|
package db
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type DBBackendType string
|
|
|
|
// These are valid backend types.
|
|
const (
|
|
// LevelDBBackend is a legacy type. Defaults to goleveldb unless cleveldb
|
|
// build tag was used, in which it becomes cleveldb.
|
|
// Deprecated: Use concrete types (golevedb, cleveldb, etc.)
|
|
LevelDBBackend DBBackendType = "leveldb"
|
|
// GoLevelDBBackend represents goleveldb (github.com/syndtr/goleveldb - most
|
|
// popular implementation)
|
|
// - pure go
|
|
// - stable
|
|
GoLevelDBBackend DBBackendType = "goleveldb"
|
|
// CLevelDBBackend represents cleveldb (uses levigo wrapper)
|
|
// - fast
|
|
// - requires gcc
|
|
// - use cleveldb build tag (go build -tags cleveldb)
|
|
CLevelDBBackend DBBackendType = "cleveldb"
|
|
// MemDBBackend represents in-memoty key value store, which is mostly used
|
|
// for testing.
|
|
MemDBBackend DBBackendType = "memdb"
|
|
// FSDBBackend represents filesystem database
|
|
// - EXPERIMENTAL
|
|
// - slow
|
|
FSDBBackend DBBackendType = "fsdb"
|
|
// BoltDBBackend represents bolt (uses etcd's fork of bolt -
|
|
// github.com/etcd-io/bbolt)
|
|
// - EXPERIMENTAL
|
|
// - may be faster is some use-cases (random reads - indexer)
|
|
// - use boltdb build tag (go build -tags boltdb)
|
|
BoltDBBackend DBBackendType = "boltdb"
|
|
)
|
|
|
|
type dbCreator func(name string, dir string) (DB, error)
|
|
|
|
var backends = map[DBBackendType]dbCreator{}
|
|
|
|
func registerDBCreator(backend DBBackendType, creator dbCreator, force bool) {
|
|
_, ok := backends[backend]
|
|
if !force && ok {
|
|
return
|
|
}
|
|
backends[backend] = creator
|
|
}
|
|
|
|
// NewDB creates a new database of type backend with the given name.
|
|
// NOTE: function panics if:
|
|
// - backend is unknown (not registered)
|
|
// - creator function, provided during registration, returns error
|
|
func NewDB(name string, backend DBBackendType, dir string) DB {
|
|
dbCreator, ok := backends[backend]
|
|
if !ok {
|
|
keys := make([]string, len(backends))
|
|
i := 0
|
|
for k := range backends {
|
|
keys[i] = string(k)
|
|
i++
|
|
}
|
|
panic(fmt.Sprintf("Unknown db_backend %s, expected either %s", backend, strings.Join(keys, " or ")))
|
|
}
|
|
|
|
db, err := dbCreator(name, dir)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("Error initializing DB: %v", err))
|
|
}
|
|
return db
|
|
}
|