diff pkg/mesh/meshserialize.go @ 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
line wrap: on
line diff
--- 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