fix: fixed length string with terminating character

This commit is contained in:
Xie Yanbo 2019-11-16 20:24:33 +08:00
parent 068b9822d3
commit f06f932669
2 changed files with 16 additions and 3 deletions

View File

@ -60,6 +60,10 @@ proc put*(self: LevelDb, key: string, value: string, sync = true) =
key, key.len.csize, value, value.len.csize, addr errPtr)
checkError(errPtr)
proc newString(cstr: cstring, length: csize): string =
result = newString(length)
copyMem(unsafeAddr result[0], cstr, length)
proc get*(self: LevelDb, key: string): Option[string] =
var size: csize
var errPtr: cstring = nil
@ -69,7 +73,7 @@ proc get*(self: LevelDb, key: string): Option[string] =
if s == nil:
result = none(string)
else:
result = some ($s)[0..<size]
result = some (newString(s, size))
free(s)
proc delete*(self: LevelDb, key: string, sync = true) =
@ -84,13 +88,13 @@ proc getIterData(iterPtr: ptr leveldb_iterator_t): (Option[string], Option[strin
str = leveldb_iter_key(iterPtr, addr len)
if len > 0:
result[0] = some ($str)[0..<len]
result[0] = some (newString(str, len))
else:
result[0] = none string
str = leveldb_iter_value(iterPtr, addr len)
if len > 0:
result[1] = some ($str)[0..<len]
result[1] = some (newString(str, len))
else:
result[1] = none string

View File

@ -29,6 +29,10 @@ suite "leveldb":
db.delete("hello")
check(db.get("hello") == none(string))
test "get value with 0x00":
db.put("\0key", "\0ff")
check(db.get("\0key") == some("\0ff"))
proc initData(db: LevelDb) =
db.put("aa", "1")
db.put("ba", "2")
@ -67,3 +71,8 @@ suite "leveldb":
initData(db)
check(toSeq(db.iterRange(start = "bb", limit = "b")) ==
@[("bb", "3"), ("ba", "2")])
test "iter with 0x00":
db.put("\0z1", "\0ff")
db.put("z2\0", "ff\0")
check(toSeq(db.iter()) == @[("\0z1", "\0ff"), ("z2\0", "ff\0")])