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 {