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  }