spec out the interface change

This commit is contained in:
Barak Michener 2015-06-23 14:04:48 -04:00
parent e600e02514
commit 9155dc0c56
2 changed files with 98 additions and 17 deletions

View file

@ -0,0 +1,75 @@
// Copyright 2015 The Cayley Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +build !appengine
package main
import (
"errors"
"flag"
"github.com/google/cayley/config"
_ "github.com/google/cayley/graph"
// Load all supported backends.
"github.com/google/cayley/db"
_ "github.com/google/cayley/graph/bolt"
_ "github.com/google/cayley/graph/leveldb"
_ "github.com/google/cayley/graph/memstore"
_ "github.com/google/cayley/graph/mongo"
"github.com/google/cayley/internal"
)
var (
configFile = flag.String("config", "", "Path to an explicit configuration file.")
databasePath = flag.String("dbpath", "/tmp/testdb", "Path to the database.")
databaseBackend = flag.String("db", "memstore", "Database Backend.")
)
func configFrom(file string) *config.Config {
if cfg.DatabasePath == "" {
cfg.DatabasePath = *databasePath
}
if cfg.DatabaseType == "" {
cfg.DatabaseType = *databaseBackend
}
return cfg
}
func main() {
flag.Parse()
cfg := configFrom(*configFile)
r, registered := storeRegistry[*databaseBackend]
if registered {
return r.initFunc(dbpath, opts)
}
return errors.New("quadstore: name '" + name + "' is not registered")
if err != nil {
break
}
if *quadFile != "" {
handle, err = db.Open(cfg)
if err != nil {
break
}
err = internal.Load(handle.QuadWriter, cfg, *quadFile, *quadType)
if err != nil {
break
}
handle.Close()
}
}

View file

@ -150,27 +150,24 @@ type BulkLoader interface {
type NewStoreFunc func(string, Options) (QuadStore, error) type NewStoreFunc func(string, Options) (QuadStore, error)
type InitStoreFunc func(string, Options) error type InitStoreFunc func(string, Options) error
type UpgradeStoreFunc func(string, Options) error
type NewStoreForRequestFunc func(QuadStore, Options) (QuadStore, error) type NewStoreForRequestFunc func(QuadStore, Options) (QuadStore, error)
type register struct { type QuadStoreRegistration struct {
newFunc NewStoreFunc NewFunc NewStoreFunc
newForRequestFunc NewStoreForRequestFunc NewForRequestFunc NewStoreForRequestFunc
initFunc InitStoreFunc UpgradeFunc UpgradeStoreFunc
isPersistent bool InitFunc InitStoreFunc
IsPersistent bool
} }
var storeRegistry = make(map[string]register) var storeRegistry = make(map[string]QuadStoreRegistration)
func RegisterQuadStore(name string, persists bool, newFunc NewStoreFunc, initFunc InitStoreFunc, newForRequestFunc NewStoreForRequestFunc) { func RegisterQuadStore(name string, register QuadStoreRegistration) {
if _, found := storeRegistry[name]; found { if _, found := storeRegistry[name]; found {
panic("already registered QuadStore " + name) panic("already registered QuadStore " + name)
} }
storeRegistry[name] = register{ storeRegistry[name] = register
newFunc: newFunc,
initFunc: initFunc,
newForRequestFunc: newForRequestFunc,
isPersistent: persists,
}
} }
func NewQuadStore(name, dbpath string, opts Options) (QuadStore, error) { func NewQuadStore(name, dbpath string, opts Options) (QuadStore, error) {
@ -178,13 +175,13 @@ func NewQuadStore(name, dbpath string, opts Options) (QuadStore, error) {
if !registered { if !registered {
return nil, errors.New("quadstore: name '" + name + "' is not registered") return nil, errors.New("quadstore: name '" + name + "' is not registered")
} }
return r.newFunc(dbpath, opts) return r.NewFunc(dbpath, opts)
} }
func InitQuadStore(name, dbpath string, opts Options) error { func InitQuadStore(name, dbpath string, opts Options) error {
r, registered := storeRegistry[name] r, registered := storeRegistry[name]
if registered { if registered {
return r.initFunc(dbpath, opts) return r.InitFunc(dbpath, opts)
} }
return errors.New("quadstore: name '" + name + "' is not registered") return errors.New("quadstore: name '" + name + "' is not registered")
} }
@ -192,13 +189,22 @@ func InitQuadStore(name, dbpath string, opts Options) error {
func NewQuadStoreForRequest(qs QuadStore, opts Options) (QuadStore, error) { func NewQuadStoreForRequest(qs QuadStore, opts Options) (QuadStore, error) {
r, registered := storeRegistry[qs.Type()] r, registered := storeRegistry[qs.Type()]
if registered { if registered {
return r.newForRequestFunc(qs, opts) return r.NewForRequestFunc(qs, opts)
} }
return nil, errors.New("QuadStore does not support Per Request construction, check config") return nil, errors.New("QuadStore does not support Per Request construction, check config")
} }
func UpgradeQuadStore(name, dbpath string, opts Options) error {
r, registered := storeRegistry[name]
if registered {
return r.UpgradeFunc(dbpath, opts)
}
return errors.New("quadstore: name '" + name + "' is not registered")
}
func IsPersistent(name string) bool { func IsPersistent(name string) bool {
return storeRegistry[name].isPersistent return storeRegistry[name].IsPersistent
} }
func QuadStores() []string { func QuadStores() []string {