remove / prefix and close directories properly in query
Jeromy committed
Apr 8, 2015 at 14:51 UTC
e965c53780003a01fcbd94af96333ace4b3e2748
1 file changed
+28
-19
Godeps/_workspace/src/github.com/jbenet/go-datastore/flatfs/flatfs.go
+28
-19
@@ -47,7 +47,7 @@ func New(path string, prefixLen int) (*Datastore, error) {
47
var padding = strings.Repeat("_", maxPrefixLen*hex.EncodedLen(1))
48
49
func (fs *Datastore) encode(key datastore.Key) (dir, file string) {
50
- safe := hex.EncodeToString(key.Bytes())
50
+ safe := hex.EncodeToString(key.Bytes()[1:])
51
prefix := (safe + padding)[:fs.hexPrefixLen]
52
dir = path.Join(fs.path, prefix)
53
file = path.Join(dir, safe+extension)
@@ -210,30 +210,39 @@ func (fs *Datastore) Query(q query.Query) (query.Results, error) {
210
return nil, err
211
}
212
for _, fi := range prefixes {
213
- if !fi.IsDir() || fi.Name()[0] == '.' {
214
- continue
215
- }
216
- child, err := os.Open(path.Join(fs.path, fi.Name()))
213
+ var err error
214
+ res, err = fs.enumerateKeys(fi, res)
215
if err != nil {
216
return nil, err
217
}
220
- defer child.Close()
221
- objs, err := child.Readdir(0)
222
- if err != nil {
223
- return nil, err
218
+ }
219
+ return query.ResultsWithEntries(q, res), nil
220
+}
221
+
222
+func (fs *Datastore) enumerateKeys(fi os.FileInfo, res []query.Entry) ([]query.Entry, error) {
223
+ if !fi.IsDir() || fi.Name()[0] == '.' {
224
+ return res, nil
225
+ }
226
+ child, err := os.Open(path.Join(fs.path, fi.Name()))
227
+ if err != nil {
228
+ return nil, err
229
+ }
230
+ defer child.Close()
231
+ objs, err := child.Readdir(0)
232
+ if err != nil {
233
+ return nil, err
234
+ }
235
+ for _, fi := range objs {
236
+ if !fi.Mode().IsRegular() || fi.Name()[0] == '.' {
237
+ return res, nil
238
}
225
- for _, fi := range objs {
226
- if !fi.Mode().IsRegular() || fi.Name()[0] == '.' {
227
- continue
228
- }
229
- key, ok := fs.decode(fi.Name())
230
- if !ok {
231
- continue
232
- }
233
- res = append(res, query.Entry{Key: key.String()})
239
+ key, ok := fs.decode(fi.Name())
240
+ if !ok {
241
+ return res, nil
242
}
243
+ res = append(res, query.Entry{Key: key.String()})
244
}
236
- return query.ResultsWithEntries(q, res), nil
245
+ return res, nil
246
}
247
248
var _ datastore.ThreadSafeDatastore = (*Datastore)(nil)