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