mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-12-23 23:25:22 +00:00
storage: deduplicate BoltDBBatch/MemoryBatch
BoltDB doesn't have internal batching mechanism, thus we have a substitute for
it, but this substitute is absolutely identical to MemoryBatch, so it's better
to unify them and import ac5d2f94d3
fix into the
MemoryBatch.
This commit is contained in:
parent
8bf37f45fc
commit
af557cea19
3 changed files with 14 additions and 27 deletions
|
@ -24,25 +24,6 @@ type BoltDBStore struct {
|
|||
db *bbolt.DB
|
||||
}
|
||||
|
||||
// BoltDBBatch simple batch implementation to satisfy the Store interface.
|
||||
type BoltDBBatch struct {
|
||||
mem map[*[]byte][]byte
|
||||
}
|
||||
|
||||
// Len implements the Batch interface.
|
||||
func (b *BoltDBBatch) Len() int {
|
||||
return len(b.mem)
|
||||
}
|
||||
|
||||
// Put implements the Batch interface.
|
||||
func (b *BoltDBBatch) Put(k, v []byte) {
|
||||
vcopy := make([]byte, len(v))
|
||||
copy(vcopy, v)
|
||||
kcopy := make([]byte, len(k))
|
||||
copy(kcopy, k)
|
||||
b.mem[&kcopy] = vcopy
|
||||
}
|
||||
|
||||
// NewBoltDBStore returns a new ready to use BoltDB storage with created bucket.
|
||||
func NewBoltDBStore(cfg BoltDBOptions) (*BoltDBStore, error) {
|
||||
var opts *bbolt.Options // should be exposed via BoltDBOptions if anything needed
|
||||
|
@ -94,7 +75,7 @@ func (s *BoltDBStore) Get(key []byte) (val []byte, err error) {
|
|||
func (s *BoltDBStore) PutBatch(batch Batch) error {
|
||||
return s.db.Batch(func(tx *bbolt.Tx) error {
|
||||
b := tx.Bucket(Bucket)
|
||||
for k, v := range batch.(*BoltDBBatch).mem {
|
||||
for k, v := range batch.(*MemoryBatch).m {
|
||||
err := b.Put(*k, v)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -122,9 +103,7 @@ func (s *BoltDBStore) Seek(key []byte, f func(k, v []byte)) {
|
|||
// Batch implements the Batch interface and returns a boltdb
|
||||
// compatible Batch.
|
||||
func (s *BoltDBStore) Batch() Batch {
|
||||
return &BoltDBBatch{
|
||||
mem: make(map[*[]byte][]byte),
|
||||
}
|
||||
return newMemoryBatch()
|
||||
}
|
||||
|
||||
// Close releases all db resources.
|
||||
|
|
|
@ -12,14 +12,14 @@ import (
|
|||
|
||||
func TestBoltDBBatch(t *testing.T) {
|
||||
boltDB := BoltDBStore{}
|
||||
want := &BoltDBBatch{mem: map[*[]byte][]byte{}}
|
||||
want := &MemoryBatch{m: map[*[]byte][]byte{}}
|
||||
if got := boltDB.Batch(); !reflect.DeepEqual(got, want) {
|
||||
t.Errorf("BoltDB Batch() = %v, want %v", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBoltDBBatch_Len(t *testing.T) {
|
||||
batch := &BoltDBBatch{mem: map[*[]byte][]byte{}}
|
||||
batch := &MemoryBatch{m: map[*[]byte][]byte{}}
|
||||
want := len(map[*[]byte][]byte{})
|
||||
assert.Equal(t, want, batch.Len())
|
||||
}
|
||||
|
|
|
@ -20,8 +20,11 @@ type MemoryBatch struct {
|
|||
|
||||
// Put implements the Batch interface.
|
||||
func (b *MemoryBatch) Put(k, v []byte) {
|
||||
key := &k
|
||||
b.m[key] = v
|
||||
vcopy := make([]byte, len(v))
|
||||
copy(vcopy, v)
|
||||
kcopy := make([]byte, len(k))
|
||||
copy(kcopy, k)
|
||||
b.m[&kcopy] = vcopy
|
||||
}
|
||||
|
||||
// Len implements the Batch interface.
|
||||
|
@ -76,6 +79,11 @@ func (s *MemoryStore) Seek(key []byte, f func(k, v []byte)) {
|
|||
|
||||
// Batch implements the Batch interface and returns a compatible Batch.
|
||||
func (s *MemoryStore) Batch() Batch {
|
||||
return newMemoryBatch()
|
||||
}
|
||||
|
||||
// newMemoryBatch returns new memory batch.
|
||||
func newMemoryBatch() *MemoryBatch {
|
||||
return &MemoryBatch{
|
||||
m: make(map[*[]byte][]byte),
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue