driver.go raw

   1  package ffldb
   2  
   3  import (
   4  	"fmt"
   5  	
   6  	"github.com/p9c/p9/pkg/database"
   7  	"github.com/p9c/p9/pkg/wire"
   8  )
   9  
  10  const (
  11  	dbType = "ffldb"
  12  )
  13  
  14  // parseArgs parses the arguments from the database Open/Create methods.
  15  func parseArgs(funcName string, args ...interface{}) (string, wire.BitcoinNet, error) {
  16  	if len(args) != 2 {
  17  		return "", 0, fmt.Errorf(
  18  			"invalid arguments to %s.%s -- "+
  19  				"expected database path and block network", dbType,
  20  			funcName,
  21  		)
  22  	}
  23  	dbPath, ok := args[0].(string)
  24  	if !ok {
  25  		return "", 0, fmt.Errorf(
  26  			"first argument to %s.%s is invalid -- "+
  27  				"expected database path string", dbType, funcName,
  28  		)
  29  	}
  30  	network, ok := args[1].(wire.BitcoinNet)
  31  	if !ok {
  32  		return "", 0, fmt.Errorf(
  33  			"second argument to %s.%s is invalid -- "+
  34  				"expected block network", dbType, funcName,
  35  		)
  36  	}
  37  	return dbPath, network, nil
  38  }
  39  
  40  // openDBDriver is the callback provided during driver registration that opens an existing database for use.
  41  func openDBDriver(args ...interface{}) (database.DB, error) {
  42  	dbPath, network, e := parseArgs("Open", args...)
  43  	if e != nil {
  44  		return nil, e
  45  	}
  46  	return openDB(dbPath, network, false)
  47  }
  48  
  49  // createDBDriver is the callback provided during driver registration that creates, initializes, and opens a database
  50  // for use.
  51  func createDBDriver(args ...interface{}) (database.DB, error) {
  52  	dbPath, network, e := parseArgs("Create", args...)
  53  	if e != nil {
  54  		return nil, e
  55  	}
  56  	return openDB(dbPath, network, true)
  57  }
  58  
  59  func init() {
  60  	T.Ln("registering ffldb database driver")
  61  	// Register the driver.
  62  	driver := database.Driver{
  63  		DbType: dbType,
  64  		Create: createDBDriver,
  65  		Open:   openDBDriver,
  66  	}
  67  	if e := database.RegisterDriver(driver); E.Chk(e) {
  68  		panic(
  69  			fmt.Sprintf(
  70  				"Failed to regiser database driver '%s': %v",
  71  				dbType, e,
  72  			),
  73  		)
  74  	}
  75  }
  76