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  }