# HG changeset patch # User Sascha L. Teichmann # Date 1707581038 -3600 # Node ID e54635c20d43355e4193455c4e3f43e4ebad38d5 # Parent 689f55d73bf0094eae44505593df29f8a655e0a4 Load version fom database. diff -r 689f55d73bf0 -r e54635c20d43 pkg/mesh/cache.go --- 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 } diff -r 689f55d73bf0 -r e54635c20d43 pkg/mesh/loader.go --- 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.