Skip to content

Commit dad7b1b

Browse files
committed
refactor: gz/json encoder for meta data in index file
1 parent cf89436 commit dad7b1b

File tree

5 files changed

+76
-32
lines changed

5 files changed

+76
-32
lines changed

cmd/tinytune/tinytune.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ func start(config internal.Config) {
280280
slog.String("total preview data size", bytesutil.PrettyByteSize(previewsSize)),
281281
)
282282

283-
if index.OutDated() && !config.IndexFileSave {
283+
if index.OutDated() && config.IndexFileSave {
284284
err = indexFile.Truncate(0)
285285
internal.PanicError(err)
286286
_, err = indexFile.Seek(0, 0)

pkg/index/format.go

+59-15
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package index
22

33
import (
44
"bytes"
5+
"compress/gzip"
56
"encoding/binary"
67
"encoding/gob"
8+
"encoding/json"
79
"errors"
810
"fmt"
911
"io"
@@ -30,12 +32,20 @@ var (
3032
ErrWriteMetaPartSize = errors.New("failed to write meta's part size")
3133
ErrWriteMetaPart = errors.New("failed to write meta items")
3234
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")
3344
)
3445

3546
const indexHeader = "TINYTUNE_INDEX"
3647
const metaItemsCountSize = 4
3748

38-
//nolint:cyclop
3949
func (index *Index) Decode(r io.Reader) error {
4050
if r == nil {
4151
return nil
@@ -76,15 +86,8 @@ func (index *Index) Decode(r io.Reader) error {
7686
return fmt.Errorf("%w: %w", ErrReadMetaPart, err)
7787
}
7888

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)
8891
}
8992

9093
// read binary data
@@ -110,12 +113,9 @@ func (index *Index) Encode(w io.Writer) (uint64, error) {
110113
}
111114
// prepare meta items
112115
metaBuffer := bytes.NewBuffer(make([]byte, 0))
113-
enc := gob.NewEncoder(metaBuffer)
114116

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)
119119
}
120120

121121
// write meta part size
@@ -136,3 +136,47 @@ func (index *Index) Encode(w io.Writer) (uint64, error) {
136136

137137
return writer.Count(), nil
138138
}
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+
}

pkg/index/index_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ func TestIndexEncodeDecode(t *testing.T) {
5454
buff := new(bytes.Buffer)
5555
wrote, err := indexOriginal.Encode(buff)
5656
require.NoError(t, err)
57-
assert.EqualValues(t, 497, wrote)
58-
assert.EqualValues(t, 497, buff.Len())
57+
assert.EqualValues(t, 351, wrote)
58+
assert.EqualValues(t, 351, buff.Len())
5959
// Parse
6060
indexDerivative, err := NewIndex(context.Background(), bufio.NewReader(buff))
6161
require.NoError(t, err)

pkg/index/meta.go

+13-13
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,22 @@ type Path string
2222
type RelativePath string
2323

2424
type Meta struct {
25-
ID ID
26-
AbsolutePath Path
27-
RelativePath RelativePath
28-
OriginSize int64
29-
Name string
30-
ModTime time.Time
31-
IsDir bool
32-
Preview PreviewLocation
33-
Duration time.Duration
34-
Resolution string
35-
Type int
25+
ID ID `json:"id"`
26+
AbsolutePath Path `json:"absolutePath"`
27+
RelativePath RelativePath `json:"relativePath"`
28+
OriginSize int64 `json:"originSize"`
29+
Name string `json:"name"`
30+
ModTime time.Time `json:"modTime"`
31+
IsDir bool `json:"isDir"`
32+
Preview PreviewLocation `json:"preview"`
33+
Duration time.Duration `json:"duration"`
34+
Resolution string `json:"resolution"`
35+
Type int `json:"type"`
3636
}
3737

3838
type PreviewLocation struct {
39-
Length uint32
40-
Offset uint32
39+
Length uint32 `json:"length"`
40+
Offset uint32 `json:"offset"`
4141
}
4242

4343
func (m *Meta) Size() int64 {

pkg/preview/preview.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func ifMaxPass(maxNewItems *int64) bool {
7474
return true
7575
}
7676

77-
//nolint:cyclop,ireturn //it's very simple method...
77+
//nolint:cyclop,ireturn,nolintlint //it's very simple method...
7878
func (p Previewer) Pull(src Source) (Data, error) {
7979
defaultPreview := data{resolution: "0x0"}
8080

0 commit comments

Comments
 (0)