Mercurial > gemma
comparison pkg/mesh/meshserialize.go @ 5695:ef80748ae4f3 sr-v2
Finish deserializing v2 of the mesh index.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 12 Feb 2024 21:23:55 +0100 |
parents | d920f0fa2f04 |
children | 1ea1d3ef2258 |
comparison
equal
deleted
inserted
replaced
5694:3bc15e38c7e8 | 5695:ef80748ae4f3 |
---|---|
22 "io" | 22 "io" |
23 | 23 |
24 "gemma.intevation.de/gemma/pkg/log" | 24 "gemma.intevation.de/gemma/pkg/log" |
25 ) | 25 ) |
26 | 26 |
27 const Version = 1 | 27 // Version is current version of the format the mesh index is stored in. |
28 const Version = 2 | |
28 | 29 |
30 // magicHeader is a magic header to tell if the data blob is a mesh index. | |
29 const magicHeader = "SR3D" | 31 const magicHeader = "SR3D" |
30 | 32 |
33 // coalesceVersion returns the most recent version if version is less or equal zero. | |
31 func coalesceVersion(version int) int { | 34 func coalesceVersion(version int) int { |
32 if version > 0 { | 35 if version > 0 { |
33 return version | 36 return version |
34 } | 37 } |
35 return Version | 38 return Version |
36 } | 39 } |
37 | 40 |
41 // OptimizeForSerialization apply version specific storage optimizations | |
42 // before serialization. | |
38 func (s *STRTree) OptimizeForSerialization(version int) { | 43 func (s *STRTree) OptimizeForSerialization(version int) { |
39 version = coalesceVersion(version) | 44 version = coalesceVersion(version) |
40 if version == 2 { | 45 if version == 2 { |
41 s.optimizeForSerializationV2() | 46 s.optimizeForSerializationV2() |
42 } | 47 } |
43 } | 48 } |
44 | 49 |
45 // Bytes serializes this tree to a byte slice. | 50 // Bytes serializes this tree to a byte slice. |
46 func (s *STRTree) Bytes(version int) ([]byte, int, error) { | 51 func (s *STRTree) Bytes(version int) ([]byte, int, error) { |
47 | |
48 var buf bytes.Buffer | 52 var buf bytes.Buffer |
49 w, err := gzip.NewWriterLevel(&buf, gzip.BestSpeed) | 53 w, err := gzip.NewWriterLevel(&buf, gzip.BestSpeed) |
50 if err != nil { | 54 if err != nil { |
51 return nil, 0, err | 55 return nil, 0, err |
52 } | 56 } |
53 | |
54 version = coalesceVersion(version) | 57 version = coalesceVersion(version) |
55 if err := s.serializeVn(w, version); err != nil { | 58 if err := s.serializeVn(w, version); err != nil { |
56 return nil, 0, err | 59 return nil, 0, err |
57 } | 60 } |
58 | |
59 if err := w.Close(); err != nil { | 61 if err := w.Close(); err != nil { |
60 return nil, 0, err | 62 return nil, 0, err |
61 } | 63 } |
62 | |
63 return buf.Bytes(), version, nil | 64 return buf.Bytes(), version, nil |
64 } | 65 } |
65 | 66 |
66 func (s *STRTree) serializeVn(w io.Writer, version int) error { | 67 func (s *STRTree) serializeVn(w io.Writer, version int) error { |
67 switch version { | 68 switch version { |
83 } | 84 } |
84 return s.deserialize(bufio.NewReader(r), version) | 85 return s.deserialize(bufio.NewReader(r), version) |
85 } | 86 } |
86 | 87 |
87 func (s *STRTree) deserialize(r *bufio.Reader, version int) error { | 88 func (s *STRTree) deserialize(r *bufio.Reader, version int) error { |
88 | |
89 header, err := r.Peek(8) | 89 header, err := r.Peek(8) |
90 if err != nil { | 90 if err != nil { |
91 return err | 91 return err |
92 } | 92 } |
93 | |
94 if bytes.HasPrefix(header, []byte(magicHeader)) { | 93 if bytes.HasPrefix(header, []byte(magicHeader)) { |
95 realVersion := int(binary.LittleEndian.Uint32(header[4:])) | 94 realVersion := int(binary.LittleEndian.Uint32(header[4:])) |
96 if realVersion != version { | 95 if realVersion != version { |
97 return fmt.Errorf("mesh version mismatch: Have %d expect %d", | 96 return fmt.Errorf("mesh version mismatch: Have %d expect %d", |
98 realVersion, version) | 97 realVersion, version) |
101 if _, err := r.Discard(8); err != nil { | 100 if _, err := r.Discard(8); err != nil { |
102 return err | 101 return err |
103 } | 102 } |
104 return s.deserializeVn(r, realVersion) | 103 return s.deserializeVn(r, realVersion) |
105 } | 104 } |
106 | |
107 return s.deserializeV1(r) | 105 return s.deserializeV1(r) |
108 } | 106 } |
109 | 107 |
110 func (s *STRTree) deserializeVn(r *bufio.Reader, version int) error { | 108 func (s *STRTree) deserializeVn(r *bufio.Reader, version int) error { |
111 switch version { | 109 switch version { |
117 return fmt.Errorf("cannot deserialize mesh version %d", version) | 115 return fmt.Errorf("cannot deserialize mesh version %d", version) |
118 } | 116 } |
119 } | 117 } |
120 | 118 |
121 // serializer is a generic function to apply a chain of | 119 // serializer is a generic function to apply a chain of |
122 // serializer/deserializer functions to an object given a reader. | 120 // serializer/deserializer functions to an object given a reader or writer. |
123 func serializer[T, S any]( | 121 func serializer[T, S any]( |
124 s S, | 122 s S, |
125 t T, | 123 t T, |
126 fns ...func(T, S) error, | 124 fns ...func(T, S) error, |
127 ) error { | 125 ) error { |