master
go 90 lines 1.87 KB
Raw
1 package flatfs
2
3 import (
4 "fmt"
5 "path/filepath"
6
7 "github.com/ipfs/kubo/plugin"
8 "github.com/ipfs/kubo/repo"
9 "github.com/ipfs/kubo/repo/fsrepo"
10
11 flatfs "github.com/ipfs/go-ds-flatfs"
12 )
13
14 // Plugins is exported list of plugins that will be loaded.
15 var Plugins = []plugin.Plugin{
16 &flatfsPlugin{},
17 }
18
19 type flatfsPlugin struct{}
20
21 var _ plugin.PluginDatastore = (*flatfsPlugin)(nil)
22
23 func (*flatfsPlugin) Name() string {
24 return "ds-flatfs"
25 }
26
27 func (*flatfsPlugin) Version() string {
28 return "0.1.0"
29 }
30
31 func (*flatfsPlugin) Init(_ *plugin.Environment) error {
32 return nil
33 }
34
35 func (*flatfsPlugin) DatastoreTypeName() string {
36 return "flatfs"
37 }
38
39 type datastoreConfig struct {
40 path string
41 shardFun *flatfs.ShardIdV1
42 syncField bool
43 }
44
45 // DatastoreConfigParser returns a configuration stub for a flatfs datastore
46 // from the given parameters.
47 func (*flatfsPlugin) DatastoreConfigParser() fsrepo.ConfigFromMap {
48 return func(params map[string]any) (fsrepo.DatastoreConfig, error) {
49 var c datastoreConfig
50 var ok bool
51 var err error
52
53 c.path, ok = params["path"].(string)
54 if !ok {
55 return nil, fmt.Errorf("'path' field is missing or not boolean")
56 }
57
58 sshardFun, ok := params["shardFunc"].(string)
59 if !ok {
60 return nil, fmt.Errorf("'shardFunc' field is missing or not a string")
61 }
62 c.shardFun, err = flatfs.ParseShardFunc(sshardFun)
63 if err != nil {
64 return nil, err
65 }
66
67 c.syncField, ok = params["sync"].(bool)
68 if !ok {
69 return nil, fmt.Errorf("'sync' field is missing or not boolean")
70 }
71 return &c, nil
72 }
73 }
74
75 func (c *datastoreConfig) DiskSpec() fsrepo.DiskSpec {
76 return map[string]any{
77 "type": "flatfs",
78 "path": c.path,
79 "shardFunc": c.shardFun.String(),
80 }
81 }
82
83 func (c *datastoreConfig) Create(path string) (repo.Datastore, error) {
84 p := c.path
85 if !filepath.IsAbs(p) {
86 p = filepath.Join(path, p)
87 }
88
89 return flatfs.CreateOrOpen(p, c.shardFun, c.syncField)
90 }