aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dedo.go46
-rw-r--r--tests/dedo.go313
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