diff --git a/go.mod b/go.mod index fcb0f36..9f02919 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,6 @@ require ( github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/urfave/cli/v2 v2.2.0 // indirect go.dedis.ch/fixbuf v1.0.3 // indirect - go.etcd.io/bbolt v1.3.5 // indirect golang.org/x/crypto v0.14.0 // indirect golang.org/x/sys v0.14.0 // indirect google.golang.org/protobuf v1.28.1 // indirect diff --git a/go.sum b/go.sum index 20b2090..86fb35b 100644 --- a/go.sum +++ b/go.sum @@ -156,7 +156,6 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/store/kv/blob.go b/store/kv/blob.go index af08f7f..0754583 100644 --- a/store/kv/blob.go +++ b/store/kv/blob.go @@ -6,6 +6,7 @@ import ( "go.dedis.ch/kyber/v3/util/key" "go.dedis.ch/libpurb/libpurb" "golang.org/x/xerrors" + "path/filepath" "go.dedis.ch/kyber/v3/util/random" ) @@ -13,13 +14,13 @@ import ( const numberOfRecipients = 1 // NewBlob creates a new blob -func NewBlob(keypair []key.Pair) *libpurb.Purb { +func NewBlob(path string) *libpurb.Purb { p := libpurb.NewPurb( getSuiteInfo(), false, random.New(), ) - p.Recipients = createRecipients(keypair) + p.Recipients = createRecipients(path) return p } @@ -64,27 +65,33 @@ func getSuiteInfo() libpurb.SuiteInfoMap { } // see example in libpurb -func createRecipients(keypair []key.Pair) []libpurb.Recipient { +func createRecipients(path string) []libpurb.Recipient { r := make([]libpurb.Recipient, 0) - suites := []libpurb.Suite{curve25519.NewBlakeSHA256Curve25519(true)} - - if len(keypair) < numberOfRecipients { - keypair = make([]key.Pair, 0) + suite := []libpurb.Suite{curve25519.NewBlakeSHA256Curve25519(true)} + + keysPath := filepath.Join(path, "purb.keys") + loader := NewKeysLoader(keysPath) + keypair := make([]key.Pair, numberOfRecipients) + err := loader.Load(&keypair) + if err != nil { + // cannot load keys, create new ones + for i := range keypair { + keypair[i] = *key.NewKeyPair(suite[0]) + } + err := loader.Save(&keypair) + if err != nil { + panic(err) + } } - for _, suite := range suites { - for i := 0; i < numberOfRecipients; i++ { - if len(keypair) < numberOfRecipients { - keypair = append(keypair, *key.NewKeyPair(suite)) - } - - r = append(r, libpurb.Recipient{ - SuiteName: suite.String(), - Suite: suite, - PublicKey: keypair[i].Public, - PrivateKey: keypair[i].Private, - }) - } + for i := 0; i < numberOfRecipients; i++ { + r = append(r, libpurb.Recipient{ + SuiteName: suite[0].String(), + Suite: suite[0], + PublicKey: keypair[i].Public, + PrivateKey: keypair[i].Private, + }) } + return r } diff --git a/store/kv/controller/controller.go b/store/kv/controller/controller.go index b0b3d8c..4e59c6a 100644 --- a/store/kv/controller/controller.go +++ b/store/kv/controller/controller.go @@ -4,23 +4,33 @@ package controller import ( - "path/filepath" - "go.dedis.ch/dela/cli" "go.dedis.ch/dela/cli/node" - "go.dedis.ch/dela/core/store/kv" + "go.dedis.ch/purb-db/store/kv" "golang.org/x/xerrors" ) // MinimalController is a CLI controller to inject a key/value database. // // - implements node.Initializer -type minimalController struct{} +type minimalController struct { + purbIsOn bool +} -// NewController returns a minimal controller that will inject a key/value -// database. +// NewController returns a minimal controller +// that will inject a key/value database. func NewController() node.Initializer { - return minimalController{} + return minimalController{ + purbIsOn: true, + } +} + +// NewControllerWithoutPurb returns a minimal controller without PURB +// that will inject a key/value database. +func NewControllerWithoutPurb() node.Initializer { + return minimalController{ + purbIsOn: false, + } } // SetCommands implements node.Initializer. It does not register any command. @@ -29,7 +39,7 @@ func (m minimalController) SetCommands(builder node.Builder) {} // OnStart implements node.Initializer. It opens the database in a file using // the config path as the base. func (m minimalController) OnStart(flags cli.Flags, inj node.Injector) error { - db, err := kv.New(filepath.Join(flags.String("config"), "dela.db")) + db, err := kv.NewDB(flags.String("config"), m.purbIsOn) if err != nil { return xerrors.Errorf("db: %v", err) } diff --git a/store/kv/controller/controller_test.go b/store/kv/controller/controller_test.go new file mode 100644 index 0000000..9d9e298 --- /dev/null +++ b/store/kv/controller/controller_test.go @@ -0,0 +1,46 @@ +package controller + +import ( + "github.com/stretchr/testify/require" + "go.dedis.ch/dela/cli/node" + "testing" +) + +func TestNewController(t *testing.T) { + c := NewController() + require.NotNil(t, c) + + require.Equal(t, minimalController{true}, c) +} + +func TestNewControllerWithoutPurb(t *testing.T) { + c := NewControllerWithoutPurb() + require.NotNil(t, c) + + require.Equal(t, minimalController{false}, c) +} + +func TestOnStart(t *testing.T) { + c := NewController() + + err := c.OnStart(node.FlagSet{}, node.NewInjector()) + require.NoError(t, err) +} + +func TestOnStop(t *testing.T) { + c := NewController() + + inj := node.NewInjector() + + err := c.OnStart(node.FlagSet{}, inj) + require.NoError(t, err) + + err = c.OnStop(inj) + require.NoError(t, err) +} + +func TestSetCommands(t *testing.T) { + c := NewController() + + c.SetCommands(nil) +} diff --git a/store/kv/db.go b/store/kv/db.go index dfac17f..fc8d6a9 100644 --- a/store/kv/db.go +++ b/store/kv/db.go @@ -6,9 +6,9 @@ import ( "errors" "io" "os" + "path/filepath" "sync" - "go.dedis.ch/kyber/v3/util/key" "go.dedis.ch/libpurb/libpurb" "golang.org/x/xerrors" ) @@ -37,74 +37,51 @@ type purbDB struct { } // NewDB opens a new database to the given file. -func NewDB(path string, purbIsOn bool) (DB, []key.Pair, error) { - f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0755) - if err != nil { - return nil, nil, xerrors.Errorf("failed to open DB file: %v", err) - } - defer f.Close() - - stats, _ := f.Stat() - s := stats.Size() - if s > 0 { - return nil, nil, xerrors.New("failed to create DB file: file already exists") - } - - var data = make([]byte, s) - l, err := f.Read(data) - if int64(l) != 0 || err != nil { - return nil, nil, xerrors.Errorf("failed to read DB file: %v", err) - } - - var b *libpurb.Purb = nil - keypair := make([]key.Pair, 0) +func NewDB(path string, purbIsOn bool) (DB, error) { + var filePath string if purbIsOn { - b = NewBlob(nil) - pair := key.Pair{ - Public: b.Recipients[0].PublicKey, - Private: b.Recipients[0].PrivateKey, - } - keypair = append(keypair, pair) + filePath = filepath.Join(path, "purb.db") + } else { + filePath = filepath.Join(path, "kv.db") } - p := &purbDB{ - dbFile: path, - bucketDb: newBucketDb(), - purbIsOn: purbIsOn, - blob: b, + f, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0755) + if err != nil { + return nil, xerrors.Errorf("failed to open DB file: %v", err) } + defer f.Close() - return p, keypair, nil -} - -// LoadDB opens a database from a given file. -func LoadDB(path string, purbIsOn bool, keypair []key.Pair) (DB, error) { var b *libpurb.Purb = nil if purbIsOn { - b = NewBlob(keypair) + b = NewBlob(path) } p := &purbDB{ - dbFile: path, + dbFile: filePath, bucketDb: newBucketDb(), purbIsOn: purbIsOn, blob: b, } - err := p.load() - if err != nil { - return nil, err + stats, _ := f.Stat() + s := stats.Size() + if s > 0 { + err = p.load() + if err != nil { + return nil, xerrors.Errorf("failed to load DB file: %v", err) + } } - return p, nil } // View implements kv.DB. It executes the read-only transaction in the context // of the database. func (p *purbDB) View(fn func(ReadableTx) error) error { - tx := &dpTx{db: p.bucketDb, new: newBucketDb()} + tx := &dpTx{db: &p.bucketDb, new: newBucketDb()} + tx.db.RLock() err := fn(tx) + tx.db.RUnlock() if err != nil { return err @@ -116,9 +93,12 @@ func (p *purbDB) View(fn func(ReadableTx) error) error { // Update implements kv.DB. It executes the writable transaction in the context // of the database. func (p *purbDB) Update(fn func(WritableTx) error) error { - tx := &dpTx{db: p.bucketDb, new: newBucketDb()} + tx := &dpTx{db: &p.bucketDb, new: newBucketDb()} + tx.db.RLock() err := fn(tx) + tx.db.RUnlock() + if err != nil { return err } diff --git a/store/kv/db_test.go b/store/kv/db_test.go index 715a0eb..d5f49ee 100644 --- a/store/kv/db_test.go +++ b/store/kv/db_test.go @@ -2,7 +2,6 @@ package kv import ( "os" - "path/filepath" "testing" "time" @@ -17,7 +16,7 @@ func TestDb_OpenClose(t *testing.T) { require.NoError(t, err) defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), false) + db, err := NewDB(dir, false) require.NoError(t, err) err = db.Close() @@ -29,14 +28,14 @@ func TestDb_OpenCloseReopen(t *testing.T) { require.NoError(t, err) defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), false) + db, err := NewDB(dir, false) require.NoError(t, err) err = db.Close() require.NoError(t, err) //reopen - db, err = LoadDB(filepath.Join(dir, "test.Db"), false, nil) + db, err = NewDB(dir, false) require.NoError(t, err) err = db.Close() @@ -49,7 +48,7 @@ func TestDb_UpdateAndView(t *testing.T) { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), false) + db, err := NewDB(dir, false) require.NoError(t, err) ch := make(chan struct{}) @@ -87,7 +86,7 @@ func TestDb_GetBucket(t *testing.T) { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), false) + db, err := NewDB(dir, false) require.NoError(t, err) err = db.Update(func(tx WritableTx) error { @@ -111,7 +110,7 @@ func TestDb_GetSetDelete(t *testing.T) { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), false) + db, err := NewDB(dir, false) require.NoError(t, err) err = db.Update(func(txn WritableTx) error { @@ -143,7 +142,7 @@ func TestDb_SetReopenGet(t *testing.T) { defer os.RemoveAll(dir) - db, keypair, err := NewDB(filepath.Join(dir, "test.Db"), false) + db, err := NewDB(dir, false) require.NoError(t, err) err = db.Update(func(txn WritableTx) error { @@ -161,7 +160,7 @@ func TestDb_SetReopenGet(t *testing.T) { require.NoError(t, err) //reopen - db, err = LoadDB(filepath.Join(dir, "test.Db"), false, keypair) + db, err = NewDB(dir, false) require.NoError(t, err) err = db.Update(func(txn WritableTx) error { @@ -187,7 +186,7 @@ func TestDb_ForEach(t *testing.T) { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), false) + db, err := NewDB(dir, false) require.NoError(t, err) err = db.Update(func(txn WritableTx) error { @@ -215,7 +214,7 @@ func TestDb_ForEachAborted(t *testing.T) { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), false) + db, err := NewDB(dir, false) require.NoError(t, err) // set some values in the DB @@ -265,7 +264,7 @@ func TestDb_ReOpenClosedDb(t *testing.T) { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), false) + db, err := NewDB(dir, false) require.NoError(t, err) // set some values in the DB @@ -285,7 +284,7 @@ func TestDb_ReOpenClosedDb(t *testing.T) { require.NoError(t, err) // re-open DB file - newdb, err := LoadDB(filepath.Join(dir, "test.Db"), false, nil) + newdb, err := NewDB(dir, false) require.NoError(t, err) // checks that the DB values are still ok @@ -313,7 +312,7 @@ func TestDb_Scan(t *testing.T) { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), false) + db, err := NewDB(dir, false) require.NoError(t, err) err = db.Update(func(txn WritableTx) error { diff --git a/store/kv/example_test.go b/store/kv/example_test.go index fb3354e..3a00b6c 100644 --- a/store/kv/example_test.go +++ b/store/kv/example_test.go @@ -3,7 +3,6 @@ package kv import ( "fmt" "os" - "path/filepath" ) func ExampleBucket_Scan() { @@ -14,7 +13,7 @@ func ExampleBucket_Scan() { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "example.Db"), false) + db, err := NewDB(dir, false) if err != nil { panic("failed to open Db: " + err.Error()) } diff --git a/store/kv/keyloader.go b/store/kv/keyloader.go new file mode 100644 index 0000000..446d2cc --- /dev/null +++ b/store/kv/keyloader.go @@ -0,0 +1,129 @@ +package kv + +import ( + "bufio" + "encoding/base64" + "go.dedis.ch/kyber/v3/group/curve25519" + "go.dedis.ch/kyber/v3/util/key" + "golang.org/x/xerrors" + "os" + "strings" +) + +// FileLoader is loader that is storing the new keys to a file. +// +// - implements loader.Loader +type fileLoader struct { + path string + + openFileFn func(path string, flags int, perms os.FileMode) (*os.File, error) + statFn func(path string) (os.FileInfo, error) +} + +// NewKeyLoader creates a new key file loader using the given file path. +func NewKeysLoader(path string) fileLoader { + return fileLoader{ + path: path, + openFileFn: os.OpenFile, + statFn: os.Stat, + } +} + +// Load loads the keys from the file if it exists, +// otherwise it returns an error. +func (l fileLoader) Load(keypair *[]key.Pair) error { + file, err := l.openFileFn(l.path, os.O_RDONLY, 0400) + if err != nil { + return xerrors.Errorf("while opening file: %v", err) + } + defer file.Close() + + scanner := bufio.NewScanner(file) + scanner.Split(bufio.ScanLines) + + i := 0 + for scanner.Scan() { + line := scanner.Text() + keys := strings.Split(line, ":") + if len(keys) != 2 { + return xerrors.Errorf("invalid key format") + } + + pubk, err := base64.URLEncoding.DecodeString(keys[0]) + if err != nil { + return xerrors.Errorf("while decoding pubk in %v: %v", line, err) + } + + privk, err := base64.URLEncoding.DecodeString(keys[1]) + if err != nil { + return xerrors.Errorf("while decoding privk in %v: %v", line, err) + } + + kp := *key.NewKeyPair(curve25519.NewBlakeSHA256Curve25519(true)) + + err = kp.Public.UnmarshalBinary(pubk) + if err != nil { + return xerrors.Errorf("while unmarshaling pubk in %v: %v", line, err) + } + + err = kp.Private.UnmarshalBinary(privk) + if err != nil { + return xerrors.Errorf("while unmarshaling privk in %v: %v", line, err) + } + + (*keypair)[i] = kp + i++ + if i == len(*keypair) { + break + } + } + + if i != len(*keypair) { + return xerrors.Errorf("number of keys does not match") + } + + return nil +} + +// Save the keys to the file in path, +// otherwise it returns an error +func (l fileLoader) Save(keypair *[]key.Pair) error { + if keypair == nil { + return xerrors.Errorf("keypair is nil") + } + + if len(*keypair) == 0 { + return xerrors.Errorf("number of keys is 0") + } + + file, err := l.openFileFn(l.path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) + if err != nil { + return xerrors.Errorf("while creating file: %v", err) + } + defer file.Close() + + for _, k := range *keypair { + pubk, err := k.Public.MarshalBinary() + if err != nil { + return xerrors.Errorf("while marshaling pubk: %v", err) + } + pubkString := base64.URLEncoding.EncodeToString(pubk) + + privk, err := k.Private.MarshalBinary() + if err != nil { + return xerrors.Errorf("while marshaling privk: %v", err) + } + privkString := base64.URLEncoding.EncodeToString(privk) + + _, err = file.WriteString(pubkString + ":" + privkString + "\n") + if err != nil { + return xerrors.Errorf("while writing pubk:privk {%v:%v} to disk: %v", pubkString, privkString, err) + } + } + + if err != nil { + return xerrors.Errorf("while encoding: %v", err) + } + + return nil +} diff --git a/store/kv/keyloader_test.go b/store/kv/keyloader_test.go new file mode 100644 index 0000000..cf42a8e --- /dev/null +++ b/store/kv/keyloader_test.go @@ -0,0 +1,72 @@ +package kv + +import ( + "github.com/stretchr/testify/require" + "go.dedis.ch/kyber/v3/group/curve25519" + "go.dedis.ch/kyber/v3/util/key" + "os" + "path/filepath" + "testing" +) + +const keyTestDir = "key-loader" +const keyTestFile = "test.keys" + +func TestNewKeysLoader(t *testing.T) { + keyDir, err := os.MkdirTemp(os.TempDir(), keyTestDir) + require.NoError(t, err) + + keyPath := filepath.Join(keyDir, keyTestFile) + defer os.RemoveAll(keyPath) + + loader := NewKeysLoader(keyPath) + require.Equal(t, loader.path, keyPath) +} + +func TestKeysloaderSave(t *testing.T) { + keyDir, err := os.MkdirTemp(os.TempDir(), keyTestDir) + require.NoError(t, err) + + keyPath := filepath.Join(keyDir, keyTestFile) + defer os.RemoveAll(keyPath) + + loader := NewKeysLoader(keyPath) + + err = loader.Save(nil) + require.Error(t, err) + + err = loader.Save(&[]key.Pair{*key.NewKeyPair(curve25519.NewBlakeSHA256Curve25519(true))}) + require.NoError(t, err) + + err = loader.Save(&[]key.Pair{ + *key.NewKeyPair(curve25519.NewBlakeSHA256Curve25519(true)), + *key.NewKeyPair(curve25519.NewBlakeSHA256Curve25519(true)), + }) + require.NoError(t, err) +} + +func TestKeysloaderLoad(t *testing.T) { + keyDir, err := os.MkdirTemp(os.TempDir(), keyTestDir) + require.NoError(t, err) + + keyPath := filepath.Join(keyDir, keyTestFile) + defer os.RemoveAll(keyPath) + + loader := NewKeysLoader(keyPath) + + keypair := []key.Pair{ + *key.NewKeyPair(curve25519.NewBlakeSHA256Curve25519(true)), + *key.NewKeyPair(curve25519.NewBlakeSHA256Curve25519(true)), + } + + err = loader.Save(&keypair) + require.NoError(t, err) + + loadedKeypair := make([]key.Pair, 2) + err = loader.Load(&loadedKeypair) + require.NoError(t, err) + + for i, kp := range loadedKeypair { + require.Equal(t, keypair[i].Public, kp.Public) + } +} diff --git a/store/kv/purbdb_test.go b/store/kv/purbdb_test.go index 37ece42..87576ca 100644 --- a/store/kv/purbdb_test.go +++ b/store/kv/purbdb_test.go @@ -2,7 +2,6 @@ package kv import ( "os" - "path/filepath" "testing" "time" @@ -17,7 +16,7 @@ func TestPurbDb_OpenClose(t *testing.T) { require.NoError(t, err) defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), true) + db, err := NewDB(dir, true) require.NoError(t, err) err = db.Close() @@ -29,14 +28,14 @@ func TestPurbDb_OpenCloseReopen(t *testing.T) { require.NoError(t, err) defer os.RemoveAll(dir) - db, keypair, err := NewDB(filepath.Join(dir, "test.Db"), true) + db, err := NewDB(dir, true) require.NoError(t, err) err = db.Close() require.NoError(t, err) //reopen - db, err = LoadDB(filepath.Join(dir, "test.Db"), true, keypair) + db, err = NewDB(dir, true) require.NoError(t, err) err = db.Close() @@ -49,7 +48,7 @@ func TestPurbDb_UpdateAndView(t *testing.T) { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), true) + db, err := NewDB(dir, true) require.NoError(t, err) ch := make(chan struct{}) @@ -87,7 +86,7 @@ func TestPurbDb_GetBucket(t *testing.T) { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), true) + db, err := NewDB(dir, true) require.NoError(t, err) err = db.Update(func(tx WritableTx) error { @@ -111,7 +110,7 @@ func TestPurbDb_GetSetDelete(t *testing.T) { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), true) + db, err := NewDB(dir, true) require.NoError(t, err) err = db.Update(func(txn WritableTx) error { @@ -143,7 +142,7 @@ func TestPurbDb_SetReopenGet(t *testing.T) { defer os.RemoveAll(dir) - db, keypair, err := NewDB(filepath.Join(dir, "test.Db"), true) + db, err := NewDB(dir, true) require.NoError(t, err) err = db.Update(func(txn WritableTx) error { @@ -161,7 +160,7 @@ func TestPurbDb_SetReopenGet(t *testing.T) { require.NoError(t, err) //reopen - db, err = LoadDB(filepath.Join(dir, "test.Db"), true, keypair) + db, err = NewDB(dir, true) require.NoError(t, err) err = db.Update(func(txn WritableTx) error { @@ -187,7 +186,7 @@ func TestPurbDb_ForEach(t *testing.T) { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), true) + db, err := NewDB(dir, true) require.NoError(t, err) err = db.Update(func(txn WritableTx) error { @@ -215,7 +214,7 @@ func TestPurbDb_ForEachAborted(t *testing.T) { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), true) + db, err := NewDB(dir, true) require.NoError(t, err) // set some values in the DB @@ -265,7 +264,7 @@ func TestPurbDb_ReOpenClosedDb(t *testing.T) { defer os.RemoveAll(dir) - db, keypair, err := NewDB(filepath.Join(dir, "test.Db"), true) + db, err := NewDB(dir, true) require.NoError(t, err) // set some values in the DB @@ -285,11 +284,11 @@ func TestPurbDb_ReOpenClosedDb(t *testing.T) { require.NoError(t, err) // re-open DB file - newdb, err := LoadDB(filepath.Join(dir, "test.Db"), true, keypair) + NewDB, err := NewDB(dir, true) require.NoError(t, err) // checks that the DB values are still ok - err = newdb.Update(func(txn WritableTx) error { + err = NewDB.Update(func(txn WritableTx) error { b, err := txn.GetBucketOrCreate([]byte("test")) require.NoError(t, err) @@ -313,7 +312,7 @@ func TestPurbDb_Scan(t *testing.T) { defer os.RemoveAll(dir) - db, _, err := NewDB(filepath.Join(dir, "test.Db"), true) + db, err := NewDB(dir, true) require.NoError(t, err) err = db.Update(func(txn WritableTx) error { diff --git a/store/kv/transaction.go b/store/kv/transaction.go index dcaec9f..c867bef 100644 --- a/store/kv/transaction.go +++ b/store/kv/transaction.go @@ -9,7 +9,7 @@ import ( // dpTx implements kv.ReadableTx and kv.WritableTx type dpTx struct { - db bucketDb + db *bucketDb new bucketDb onCommit func() }