fix empty string

This commit is contained in:
Xie Yanbo 2019-12-14 18:05:05 +08:00
parent e4a4a55630
commit c758236822
2 changed files with 26 additions and 13 deletions

View File

@ -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)

View File

@ -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()