keytransform ds
Juan Batiz-Benet committed
Oct 8, 2014 at 14:33 UTC
9ebf3ae64081a943dadc7f361f7b27e4eced67a7
3 files changed
+149
-1
Godeps/Godeps.json
+1
-1
@@ -64,7 +64,7 @@
64
},
65
{
66
"ImportPath": "github.com/jbenet/datastore.go",
67
- "Rev": "e7d6f7cb9e3c207a04c5397c449d10a6f9d403a0"
67
+ "Rev": "60ebc56447b5a8264cfed3ae3ff48deb984d7cf1"
68
},
69
{
70
"ImportPath": "github.com/jbenet/go-base58",
Godeps/_workspace/src/github.com/jbenet/datastore.go/keytransform/keytransform.go
new
+88
@@ -0,0 +1,88 @@
1
+package keytransform
2
+
3
+import ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go"
4
+
5
+// KeyTransform is a function that transforms one key into another.
6
+type KeyTransform func(ds.Key) ds.Key
7
+
8
+// Datastore is a keytransform.Datastore
9
+type Datastore interface {
10
+ ds.Shim
11
+
12
+ // Transform runs the transformation function
13
+ Transform(ds.Key) ds.Key
14
+
15
+ // TransformFunc returns the KeyTransform function
16
+ TransformFunc() KeyTransform
17
+}
18
+
19
+// ktds keeps a KeyTransform function
20
+type ktds struct {
21
+ child ds.Datastore
22
+ xform KeyTransform
23
+}
24
+
25
+// WrapDatastore wraps a given datastore with a KeyTransform function.
26
+// The resulting wrapped datastore will use the transform on all Datastore
27
+// operations.
28
+func WrapDatastore(child ds.Datastore, f KeyTransform) Datastore {
29
+ if f == nil {
30
+ panic("f (KeyTransform) is nil")
31
+ }
32
+
33
+ if child == nil {
34
+ panic("child (ds.Datastore) is nil")
35
+ }
36
+
37
+ return &ktds{child, f}
38
+}
39
+
40
+// TransformFunc returns the KeyTransform function
41
+func (d *ktds) TransformFunc() KeyTransform {
42
+ return d.xform
43
+}
44
+
45
+// Transform runs the KeyTransform function
46
+func (d *ktds) Transform(k ds.Key) ds.Key {
47
+ return d.xform(k)
48
+}
49
+
50
+// Children implements ds.Shim
51
+func (d *ktds) Children() []ds.Datastore {
52
+ return []ds.Datastore{d.child}
53
+}
54
+
55
+// Put stores the given value, transforming the key first.
56
+func (d *ktds) Put(key ds.Key, value interface{}) (err error) {
57
+ return d.child.Put(d.Transform(key), value)
58
+}
59
+
60
+// Get returns the value for given key, transforming the key first.
61
+func (d *ktds) Get(key ds.Key) (value interface{}, err error) {
62
+ return d.child.Get(d.Transform(key))
63
+}
64
+
65
+// Has returns whether the datastore has a value for a given key, transforming
66
+// the key first.
67
+func (d *ktds) Has(key ds.Key) (exists bool, err error) {
68
+ return d.child.Has(d.Transform(key))
69
+}
70
+
71
+// Delete removes the value for given key
72
+func (d *ktds) Delete(key ds.Key) (err error) {
73
+ return d.child.Delete(d.Transform(key))
74
+}
75
+
76
+// KeyList returns a list of all keys in the datastore, transforming keys out.
77
+func (d *ktds) KeyList() ([]ds.Key, error) {
78
+
79
+ keys, err := d.child.KeyList()
80
+ if err != nil {
81
+ return nil, err
82
+ }
83
+
84
+ for i, k := range keys {
85
+ keys[i] = d.Transform(k)
86
+ }
87
+ return keys, nil
88
+}
Godeps/_workspace/src/github.com/jbenet/datastore.go/keytransform/keytransform_test.go
new
+60
@@ -0,0 +1,60 @@
1
+package keytransform_test
2
+
3
+import (
4
+ "bytes"
5
+ "testing"
6
+
7
+ ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go"
8
+ kt "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go/keytransform"
9
+ . "launchpad.net/gocheck"
10
+)
11
+
12
+// Hook up gocheck into the "go test" runner.
13
+func Test(t *testing.T) { TestingT(t) }
14
+
15
+type DSSuite struct {
16
+ dir string
17
+ ds ds.Datastore
18
+}
19
+
20
+var _ = Suite(&DSSuite{})
21
+
22
+func (ks *DSSuite) TestBasic(c *C) {
23
+
24
+ mpds := ds.NewMapDatastore()
25
+ ktds := kt.WrapDatastore(mpds, func(k ds.Key) ds.Key {
26
+ return k.Reverse()
27
+ })
28
+
29
+ keys := strsToKeys([]string{
30
+ "foo",
31
+ "foo/bar",
32
+ "foo/bar/baz",
33
+ "foo/barb",
34
+ "foo/bar/bazb",
35
+ "foo/bar/baz/barb",
36
+ })
37
+
38
+ for _, k := range keys {
39
+ err := ktds.Put(k, []byte(k.String()))
40
+ c.Check(err, Equals, nil)
41
+ }
42
+
43
+ for _, k := range keys {
44
+ v1, err := ktds.Get(k)
45
+ c.Check(err, Equals, nil)
46
+ c.Check(bytes.Equal(v1.([]byte), []byte(k.String())), Equals, true)
47
+
48
+ v2, err := mpds.Get(k.Reverse())
49
+ c.Check(err, Equals, nil)
50
+ c.Check(bytes.Equal(v2.([]byte), []byte(k.String())), Equals, true)
51
+ }
52
+}
53
+
54
+func strsToKeys(strs []string) []ds.Key {
55
+ keys := make([]ds.Key, len(strs))
56
+ for i, s := range strs {
57
+ keys[i] = ds.NewKey(s)
58
+ }
59
+ return keys
60
+}