decred.org/dcrdex@v1.0.5/server/db/driver.go (about) 1 // This code is available on the terms of the project LICENSE.md file, 2 // also available online at https://blueoakcouncil.org/license/1.0.0. 3 4 package db 5 6 import ( 7 "context" 8 "fmt" 9 "sync" 10 11 "decred.org/dcrdex/dex" 12 ) 13 14 var ( 15 driversMtx sync.Mutex 16 drivers = make(map[string]Driver) 17 ) 18 19 // Driver is the interface required of all DB drivers. Open should create a 20 // DEXArchivist and verify connectivity with the asset's chain server. 21 type Driver interface { 22 Open(ctx context.Context, cfg any) (DEXArchivist, error) 23 UseLogger(logger dex.Logger) 24 } 25 26 // Register should be called by the init function of an DB driver's package. 27 func Register(name string, driver Driver) { 28 driversMtx.Lock() 29 defer driversMtx.Unlock() 30 31 if driver == nil { 32 panic("db: Register driver is nil") 33 } 34 if _, dup := drivers[name]; dup { 35 panic("db: Register called twice for asset driver " + name) 36 } 37 drivers[name] = driver 38 } 39 40 // Open loads the named DB driver with the provided configuration. 41 func Open(ctx context.Context, name string, cfg any) (DEXArchivist, error) { 42 driversMtx.Lock() 43 drv, ok := drivers[name] 44 driversMtx.Unlock() 45 if !ok { 46 return nil, fmt.Errorf("db: unknown database driver %q", name) 47 } 48 return drv.Open(ctx, cfg) 49 } 50 51 // UseLogger sets the logger to use for all of the DB Drivers. 52 func UseLogger(logger dex.Logger) { 53 driversMtx.Lock() 54 for _, drv := range drivers { 55 drv.UseLogger(logger) 56 } 57 driversMtx.Unlock() 58 }