annotate pkg/mesh/meshserialize.go @ 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
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
5679
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
30 func coalesceVersion(version int) int {
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
31 if version > 0 {
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
32 return version
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
33 }
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
34 return Version
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
35 }
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
36
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
37 func (s *STRTree) OptimizeForSerialization(version int) {
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
38 version = coalesceVersion(version)
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
39 // TODO: Implement me!
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
40 _ = version
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
41 }
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
42
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
43 // Bytes serializes this tree to a byte slice.
5679
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
44 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
45
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
46 var buf bytes.Buffer
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
47 w, err := gzip.NewWriterLevel(&buf, gzip.BestSpeed)
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
48 if err != nil {
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
49 return nil, 0, err
4650
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
50 }
674
120a82bd9953 octree: Added loading frame for contour generation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
51
5679
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
52 version = coalesceVersion(version)
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
53
5679
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
54 if err := s.serializeVn(w, version); err != nil {
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
55 return nil, 0, err
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
56 }
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
57
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
58 if err := w.Close(); err != nil {
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
59 return nil, 0, err
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
60 }
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
61
5679
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
62 return buf.Bytes(), version, nil
5678
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
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
65 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
66
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
67 if version > Version {
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
68 return fmt.Errorf(
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
69 "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
70 version, Version)
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
71 }
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
72
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
73 return s.serializeV1(w)
4650
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
74 }
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
75
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
76 // FromBytes restores a STRTree from a binary representation.
5679
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
77 func (s *STRTree) FromBytes(data []byte, version int) error {
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
78
5679
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
79 version = coalesceVersion(version)
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
80
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
81 if version > Version {
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
82 return fmt.Errorf(
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
83 "cannot deserialize mesh version %d. Highest supported version %d",
5679
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
84 version, Version)
5678
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
85 }
4abbb62d2bed Write mesh version to database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5677
diff changeset
86
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
87 r, err := gzip.NewReader(bytes.NewReader(data))
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
88 if err != nil {
4650
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
89 return err
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
90 }
5676
d56e043bbbca More code moving.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5674
diff changeset
91 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
92 }
f5fce22184da Added a deserializer from STRTrees.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2465
diff changeset
93
5679
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
94 func (s *STRTree) deserialize(r *bufio.Reader, version int) error {
5674
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 header, err := r.Peek(8)
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
97 if err != nil {
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
98 return err
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
99 }
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 if bytes.HasPrefix(header, []byte(magicHeader)) {
5679
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
102 realVersion := int(binary.LittleEndian.Uint32(header[4:]))
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
103 if realVersion != version {
5674
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
104 return fmt.Errorf("sounding result version mismatch: Have %d expect %d",
5679
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
105 realVersion, version)
5674
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
106 }
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
107 return s.deserializeVn(r, realVersion)
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
108 }
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
109
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
110 return s.deserializeV1(r)
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
111 }
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
112
5679
03dfbe675842 Simplified version handling.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5678
diff changeset
113 func (s *STRTree) deserializeVn(r *bufio.Reader, version int) error {
5674
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
114 if version == 1 {
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
115 return s.deserializeV1(r)
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
116 }
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
117 // TODO: Implement me!
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
118 return errors.New("not implemented, yet")
e54635c20d43 Load version fom database.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5601
diff changeset
119 }