@@ -2,8 +2,10 @@ package index
2
2
3
3
import (
4
4
"bytes"
5
+ "compress/gzip"
5
6
"encoding/binary"
6
7
"encoding/gob"
8
+ "encoding/json"
7
9
"errors"
8
10
"fmt"
9
11
"io"
@@ -30,12 +32,20 @@ var (
30
32
ErrWriteMetaPartSize = errors .New ("failed to write meta's part size" )
31
33
ErrWriteMetaPart = errors .New ("failed to write meta items" )
32
34
ErrWriteBinaryData = errors .New ("failed to write binary data" )
35
+
36
+ ErrJSONEncode = errors .New ("failed to JSON encode item" )
37
+ ErrGZIPDecode = errors .New ("failed to decode gzip" )
38
+ ErrGZIPDecoderClose = errors .New ("failed to close gzip decoder" )
39
+ ErrGZIPEncode = errors .New ("failed to encode gzip" )
40
+ ErrGZIPEncoderClose = errors .New ("failed to close gzip encoder" )
41
+
42
+ ErrMetaDecode = errors .New ("failed to decode meta data" )
43
+ ErrMetaEncode = errors .New ("failed to encode meta data" )
33
44
)
34
45
35
46
const indexHeader = "TINYTUNE_INDEX"
36
47
const metaItemsCountSize = 4
37
48
38
- //nolint:cyclop
39
49
func (index * Index ) Decode (r io.Reader ) error {
40
50
if r == nil {
41
51
return nil
@@ -76,15 +86,8 @@ func (index *Index) Decode(r io.Reader) error {
76
86
return fmt .Errorf ("%w: %w" , ErrReadMetaPart , err )
77
87
}
78
88
79
- decoder := gob .NewDecoder (bytes .NewReader (metaPartBuffer ))
80
-
81
- for range metaItemsCount {
82
- m := Meta {}
83
- if err := decoder .Decode (& m ); err != nil {
84
- return fmt .Errorf ("%w: %w" , ErrMetaItemDecode , err )
85
- }
86
-
87
- index .meta [m .ID ] = & m
89
+ if err := index .metaDecode (bytes .NewReader (metaPartBuffer ), metaItemsCount ); err != nil {
90
+ return fmt .Errorf ("%w: %w" , ErrMetaDecode , err )
88
91
}
89
92
90
93
// read binary data
@@ -110,12 +113,9 @@ func (index *Index) Encode(w io.Writer) (uint64, error) {
110
113
}
111
114
// prepare meta items
112
115
metaBuffer := bytes .NewBuffer (make ([]byte , 0 ))
113
- enc := gob .NewEncoder (metaBuffer )
114
116
115
- for _ , v := range index .meta {
116
- if err := enc .Encode (v ); err != nil {
117
- return 0 , fmt .Errorf ("%w: %w" , ErrEncodeMetaItem , err )
118
- }
117
+ if err := index .metaEncode (metaBuffer ); err != nil {
118
+ return 0 , fmt .Errorf ("%w: %w" , ErrMetaDecode , err )
119
119
}
120
120
121
121
// write meta part size
@@ -136,3 +136,47 @@ func (index *Index) Encode(w io.Writer) (uint64, error) {
136
136
137
137
return writer .Count (), nil
138
138
}
139
+
140
+ func (index * Index ) metaEncode (w io.Writer ) error {
141
+ gzipEncoder := gzip .NewWriter (w )
142
+ jsonEncoder := json .NewEncoder (gzipEncoder )
143
+
144
+ for _ , v := range index .meta {
145
+ err := jsonEncoder .Encode (v )
146
+ if err != nil {
147
+ return fmt .Errorf ("%w: %w" , ErrJSONEncode , err )
148
+ }
149
+ }
150
+
151
+ err := gzipEncoder .Close ()
152
+ if err != nil {
153
+ return fmt .Errorf ("%w: %w" , ErrGZIPEncoderClose , err )
154
+ }
155
+
156
+ return nil
157
+ }
158
+
159
+ func (index * Index ) metaDecode (r io.Reader , count uint32 ) error {
160
+ gzipDecoder , err := gzip .NewReader (r )
161
+ if err != nil {
162
+ return fmt .Errorf ("%w: %w" , ErrGZIPDecode , err )
163
+ }
164
+
165
+ jsonDecoder := json .NewDecoder (gzipDecoder )
166
+
167
+ for range count {
168
+ m := Meta {}
169
+ if err := jsonDecoder .Decode (& m ); err != nil {
170
+ return fmt .Errorf ("%w: %w" , ErrMetaItemDecode , err )
171
+ }
172
+
173
+ index .meta [m .ID ] = & m
174
+ }
175
+
176
+ err = gzipDecoder .Close ()
177
+ if err != nil {
178
+ return fmt .Errorf ("%w: %w" , ErrGZIPDecoderClose , err )
179
+ }
180
+
181
+ return nil
182
+ }
0 commit comments