use encoded (pretty) keys only on fs ds
Juan Batiz-Benet committed
Oct 8, 2014 at 14:49 UTC
dc6fdd39c58264fd206c54a9fc793a0a01ebe19b
2 files changed
+29
-5
core/datastore.go
+5
-1
@@ -5,9 +5,12 @@ import (
5
6
ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go"
7
fsds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go/fs"
8
+ ktds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go/keytransform"
9
lds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go/leveldb"
10
syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go/sync"
11
+
12
config "github.com/jbenet/go-ipfs/config"
13
+ u "github.com/jbenet/go-ipfs/util"
14
)
15
16
func makeDatastore(cfg config.Datastore) (ds.ThreadSafeDatastore, error) {
@@ -28,7 +31,8 @@ func makeDatastore(cfg config.Datastore) (ds.ThreadSafeDatastore, error) {
31
if err != nil {
32
return nil, err
33
}
31
- return syncds.MutexWrap(d), nil
34
+ ktd := ktds.WrapDatastore(d, u.DsKeyB58Encode)
35
+ return syncds.MutexWrap(ktd), nil
36
}
37
38
return nil, fmt.Errorf("Unknown datastore type: %s", cfg.Type)
util/util.go
+24
-4
@@ -55,14 +55,34 @@ func (k Key) Pretty() string {
55
56
// DsKey returns a Datastore key
57
func (k Key) DsKey() ds.Key {
58
- return ds.NewKey(k.Pretty())
58
+ return ds.NewKey(string(k))
59
}
60
61
// KeyFromDsKey returns a Datastore key
62
func KeyFromDsKey(dsk ds.Key) Key {
63
- l := dsk.List()
64
- enc := l[len(l)-1]
65
- return Key(b58.Decode(enc))
63
+ return Key(dsk.BaseNamespace())
64
+}
65
+
66
+// DsKeyB58Encode returns a B58 encoded Datastore key
67
+// TODO: this is hacky because it encodes every path component. some
68
+// path components may be proper strings already...
69
+func DsKeyB58Encode(dsk ds.Key) ds.Key {
70
+ k := ds.NewKey("/")
71
+ for _, n := range dsk.Namespaces() {
72
+ k = k.Child(b58.Encode([]byte(n)))
73
+ }
74
+ return k
75
+}
76
+
77
+// DsKeyB58Decode returns a b58 decoded Datastore key
78
+// TODO: this is hacky because it encodes every path component. some
79
+// path components may be proper strings already...
80
+func DsKeyB58Decode(dsk ds.Key) ds.Key {
81
+ k := ds.NewKey("/")
82
+ for _, n := range dsk.Namespaces() {
83
+ k = k.Child(string(b58.Decode(n)))
84
+ }
85
+ return k
86
}
87
88
// Hash is the global IPFS hash function. uses multihash SHA2_256, 256 bits