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