diff options
-rw-r--r-- | src/dedo.go | 46 | ||||
-rw-r--r-- | tests/dedo.go | 313 |
2 files changed, 189 insertions, 170 deletions
diff --git a/src/dedo.go b/src/dedo.go index a6e951a..a439ac6 100644 --- a/src/dedo.go +++ b/src/dedo.go @@ -113,10 +113,26 @@ type InMemory struct{ *pds.Map[[]byte, Value] } +type ITx interface{ + CreateBucket ([]byte) (*Bucket, error) + CreateBucketIfNotExists([]byte) (*Bucket, error) + Bucket([]byte) *Bucket + DeleteBucket([]byte) error + + Cursor() *Cursor + ForEach(func([]byte, *Bucket) error) error + + OnCommit(func()) + + WriteTo(io.Writer) (int64, error) + + Check() <-chan error +} + type IDedo interface{ Close() error - View (func(tx *Tx) error) error - Update(func(tx *Tx) error) error + View (func(tx ITx) error) error + Update(func(tx ITx) error) error Path() string } @@ -176,7 +192,7 @@ type OpenOptionsT struct{ } type call struct { - fn func(*Tx) error + fn func(ITx) error err chan<- error } @@ -1645,11 +1661,11 @@ func (m *InMemory) Path() string { return "" } -func (m *InMemory) Update(func(*Tx) error) error { +func (m *InMemory) Update(func(ITx) error) error { return nil } -func (m *InMemory) View(func(*Tx) error) error { +func (m *InMemory) View(func(ITx) error) error { return nil } @@ -1982,7 +1998,7 @@ func (db *DB) removeTx(tx *Tx) { /// /// Attempting to manually commit or rollback within the function will cause a /// panic. -func (db *DB) Update(fn func(*Tx) error) error { +func (db *DB) Update(fn func(ITx) error) error { t, err := db.begin(true) if err != nil { return err @@ -2011,7 +2027,7 @@ func (db *DB) Update(fn func(*Tx) error) error { /// the DB.View() method. /// /// Attempting to manually rollback within the function will cause a panic. -func (db *DB) View(fn func(*Tx) error) error { +func (db *DB) View(fn func(ITx) error) error { t, err := db.begin(false) if err != nil { return err @@ -2059,7 +2075,7 @@ func needsNewBatch(batch *batch, max int) bool { /// DB.MaxBatchDelay, respectively. /// /// DB.Batch() is only useful when there are multiple goroutines calling it. -func (db *DB) Batch(fn func(*Tx) error) error { +func (db *DB) Batch(fn func(ITx) error) error { errCh := make(chan error, 1) db.batchMu.Lock() @@ -2108,7 +2124,7 @@ func (b *batch) run() { retry: for len(b.calls) > 0 { failIdx := -1 - err := b.db.Update(func(tx *Tx) error { + err := b.db.Update(func(tx ITx) error { for i, c := range b.calls { err := safelyCall(c.fn, tx) if err != nil { @@ -2149,7 +2165,7 @@ func (p panicked) Error() string { return fmt.Sprintf("panic: %v", p.reason) } -func safelyCall(fn func(*Tx) error, tx *Tx) (err error) { +func safelyCall(fn func(ITx) error, tx ITx) (err error) { defer func() { p := recover() if p != nil { @@ -3869,7 +3885,7 @@ func setGetopt(args argsT, w io.Writer) (argsT, bool) { } func checkExec(args argsT, db IDedo, _r io.Reader, _w io.Writer) error { - return db.View(func(tx *Tx) error { + return db.View(func(tx ITx) error { var errs error for err := range tx.Check() { errs = g.WrapErrors(errs, err) @@ -3879,7 +3895,7 @@ func checkExec(args argsT, db IDedo, _r io.Reader, _w io.Writer) error { } func getExec(args argsT, db IDedo, r io.Reader, w io.Writer) error { - return db.View(func(tx *Tx) error { + return db.View(func(tx ITx) error { bucket := tx.Bucket(args.bucket) if bucket == nil { return ErrBucketNotFound @@ -3896,7 +3912,7 @@ func getExec(args argsT, db IDedo, r io.Reader, w io.Writer) error { } func setExec(args argsT, db IDedo, r io.Reader, w io.Writer) error { - return db.Update(func(tx *Tx) error { + return db.Update(func(tx ITx) error { bucket, err := tx.CreateBucketIfNotExists(args.bucket) if err != nil { return err @@ -3907,7 +3923,7 @@ func setExec(args argsT, db IDedo, r io.Reader, w io.Writer) error { } func rmExec(args argsT, db IDedo, r io.Reader, w io.Writer) error { - return db.Update(func(tx *Tx) error { + return db.Update(func(tx ITx) error { bucket := tx.Bucket(args.bucket) if bucket == nil { return ErrBucketNotFound @@ -3918,7 +3934,7 @@ func rmExec(args argsT, db IDedo, r io.Reader, w io.Writer) error { } func listExec(args argsT, db IDedo, r io.Reader, w io.Writer) error { - return db.View(func(tx *Tx) error { + return db.View(func(tx ITx) error { if len(args.bucket) == 0 { return tx.ForEach(func( name []byte, diff --git a/tests/dedo.go b/tests/dedo.go index bd10ae1..7dba449 100644 --- a/tests/dedo.go +++ b/tests/dedo.go @@ -540,7 +540,7 @@ func TestBucket_Get_NonExistent(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -564,7 +564,7 @@ func TestBucket_Get_FromNode(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -593,7 +593,7 @@ func TestBucket_Get_IncompatibleValue(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -628,7 +628,7 @@ func TestBucket_Get_Capacity(t *testing.T) { defer os.Remove(db.Path()) // Write key to a bucket. - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("bucket")) if err != nil { return err @@ -641,7 +641,7 @@ func TestBucket_Get_Capacity(t *testing.T) { } // Retrieve value and attempt to append to it. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { k, v := tx.Bucket([]byte("bucket")).Cursor().First() // Verify capacity. @@ -668,7 +668,7 @@ func TestBucket_Put(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -697,7 +697,7 @@ func TestBucket_Put_Repeat(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -732,7 +732,7 @@ func TestBucket_Put_Large(t *testing.T) { defer os.Remove(db.Path()) count, factor := 100, 200 - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -753,7 +753,7 @@ func TestBucket_Put_Large(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) for i := 1; i < count; i++ { value := b.Get([]byte(strings.Repeat("0", i*factor))) @@ -786,7 +786,7 @@ func TestDB_Put_VeryLarge(t *testing.T) { defer os.Remove(db.Path()) for i := 0; i < n; i += batchN { - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucketIfNotExists([]byte("widgets")) if err != nil { t.Fatal(err) @@ -813,7 +813,7 @@ func TestBucket_Put_IncompatibleValue(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b0, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -872,7 +872,7 @@ func TestBucket_Put_ReadOnly(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -884,7 +884,7 @@ func TestBucket_Put_ReadOnly(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) err := b.Put([]byte("foo"), []byte("bar")) if err != ErrTxNotWritable { @@ -904,7 +904,7 @@ func TestBucket_Delete(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -938,7 +938,7 @@ func TestBucket_Delete_Large(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -960,7 +960,7 @@ func TestBucket_Delete_Large(t *testing.T) { t.Fatal(err) } - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) for i := 0; i < 100; i++ { err := b.Delete([]byte(strconv.Itoa(i))) @@ -974,7 +974,7 @@ func TestBucket_Delete_Large(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) for i := 0; i < 100; i++ { v := b.Get([]byte(strconv.Itoa(i))) @@ -1003,7 +1003,7 @@ func TestBucket_Delete_FreelistOverflow(t *testing.T) { k := make([]byte, 16) for i := uint64(0); i < n1; i++ { - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucketIfNotExists([]byte("0")) if err != nil { t.Fatalf("bucket error: %s", err) @@ -1026,7 +1026,7 @@ func TestBucket_Delete_FreelistOverflow(t *testing.T) { } // Delete all of them in one large transaction - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b := tx.Bucket([]byte("0")) c := b.Cursor() for k, _ := c.First(); k != nil; k, _ = c.Next() { @@ -1048,7 +1048,7 @@ func TestBucket_Nested(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { // Create a widgets bucket. b, err := tx.CreateBucket([]byte("widgets")) if err != nil { @@ -1075,7 +1075,7 @@ func TestBucket_Nested(t *testing.T) { db.MustCheck() // Update widgets/bar. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) err := b.Put([]byte("bar"), []byte("xxxx")) if err != nil { @@ -1090,7 +1090,7 @@ func TestBucket_Nested(t *testing.T) { db.MustCheck() // Cause a split. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) for i := 0; i < 10000; i++ { err := b.Put( @@ -1110,7 +1110,7 @@ func TestBucket_Nested(t *testing.T) { db.MustCheck() // Insert into widgets/foo/baz. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) err := b.Bucket([]byte("foo")).Put( []byte("baz"), @@ -1128,7 +1128,7 @@ func TestBucket_Nested(t *testing.T) { db.MustCheck() // Verify. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) v := b.Bucket([]byte("foo")).Get([]byte("baz")) if !bytes.Equal(v, []byte("yyyy")) { @@ -1160,7 +1160,7 @@ func TestBucket_Delete_Bucket(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1189,7 +1189,7 @@ func TestBucket_Delete_ReadOnly(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1201,7 +1201,7 @@ func TestBucket_Delete_ReadOnly(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { err := tx.Bucket([]byte("widgets")).Delete([]byte("foo")) if err != ErrTxNotWritable { t.Fatalf("unexpected error: %s", err) @@ -1248,7 +1248,7 @@ func TestBucket_DeleteBucket_Nested(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { widgets, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1288,7 +1288,7 @@ func TestBucket_DeleteBucket_Nested2(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { widgets, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1314,7 +1314,7 @@ func TestBucket_DeleteBucket_Nested2(t *testing.T) { t.Fatal(err) } - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { widgets := tx.Bucket([]byte("widgets")) if widgets == nil { t.Fatal("expected widgets bucket") @@ -1346,7 +1346,7 @@ func TestBucket_DeleteBucket_Nested2(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { if tx.Bucket([]byte("widgets")) != nil { t.Fatal("expected bucket to be deleted") } @@ -1365,7 +1365,7 @@ func TestBucket_DeleteBucket_Large(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { widgets, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1391,7 +1391,7 @@ func TestBucket_DeleteBucket_Large(t *testing.T) { t.Fatal(err) } - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { err := tx.DeleteBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1410,7 +1410,7 @@ func TestBucket_Bucket_IncompatibleValue(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { widgets, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1439,7 +1439,7 @@ func TestBucket_CreateBucket_IncompatibleValue(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { widgets, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1468,7 +1468,7 @@ func TestBucket_DeleteBucket_IncompatibleValue(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { widgets, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1497,7 +1497,7 @@ func TestBucket_NextSequence(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { widgets, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1546,7 +1546,7 @@ func TestBucket_NextSequence_Persist(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1558,7 +1558,7 @@ func TestBucket_NextSequence_Persist(t *testing.T) { t.Fatal(err) } - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { _, err := tx.Bucket([]byte("widgets")).NextSequence() if err != nil { t.Fatal(err) @@ -1570,7 +1570,7 @@ func TestBucket_NextSequence_Persist(t *testing.T) { t.Fatal(err) } - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { seq, err := tx.Bucket([]byte("widgets")).NextSequence() if err != nil { t.Fatalf("unexpected error: %s", err) @@ -1592,7 +1592,7 @@ func TestBucket_NextSequence_ReadOnly(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1604,7 +1604,7 @@ func TestBucket_NextSequence_ReadOnly(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { _, err := tx.Bucket([]byte("widgets")).NextSequence() if err != ErrTxNotWritable { t.Fatalf("unexpected error: %s", err) @@ -1651,7 +1651,7 @@ func TestBucket_ForEach(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1719,7 +1719,7 @@ func TestBucket_ForEach_ShortCircuit(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1797,7 +1797,7 @@ func TestBucket_Put_EmptyKey(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1826,7 +1826,7 @@ func TestBucket_Put_KeyTooLarge(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1849,7 +1849,7 @@ func TestBucket_Put_ValueTooLarge(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1882,7 +1882,7 @@ func TestBucket_Put_Single(t *testing.T) { m := make(map[string][]byte) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1895,7 +1895,7 @@ func TestBucket_Put_Single(t *testing.T) { } for _, item := range items { - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { err := tx.Bucket([]byte("widgets")).Put( item.Key, item.Value, @@ -1915,7 +1915,7 @@ func TestBucket_Put_Single(t *testing.T) { const errmsg = "value mismatch [run %d] (%d of %d):\n" + "key: %x\ngot: %x\nexp: %x" // Verify all key/values so far. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { i := 0 for k, v := range m { value := tx.Bucket( @@ -1963,7 +1963,7 @@ func TestBucket_Put_Multiple(t *testing.T) { defer os.Remove(db.Path()) // Bulk insert all values. - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -1975,7 +1975,7 @@ func TestBucket_Put_Multiple(t *testing.T) { t.Fatal(err) } - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) for _, item := range items { err := b.Put(item.Key, item.Value) @@ -1991,7 +1991,7 @@ func TestBucket_Put_Multiple(t *testing.T) { } // Verify all items exist. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) for _, item := range items { value := b.Get(item.Key) @@ -2030,7 +2030,7 @@ func TestBucket_Delete_Quick(t *testing.T) { defer os.Remove(db.Path()) // Bulk insert all values. - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -2042,7 +2042,7 @@ func TestBucket_Delete_Quick(t *testing.T) { t.Fatal(err) } - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) for _, item := range items { err := b.Put(item.Key, item.Value) @@ -2059,7 +2059,7 @@ func TestBucket_Delete_Quick(t *testing.T) { // Remove items one at a time and check consistency. for _, item := range items { - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { return tx.Bucket([]byte("widgets")).Delete( item.Key, ) @@ -2070,7 +2070,7 @@ func TestBucket_Delete_Quick(t *testing.T) { } // Anything before our deletion index should be nil. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { err := tx.Bucket( []byte("widgets"), ).ForEach(func(k, v []byte) error { @@ -2106,7 +2106,7 @@ func ExampleBucket_Put() { defer os.Remove(db.Path()) // Start a write transaction. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { // Create a bucket. b, err := tx.CreateBucket([]byte("widgets")) if err != nil { @@ -2126,7 +2126,7 @@ func ExampleBucket_Put() { } // Read value back in a different read-only transaction. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { value := tx.Bucket([]byte("widgets")).Get([]byte("foo")) fmt.Printf("The value of 'foo' is: %s\n", value) return nil @@ -2154,7 +2154,7 @@ func ExampleBucket_Delete() { defer os.Remove(db.Path()) // Start a write transaction. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { // Create a bucket. b, err := tx.CreateBucket([]byte("widgets")) if err != nil { @@ -2178,7 +2178,7 @@ func ExampleBucket_Delete() { } // Delete the key in a different write transaction. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { return tx.Bucket([]byte("widgets")).Delete([]byte("foo")) }) if err != nil { @@ -2186,7 +2186,7 @@ func ExampleBucket_Delete() { } // Retrieve the key again. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { value := tx.Bucket([]byte("widgets")).Get([]byte("foo")) if value == nil { fmt.Printf("The value of 'foo' is now: nil\n") @@ -2217,7 +2217,7 @@ func ExampleBucket_ForEach() { defer os.Remove(db.Path()) // Insert data into a bucket. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("animals")) if err != nil { return err @@ -2271,7 +2271,7 @@ func TestCursor_Seek(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -2303,7 +2303,7 @@ func TestCursor_Seek(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { c := tx.Bucket([]byte("widgets")).Cursor() // Exact match should go to the key. @@ -2361,7 +2361,7 @@ func TestCursor_Delete(t *testing.T) { const count = 1000 // Insert every other key between 0 and $count. - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -2387,7 +2387,7 @@ func TestCursor_Delete(t *testing.T) { t.Fatal(err) } - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { c := tx.Bucket([]byte("widgets")).Cursor() bound := make([]byte, 8) binary.BigEndian.PutUint64(bound, uint64(count/2)) @@ -2427,7 +2427,7 @@ func TestCursor_Seek_Large(t *testing.T) { const count = 10000 // Insert every other key between 0 and $count. - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -2449,7 +2449,7 @@ func TestCursor_Seek_Large(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { c := tx.Bucket([]byte("widgets")).Cursor() for i := 0; i < count; i++ { seek := make([]byte, 8) @@ -2493,7 +2493,7 @@ func TestCursor_EmptyBucket(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) return err }) @@ -2501,7 +2501,7 @@ func TestCursor_EmptyBucket(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { c := tx.Bucket([]byte("widgets")).Cursor() k, v := c.First() if k != nil { @@ -2523,7 +2523,7 @@ func TestCursor_EmptyBucketReverse(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) return err }) @@ -2531,7 +2531,7 @@ func TestCursor_EmptyBucketReverse(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { c := tx.Bucket([]byte("widgets")).Cursor() k, v := c.Last() if k != nil { @@ -2553,7 +2553,7 @@ func TestCursor_Iterate_Leaf(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -2636,7 +2636,7 @@ func TestCursor_LeafRootReverse(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -2716,7 +2716,7 @@ func TestCursor_Restart(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -2777,7 +2777,7 @@ func TestCursor_First_EmptyPages(t *testing.T) { defer os.Remove(db.Path()) // Create 1000 keys in the "widgets" bucket. - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -2797,7 +2797,7 @@ func TestCursor_First_EmptyPages(t *testing.T) { } // Delete half the keys and then try to iterate. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) for i := 0; i < 600; i++ { err := b.Delete(u64tob(uint64(i))) @@ -2976,7 +2976,7 @@ func TestCursor_QuickCheck_BucketsOnly(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -3003,7 +3003,7 @@ func TestCursor_QuickCheck_BucketsOnly(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { names := []string{} c := tx.Bucket([]byte("widgets")).Cursor() for k, v := c.First(); k != nil; k, v = c.Next() { @@ -3030,7 +3030,7 @@ func TestCursor_QuickCheck_BucketsOnly_Reverse(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -3057,7 +3057,7 @@ func TestCursor_QuickCheck_BucketsOnly_Reverse(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { names := []string{} c := tx.Bucket([]byte("widgets")).Cursor() for k, v := c.Last(); k != nil; k, v = c.Prev() { @@ -3087,7 +3087,7 @@ func ExampleCursor() { defer os.Remove(db.Path()) // Start a read-write transaction. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { // Create a new bucket. b, err := tx.CreateBucket([]byte("animals")) if err != nil { @@ -3149,7 +3149,7 @@ func ExampleCursor_reverse() { defer os.Remove(db.Path()) // Start a read-write transaction. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { // Create a new bucket. b, err := tx.CreateBucket([]byte("animals")) if err != nil { @@ -3339,7 +3339,7 @@ func TestOpen_Size(t *testing.T) { pagesize := db.pageSize // Insert until we get above the minimum 4MB size. - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, _ := tx.CreateBucketIfNotExists([]byte("data")) for i := 0; i < 10000; i++ { err := b.Put([]byte( @@ -3373,7 +3373,7 @@ func TestOpen_Size(t *testing.T) { t.Fatal(err) } - err = db0.Update(func(tx *Tx) error { + err = db0.Update(func(tx ITx) error { err := tx.Bucket([]byte("data")).Put([]byte{0}, []byte{0}) if err != nil { t.Fatal(err) @@ -3424,7 +3424,7 @@ func TestOpen_Size_Large(t *testing.T) { // Insert until we get above the minimum 4MB size. var index uint64 for i := 0; i < n1; i++ { - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, _ := tx.CreateBucketIfNotExists([]byte("data")) for j := 0; j < n2; j++ { err := b.Put(u64tob(index), make([]byte, 50)) @@ -3460,7 +3460,7 @@ func TestOpen_Size_Large(t *testing.T) { t.Fatal(err) } - err = db0.Update(func(tx *Tx) error { + err = db0.Update(func(tx ITx) error { return tx.Bucket([]byte("data")).Put([]byte{0}, []byte{0}) }) if err != nil { @@ -3494,7 +3494,7 @@ func TestOpen_Check(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { return <-tx.Check() }) + err = db.View(func(tx ITx) error { return <-tx.Check() }) if err != nil { t.Fatal(err) } @@ -3509,7 +3509,7 @@ func TestOpen_Check(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { return <-tx.Check() }) + err = db.View(func(tx ITx) error { return <-tx.Check() }) if err != nil { t.Fatal(err) } @@ -3726,7 +3726,7 @@ func TestDB_Update(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -3753,7 +3753,7 @@ func TestDB_Update(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) v := b.Get([]byte("foo")) if v != nil { @@ -3775,7 +3775,7 @@ func TestDB_Update(t *testing.T) { // Ensure a closed database returns an error while running a transaction block func TestDB_Update_Closed(t *testing.T) { var db DB - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -3803,7 +3803,7 @@ func TestDB_Update_Panic(t *testing.T) { } }() - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -3817,7 +3817,7 @@ func TestDB_Update_Panic(t *testing.T) { }() // Verify we can update again. - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -3830,7 +3830,7 @@ func TestDB_Update_Panic(t *testing.T) { } // Verify that our change persisted. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { if tx.Bucket([]byte("widgets")) == nil { t.Fatal("expected bucket") } @@ -3848,7 +3848,7 @@ func TestDB_View_Error(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.View(func(tx *Tx) error { + err := db.View(func(tx ITx) error { return errors.New("xxx") }) if err == nil || err.Error() != "xxx" { @@ -3862,7 +3862,7 @@ func TestDB_View_Panic(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -3883,7 +3883,7 @@ func TestDB_View_Panic(t *testing.T) { } }() - err := db.View(func(tx *Tx) error { + err := db.View(func(tx ITx) error { if tx.Bucket([]byte("widgets")) == nil { t.Fatal("expected bucket") } @@ -3895,7 +3895,7 @@ func TestDB_View_Panic(t *testing.T) { }() // Verify that we can still use read transactions. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { if tx.Bucket([]byte("widgets")) == nil { t.Fatal("expected bucket") } @@ -3912,7 +3912,7 @@ func TestDB_Consistency(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) return err }) @@ -3921,7 +3921,7 @@ func TestDB_Consistency(t *testing.T) { } for i := 0; i < 10; i++ { - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { err := tx.Bucket([]byte("widgets")).Put( []byte("foo"), []byte("bar"), @@ -3937,7 +3937,8 @@ func TestDB_Consistency(t *testing.T) { } } - err = db.Update(func(tx *Tx) error { + err = db.Update(func(itx ITx) error { + tx := itx.(*Tx) p, _ := tx.pageInfo(0) if p == nil { t.Fatal("expected page") @@ -3998,7 +3999,7 @@ func TestDB_Batch(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -4015,7 +4016,7 @@ func TestDB_Batch(t *testing.T) { ch := make(chan error) for i := 0; i < n; i++ { go func(i int) { - ch <- db.Batch(func(tx *Tx) error { + ch <- db.Batch(func(tx ITx) error { return tx.Bucket([]byte("widgets")).Put( u64tob(uint64(i)), []byte{}, @@ -4033,7 +4034,7 @@ func TestDB_Batch(t *testing.T) { } // Ensure data is correct. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) for i := 0; i < n; i++ { v := b.Get(u64tob(uint64(i))) @@ -4068,7 +4069,7 @@ func TestDB_Batch_Panic(t *testing.T) { problem = p } }() - err = db.Batch(func(tx *Tx) error { + err = db.Batch(func(tx ITx) error { panic(bork) }) }() @@ -4090,7 +4091,7 @@ func TestDB_BatchFull(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) return err }) @@ -4102,7 +4103,7 @@ func TestDB_BatchFull(t *testing.T) { // buffered so we never leak goroutines ch := make(chan error, size) put := func(i int) { - ch <- db.Batch(func(tx *Tx) error { + ch <- db.Batch(func(tx ITx) error { return tx.Bucket([]byte("widgets")).Put( u64tob(uint64(i)), []byte{}, @@ -4138,7 +4139,7 @@ func TestDB_BatchFull(t *testing.T) { } // Ensure data is correct. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) for i := 1; i <= size; i++ { v := b.Get(u64tob(uint64(i))) @@ -4159,7 +4160,7 @@ func TestDB_BatchTime(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) return err }) @@ -4171,7 +4172,7 @@ func TestDB_BatchTime(t *testing.T) { // buffered so we never leak goroutines ch := make(chan error, size) put := func(i int) { - ch <- db.Batch(func(tx *Tx) error { + ch <- db.Batch(func(tx ITx) error { return tx.Bucket([]byte("widgets")).Put( u64tob(uint64(i)), []byte{}, @@ -4194,7 +4195,7 @@ func TestDB_BatchTime(t *testing.T) { } // Ensure data is correct. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { b := tx.Bucket([]byte("widgets")) for i := 1; i <= size; i++ { if v := b.Get(u64tob(uint64(i))); v == nil { @@ -4217,7 +4218,7 @@ func ExampleDB_Update() { defer os.Remove(db.Path()) // Execute several commands within a read-write transaction. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { return err @@ -4235,7 +4236,7 @@ func ExampleDB_Update() { } // Read the value back from a separate read-only transaction. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { value := tx.Bucket([]byte("widgets")).Get([]byte("foo")) fmt.Printf("The value of 'foo' is: %s\n", value) return nil @@ -4263,7 +4264,7 @@ func ExampleDB_View() { defer os.Remove(db.Path()) // Insert data into a bucket. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("people")) if err != nil { return err @@ -4286,7 +4287,7 @@ func ExampleDB_View() { } // Access data from within a read-only transactional block. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { v := tx.Bucket([]byte("people")).Get([]byte("john")) fmt.Printf("John's last name is %s.\n", v) return nil @@ -4315,7 +4316,7 @@ func ExampleDB_Begin_ReadOnly() { defer os.Remove(db.Path()) // Create a bucket using a read-write transaction. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) return err }) @@ -4381,7 +4382,7 @@ func BenchmarkDBBatchAutomatic(b *testing.B) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("bench")) return err }) @@ -4406,7 +4407,7 @@ func BenchmarkDBBatchAutomatic(b *testing.B) { binary.LittleEndian.PutUint32(buf, id) _, _ = h.Write(buf[:]) k := h.Sum(nil) - insert := func(tx *Tx) error { + insert := func(tx ITx) error { b := tx.Bucket([]byte("bench")) return b.Put(k, []byte("filler")) } @@ -4431,7 +4432,7 @@ func BenchmarkDBBatchSingle(b *testing.B) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("bench")) return err }) @@ -4455,7 +4456,7 @@ func BenchmarkDBBatchSingle(b *testing.B) { binary.LittleEndian.PutUint32(buf, id) _, _ = h.Write(buf[:]) k := h.Sum(nil) - insert := func(tx *Tx) error { + insert := func(tx ITx) error { b := tx.Bucket([]byte("bench")) return b.Put(k, []byte("filler")) } @@ -4480,7 +4481,7 @@ func BenchmarkDBBatchManual10x100(b *testing.B) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("bench")) return err }) @@ -4499,7 +4500,7 @@ func BenchmarkDBBatchManual10x100(b *testing.B) { defer wg.Done() <-start - insert100 := func(tx *Tx) error { + insert100 := func(tx ITx) error { h := fnv.New32a() buf := make([]byte, 4) for minor := 0; minor < 100; minor++ { @@ -4539,7 +4540,7 @@ func BenchmarkDBBatchManual10x100(b *testing.B) { func validateBatchBench(b *testing.B, db *WDB) { rollback := errors.New("sentinel error to cause rollback") - validate := func(tx *Tx) error { + validate := func(tx ITx) error { bucket := tx.Bucket([]byte("bench")) h := fnv.New32a() buf := make([]byte, 4) @@ -4624,7 +4625,8 @@ func (db *WDB) MustClose() { // MustCheck runs a consistency check on the database and panics if any errors // are found. func (db *WDB) MustCheck() { - err := db.Update(func(tx *Tx) error { + err := db.Update(func(itx ITx) error { + tx := itx.(*Tx) // Collect all the errors. errors := []error{} for err := range tx.Check() { @@ -4669,7 +4671,8 @@ func (db *WDB) MustCheck() { // CopyTempFile copies a database to a temporary file. func (db *WDB) CopyTempFile() { path := tempfile() - err := db.View(func(tx *Tx) error { + err := db.View(func(itx ITx) error { + tx := itx.(*Tx) return tx.copyFile(path, 0600) }) if err != nil { @@ -5859,7 +5862,7 @@ func TestTx_Cursor(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -5905,7 +5908,7 @@ func TestTx_CreateBucket_ErrTxNotWritable(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.View(func(tx *Tx) error { + err := db.View(func(tx ITx) error { _, err := tx.CreateBucket([]byte("foo")) if err != ErrTxNotWritable { t.Fatalf("unexpected error: %s", err) @@ -5946,7 +5949,7 @@ func TestTx_Bucket(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -5969,7 +5972,7 @@ func TestTx_Get_NotFound(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -5998,7 +6001,7 @@ func TestTx_CreateBucket(t *testing.T) { defer os.Remove(db.Path()) // Create a bucket. - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -6013,7 +6016,7 @@ func TestTx_CreateBucket(t *testing.T) { } // Read the bucket through a separate transaction. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { if tx.Bucket([]byte("widgets")) == nil { t.Fatal("expected bucket") } @@ -6031,7 +6034,7 @@ func TestTx_CreateBucketIfNotExists(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { // Create bucket. b, err := tx.CreateBucketIfNotExists([]byte("widgets")) if err != nil { @@ -6055,7 +6058,7 @@ func TestTx_CreateBucketIfNotExists(t *testing.T) { } // Read the bucket through a separate transaction. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { if tx.Bucket([]byte("widgets")) == nil { t.Fatal("expected bucket") } @@ -6073,7 +6076,7 @@ func TestTx_CreateBucketIfNotExists_ErrBucketNameRequired(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucketIfNotExists([]byte{}) if err != ErrBucketNameRequired { t.Fatalf("unexpected error: %s", err) @@ -6098,7 +6101,7 @@ func TestTx_CreateBucket_ErrBucketExists(t *testing.T) { defer os.Remove(db.Path()) // Create a bucket. - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -6111,7 +6114,7 @@ func TestTx_CreateBucket_ErrBucketExists(t *testing.T) { } // Create the same bucket again. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) if err != ErrBucketExists { t.Fatalf("unexpected error: %s", err) @@ -6130,7 +6133,7 @@ func TestTx_CreateBucket_ErrBucketNameRequired(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { _, err := tx.CreateBucket(nil) if err != ErrBucketNameRequired { t.Fatalf("unexpected error: %s", err) @@ -6150,7 +6153,7 @@ func TestTx_DeleteBucket(t *testing.T) { defer os.Remove(db.Path()) // Create a bucket and add a value. - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -6168,7 +6171,7 @@ func TestTx_DeleteBucket(t *testing.T) { } // Delete the bucket and make sure we can't get the value. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { err := tx.DeleteBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -6184,7 +6187,7 @@ func TestTx_DeleteBucket(t *testing.T) { t.Fatal(err) } - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { // Create the bucket again and make sure there's not a phantom // value. b, err := tx.CreateBucket([]byte("widgets")) @@ -6232,7 +6235,7 @@ func TestTx_DeleteBucket_ReadOnly(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.View(func(tx *Tx) error { + err := db.View(func(tx ITx) error { err := tx.DeleteBucket([]byte("foo")) if err != ErrTxNotWritable { t.Fatalf("unexpected error: %s", err) @@ -6251,7 +6254,7 @@ func TestTx_DeleteBucket_NotFound(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { err := tx.DeleteBucket([]byte("widgets")) if err != ErrBucketNotFound { t.Fatalf("unexpected error: %s", err) @@ -6271,7 +6274,7 @@ func TestTx_ForEach_NoError(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -6302,7 +6305,7 @@ func TestTx_ForEach_WithError(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -6336,7 +6339,7 @@ func TestTx_OnCommit(t *testing.T) { defer os.Remove(db.Path()) var x int - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { tx.OnCommit(func() { x += 1 }) tx.OnCommit(func() { x += 2 }) _, err := tx.CreateBucket([]byte("widgets")) @@ -6359,7 +6362,7 @@ func TestTx_OnCommit_Rollback(t *testing.T) { defer os.Remove(db.Path()) var x int - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { tx.OnCommit(func() { x += 1 }) tx.OnCommit(func() { x += 2 }) _, err := tx.CreateBucket([]byte("widgets")) @@ -6403,7 +6406,7 @@ func TestTx_WriteTo_Error_Meta(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -6426,7 +6429,7 @@ func TestTx_WriteTo_Error_Meta(t *testing.T) { } const expectedMsg = "meta 0 copy: error injected for tests" - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { _, err := tx.WriteTo(&failWriter{}) return err }) @@ -6441,7 +6444,7 @@ func TestTx_WriteTo_Error_Normal(t *testing.T) { defer db.MustClose() defer os.Remove(db.Path()) - err := db.Update(func(tx *Tx) error { + err := db.Update(func(tx ITx) error { b, err := tx.CreateBucket([]byte("widgets")) if err != nil { t.Fatal(err) @@ -6463,7 +6466,7 @@ func TestTx_WriteTo_Error_Normal(t *testing.T) { t.Fatal(err) } - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { _, err := tx.WriteTo(&failWriter{3 * db.pageSize}) return err }) @@ -6482,7 +6485,7 @@ func ExampleTx_Rollback() { defer os.Remove(db.Path()) // Create a bucket. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { _, err := tx.CreateBucket([]byte("widgets")) return err }) @@ -6491,7 +6494,7 @@ func ExampleTx_Rollback() { } // Set a value for a key. - err = db.Update(func(tx *Tx) error { + err = db.Update(func(tx ITx) error { return tx.Bucket([]byte("widgets")).Put( []byte("foo"), []byte("bar"), @@ -6519,7 +6522,7 @@ func ExampleTx_Rollback() { } // Ensure that our original value is still set. - err = db.View(func(tx *Tx) error { + err = db.View(func(tx ITx) error { value := tx.Bucket([]byte("widgets")).Get([]byte("foo")) fmt.Printf("The value for 'foo' is still: %s\n", value) return nil |