package kvdb import ( "fmt" "os" "path/filepath" "github.com/lightningnetwork/lnd/channeldb/kvdb/etcd" ) // fileExists returns true if the file exists, and false otherwise. func fileExists(path string) bool { if _, err := os.Stat(path); err != nil { if os.IsNotExist(err) { return false } } return true } // GetBoltBackend opens (or creates if doesn't exits) a bbolt // backed database and returns a kvdb.Backend wrapping it. func GetBoltBackend(path, name string, noFreeListSync bool) (Backend, error) { dbFilePath := filepath.Join(path, name) var ( db Backend err error ) if !fileExists(dbFilePath) { if !fileExists(path) { if err := os.MkdirAll(path, 0700); err != nil { return nil, err } } db, err = Create(BoltBackendName, dbFilePath, noFreeListSync) } else { db, err = Open(BoltBackendName, dbFilePath, noFreeListSync) } if err != nil { return nil, err } return db, nil } // GetTestBackend opens (or creates if doesn't exist) a bbolt or etcd // backed database (for testing), and returns a kvdb.Backend and a cleanup // func. Whether to create/open bbolt or embedded etcd database is based // on the TestBackend constant which is conditionally compiled with build tag. // The passed path is used to hold all db files, while the name is only used // for bbolt. func GetTestBackend(path, name string) (Backend, func(), error) { empty := func() {} if TestBackend == BoltBackendName { db, err := GetBoltBackend(path, name, true) if err != nil { return nil, nil, err } return db, empty, nil } else if TestBackend == EtcdBackendName { config, cleanup, err := etcd.NewEmbeddedEtcdInstance(path) if err != nil { return nil, nil, err } backend, err := Open(EtcdBackendName, *config) if err != nil { cleanup() return nil, nil, err } return backend, cleanup, nil } return nil, nil, fmt.Errorf("unknown backend") }