mirror of
https://github.com/btcsuite/btcd.git
synced 2025-03-15 04:11:37 +01:00
database: update driver functions to include dbType parameter
This commit is contained in:
parent
2a64716b1c
commit
245d143e9a
5 changed files with 36 additions and 30 deletions
|
@ -20,12 +20,12 @@ type Driver struct {
|
||||||
// Create is the function that will be invoked with all user-specified
|
// Create is the function that will be invoked with all user-specified
|
||||||
// arguments to create the database. This function must return
|
// arguments to create the database. This function must return
|
||||||
// ErrDbExists if the database already exists.
|
// ErrDbExists if the database already exists.
|
||||||
Create func(args ...interface{}) (DB, error)
|
Create func(dbType string, args ...interface{}) (DB, error)
|
||||||
|
|
||||||
// Open is the function that will be invoked with all user-specified
|
// Open is the function that will be invoked with all user-specified
|
||||||
// arguments to open the database. This function must return
|
// arguments to open the database. This function must return
|
||||||
// ErrDbDoesNotExist if the database has not already been created.
|
// ErrDbDoesNotExist if the database has not already been created.
|
||||||
Open func(args ...interface{}) (DB, error)
|
Open func(dbType string, args ...interface{}) (DB, error)
|
||||||
|
|
||||||
// UseLogger uses a specified Logger to output package logging info.
|
// UseLogger uses a specified Logger to output package logging info.
|
||||||
UseLogger func(logger btclog.Logger)
|
UseLogger func(logger btclog.Logger)
|
||||||
|
@ -70,7 +70,7 @@ func Create(dbType string, args ...interface{}) (DB, error) {
|
||||||
return nil, makeError(ErrDbUnknownType, str, nil)
|
return nil, makeError(ErrDbUnknownType, str, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
return drv.Create(args...)
|
return drv.Create(dbType, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open opens an existing database for the specified type. The arguments are
|
// Open opens an existing database for the specified type. The arguments are
|
||||||
|
@ -85,5 +85,5 @@ func Open(dbType string, args ...interface{}) (DB, error) {
|
||||||
return nil, makeError(ErrDbUnknownType, str, nil)
|
return nil, makeError(ErrDbUnknownType, str, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
return drv.Open(args...)
|
return drv.Open(dbType, args...)
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,7 @@ func TestAddDuplicateDriver(t *testing.T) {
|
||||||
// driver function and intentionally returns a failure that can be
|
// driver function and intentionally returns a failure that can be
|
||||||
// detected if the interface allows a duplicate driver to overwrite an
|
// detected if the interface allows a duplicate driver to overwrite an
|
||||||
// existing one.
|
// existing one.
|
||||||
bogusCreateDB := func(args ...interface{}) (database.DB, error) {
|
bogusCreateDB := func(dbType string, args ...interface{}) (database.DB, error) {
|
||||||
return nil, fmt.Errorf("duplicate driver allowed for database "+
|
return nil, fmt.Errorf("duplicate driver allowed for database "+
|
||||||
"type [%v]", dbType)
|
"type [%v]", dbType)
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ func TestCreateOpenFail(t *testing.T) {
|
||||||
dbType := "createopenfail"
|
dbType := "createopenfail"
|
||||||
openError := fmt.Errorf("failed to create or open database for "+
|
openError := fmt.Errorf("failed to create or open database for "+
|
||||||
"database type [%v]", dbType)
|
"database type [%v]", dbType)
|
||||||
bogusCreateDB := func(args ...interface{}) (database.DB, error) {
|
bogusCreateDB := func(dbType string, args ...interface{}) (database.DB, error) {
|
||||||
return nil, openError
|
return nil, openError
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1860,6 +1860,8 @@ func (tx *transaction) Rollback() error {
|
||||||
// the database.DB interface. All database access is performed through
|
// the database.DB interface. All database access is performed through
|
||||||
// transactions which are obtained through the specific Namespace.
|
// transactions which are obtained through the specific Namespace.
|
||||||
type db struct {
|
type db struct {
|
||||||
|
dbType string
|
||||||
|
|
||||||
writeLock sync.Mutex // Limit to one write transaction at a time.
|
writeLock sync.Mutex // Limit to one write transaction at a time.
|
||||||
closeLock sync.RWMutex // Make database close block while txns active.
|
closeLock sync.RWMutex // Make database close block while txns active.
|
||||||
closed bool // Is the database closed?
|
closed bool // Is the database closed?
|
||||||
|
@ -1875,7 +1877,7 @@ var _ database.DB = (*db)(nil)
|
||||||
//
|
//
|
||||||
// This function is part of the database.DB interface implementation.
|
// This function is part of the database.DB interface implementation.
|
||||||
func (db *db) Type() string {
|
func (db *db) Type() string {
|
||||||
return dbType
|
return db.dbType
|
||||||
}
|
}
|
||||||
|
|
||||||
// begin is the implementation function for the Begin database method. See its
|
// begin is the implementation function for the Begin database method. See its
|
||||||
|
@ -2115,7 +2117,7 @@ func initDB(ldb *leveldb.DB) error {
|
||||||
|
|
||||||
// openDB opens the database at the provided path. database.ErrDbDoesNotExist
|
// openDB opens the database at the provided path. database.ErrDbDoesNotExist
|
||||||
// is returned if the database doesn't exist and the create flag is not set.
|
// is returned if the database doesn't exist and the create flag is not set.
|
||||||
func openDB(dbPath string, network wire.BitcoinNet, create bool) (database.DB, error) {
|
func openDB(dbType string, dbPath string, network wire.BitcoinNet, create bool) (database.DB, error) {
|
||||||
// Error if the database doesn't exist and the create flag is not set.
|
// Error if the database doesn't exist and the create flag is not set.
|
||||||
metadataDbPath := filepath.Join(dbPath, metadataDbName)
|
metadataDbPath := filepath.Join(dbPath, metadataDbName)
|
||||||
dbExists := fileExists(metadataDbPath)
|
dbExists := fileExists(metadataDbPath)
|
||||||
|
@ -2154,7 +2156,7 @@ func openDB(dbPath string, network wire.BitcoinNet, create bool) (database.DB, e
|
||||||
return nil, convertErr(err.Error(), err)
|
return nil, convertErr(err.Error(), err)
|
||||||
}
|
}
|
||||||
cache := newDbCache(ldb, store, defaultCacheSize, defaultFlushSecs)
|
cache := newDbCache(ldb, store, defaultCacheSize, defaultFlushSecs)
|
||||||
pdb := &db{store: store, cache: cache}
|
pdb := &db{dbType: dbType, store: store, cache: cache}
|
||||||
|
|
||||||
// Perform any reconciliation needed between the block and metadata as
|
// Perform any reconciliation needed between the block and metadata as
|
||||||
// well as database initialization, if needed.
|
// well as database initialization, if needed.
|
||||||
|
|
|
@ -15,11 +15,11 @@ import (
|
||||||
var log = btclog.Disabled
|
var log = btclog.Disabled
|
||||||
|
|
||||||
const (
|
const (
|
||||||
dbType = "ffldb"
|
LevelDB = "ffldb"
|
||||||
)
|
)
|
||||||
|
|
||||||
// parseArgs parses the arguments from the database Open/Create methods.
|
// parseArgs parses the arguments from the database Open/Create methods.
|
||||||
func parseArgs(funcName string, args ...interface{}) (string, wire.BitcoinNet, error) {
|
func parseArgs(dbType, funcName string, args ...interface{}) (string, wire.BitcoinNet, error) {
|
||||||
if len(args) != 2 {
|
if len(args) != 2 {
|
||||||
return "", 0, fmt.Errorf("invalid arguments to %s.%s -- "+
|
return "", 0, fmt.Errorf("invalid arguments to %s.%s -- "+
|
||||||
"expected database path and block network", dbType,
|
"expected database path and block network", dbType,
|
||||||
|
@ -43,24 +43,24 @@ func parseArgs(funcName string, args ...interface{}) (string, wire.BitcoinNet, e
|
||||||
|
|
||||||
// openDBDriver is the callback provided during driver registration that opens
|
// openDBDriver is the callback provided during driver registration that opens
|
||||||
// an existing database for use.
|
// an existing database for use.
|
||||||
func openDBDriver(args ...interface{}) (database.DB, error) {
|
func openDBDriver(dbType string, args ...interface{}) (database.DB, error) {
|
||||||
dbPath, network, err := parseArgs("Open", args...)
|
dbPath, network, err := parseArgs(dbType, "Open", args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return openDB(dbPath, network, false)
|
return openDB(dbType, dbPath, network, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// createDBDriver is the callback provided during driver registration that
|
// createDBDriver is the callback provided during driver registration that
|
||||||
// creates, initializes, and opens a database for use.
|
// creates, initializes, and opens a database for use.
|
||||||
func createDBDriver(args ...interface{}) (database.DB, error) {
|
func createDBDriver(dbType string, args ...interface{}) (database.DB, error) {
|
||||||
dbPath, network, err := parseArgs("Create", args...)
|
dbPath, network, err := parseArgs(dbType, "Create", args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return openDB(dbPath, network, true)
|
return openDB(dbType, dbPath, network, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// useLogger is the callback provided during driver registration that sets the
|
// useLogger is the callback provided during driver registration that sets the
|
||||||
|
@ -70,15 +70,19 @@ func useLogger(logger btclog.Logger) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
// Register the driver.
|
// Register the drivers.
|
||||||
driver := database.Driver{
|
drivers := []database.Driver{
|
||||||
DbType: dbType,
|
{
|
||||||
Create: createDBDriver,
|
DbType: LevelDB,
|
||||||
Open: openDBDriver,
|
Create: createDBDriver,
|
||||||
UseLogger: useLogger,
|
Open: openDBDriver,
|
||||||
|
UseLogger: useLogger,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
if err := database.RegisterDriver(driver); err != nil {
|
for _, driver := range drivers {
|
||||||
panic(fmt.Sprintf("Failed to register database driver '%s': %v",
|
if err := database.RegisterDriver(driver); err != nil {
|
||||||
dbType, err))
|
panic(fmt.Sprintf("Failed to register database driver '%s': %v",
|
||||||
|
driver.DbType, err))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,7 +179,7 @@ func TestCornerCases(t *testing.T) {
|
||||||
// directory is needed.
|
// directory is needed.
|
||||||
testName := "openDB: fail due to file at target location"
|
testName := "openDB: fail due to file at target location"
|
||||||
wantErrCode := database.ErrDriverSpecific
|
wantErrCode := database.ErrDriverSpecific
|
||||||
idb, err := openDB(dbPath, blockDataNet, true)
|
idb, err := openDB(LevelDB, dbPath, blockDataNet, true)
|
||||||
if !checkDbError(t, testName, err, wantErrCode) {
|
if !checkDbError(t, testName, err, wantErrCode) {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
idb.Close()
|
idb.Close()
|
||||||
|
@ -191,7 +191,7 @@ func TestCornerCases(t *testing.T) {
|
||||||
// Remove the file and create the database to run tests against. It
|
// Remove the file and create the database to run tests against. It
|
||||||
// should be successful this time.
|
// should be successful this time.
|
||||||
_ = os.RemoveAll(dbPath)
|
_ = os.RemoveAll(dbPath)
|
||||||
idb, err = openDB(dbPath, blockDataNet, true)
|
idb, err = openDB(LevelDB, dbPath, blockDataNet, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("openDB: unexpected error: %v", err)
|
t.Errorf("openDB: unexpected error: %v", err)
|
||||||
return
|
return
|
||||||
|
@ -605,9 +605,9 @@ func TestFailureScenarios(t *testing.T) {
|
||||||
// Create a new database to run tests against.
|
// Create a new database to run tests against.
|
||||||
dbPath := filepath.Join(os.TempDir(), "ffldb-failurescenarios")
|
dbPath := filepath.Join(os.TempDir(), "ffldb-failurescenarios")
|
||||||
_ = os.RemoveAll(dbPath)
|
_ = os.RemoveAll(dbPath)
|
||||||
idb, err := database.Create(dbType, dbPath, blockDataNet)
|
idb, err := database.Create(LevelDB, dbPath, blockDataNet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Failed to create test database (%s) %v", dbType, err)
|
t.Errorf("Failed to create test database (%s) %v", LevelDB, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer os.RemoveAll(dbPath)
|
defer os.RemoveAll(dbPath)
|
||||||
|
|
Loading…
Add table
Reference in a new issue