github.com/evdatsion/aphelion-dpos-bft@v0.32.1/libs/db/db.go (about) 1 package db 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 type DBBackendType string 9 10 // These are valid backend types. 11 const ( 12 // GoLevelDBBackend represents goleveldb (github.com/syndtr/goleveldb - most 13 // popular implementation) 14 // - pure go 15 // - stable 16 GoLevelDBBackend DBBackendType = "goleveldb" 17 // CLevelDBBackend represents cleveldb (uses levigo wrapper) 18 // - fast 19 // - requires gcc 20 // - use cleveldb build tag (go build -tags cleveldb) 21 CLevelDBBackend DBBackendType = "cleveldb" 22 // MemDBBackend represents in-memoty key value store, which is mostly used 23 // for testing. 24 MemDBBackend DBBackendType = "memdb" 25 // FSDBBackend represents filesystem database 26 // - EXPERIMENTAL 27 // - slow 28 FSDBBackend DBBackendType = "fsdb" 29 // BoltDBBackend represents bolt (uses etcd's fork of bolt - 30 // github.com/etcd-io/bbolt) 31 // - EXPERIMENTAL 32 // - may be faster is some use-cases (random reads - indexer) 33 // - use boltdb build tag (go build -tags boltdb) 34 BoltDBBackend DBBackendType = "boltdb" 35 ) 36 37 type dbCreator func(name string, dir string) (DB, error) 38 39 var backends = map[DBBackendType]dbCreator{} 40 41 func registerDBCreator(backend DBBackendType, creator dbCreator, force bool) { 42 _, ok := backends[backend] 43 if !force && ok { 44 return 45 } 46 backends[backend] = creator 47 } 48 49 // NewDB creates a new database of type backend with the given name. 50 // NOTE: function panics if: 51 // - backend is unknown (not registered) 52 // - creator function, provided during registration, returns error 53 func NewDB(name string, backend DBBackendType, dir string) DB { 54 dbCreator, ok := backends[backend] 55 if !ok { 56 keys := make([]string, len(backends)) 57 i := 0 58 for k := range backends { 59 keys[i] = string(k) 60 i++ 61 } 62 panic(fmt.Sprintf("Unknown db_backend %s, expected either %s", backend, strings.Join(keys, " or "))) 63 } 64 65 db, err := dbCreator(name, dir) 66 if err != nil { 67 panic(fmt.Sprintf("Error initializing DB: %v", err)) 68 } 69 return db 70 }