database: update driver functions to include dbType parameter

This commit is contained in:
Kim 2025-03-07 18:14:52 +09:00
parent 2a64716b1c
commit 245d143e9a
5 changed files with 36 additions and 30 deletions

View file

@ -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...)
} }

View file

@ -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
} }

View file

@ -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.

View file

@ -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))
}
} }
} }

View file

@ -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)