From c75823682267126f12db73ab4aebcffff54f600b Mon Sep 17 00:00:00 2001 From: Xie Yanbo Date: Sat, 14 Dec 2019 18:05:05 +0800 Subject: [PATCH] fix empty string --- src/leveldb.nim | 23 ++++++++++------------- tests/test.nim | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/leveldb.nim b/src/leveldb.nim index efd1912..95a96d4 100644 --- a/src/leveldb.nim +++ b/src/leveldb.nim @@ -103,8 +103,11 @@ proc put*(self: LevelDb, key: string, value: string, sync = true) = checkError(errPtr) proc newString(cstr: cstring, length: csize): string = - result = newString(length) - copyMem(unsafeAddr result[0], cstr, length) + if length > 0: + result = newString(length) + copyMem(unsafeAddr result[0], cstr, length) + else: + result = "" proc get*(self: LevelDb, key: string): Option[string] = var size: csize @@ -115,7 +118,7 @@ proc get*(self: LevelDb, key: string): Option[string] = if s == nil: result = none(string) else: - result = some (newString(s, size)) + result = some(newString(s, size)) free(s) proc delete*(self: LevelDb, key: string, sync = true) = @@ -151,21 +154,15 @@ proc write*(self: LevelDb, batch: LevelDbBatch) = leveldb_write(self.db, self.syncWriteOptions, batch.batch, addr errPtr) checkError(errPtr) -proc getIterData(iterPtr: ptr leveldb_iterator_t): (Option[string], Option[string]) = +proc getIterData(iterPtr: ptr leveldb_iterator_t): (string, string) = var len: csize var str: cstring str = leveldb_iter_key(iterPtr, addr len) - if len > 0: - result[0] = some (newString(str, len)) - else: - result[0] = none string + result[0] = newString(str, len) str = leveldb_iter_value(iterPtr, addr len) - if len > 0: - result[1] = some (newString(str, len)) - else: - result[1] = none string + result[1] = newString(str, len) iterator iter*(self: LevelDb, seek: string = "", reverse: bool = false): ( string, string) = @@ -188,7 +185,7 @@ iterator iter*(self: LevelDb, seek: string = "", reverse: bool = false): ( var err: cstring = nil leveldb_iter_get_error(iterPtr, addr err) checkError(err) - yield (key.get(), value.get()) + yield (key, value) if reverse: leveldb_iter_prev(iterPtr) diff --git a/tests/test.nim b/tests/test.nim index 44df169..4f9b0db 100644 --- a/tests/test.nim +++ b/tests/test.nim @@ -33,6 +33,14 @@ suite "leveldb": db.put("\0key", "\0ff") check(db.get("\0key") == some("\0ff")) + test "get empty value": + db.put("a", "") + check(db.get("a") == some("")) + + test "get empty key": + db.put("", "a") + check(db.get("") == some("a")) + proc initData(db: LevelDb) = db.put("aa", "1") db.put("ba", "2") @@ -77,6 +85,14 @@ suite "leveldb": db.put("z2\0", "ff\0") check(toSeq(db.iter()) == @[("\0z1", "\0ff"), ("z2\0", "ff\0")]) + test "iter empty value": + db.put("a", "") + check(toSeq(db.iter()) == @[("a", "")]) + + test "iter empty key": + db.put("", "a") + check(toSeq(db.iter()) == @[("", "a")]) + test "repair database": initData(db) db.close()