decred.org/dcrwallet/v3@v3.1.0/wallet/internal/bdb/driver.go (about)

     1  // Copyright (c) 2014 The btcsuite developers
     2  // Copyright (c) 2015 The Decred developers
     3  // Use of this source code is governed by an ISC
     4  // license that can be found in the LICENSE file.
     5  
     6  package bdb
     7  
     8  import (
     9  	"fmt"
    10  
    11  	"decred.org/dcrwallet/v3/errors"
    12  	"decred.org/dcrwallet/v3/wallet/walletdb"
    13  )
    14  
    15  const (
    16  	dbType = "bdb"
    17  )
    18  
    19  // parseArgs parses the arguments from the walletdb Open/Create methods.
    20  func parseArgs(funcName string, args ...interface{}) (string, error) {
    21  	if len(args) != 1 {
    22  		return "", errors.Errorf("invalid arguments to %s.%s -- "+
    23  			"expected database path", dbType, funcName)
    24  	}
    25  
    26  	dbPath, ok := args[0].(string)
    27  	if !ok {
    28  		return "", errors.Errorf("first argument to %s.%s is invalid -- "+
    29  			"expected database path string", dbType, funcName)
    30  	}
    31  
    32  	return dbPath, nil
    33  }
    34  
    35  // openDBDriver is the callback provided during driver registration that opens
    36  // an existing database for use.
    37  func openDBDriver(args ...interface{}) (walletdb.DB, error) {
    38  	dbPath, err := parseArgs("Open", args...)
    39  	if err != nil {
    40  		return nil, err
    41  	}
    42  
    43  	return openDB(dbPath, false)
    44  }
    45  
    46  // createDBDriver is the callback provided during driver registration that
    47  // creates, initializes, and opens a database for use.
    48  func createDBDriver(args ...interface{}) (walletdb.DB, error) {
    49  	dbPath, err := parseArgs("Create", args...)
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  
    54  	return openDB(dbPath, true)
    55  }
    56  
    57  func init() {
    58  	// Register the driver.
    59  	driver := walletdb.Driver{
    60  		DbType: dbType,
    61  		Create: createDBDriver,
    62  		Open:   openDBDriver,
    63  	}
    64  	if err := walletdb.RegisterDriver(driver); err != nil {
    65  		panic(fmt.Sprintf("Failed to register database driver '%s': %v",
    66  			dbType, err))
    67  	}
    68  }