mirror of
https://github.com/codex-storage/nim-leveldb.git
synced 2025-02-21 03:48:10 +00:00
fix: fixed length string with terminating character
This commit is contained in:
parent
068b9822d3
commit
f06f932669
@ -60,6 +60,10 @@ proc put*(self: LevelDb, key: string, value: string, sync = true) =
|
|||||||
key, key.len.csize, value, value.len.csize, addr errPtr)
|
key, key.len.csize, value, value.len.csize, addr errPtr)
|
||||||
checkError(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] =
|
proc get*(self: LevelDb, key: string): Option[string] =
|
||||||
var size: csize
|
var size: csize
|
||||||
var errPtr: cstring = nil
|
var errPtr: cstring = nil
|
||||||
@ -69,7 +73,7 @@ proc get*(self: LevelDb, key: string): Option[string] =
|
|||||||
if s == nil:
|
if s == nil:
|
||||||
result = none(string)
|
result = none(string)
|
||||||
else:
|
else:
|
||||||
result = some ($s)[0..<size]
|
result = some (newString(s, size))
|
||||||
free(s)
|
free(s)
|
||||||
|
|
||||||
proc delete*(self: LevelDb, key: string, sync = true) =
|
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)
|
str = leveldb_iter_key(iterPtr, addr len)
|
||||||
if len > 0:
|
if len > 0:
|
||||||
result[0] = some ($str)[0..<len]
|
result[0] = some (newString(str, len))
|
||||||
else:
|
else:
|
||||||
result[0] = none string
|
result[0] = none string
|
||||||
|
|
||||||
str = leveldb_iter_value(iterPtr, addr len)
|
str = leveldb_iter_value(iterPtr, addr len)
|
||||||
if len > 0:
|
if len > 0:
|
||||||
result[1] = some ($str)[0..<len]
|
result[1] = some (newString(str, len))
|
||||||
else:
|
else:
|
||||||
result[1] = none string
|
result[1] = none string
|
||||||
|
|
||||||
|
@ -29,6 +29,10 @@ suite "leveldb":
|
|||||||
db.delete("hello")
|
db.delete("hello")
|
||||||
check(db.get("hello") == none(string))
|
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) =
|
proc initData(db: LevelDb) =
|
||||||
db.put("aa", "1")
|
db.put("aa", "1")
|
||||||
db.put("ba", "2")
|
db.put("ba", "2")
|
||||||
@ -67,3 +71,8 @@ suite "leveldb":
|
|||||||
initData(db)
|
initData(db)
|
||||||
check(toSeq(db.iterRange(start = "bb", limit = "b")) ==
|
check(toSeq(db.iterRange(start = "bb", limit = "b")) ==
|
||||||
@[("bb", "3"), ("ba", "2")])
|
@[("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")])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user