|
- package nodb
-
- import (
- "sync"
-
- "github.com/lunny/nodb/store"
- )
-
- type batch struct {
- l *Nodb
-
- store.WriteBatch
-
- sync.Locker
-
- logs [][]byte
-
- tx *Tx
- }
-
- func (b *batch) Commit() error {
- b.l.commitLock.Lock()
- defer b.l.commitLock.Unlock()
-
- err := b.WriteBatch.Commit()
-
- if b.l.binlog != nil {
- if err == nil {
- if b.tx == nil {
- b.l.binlog.Log(b.logs...)
- } else {
- b.tx.logs = append(b.tx.logs, b.logs...)
- }
- }
- b.logs = [][]byte{}
- }
-
- return err
- }
-
- func (b *batch) Lock() {
- b.Locker.Lock()
- }
-
- func (b *batch) Unlock() {
- if b.l.binlog != nil {
- b.logs = [][]byte{}
- }
- b.WriteBatch.Rollback()
- b.Locker.Unlock()
- }
-
- func (b *batch) Put(key []byte, value []byte) {
- if b.l.binlog != nil {
- buf := encodeBinLogPut(key, value)
- b.logs = append(b.logs, buf)
- }
- b.WriteBatch.Put(key, value)
- }
-
- func (b *batch) Delete(key []byte) {
- if b.l.binlog != nil {
- buf := encodeBinLogDelete(key)
- b.logs = append(b.logs, buf)
- }
- b.WriteBatch.Delete(key)
- }
-
- type dbBatchLocker struct {
- l *sync.Mutex
- wrLock *sync.RWMutex
- }
-
- func (l *dbBatchLocker) Lock() {
- l.wrLock.RLock()
- l.l.Lock()
- }
-
- func (l *dbBatchLocker) Unlock() {
- l.l.Unlock()
- l.wrLock.RUnlock()
- }
-
- type txBatchLocker struct {
- }
-
- func (l *txBatchLocker) Lock() {}
- func (l *txBatchLocker) Unlock() {}
-
- type multiBatchLocker struct {
- }
-
- func (l *multiBatchLocker) Lock() {}
- func (l *multiBatchLocker) Unlock() {}
-
- func (l *Nodb) newBatch(wb store.WriteBatch, locker sync.Locker, tx *Tx) *batch {
- b := new(batch)
- b.l = l
- b.WriteBatch = wb
-
- b.tx = tx
- b.Locker = locker
-
- b.logs = [][]byte{}
- return b
- }
|