- 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)
- }
- }
- }
|