@cryptotaxi247 / kubo / commits / e965c5378

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)