From 594a5deb8396f8942899d0508ad8364a910c9a78 Mon Sep 17 00:00:00 2001 From: Xie Yanbo Date: Sat, 14 Dec 2019 18:11:20 +0800 Subject: [PATCH 1/2] add batch procedure --- src/leveldb.nim | 30 ++++++++++++++++++++++++++++++ tests/test.nim | 28 ++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/leveldb.nim b/src/leveldb.nim index 3567564..6ba9275 100644 --- a/src/leveldb.nim +++ b/src/leveldb.nim @@ -7,6 +7,9 @@ type asyncWriteOptions: ptr leveldb_writeoptions_t readOptions: ptr leveldb_readoptions_t + LevelDbBatch* = ref object + batch: ptr leveldb_writebatch_t + LevelDbException* = object of Exception const @@ -82,6 +85,33 @@ proc delete*(self: LevelDb, key: string, sync = true) = leveldb_delete(self.db, writeOptions, key, key.len, addr errPtr) checkError(errPtr) +proc destroy*(self: LevelDbBatch) = + if self.batch == nil: + return + leveldb_writebatch_destroy(self.batch) + self.batch = nil + +proc newBatch*(): LevelDbBatch = + new(result, destroy) + result.batch = leveldb_writebatch_create() + +proc put*(self: LevelDbBatch, key: string, value: string, sync = true) = + leveldb_writebatch_put(self.batch, key, key.len.csize, value, value.len.csize) + +proc append*(self, source: LevelDbBatch) = + leveldb_writebatch_append(self.batch, source.batch) + +proc delete*(self: LevelDbBatch, key: string) = + leveldb_writebatch_delete(self.batch, key, key.len.csize) + +proc clear*(self: LevelDbBatch) = + leveldb_writebatch_clear(self.batch) + +proc write*(self: LevelDb, batch: LevelDbBatch) = + var errPtr: cstring = nil + leveldb_write(self.db, self.syncWriteOptions, batch.batch, addr errPtr) + checkError(errPtr) + proc getIterData(iterPtr: ptr leveldb_iterator_t): (Option[string], Option[string]) = var len: csize var str: cstring diff --git a/tests/test.nim b/tests/test.nim index 611d678..4e63032 100644 --- a/tests/test.nim +++ b/tests/test.nim @@ -76,3 +76,31 @@ suite "leveldb": db.put("\0z1", "\0ff") db.put("z2\0", "ff\0") check(toSeq(db.iter()) == @[("\0z1", "\0ff"), ("z2\0", "ff\0")]) + + test "batch": + db.put("a", "1") + db.put("b", "2") + let batch = newBatch() + batch.put("a", "10") + batch.put("c", "30") + batch.delete("b") + db.write(batch) + check(toSeq(db.iter()) == @[("a", "10"), ("c", "30")]) + + test "batch append": + let batch = newBatch() + let batch2 = newBatch() + batch.put("a", "1") + batch2.put("b", "2") + batch2.delete("a") + batch.append(batch2) + db.write(batch) + check(toSeq(db.iter()) == @[("b", "2")]) + + test "batch clear": + let batch = newBatch() + batch.put("a", "1") + batch.clear() + batch.put("b", "2") + db.write(batch) + check(toSeq(db.iter()) == @[("b", "2")]) From ebc0544b8f6154fdbdf57fc68bda0ca9eb76dc13 Mon Sep 17 00:00:00 2001 From: Xie Yanbo Date: Sat, 14 Dec 2019 18:11:56 +0800 Subject: [PATCH 2/2] support cache option --- src/leveldb.nim | 11 ++++++++++- tests/test.nim | 5 +++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/leveldb.nim b/src/leveldb.nim index 6ba9275..b51a657 100644 --- a/src/leveldb.nim +++ b/src/leveldb.nim @@ -6,6 +6,7 @@ type syncWriteOptions: ptr leveldb_writeoptions_t asyncWriteOptions: ptr leveldb_writeoptions_t readOptions: ptr leveldb_readoptions_t + cache: ptr leveldb_cache_t LevelDbBatch* = ref object batch: ptr leveldb_writebatch_t @@ -36,9 +37,12 @@ proc close*(self: LevelDb) = leveldb_writeoptions_destroy(self.syncWriteOptions) leveldb_writeoptions_destroy(self.asyncWriteOptions) leveldb_readoptions_destroy(self.readOptions) + if self.cache != nil: + leveldb_cache_destroy(self.cache) + self.cache = nil self.db = nil -proc open*(path: string): LevelDb = +proc open*(path: string, cacheCapacity = 0): LevelDb = new(result, close) let options = leveldb_options_create() @@ -51,6 +55,11 @@ proc open*(path: string): LevelDb = leveldb_writeoptions_set_sync(result.asyncWriteOptions, levelDbFalse) result.readOptions = leveldb_readoptions_create() + if cacheCapacity > 0: + let cache = leveldb_cache_create_lru(cacheCapacity) + leveldb_options_set_cache(options, cache) + result.cache = cache + var errPtr: cstring = nil result.db = leveldb_open(options, path, addr errPtr) checkError(errPtr) diff --git a/tests/test.nim b/tests/test.nim index 4e63032..c1d79c6 100644 --- a/tests/test.nim +++ b/tests/test.nim @@ -104,3 +104,8 @@ suite "leveldb": batch.put("b", "2") db.write(batch) check(toSeq(db.iter()) == @[("b", "2")]) + + test "open with cache": + let ldb = leveldb.open(dbName & "-cache", cacheCapacity = 100000) + ldb.put("a", "1") + check(toSeq(ldb.iter()) == @[("a", "1")])