changeset 5674:e54635c20d43 sr-v2

Load version fom database.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sat, 10 Feb 2024 17:03:58 +0100
parents 689f55d73bf0
children b8da63027b48
files pkg/mesh/cache.go pkg/mesh/loader.go
diffstat 2 files changed, 53 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/mesh/cache.go	Sat Feb 10 14:58:39 2024 +0100
+++ b/pkg/mesh/cache.go	Sat Feb 10 17:03:58 2024 +0100
@@ -48,11 +48,11 @@
 
 const (
 	directMeshSQL = `
-SELECT mesh_index FROM waterway.sounding_results
+SELECT mesh_index, mesh_index_version FROM waterway.sounding_results
 WHERE id = $1
 `
 	fetchMeshSQL = `
-SELECT mesh_checksum, mesh_index
+SELECT mesh_checksum, mesh_index, mesh_index_version
 FROM waterway.sounding_results
 WHERE bottleneck_id = $1 AND date_info = $2::date
   AND mesh_checksum IS NOT NULL AND mesh_index IS NOT NULL
@@ -61,7 +61,8 @@
 SELECT CASE
   WHEN mesh_checksum = $3 THEN NULL
   ELSE mesh_index
-  END
+  END,
+  mesh_index_version
 FROM waterway.sounding_results
 WHERE bottleneck_id = $1 AND date_info = $2::date
   AND mesh_checksum IS NOT NULL AND mesh_index IS NOT NULL
@@ -104,12 +105,17 @@
 	id int64,
 ) (*STRTree, error) {
 	var data []byte
-	err := tx.QueryRowContext(ctx, directMeshSQL, id).Scan(&data)
+	var version sql.NullInt64
+	err := tx.QueryRowContext(ctx, directMeshSQL, id).Scan(&data, &version)
 	if err != nil {
 		return nil, err
 	}
+	var ver *int64
+	if version.Valid {
+		ver = &version.Int64
+	}
 	tree := new(STRTree)
-	if err := tree.FromBytes(data); err != nil {
+	if err := tree.FromBytes(data, ver); err != nil {
 		return nil, err
 	}
 	return tree, nil
@@ -134,11 +140,12 @@
 
 	var data []byte
 	var checksum string
+	var version sql.NullInt64
 
 	if entry == nil {
 		// fetch from database
 		err := conn.QueryRowContext(
-			ctx, fetchMeshSQL, bottleneck, date).Scan(&checksum, &data)
+			ctx, fetchMeshSQL, bottleneck, date).Scan(&checksum, &data, &version)
 		switch {
 		case err == sql.ErrNoRows:
 			return nil, nil
@@ -148,7 +155,7 @@
 	} else {
 		// check if we are not outdated.
 		err := conn.QueryRowContext(
-			ctx, checkMeshSQL, bottleneck, date, entry.checksum).Scan(&data)
+			ctx, checkMeshSQL, bottleneck, date, entry.checksum).Scan(&data, &version)
 		switch {
 		case err == sql.ErrNoRows:
 			return nil, nil
@@ -163,7 +170,11 @@
 
 	tree := new(STRTree)
 
-	if err := tree.FromBytes(data); err != nil {
+	var ver *int64
+	if version.Valid {
+		ver = &version.Int64
+	}
+	if err := tree.FromBytes(data, ver); err != nil {
 		return nil, err
 	}
 
--- a/pkg/mesh/loader.go	Sat Feb 10 14:58:39 2024 +0100
+++ b/pkg/mesh/loader.go	Sat Feb 10 17:03:58 2024 +0100
@@ -18,10 +18,14 @@
 	"bytes"
 	"compress/gzip"
 	"encoding/binary"
+	"errors"
+	"fmt"
 
 	"gemma.intevation.de/gemma/pkg/log"
 )
 
+const magicHeader = "SR3D"
+
 func (s *STRTree) deserializeIndex(r *bufio.Reader) error {
 	var numIndex int32
 	if err := binary.Read(r, binary.LittleEndian, &numIndex); err != nil {
@@ -72,9 +76,35 @@
 	return err
 }
 
-func (s *STRTree) deserialize(r *bufio.Reader) error {
+func (s *STRTree) deserialize(r *bufio.Reader, version *int64) error {
+
+	header, err := r.Peek(8)
+	if err != nil {
+		return err
+	}
+
+	if bytes.HasPrefix(header, []byte(magicHeader)) {
+		realVersion := int64(binary.LittleEndian.Uint32(header[4:]))
+		if version != nil && realVersion != *version {
+			return fmt.Errorf("sounding result version mismatch: Have %d expect %d",
+				realVersion, *version)
+		}
+		return s.deserializeVn(r, realVersion)
+	}
+
+	return s.deserializeV1(r)
+}
+
+func (s *STRTree) deserializeVn(r *bufio.Reader, version int64) error {
+	if version == 1 {
+		return s.deserializeV1(r)
+	}
+	// TODO: Implement me!
+	return errors.New("not implemented, yet")
+}
+
+func (s *STRTree) deserializeV1(r *bufio.Reader) error {
 	s.tin = new(Tin)
-
 	if err := s.tin.Deserialize(r); err != nil {
 		return err
 	}
@@ -92,12 +122,12 @@
 }
 
 // FromBytes restores a STRTree from a binary representation.
-func (s *STRTree) FromBytes(data []byte) error {
+func (s *STRTree) FromBytes(data []byte, version *int64) error {
 	r, err := gzip.NewReader(bytes.NewReader(data))
 	if err != nil {
 		return err
 	}
-	return s.deserialize(bufio.NewReader(r))
+	return s.deserialize(bufio.NewReader(r), version)
 }
 
 // Deserialize restores a TIN from a binary representation.