1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-09-10 14:34:24 +08:00

update to new flatfs code

License: MIT
Signed-off-by: Jeromy <jeromyj@gmail.com>
This commit is contained in:
Jeromy
2015-12-14 10:00:54 -08:00
parent f4ba724dbe
commit b76dd79fa2
2 changed files with 27 additions and 45 deletions

4
Godeps/Godeps.json generated
View File

@ -1,6 +1,6 @@
{ {
"ImportPath": "github.com/ipfs/go-ipfs", "ImportPath": "github.com/ipfs/go-ipfs",
"GoVersion": "go1.5.1", "GoVersion": "go1.5.2",
"Packages": [ "Packages": [
"./..." "./..."
], ],
@ -166,7 +166,7 @@
}, },
{ {
"ImportPath": "github.com/jbenet/go-datastore", "ImportPath": "github.com/jbenet/go-datastore",
"Rev": "bec407bccea1cfaf56ee946e947642e3ac5a9258" "Rev": "19e39c85262aa4c796b26346f3e1937711ffe2bf"
}, },
{ {
"ImportPath": "github.com/jbenet/go-detect-race", "ImportPath": "github.com/jbenet/go-detect-race",

View File

@ -9,6 +9,7 @@ import (
"io/ioutil" "io/ioutil"
"os" "os"
"path" "path"
"path/filepath"
"strings" "strings"
"time" "time"
@ -314,52 +315,33 @@ func (fs *Datastore) Query(q query.Query) (query.Results, error) {
return nil, errors.New("flatfs only supports listing all keys in random order") return nil, errors.New("flatfs only supports listing all keys in random order")
} }
// TODO this dumb implementation gathers all keys into a single slice. reschan := make(chan query.Result)
root, err := os.Open(fs.path) go func() {
if err != nil { defer close(reschan)
return nil, err err := filepath.Walk(fs.path, func(path string, info os.FileInfo, err error) error {
}
defer root.Close()
var res []query.Entry if !info.Mode().IsRegular() || info.Name()[0] == '.' {
prefixes, err := root.Readdir(0) return nil
if err != nil { }
return nil, err
} key, ok := fs.decode(info.Name())
for _, fi := range prefixes { if !ok {
var err error log.Warning("failed to decode entry in flatfs")
res, err = fs.enumerateKeys(fi, res) return nil
}
reschan <- query.Result{
Entry: query.Entry{
Key: key.String(),
},
}
return nil
})
if err != nil { if err != nil {
return nil, err log.Warning("walk failed: ", err)
} }
} }()
return query.ResultsWithEntries(q, res), nil return query.ResultsWithChan(q, reschan), nil
}
func (fs *Datastore) enumerateKeys(fi os.FileInfo, res []query.Entry) ([]query.Entry, error) {
if !fi.IsDir() || fi.Name()[0] == '.' {
return res, nil
}
child, err := os.Open(path.Join(fs.path, fi.Name()))
if err != nil {
return nil, err
}
defer child.Close()
objs, err := child.Readdir(0)
if err != nil {
return nil, err
}
for _, fi := range objs {
if !fi.Mode().IsRegular() || fi.Name()[0] == '.' {
return res, nil
}
key, ok := fs.decode(fi.Name())
if !ok {
return res, nil
}
res = append(res, query.Entry{Key: key.String()})
}
return res, nil
} }
func (fs *Datastore) Close() error { func (fs *Datastore) Close() error {