forked from tendermint/tm-db
-
Notifications
You must be signed in to change notification settings - Fork 1
/
boltdb_batch.go
87 lines (77 loc) · 1.63 KB
/
boltdb_batch.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//go:build boltdb
// +build boltdb
package db
import "go.etcd.io/bbolt"
// boltDBBatch stores operations internally and dumps them to BoltDB on Write().
type boltDBBatch struct {
db *BoltDB
ops []operation
}
var _ Batch = (*boltDBBatch)(nil)
func newBoltDBBatch(db *BoltDB) *boltDBBatch {
return &boltDBBatch{
db: db,
ops: []operation{},
}
}
// Set implements Batch.
func (b *boltDBBatch) Set(key, value []byte) error {
if len(key) == 0 {
return errKeyEmpty
}
if value == nil {
return errValueNil
}
if b.ops == nil {
return errBatchClosed
}
b.ops = append(b.ops, operation{opTypeSet, key, value})
return nil
}
// Delete implements Batch.
func (b *boltDBBatch) Delete(key []byte) error {
if len(key) == 0 {
return errKeyEmpty
}
if b.ops == nil {
return errBatchClosed
}
b.ops = append(b.ops, operation{opTypeDelete, key, nil})
return nil
}
// Write implements Batch.
func (b *boltDBBatch) Write() error {
if b.ops == nil {
return errBatchClosed
}
err := b.db.db.Batch(func(tx *bbolt.Tx) error {
bkt := tx.Bucket(bucket)
for _, op := range b.ops {
switch op.opType {
case opTypeSet:
if err := bkt.Put(op.key, op.value); err != nil {
return err
}
case opTypeDelete:
if err := bkt.Delete(op.key); err != nil {
return err
}
}
}
return nil
})
if err != nil {
return err
}
// Make sure batch cannot be used afterwards. Callers should still call Close(), for errors.
return b.Close()
}
// WriteSync implements Batch.
func (b *boltDBBatch) WriteSync() error {
return b.Write()
}
// Close implements Batch.
func (b *boltDBBatch) Close() error {
b.ops = nil
return nil
}