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  }