comparison 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
comparison
equal deleted inserted replaced
5677:a57be8bfb6ea 5678:4abbb62d2bed
18 "bytes" 18 "bytes"
19 "compress/gzip" 19 "compress/gzip"
20 "encoding/binary" 20 "encoding/binary"
21 "errors" 21 "errors"
22 "fmt" 22 "fmt"
23 "io"
23 ) 24 )
25
26 const Version = 1
24 27
25 const magicHeader = "SR3D" 28 const magicHeader = "SR3D"
26 29
27 // Bytes serializes this tree to a byte slice. 30 // Bytes serializes this tree to a byte slice.
28 func (s *STRTree) Bytes() ([]byte, error) { 31 func (s *STRTree) Bytes(version *int) ([]byte, int, error) {
29 32
30 var buf bytes.Buffer 33 var buf bytes.Buffer
31 w, err := gzip.NewWriterLevel(&buf, gzip.BestSpeed) 34 w, err := gzip.NewWriterLevel(&buf, gzip.BestSpeed)
32 if err != nil { 35 if err != nil {
33 return nil, err 36 return nil, 0, err
34 } 37 }
35 38
36 if err := s.serializeV1(w); err != nil { 39 var ver int
37 return nil, err 40
41 if version == nil || *version < 0 {
42 ver = Version
43 }
44
45 if err := s.serializeVn(w, ver); err != nil {
46 return nil, 0, err
38 } 47 }
39 48
40 if err := w.Close(); err != nil { 49 if err := w.Close(); err != nil {
41 return nil, err 50 return nil, 0, err
42 } 51 }
43 52
44 return buf.Bytes(), nil 53 return buf.Bytes(), ver, nil
54 }
55
56 func (s *STRTree) serializeVn(w io.Writer, version int) error {
57
58 if version > Version {
59 return fmt.Errorf(
60 "cannot serialize mesh version %d. Highest supported version %d",
61 version, Version)
62 }
63
64 return s.serializeV1(w)
45 } 65 }
46 66
47 // FromBytes restores a STRTree from a binary representation. 67 // FromBytes restores a STRTree from a binary representation.
48 func (s *STRTree) FromBytes(data []byte, version *int64) error { 68 func (s *STRTree) FromBytes(data []byte, version *int64) error {
69
70 if version != nil && *version > Version {
71 return fmt.Errorf(
72 "cannot deserialize mesh version %d. Highest supported version %d",
73 *version, Version)
74 }
75
49 r, err := gzip.NewReader(bytes.NewReader(data)) 76 r, err := gzip.NewReader(bytes.NewReader(data))
50 if err != nil { 77 if err != nil {
51 return err 78 return err
52 } 79 }
53 return s.deserialize(bufio.NewReader(r), version) 80 return s.deserialize(bufio.NewReader(r), version)