@cryptotaxi247 / kubo / commits / 9ebf3ae64

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 +}