package db
|
|
|
|
import "sync"
|
|
|
|
type atomicSetDeleter interface {
|
|
Mutex() *sync.Mutex
|
|
SetNoLock(key, value []byte)
|
|
SetNoLockSync(key, value []byte)
|
|
DeleteNoLock(key []byte)
|
|
DeleteNoLockSync(key []byte)
|
|
}
|
|
|
|
type memBatch struct {
|
|
db atomicSetDeleter
|
|
ops []operation
|
|
}
|
|
|
|
type opType int
|
|
|
|
const (
|
|
opTypeSet opType = 1
|
|
opTypeDelete opType = 2
|
|
)
|
|
|
|
type operation struct {
|
|
opType
|
|
key []byte
|
|
value []byte
|
|
}
|
|
|
|
func (mBatch *memBatch) Set(key, value []byte) {
|
|
mBatch.ops = append(mBatch.ops, operation{opTypeSet, key, value})
|
|
}
|
|
|
|
func (mBatch *memBatch) Delete(key []byte) {
|
|
mBatch.ops = append(mBatch.ops, operation{opTypeDelete, key, nil})
|
|
}
|
|
|
|
func (mBatch *memBatch) Write() {
|
|
mBatch.write(false)
|
|
}
|
|
|
|
func (mBatch *memBatch) WriteSync() {
|
|
mBatch.write(true)
|
|
}
|
|
|
|
func (mBatch *memBatch) Close() {
|
|
mBatch.ops = nil
|
|
}
|
|
|
|
func (mBatch *memBatch) write(doSync bool) {
|
|
if mtx := mBatch.db.Mutex(); mtx != nil {
|
|
mtx.Lock()
|
|
defer mtx.Unlock()
|
|
}
|
|
|
|
for i, op := range mBatch.ops {
|
|
if doSync && i == (len(mBatch.ops)-1) {
|
|
switch op.opType {
|
|
case opTypeSet:
|
|
mBatch.db.SetNoLockSync(op.key, op.value)
|
|
case opTypeDelete:
|
|
mBatch.db.DeleteNoLockSync(op.key)
|
|
}
|
|
break // we're done.
|
|
}
|
|
switch op.opType {
|
|
case opTypeSet:
|
|
mBatch.db.SetNoLock(op.key, op.value)
|
|
case opTypeDelete:
|
|
mBatch.db.DeleteNoLock(op.key)
|
|
}
|
|
}
|
|
}
|