changeset 5679:03dfbe675842 sr-v2

Simplified version handling.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sun, 11 Feb 2024 12:37:09 +0100
parents 4abbb62d2bed
children a87900c0fd11
files pkg/imports/sr.go pkg/mesh/cache.go pkg/mesh/meshserialize.go
diffstat 3 files changed, 38 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/imports/sr.go	Sun Feb 11 10:25:50 2024 +0100
+++ b/pkg/imports/sr.go	Sun Feb 11 12:37:09 2024 +0100
@@ -741,10 +741,11 @@
 	}
 
 	if m.SurveyType != models.SurveyTypeMarking {
+		final.OptimizeForSerialization(-1)
+
 		var index []byte
 		var version int
-
-		index, version, err = final.Bytes(nil)
+		index, version, err = final.Bytes(-1)
 		if err != nil {
 			return nil, err
 		}
--- a/pkg/mesh/cache.go	Sun Feb 11 10:25:50 2024 +0100
+++ b/pkg/mesh/cache.go	Sun Feb 11 12:37:09 2024 +0100
@@ -48,11 +48,12 @@
 
 const (
 	directMeshSQL = `
-SELECT mesh_index, mesh_index_version FROM waterway.sounding_results
+SELECT mesh_index, coalesce(mesh_index_version, 1) AS mesh_index_version
+FROM waterway.sounding_results
 WHERE id = $1
 `
 	fetchMeshSQL = `
-SELECT mesh_checksum, mesh_index, mesh_index_version
+SELECT mesh_checksum, mesh_index, coalesce(mesh_index_version, 1) AS 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
@@ -62,7 +63,7 @@
   WHEN mesh_checksum = $3 THEN NULL
   ELSE mesh_index
   END,
-  mesh_index_version
+  coalesce(mesh_index_version, 1) AS 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
@@ -105,17 +106,13 @@
 	id int64,
 ) (*STRTree, error) {
 	var data []byte
-	var version sql.NullInt64
+	var version int
 	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, ver); err != nil {
+	if err := tree.FromBytes(data, version); err != nil {
 		return nil, err
 	}
 	return tree, nil
@@ -140,7 +137,7 @@
 
 	var data []byte
 	var checksum string
-	var version sql.NullInt64
+	var version int
 
 	if entry == nil {
 		// fetch from database
@@ -170,11 +167,7 @@
 
 	tree := new(STRTree)
 
-	var ver *int64
-	if version.Valid {
-		ver = &version.Int64
-	}
-	if err := tree.FromBytes(data, ver); err != nil {
+	if err := tree.FromBytes(data, version); err != nil {
 		return nil, err
 	}
 
--- a/pkg/mesh/meshserialize.go	Sun Feb 11 10:25:50 2024 +0100
+++ b/pkg/mesh/meshserialize.go	Sun Feb 11 12:37:09 2024 +0100
@@ -27,8 +27,21 @@
 
 const magicHeader = "SR3D"
 
+func coalesceVersion(version int) int {
+	if version > 0 {
+		return version
+	}
+	return Version
+}
+
+func (s *STRTree) OptimizeForSerialization(version int) {
+	version = coalesceVersion(version)
+	// TODO: Implement me!
+	_ = version
+}
+
 // Bytes serializes this tree to a byte slice.
-func (s *STRTree) Bytes(version *int) ([]byte, int, error) {
+func (s *STRTree) Bytes(version int) ([]byte, int, error) {
 
 	var buf bytes.Buffer
 	w, err := gzip.NewWriterLevel(&buf, gzip.BestSpeed)
@@ -36,13 +49,9 @@
 		return nil, 0, err
 	}
 
-	var ver int
+	version = coalesceVersion(version)
 
-	if version == nil || *version < 0 {
-		ver = Version
-	}
-
-	if err := s.serializeVn(w, ver); err != nil {
+	if err := s.serializeVn(w, version); err != nil {
 		return nil, 0, err
 	}
 
@@ -50,7 +59,7 @@
 		return nil, 0, err
 	}
 
-	return buf.Bytes(), ver, nil
+	return buf.Bytes(), version, nil
 }
 
 func (s *STRTree) serializeVn(w io.Writer, version int) error {
@@ -65,12 +74,14 @@
 }
 
 // FromBytes restores a STRTree from a binary representation.
-func (s *STRTree) FromBytes(data []byte, version *int64) error {
+func (s *STRTree) FromBytes(data []byte, version int) error {
 
-	if version != nil && *version > Version {
+	version = coalesceVersion(version)
+
+	if version > Version {
 		return fmt.Errorf(
 			"cannot deserialize mesh version %d. Highest supported version %d",
-			*version, Version)
+			version, Version)
 	}
 
 	r, err := gzip.NewReader(bytes.NewReader(data))
@@ -80,7 +91,7 @@
 	return s.deserialize(bufio.NewReader(r), version)
 }
 
-func (s *STRTree) deserialize(r *bufio.Reader, version *int64) error {
+func (s *STRTree) deserialize(r *bufio.Reader, version int) error {
 
 	header, err := r.Peek(8)
 	if err != nil {
@@ -88,10 +99,10 @@
 	}
 
 	if bytes.HasPrefix(header, []byte(magicHeader)) {
-		realVersion := int64(binary.LittleEndian.Uint32(header[4:]))
-		if version != nil && realVersion != *version {
+		realVersion := int(binary.LittleEndian.Uint32(header[4:]))
+		if realVersion != version {
 			return fmt.Errorf("sounding result version mismatch: Have %d expect %d",
-				realVersion, *version)
+				realVersion, version)
 		}
 		return s.deserializeVn(r, realVersion)
 	}
@@ -99,7 +110,7 @@
 	return s.deserializeV1(r)
 }
 
-func (s *STRTree) deserializeVn(r *bufio.Reader, version int64) error {
+func (s *STRTree) deserializeVn(r *bufio.Reader, version int) error {
 	if version == 1 {
 		return s.deserializeV1(r)
 	}