From 74ae934f94055cb53d05648e683b7167dd68ac2f Mon Sep 17 00:00:00 2001 From: Xie Yanbo Date: Wed, 12 Feb 2020 23:29:11 +0800 Subject: [PATCH 1/3] test repairDb --- src/leveldb.nim | 6 ++++-- tests/test.nim | 8 ++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/leveldb.nim b/src/leveldb.nim index b51a657..56d6d6c 100644 --- a/src/leveldb.nim +++ b/src/leveldb.nim @@ -2,6 +2,7 @@ import options, strutils, leveldb/raw type LevelDb* = ref object + path*: string db: ptr leveldb_t syncWriteOptions: ptr leveldb_writeoptions_t asyncWriteOptions: ptr leveldb_writeoptions_t @@ -61,6 +62,7 @@ proc open*(path: string, cacheCapacity = 0): LevelDb = result.cache = cache var errPtr: cstring = nil + result.path = path result.db = leveldb_open(options, path, addr errPtr) checkError(errPtr) @@ -189,7 +191,7 @@ proc removeDb*(name: string) = leveldb_destroy_db(options, name, addr err) checkError(err) -proc repaireDb*(name: string) = +proc repairDb*(name: string) = let options = leveldb_options_create() leveldb_options_set_create_if_missing(options, 0) leveldb_options_set_error_if_exists(options, 0) @@ -322,4 +324,4 @@ when isMainModule: db.delete(key) db.close() elif args[0] == "repair": - repaireDb(dbPath) + repairDb(dbPath) diff --git a/tests/test.nim b/tests/test.nim index c1d79c6..c4d19ff 100644 --- a/tests/test.nim +++ b/tests/test.nim @@ -77,6 +77,11 @@ suite "leveldb": db.put("z2\0", "ff\0") check(toSeq(db.iter()) == @[("\0z1", "\0ff"), ("z2\0", "ff\0")]) + test "repair database": + initData(db) + db.close() + repairDb(dbName) + test "batch": db.put("a", "1") db.put("b", "2") @@ -107,5 +112,8 @@ suite "leveldb": test "open with cache": let ldb = leveldb.open(dbName & "-cache", cacheCapacity = 100000) + defer: + ldb.close() + removeDb(ldb.path) ldb.put("a", "1") check(toSeq(ldb.iter()) == @[("a", "1")]) From 6b87da8cc376f9a7e1b20f620fe4b9100b2ab3eb Mon Sep 17 00:00:00 2001 From: Xie Yanbo Date: Wed, 12 Feb 2020 23:29:23 +0800 Subject: [PATCH 2/3] more options --- src/leveldb.nim | 30 ++++++++++++++++++++++++++---- tests/test.nim | 19 +++++++++++++++++++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/leveldb.nim b/src/leveldb.nim index 56d6d6c..2cf5431 100644 --- a/src/leveldb.nim +++ b/src/leveldb.nim @@ -43,11 +43,13 @@ proc close*(self: LevelDb) = self.cache = nil self.db = nil -proc open*(path: string, cacheCapacity = 0): LevelDb = +proc open*(path: string, create = true, reuse = true, paranoidChecks = true, + cacheCapacity = 0, blockSize = 4 * 1024, writeBufferSize = 4*1024*1024, + maxOpenFiles = 1000, maxFileSize = 2 * 1024 * 1024, + restartInterval = 16): LevelDb = new(result, close) let options = leveldb_options_create() - leveldb_options_set_create_if_missing(options, levelDbTrue) defer: leveldb_options_destroy(options) result.syncWriteOptions = leveldb_writeoptions_create() @@ -56,6 +58,26 @@ proc open*(path: string, cacheCapacity = 0): LevelDb = leveldb_writeoptions_set_sync(result.asyncWriteOptions, levelDbFalse) result.readOptions = leveldb_readoptions_create() + if create: + leveldb_options_set_create_if_missing(options, levelDbTrue) + else: + leveldb_options_set_create_if_missing(options, levelDbFalse) + if reuse: + leveldb_options_set_error_if_exists(options, levelDbFalse) + else: + leveldb_options_set_error_if_exists(options, levelDbTrue) + if paranoidChecks: + leveldb_options_set_paranoid_checks(options, levelDbTrue) + else: + leveldb_options_set_paranoid_checks(options, levelDbFalse) + + leveldb_options_set_write_buffer_size(options, writeBufferSize) + leveldb_options_set_block_size(options, blockSize) + leveldb_options_set_max_open_files(options, cast[cint](maxOpenFiles)) + leveldb_options_set_max_file_size(options, maxFileSize) + leveldb_options_set_block_restart_interval(options, + cast[cint](restartInterval)) + if cacheCapacity > 0: let cache = leveldb_cache_create_lru(cacheCapacity) leveldb_options_set_cache(options, cache) @@ -193,8 +215,8 @@ proc removeDb*(name: string) = proc repairDb*(name: string) = let options = leveldb_options_create() - leveldb_options_set_create_if_missing(options, 0) - leveldb_options_set_error_if_exists(options, 0) + leveldb_options_set_create_if_missing(options, levelDbFalse) + leveldb_options_set_error_if_exists(options, levelDbFalse) var errPtr: cstring = nil leveldb_repair_db(options, name, addr errPtr) checkError(errPtr) diff --git a/tests/test.nim b/tests/test.nim index c4d19ff..72d79dd 100644 --- a/tests/test.nim +++ b/tests/test.nim @@ -117,3 +117,22 @@ suite "leveldb": removeDb(ldb.path) ldb.put("a", "1") check(toSeq(ldb.iter()) == @[("a", "1")]) + + test "open but no create": + expect LevelDbException: + let failed = leveldb.open(dbName & "-nocreate", create = false) + defer: + failed.close() + removeDb(failed.path) + + test "open but no reuse": + let old = leveldb.open(dbName & "-noreuse", reuse = true) + defer: + old.close() + removeDb(old.path) + + expect LevelDbException: + let failed = leveldb.open(old.path, reuse = false) + defer: + failed.close() + removeDb(failed.path) From 115c7a37805a2913005805199136ec3842d67a85 Mon Sep 17 00:00:00 2001 From: Xie Yanbo Date: Wed, 12 Feb 2020 23:29:32 +0800 Subject: [PATCH 3/3] compress --- src/leveldb.nim | 10 ++++++++-- tests/test.nim | 7 +++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/leveldb.nim b/src/leveldb.nim index 2cf5431..efd1912 100644 --- a/src/leveldb.nim +++ b/src/leveldb.nim @@ -12,6 +12,10 @@ type LevelDbBatch* = ref object batch: ptr leveldb_writebatch_t + CompressionType* = enum + ctNoCompression = leveldb_no_compression, + ctSnappyCompression = leveldb_snappy_compression + LevelDbException* = object of Exception const @@ -44,9 +48,10 @@ proc close*(self: LevelDb) = self.db = nil proc open*(path: string, create = true, reuse = true, paranoidChecks = true, + compressionType = ctSnappyCompression, cacheCapacity = 0, blockSize = 4 * 1024, writeBufferSize = 4*1024*1024, maxOpenFiles = 1000, maxFileSize = 2 * 1024 * 1024, - restartInterval = 16): LevelDb = + blockRestartInterval = 16): LevelDb = new(result, close) let options = leveldb_options_create() @@ -76,7 +81,8 @@ proc open*(path: string, create = true, reuse = true, paranoidChecks = true, leveldb_options_set_max_open_files(options, cast[cint](maxOpenFiles)) leveldb_options_set_max_file_size(options, maxFileSize) leveldb_options_set_block_restart_interval(options, - cast[cint](restartInterval)) + cast[cint](blockRestartInterval)) + leveldb_options_set_compression(options, cast[cint](compressionType.ord)) if cacheCapacity > 0: let cache = leveldb_cache_create_lru(cacheCapacity) diff --git a/tests/test.nim b/tests/test.nim index 72d79dd..44df169 100644 --- a/tests/test.nim +++ b/tests/test.nim @@ -136,3 +136,10 @@ suite "leveldb": defer: failed.close() removeDb(failed.path) + + test "no compress": + db.close() + let nc = leveldb.open(dbName, compressionType = ctNoCompression) + defer: nc.close() + nc.put("a", "1") + check(toSeq(nc.iter()) == @[("a", "1")])