annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1017
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
2 // without warranty, see README.md and license for details.
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
3 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
6 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
7 // Copyright (C) 2018 by via donau
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
9 // Software engineering by Intevation GmbH
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
10 //
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
11 // Author(s):
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
a244b18cb916 Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 729
diff changeset
13
4827
f4abfd0ee8ad Renamed octree package to mesh as there is no octree any more.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4824
diff changeset
14 package mesh
674
120a82bd9953 octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
120a82bd9953 octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 import (
120a82bd9953 octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 "bufio"
727
41c8dc61f38f Moved octree loading stuff to octree package.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 726
diff changeset
18 "bytes"
4656
a2f16987911b Removed lz4 from loader, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 4650
diff changeset
19 "compress/gzip"
674
120a82bd9953 octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 "encoding/binary"
5674
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
21 "errors"
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
22 "fmt"
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
23 "io"
674
120a82bd9953 octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24 )
120a82bd9953 octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
26 const Version = 1
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
27
5674
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
28 const magicHeader = "SR3D"
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
29
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
30 // Bytes serializes this tree to a byte slice.
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
31 func (s *STRTree) Bytes(version *int) ([]byte, int, error) {
4650
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
32
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
33 var buf bytes.Buffer
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
34 w, err := gzip.NewWriterLevel(&buf, gzip.BestSpeed)
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
35 if err != nil {
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
36 return nil, 0, err
4650
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
37 }
674
120a82bd9953 octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
39 var ver int
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
40
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
41 if version == nil || *version < 0 {
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
42 ver = Version
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
43 }
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
44
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
45 if err := s.serializeVn(w, ver); err != nil {
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
46 return nil, 0, err
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
47 }
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
48
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
49 if err := w.Close(); err != nil {
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
50 return nil, 0, err
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
51 }
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
52
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
53 return buf.Bytes(), ver, nil
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
54 }
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
55
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
56 func (s *STRTree) serializeVn(w io.Writer, version int) error {
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
57
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
58 if version > Version {
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
59 return fmt.Errorf(
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
60 "cannot serialize mesh version %d. Highest supported version %d",
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
61 version, Version)
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
62 }
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
63
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
64 return s.serializeV1(w)
4650
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
65 }
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
66
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
67 // FromBytes restores a STRTree from a binary representation.
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
68 func (s *STRTree) FromBytes(data []byte, version *int64) error {
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
69
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
70 if version != nil && *version > Version {
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
71 return fmt.Errorf(
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
72 "cannot deserialize mesh version %d. Highest supported version %d",
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
73 *version, Version)
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
74 }
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
75
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
76 r, err := gzip.NewReader(bytes.NewReader(data))
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
77 if err != nil {
4650
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
78 return err
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
79 }
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
80 return s.deserialize(bufio.NewReader(r), version)
4650
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
81 }
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
82
5674
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
83 func (s *STRTree) deserialize(r *bufio.Reader, version *int64) error {
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
84
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
85 header, err := r.Peek(8)
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
86 if err != nil {
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
87 return err
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
88 }
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
89
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
90 if bytes.HasPrefix(header, []byte(magicHeader)) {
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
91 realVersion := int64(binary.LittleEndian.Uint32(header[4:]))
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
92 if version != nil && realVersion != *version {
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
93 return fmt.Errorf("sounding result version mismatch: Have %d expect %d",
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
94 realVersion, *version)
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
95 }
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
96 return s.deserializeVn(r, realVersion)
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
97 }
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
98
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
99 return s.deserializeV1(r)
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
100 }
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
101
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
102 func (s *STRTree) deserializeVn(r *bufio.Reader, version int64) error {
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
103 if version == 1 {
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
104 return s.deserializeV1(r)
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
105 }
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
106 // TODO: Implement me!
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
107 return errors.New("not implemented, yet")
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
108 }