# HG changeset patch # User Sascha L. Teichmann # Date 1707643550 -3600 # Node ID 4abbb62d2bed10aedc0e225a7043010611ba372f # Parent a57be8bfb6eaad7585026949f84fe560a0945820 Write mesh version to database. diff -r a57be8bfb6ea -r 4abbb62d2bed pkg/imports/sr.go --- 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 } diff -r a57be8bfb6ea -r 4abbb62d2bed pkg/mesh/meshserialize.go --- 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