diff --git a/store/leveldb/batch.go b/store/leveldb/batch.go index 777e11c..542a322 100644 --- a/store/leveldb/batch.go +++ b/store/leveldb/batch.go @@ -7,22 +7,45 @@ package leveldb import "C" import ( + "github.com/siddontang/goleveldb/leveldb" "unsafe" ) +/* + It's not easy to let leveldb support Data() function like rocksdb, + so here, we will use goleveldb batch instead + + later optimize +*/ + type WriteBatch struct { db *DB wbatch *C.leveldb_writebatch_t + + gbatch *leveldb.Batch +} + +func newWriteBatch(db *DB) *WriteBatch { + w := new(WriteBatch) + w.db = db + w.wbatch = C.leveldb_writebatch_create() + w.gbatch = new(leveldb.Batch) + + return w } func (w *WriteBatch) Close() error { C.leveldb_writebatch_destroy(w.wbatch) w.wbatch = nil + w.gbatch = nil + return nil } func (w *WriteBatch) Put(key, value []byte) { + w.gbatch.Put(key, value) + var k, v *C.char if len(key) != 0 { k = (*C.char)(unsafe.Pointer(&key[0])) @@ -38,20 +61,29 @@ func (w *WriteBatch) Put(key, value []byte) { } func (w *WriteBatch) Delete(key []byte) { + w.gbatch.Delete(key) + C.leveldb_writebatch_delete(w.wbatch, (*C.char)(unsafe.Pointer(&key[0])), C.size_t(len(key))) } func (w *WriteBatch) Commit() error { + w.gbatch.Reset() + return w.commit(w.db.writeOpts) } func (w *WriteBatch) SyncCommit() error { + w.gbatch.Reset() + return w.commit(w.db.syncOpts) } func (w *WriteBatch) Rollback() error { C.leveldb_writebatch_clear(w.wbatch) + + w.gbatch.Reset() + return nil } @@ -65,6 +97,5 @@ func (w *WriteBatch) commit(wb *WriteOptions) error { } func (w *WriteBatch) Data() []byte { - //todo later - return nil + return w.gbatch.Dump() } diff --git a/store/leveldb/db.go b/store/leveldb/db.go index e5ab88c..a2d9c26 100644 --- a/store/leveldb/db.go +++ b/store/leveldb/db.go @@ -182,12 +182,7 @@ func (db *DB) SyncDelete(key []byte) error { } func (db *DB) NewWriteBatch() driver.IWriteBatch { - wb := &WriteBatch{ - db: db, - wbatch: C.leveldb_writebatch_create(), - } - - return wb + return newWriteBatch(db) } func (db *DB) NewIterator() driver.IIterator {