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