Mercurial > gemma
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 |
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 } |