Skip to content

Commit a23eb2a

Browse files
committed
--wip--
It doesn't work due to dep cycle License: MIT Signed-off-by: Jakub Sztandera <[email protected]>
1 parent a0be5f9 commit a23eb2a

File tree

9 files changed

+218
-159
lines changed

9 files changed

+218
-159
lines changed

repo/config/datastore.go

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package config
22

3+
import (
4+
cfgds "github.com/ipfs/go-ipfs/repo/config/datastore"
5+
)
6+
37
// DefaultDataStoreDirectory is the directory to store all the local IPFS data.
48
const DefaultDataStoreDirectory = "datastore"
59

@@ -11,7 +15,7 @@ type Datastore struct {
1115
Path string
1216
NoSync bool // deprecated
1317

14-
Spec map[string]interface{}
18+
Spec *cfgds.CoreCtor
1519

1620
HashOnRead bool
1721
BloomFilterSize int
@@ -23,21 +27,6 @@ type S3Datastore struct {
2327
ACL string `json:"acl"`
2428
}
2529

26-
type FlatDS struct {
27-
Path string
28-
ShardFunc string
29-
Sync bool
30-
}
31-
32-
type LevelDB struct {
33-
Path string
34-
Compression string
35-
}
36-
37-
type SbsDS struct {
38-
Path string
39-
}
40-
4130
// DataStorePath returns the default data store path given a configuration root
4231
// (set an empty string to have the default configuration root)
4332
func DataStorePath(configroot string) (string, error) {

repo/config/datastore/ctor.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package cfgds
2+
3+
import (
4+
"github.com/ipfs/go-ipfs/repo"
5+
6+
ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore"
7+
)
8+
9+
var (
10+
fErrUnknownDatastoreType = "unknown datastore: %s"
11+
)
12+
13+
// Ctor interface is used to create Datastore from config specification
14+
type Ctor interface {
15+
Create(repo.Repo) (repo.Datastore, error)
16+
}
17+
18+
type memCtor struct{}
19+
20+
func (_ *memCtor) Create(_ repo.Repo) (repo.Datastore, error) {
21+
return ds.NewMapDatastore(), nil
22+
}
23+
24+
var _ Ctor = (*memCtor)(nil)

repo/config/datastore/mount.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package cfgds
2+
3+
import "github.com/ipfs/go-ipfs/repo"
4+
5+
type mountCtor struct {
6+
Mounts map[string]*CoreCtor
7+
}
8+
9+
func (ctr mountCtor) Create(r repo.Repo) (repo.Datastore, error) {
10+
return nil, nil
11+
}
12+
13+
var _ Ctor = (*mountCtor)(nil)

repo/config/datastore/registry.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package cfgds
2+
3+
// CtorCtor is a function that creates new Ctors
4+
type CtorCtor func() Ctor
5+
6+
var registeredCtors = map[string]CtorCtor{
7+
"mem": func() Ctor { return &memCtor{} },
8+
}
9+
10+
// RegisterCtor allows for registration of Ctor under given name/type
11+
func RegisterCtor(name string, cctor CtorCtor) {
12+
registeredCtors[name] = cctor
13+
}

repo/config/datastore/trampoline.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package cfgds
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
7+
"github.com/ipfs/go-ipfs/repo"
8+
)
9+
10+
// CoreCtor is entrypoint and trampoline for other datastore Ctors
11+
type CoreCtor struct {
12+
sub Ctor
13+
}
14+
15+
func (tr *CoreCtor) UnmarshalJSON(data []byte) error {
16+
typeStruct := &struct {
17+
Type string
18+
}{}
19+
20+
err := json.Unmarshal(data, typeStruct)
21+
if err != nil {
22+
return err
23+
}
24+
25+
ctrctr, ok := registeredCtors[typeStruct.Type]
26+
if !ok {
27+
return fmt.Errorf(fErrUnknownDatastoreType, typeStruct.Type)
28+
}
29+
tr.sub = ctrctr()
30+
31+
return json.Unmarshal(data, tr.sub)
32+
}
33+
34+
func (tr *CoreCtor) Create(r repo.Repo) (repo.Datastore, error) {
35+
return tr.sub.Create(r)
36+
}
37+
38+
var _ json.Unmarshaler = (*CoreCtor)(nil)
39+
var _ Ctor = (*CoreCtor)(nil)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package cfgds
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
7+
ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore"
8+
)
9+
10+
func TestTrampolineToMem(t *testing.T) {
11+
in := []byte(`{ "type": "mem" }`)
12+
tr := &CoreCtor{}
13+
err := json.Unmarshal(in, tr)
14+
if err != nil {
15+
t.Fatal(err)
16+
}
17+
18+
uds, err := tr.Create()
19+
if err != nil {
20+
t.Fatal(err)
21+
}
22+
23+
_, ok := uds.(*ds.MapDatastore)
24+
if !ok {
25+
t.Fatal("wrong datastore type")
26+
}
27+
28+
}

repo/fsrepo/datastores.go

Lines changed: 0 additions & 138 deletions
This file was deleted.

repo/fsrepo/datstores.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package fsrepo
2+
3+
import (
4+
"errors"
5+
"path/filepath"
6+
7+
"github.com/ipfs/go-ipfs/repo"
8+
dcfg "github.com/ipfs/go-ipfs/repo/config/datastore"
9+
10+
flatfs "gx/ipfs/QmXZEfbEv9sXG9JnLoMNhREDMDgkq5Jd7uWJ7d77VJ4pxn/go-ds-flatfs"
11+
leveldb "gx/ipfs/QmaHHmfEozrrotyhyN44omJouyuEtx6ahddqV6W5yRaUSQ/go-ds-leveldb"
12+
ldbopts "gx/ipfs/QmbBhyDKsY4mbY6xsKt3qu9Y7FPvMJ6qbD8AMjYYvPRw1g/goleveldb/leveldb/opt"
13+
)
14+
15+
var (
16+
errNotFSRepo = errors.New("used repo is not FSRepo")
17+
)
18+
19+
func fsRepoOrError(r repo.Repo) (*FSRepo, error) {
20+
fsrepo, ok := r.(*FSRepo)
21+
if !ok {
22+
return nil, errNotFSRepo
23+
}
24+
return fsrepo, nil
25+
}
26+
27+
func relPath(fsrepo *FSRepo, p string) string {
28+
if !filepath.IsAbs(p) {
29+
p = filepath.Join(fsrepo.path, p)
30+
}
31+
return p
32+
}
33+
34+
func registerDStoreCtors() {
35+
dcfg.RegisterCtor("leveldb", func() dcfg.Ctor { return &levelDBCtor{} })
36+
dcfg.RegisterCtor("flatfs", func() dcfg.Ctor { return &flatfsCtor{} })
37+
}
38+
39+
type flatfsCtor struct {
40+
Path string
41+
ShardFunc string
42+
NoSync bool
43+
}
44+
45+
func (ctr *flatfsCtor) Create(r repo.Repo) (repo.Datastore, error) {
46+
fsrepo, err := fsRepoOrError(r)
47+
if err != nil {
48+
return nil, err
49+
}
50+
51+
p := relPath(fsrepo, ctr.Path)
52+
shardFunc, err := flatfs.ParseShardFunc(ctr.ShardFunc)
53+
if err != nil {
54+
return nil, err
55+
}
56+
57+
return flatfs.CreateOrOpen(p, shardFunc, ctr.NoSync)
58+
}
59+
60+
var _ dcfg.Ctor = (*flatfsCtor)(nil)
61+
62+
type levelDBCtor struct {
63+
Path string
64+
Compression string
65+
}
66+
67+
func (ctr *levelDBCtor) Create(r repo.Repo) (repo.Datastore, error) {
68+
fsrepo, err := fsRepoOrError(r)
69+
if err != nil {
70+
return nil, err
71+
}
72+
73+
p := relPath(fsrepo, ctr.Path)
74+
c := ldbopts.DefaultCompression
75+
switch ctr.Compression {
76+
case "none":
77+
c = ldbopts.NoCompression
78+
case "snappy":
79+
c = ldbopts.SnappyCompression
80+
}
81+
82+
return leveldb.NewDatastore(p, &leveldb.Options{
83+
Compression: c,
84+
})
85+
}
86+
87+
var _ dcfg.Ctor = (*levelDBCtor)(nil)

0 commit comments

Comments
 (0)