This repository has been archived by the owner on Jan 18, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 5
/
msgp.go
88 lines (78 loc) · 1.4 KB
/
msgp.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package repo
import (
"compress/gzip"
"os"
"path/filepath"
"github.com/tinylib/msgp/msgp"
)
type msgWriter struct {
loc string
f *os.File
gw *gzip.Writer
wr *msgp.Writer
}
func newMsgWriter(dir string, kind string) (*msgWriter, error) {
s := &msgWriter{}
err := os.MkdirAll(dir, 0777)
if err != nil {
return nil, err
}
s.loc = filepath.Join(dir, kind)
f, err := os.Create(s.loc + ".tmp")
if err != nil {
return nil, err
}
s.f = f
s.gw = gzip.NewWriter(f)
s.wr = msgp.NewWriter(s.gw)
return s, nil
}
func (s *msgWriter) Write(obj msgp.Encodable) error {
return obj.EncodeMsg(s.wr)
}
func (s *msgWriter) Finish() error {
err := s.wr.Flush()
if err != nil {
return err
}
err = s.gw.Flush()
if err != nil {
return err
}
err = s.f.Close()
if err != nil {
return err
}
return os.Rename(s.loc+".tmp", s.loc)
}
type msgReader struct {
loc string
f *os.File
gr *gzip.Reader
r *msgp.Reader
}
func newMsgReader(dir string, kind string) (*msgReader, error) {
s := &msgReader{}
s.loc = filepath.Join(dir, kind)
f, err := os.Open(s.loc)
if err != nil {
return nil, err
}
s.f = f
s.gr, err = gzip.NewReader(f)
if err != nil {
return nil, err
}
s.r = msgp.NewReader(s.gr)
return s, nil
}
func (s *msgReader) Read(obj msgp.Decodable) error {
return obj.DecodeMsg(s.r)
}
func (s *msgReader) Finish() error {
err := s.f.Close()
if err != nil {
return err
}
return nil
}