-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathcompression_zstd.go
115 lines (93 loc) · 2.56 KB
/
compression_zstd.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package freezer
import (
"io"
"os"
"github.com/klauspost/compress/zstd"
"github.com/uw-labs/straw"
)
var _ straw.StreamStore = &zstdStreamStore{}
// zstdStreamStore is a straw.StreamStore wrapper that implements transparent zstd compression. Everything is supported, except for calling Size() on the os.FileInfo returned from Stat or Lstat. Calling Size() like this will panic, but freezer does not need that functionality anyway.
type zstdStreamStore struct {
store straw.StreamStore
}
func (fs *zstdStreamStore) Lstat(name string) (os.FileInfo, error) {
fi, err := fs.store.Lstat(name)
if err != nil {
return nil, err
}
return &noSizeFileInfo{fi}, nil
}
func (fs *zstdStreamStore) Stat(name string) (os.FileInfo, error) {
fi, err := fs.store.Stat(name)
if err != nil {
return nil, err
}
return &noSizeFileInfo{fi}, nil
}
func (fs *zstdStreamStore) OpenReadCloser(name string) (straw.StrawReader, error) {
rc, err := fs.store.OpenReadCloser(name)
if err != nil {
return nil, err
}
r, err := zstd.NewReader(rc)
if err != nil {
_ = rc.Close()
return nil, err
}
return &zstdReadCloser{r, rc}, nil
}
func (fs *zstdStreamStore) Mkdir(name string, mode os.FileMode) error {
return fs.store.Mkdir(name, mode)
}
func (fs *zstdStreamStore) Remove(name string) error {
return fs.store.Remove(name)
}
func (fs *zstdStreamStore) CreateWriteCloser(name string) (straw.StrawWriter, error) {
wc, err := fs.store.CreateWriteCloser(name)
if err != nil {
return nil, err
}
w, err := zstd.NewWriter(wc)
if err != nil {
_ = wc.Close()
return nil, err
}
return &zstdWriteCloser{w, wc}, nil
}
func (fs *zstdStreamStore) Readdir(name string) ([]os.FileInfo, error) {
return fs.store.Readdir(name)
}
func (fs *zstdStreamStore) Close() error {
return fs.store.Close()
}
type zstdReadCloser struct {
sr *zstd.Decoder
inner io.Closer
}
func (src *zstdReadCloser) Read(buf []byte) (int, error) {
return src.sr.Read(buf)
}
func (src *zstdReadCloser) Close() error {
src.sr.Close()
return src.inner.Close()
}
func (src *zstdReadCloser) Seek(int64, int) (int64, error) {
panic("freezer: Seek not supported in zstd read closer")
}
func (src *zstdReadCloser) ReadAt([]byte, int64) (int, error) {
panic("freezer: ReadAt not supported in zstd read closer")
}
type zstdWriteCloser struct {
swc io.WriteCloser
inner io.Closer
}
func (src *zstdWriteCloser) Write(buf []byte) (int, error) {
return src.swc.Write(buf)
}
func (src *zstdWriteCloser) Close() error {
if err := src.swc.Close(); err != nil {
_ = src.inner.Close()
return err
}
return src.inner.Close()
}