github.com/decred/dcrlnd@v0.7.6/kvdb/etcd/driver.go (about) 1 //go:build kvdb_etcd 2 // +build kvdb_etcd 3 4 package etcd 5 6 import ( 7 "context" 8 "fmt" 9 10 "github.com/btcsuite/btcwallet/walletdb" 11 ) 12 13 const ( 14 dbType = "etcd" 15 ) 16 17 // parseArgs parses the arguments from the walletdb Open/Create methods. 18 func parseArgs(funcName string, args ...interface{}) (context.Context, 19 *Config, error) { 20 21 if len(args) != 2 { 22 return nil, nil, fmt.Errorf("invalid number of arguments to "+ 23 "%s.%s -- expected: context.Context, etcd.Config", 24 dbType, funcName, 25 ) 26 } 27 28 ctx, ok := args[0].(context.Context) 29 if !ok { 30 return nil, nil, fmt.Errorf("argument 0 to %s.%s is invalid "+ 31 "-- expected: context.Context", 32 dbType, funcName, 33 ) 34 } 35 36 config, ok := args[1].(*Config) 37 if !ok { 38 return nil, nil, fmt.Errorf("argument 1 to %s.%s is invalid -- "+ 39 "expected: etcd.Config", 40 dbType, funcName, 41 ) 42 } 43 44 return ctx, config, nil 45 } 46 47 // createDBDriver is the callback provided during driver registration that 48 // creates, initializes, and opens a database for use. 49 func createDBDriver(args ...interface{}) (walletdb.DB, error) { 50 ctx, config, err := parseArgs("Create", args...) 51 if err != nil { 52 return nil, err 53 } 54 55 return newEtcdBackend(ctx, *config) 56 } 57 58 // openDBDriver is the callback provided during driver registration that opens 59 // an existing database for use. 60 func openDBDriver(args ...interface{}) (walletdb.DB, error) { 61 ctx, config, err := parseArgs("Open", args...) 62 if err != nil { 63 return nil, err 64 } 65 66 return newEtcdBackend(ctx, *config) 67 } 68 69 func init() { 70 // Register the driver. 71 driver := walletdb.Driver{ 72 DbType: dbType, 73 Create: createDBDriver, 74 Open: openDBDriver, 75 } 76 if err := walletdb.RegisterDriver(driver); err != nil { 77 panic(fmt.Sprintf("Failed to regiser database driver '%s': %v", 78 dbType, err)) 79 } 80 }