diff --git a/cayley.go b/cayley.go index c68d487..b6017ce 100644 --- a/cayley.go +++ b/cayley.go @@ -134,6 +134,6 @@ func main() { flag.Usage() } if err != nil { - glog.Fatalln(err) + glog.Errorln(err) } } diff --git a/db/init.go b/db/init.go index a791a8f..650a854 100644 --- a/db/init.go +++ b/db/init.go @@ -15,11 +15,20 @@ package db import ( + "errors" + "fmt" + "github.com/google/cayley/config" "github.com/google/cayley/graph" ) +var ErrNotPersistent = errors.New("database type is not persistent") + func Init(cfg *config.Config, triplePath string) error { + if !graph.IsPersistent(cfg.DatabaseType) { + return fmt.Errorf("ignoring unproductive database initialization request: %v", ErrNotPersistent) + } + err := graph.InitTripleStore(cfg.DatabaseType, cfg.DatabasePath, cfg.DatabaseOptions) if err != nil { return err diff --git a/db/open.go b/db/open.go index 3e1ee24..cef8127 100644 --- a/db/open.go +++ b/db/open.go @@ -28,8 +28,7 @@ func Open(cfg *config.Config) (graph.TripleStore, error) { return nil, err } - // Memstore is not persistent, so it MUST be loaded. - if cfg.DatabaseType == "memstore" { + if !graph.IsPersistent(cfg.DatabaseType) { err = Load(ts, cfg, cfg.DatabasePath) if err != nil { return nil, err diff --git a/graph/leveldb/triplestore.go b/graph/leveldb/triplestore.go index 1a305d2..7efb03f 100644 --- a/graph/leveldb/triplestore.go +++ b/graph/leveldb/triplestore.go @@ -34,7 +34,7 @@ import ( ) func init() { - graph.RegisterTripleStore("leveldb", newTripleStore, createNewLevelDB) + graph.RegisterTripleStore("leveldb", true, newTripleStore, createNewLevelDB) } const ( diff --git a/graph/memstore/triplestore.go b/graph/memstore/triplestore.go index 056998c..3641a60 100644 --- a/graph/memstore/triplestore.go +++ b/graph/memstore/triplestore.go @@ -26,7 +26,7 @@ import ( ) func init() { - graph.RegisterTripleStore("memstore", func(string, graph.Options) (graph.TripleStore, error) { + graph.RegisterTripleStore("memstore", false, func(string, graph.Options) (graph.TripleStore, error) { return newTripleStore(), nil }, nil) } diff --git a/graph/mongo/triplestore.go b/graph/mongo/triplestore.go index 20fea2f..364d195 100644 --- a/graph/mongo/triplestore.go +++ b/graph/mongo/triplestore.go @@ -30,7 +30,7 @@ import ( ) func init() { - graph.RegisterTripleStore("mongo", newTripleStore, createNewMongoGraph) + graph.RegisterTripleStore("mongo", true, newTripleStore, createNewMongoGraph) } // Guarantee we satisfy graph.Bulkloader. diff --git a/graph/triplestore.go b/graph/triplestore.go index b25ca74..9d45dd5 100644 --- a/graph/triplestore.go +++ b/graph/triplestore.go @@ -136,38 +136,45 @@ type BulkLoader interface { type NewStoreFunc func(string, Options) (TripleStore, error) type InitStoreFunc func(string, Options) error -var storeRegistry = make(map[string]NewStoreFunc) -var storeInitRegistry = make(map[string]InitStoreFunc) +type register struct { + newFunc NewStoreFunc + initFunc InitStoreFunc + isPersistent bool +} -func RegisterTripleStore(name string, newFunc NewStoreFunc, initFunc InitStoreFunc) { +var storeRegistry = make(map[string]register) + +func RegisterTripleStore(name string, persists bool, newFunc NewStoreFunc, initFunc InitStoreFunc) { if _, found := storeRegistry[name]; found { panic("already registered TripleStore " + name) } - storeRegistry[name] = newFunc - if initFunc != nil { - storeInitRegistry[name] = initFunc + storeRegistry[name] = register{ + newFunc: newFunc, + initFunc: initFunc, + isPersistent: persists, } } func NewTripleStore(name, dbpath string, opts Options) (TripleStore, error) { - newFunc, hasNew := storeRegistry[name] - if !hasNew { + r, registered := storeRegistry[name] + if !registered { return nil, errors.New("triplestore: name '" + name + "' is not registered") } - return newFunc(dbpath, opts) + return r.newFunc(dbpath, opts) } func InitTripleStore(name, dbpath string, opts Options) error { - initFunc, hasInit := storeInitRegistry[name] - if hasInit { - return initFunc(dbpath, opts) - } - if _, isRegistered := storeRegistry[name]; isRegistered { - return nil + r, registered := storeRegistry[name] + if registered { + return r.initFunc(dbpath, opts) } return errors.New("triplestore: name '" + name + "' is not registered") } +func IsPersistent(name string) bool { + return storeRegistry[name].isPersistent +} + func TripleStores() []string { t := make([]string, 0, len(storeRegistry)) for n := range storeRegistry {