changeset 5678:4abbb62d2bed sr-v2

Write mesh version to database.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sun, 11 Feb 2024 10:25:50 +0100
parents a57be8bfb6ea
children 03dfbe675842
files pkg/imports/sr.go pkg/mesh/meshserialize.go
diffstat 2 files changed, 37 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/imports/sr.go	Sun Feb 11 09:51:21 2024 +0100
+++ b/pkg/imports/sr.go	Sun Feb 11 10:25:50 2024 +0100
@@ -174,7 +174,7 @@
 
 	insertMeshSQL = `
 UPDATE waterway.sounding_results SET
-  mesh_checksum = $2, mesh_index = $3
+  mesh_checksum = $2, mesh_index = $3, mesh_index_version = $4
 WHERE id = $1`
 
 	repairBoundarySQL = `
@@ -742,8 +742,9 @@
 
 	if m.SurveyType != models.SurveyTypeMarking {
 		var index []byte
+		var version int
 
-		index, err = final.Bytes()
+		index, version, err = final.Bytes(nil)
 		if err != nil {
 			return nil, err
 		}
@@ -751,7 +752,7 @@
 		h := sha1.New()
 		h.Write(index)
 		checksum := hex.EncodeToString(h.Sum(nil))
-		_, err = tx.ExecContext(ctx, insertMeshSQL, id, checksum, index)
+		_, err = tx.ExecContext(ctx, insertMeshSQL, id, checksum, index, version)
 		if err != nil {
 			return nil, err
 		}
--- a/pkg/mesh/meshserialize.go	Sun Feb 11 09:51:21 2024 +0100
+++ b/pkg/mesh/meshserialize.go	Sun Feb 11 10:25:50 2024 +0100
@@ -20,32 +20,59 @@
 	"encoding/binary"
 	"errors"
 	"fmt"
+	"io"
 )
 
+const Version = 1
+
 const magicHeader = "SR3D"
 
 // Bytes serializes this tree to a byte slice.
-func (s *STRTree) Bytes() ([]byte, error) {
+func (s *STRTree) Bytes(version *int) ([]byte, int, error) {
 
 	var buf bytes.Buffer
 	w, err := gzip.NewWriterLevel(&buf, gzip.BestSpeed)
 	if err != nil {
-		return nil, err
+		return nil, 0, err
 	}
 
-	if err := s.serializeV1(w); err != nil {
-		return nil, err
+	var ver int
+
+	if version == nil || *version < 0 {
+		ver = Version
+	}
+
+	if err := s.serializeVn(w, ver); err != nil {
+		return nil, 0, err
 	}
 
 	if err := w.Close(); err != nil {
-		return nil, err
+		return nil, 0, err
 	}
 
-	return buf.Bytes(), nil
+	return buf.Bytes(), ver, nil
+}
+
+func (s *STRTree) serializeVn(w io.Writer, version int) error {
+
+	if version > Version {
+		return fmt.Errorf(
+			"cannot serialize mesh version %d. Highest supported version %d",
+			version, Version)
+	}
+
+	return s.serializeV1(w)
 }
 
 // FromBytes restores a STRTree from a binary representation.
 func (s *STRTree) FromBytes(data []byte, version *int64) error {
+
+	if version != nil && *version > Version {
+		return fmt.Errorf(
+			"cannot deserialize mesh version %d. Highest supported version %d",
+			*version, Version)
+	}
+
 	r, err := gzip.NewReader(bytes.NewReader(data))
 	if err != nil {
 		return err