...
1
2
3
4
5
6
7
8 package storage
9
10 import (
11 "errors"
12 "fmt"
13 "io"
14 )
15
16
17 type FileType int
18
19
20 const (
21 TypeManifest FileType = 1 << iota
22 TypeJournal
23 TypeTable
24 TypeTemp
25
26 TypeAll = TypeManifest | TypeJournal | TypeTable | TypeTemp
27 )
28
29 func (t FileType) String() string {
30 switch t {
31 case TypeManifest:
32 return "manifest"
33 case TypeJournal:
34 return "journal"
35 case TypeTable:
36 return "table"
37 case TypeTemp:
38 return "temp"
39 }
40 return fmt.Sprintf("<unknown:%d>", t)
41 }
42
43
44 var (
45 ErrInvalidFile = errors.New("leveldb/storage: invalid file for argument")
46 ErrLocked = errors.New("leveldb/storage: already locked")
47 ErrClosed = errors.New("leveldb/storage: closed")
48 )
49
50
51
52
53 type ErrCorrupted struct {
54 Fd FileDesc
55 Err error
56 }
57
58 func isCorrupted(err error) bool {
59 switch err.(type) {
60 case *ErrCorrupted:
61 return true
62 default:
63 return false
64 }
65 }
66
67 func (e *ErrCorrupted) Error() string {
68 if !e.Fd.Zero() {
69 return fmt.Sprintf("%v [file=%v]", e.Err, e.Fd)
70 }
71 return e.Err.Error()
72 }
73
74
75 type Syncer interface {
76
77 Sync() error
78 }
79
80
81
82 type Reader interface {
83 io.ReadSeeker
84 io.ReaderAt
85 io.Closer
86 }
87
88
89
90 type Writer interface {
91 io.WriteCloser
92 Syncer
93 }
94
95
96 type Locker interface {
97 Unlock()
98 }
99
100
101 type FileDesc struct {
102 Type FileType
103 Num int64
104 }
105
106 func (fd FileDesc) String() string {
107 switch fd.Type {
108 case TypeManifest:
109 return fmt.Sprintf("MANIFEST-%06d", fd.Num)
110 case TypeJournal:
111 return fmt.Sprintf("%06d.log", fd.Num)
112 case TypeTable:
113 return fmt.Sprintf("%06d.ldb", fd.Num)
114 case TypeTemp:
115 return fmt.Sprintf("%06d.tmp", fd.Num)
116 default:
117 return fmt.Sprintf("%#x-%d", fd.Type, fd.Num)
118 }
119 }
120
121
122 func (fd FileDesc) Zero() bool {
123 return fd == (FileDesc{})
124 }
125
126
127 func FileDescOk(fd FileDesc) bool {
128 switch fd.Type {
129 case TypeManifest:
130 case TypeJournal:
131 case TypeTable:
132 case TypeTemp:
133 default:
134 return false
135 }
136 return fd.Num >= 0
137 }
138
139
140 type Storage interface {
141
142
143
144 Lock() (Locker, error)
145
146
147
148 Log(str string)
149
150
151
152
153
154 SetMeta(fd FileDesc) error
155
156
157
158
159
160 GetMeta() (FileDesc, error)
161
162
163
164 List(ft FileType) ([]FileDesc, error)
165
166
167
168
169 Open(fd FileDesc) (Reader, error)
170
171
172
173
174 Create(fd FileDesc) (Writer, error)
175
176
177
178 Remove(fd FileDesc) error
179
180
181
182 Rename(oldfd, newfd FileDesc) error
183
184
185
186
187 Close() error
188 }
189
View as plain text