github.com/evdatsion/aphelion-dpos-bft@v0.32.1/libs/db/mem_batch.go (about) 1 package db 2 3 import "sync" 4 5 type atomicSetDeleter interface { 6 Mutex() *sync.Mutex 7 SetNoLock(key, value []byte) 8 SetNoLockSync(key, value []byte) 9 DeleteNoLock(key []byte) 10 DeleteNoLockSync(key []byte) 11 } 12 13 type memBatch struct { 14 db atomicSetDeleter 15 ops []operation 16 } 17 18 type opType int 19 20 const ( 21 opTypeSet opType = 1 22 opTypeDelete opType = 2 23 ) 24 25 type operation struct { 26 opType 27 key []byte 28 value []byte 29 } 30 31 func (mBatch *memBatch) Set(key, value []byte) { 32 mBatch.ops = append(mBatch.ops, operation{opTypeSet, key, value}) 33 } 34 35 func (mBatch *memBatch) Delete(key []byte) { 36 mBatch.ops = append(mBatch.ops, operation{opTypeDelete, key, nil}) 37 } 38 39 func (mBatch *memBatch) Write() { 40 mBatch.write(false) 41 } 42 43 func (mBatch *memBatch) WriteSync() { 44 mBatch.write(true) 45 } 46 47 func (mBatch *memBatch) Close() { 48 mBatch.ops = nil 49 } 50 51 func (mBatch *memBatch) write(doSync bool) { 52 if mtx := mBatch.db.Mutex(); mtx != nil { 53 mtx.Lock() 54 defer mtx.Unlock() 55 } 56 57 for i, op := range mBatch.ops { 58 if doSync && i == (len(mBatch.ops)-1) { 59 switch op.opType { 60 case opTypeSet: 61 mBatch.db.SetNoLockSync(op.key, op.value) 62 case opTypeDelete: 63 mBatch.db.DeleteNoLockSync(op.key) 64 } 65 break // we're done. 66 } 67 switch op.opType { 68 case opTypeSet: 69 mBatch.db.SetNoLock(op.key, op.value) 70 case opTypeDelete: 71 mBatch.db.DeleteNoLock(op.key) 72 } 73 } 74 }