diff --git a/leveldbstatic.nim b/leveldbstatic.nim index 4dcb186..d80e8f4 100644 --- a/leveldbstatic.nim +++ b/leveldbstatic.nim @@ -77,9 +77,11 @@ type LevelDbException* = object of CatchableError IterNext* = proc(): (string, string) {.gcsafe, closure.} + IterDispose* = proc() {.gcsafe, closure.} LevelDbQueryIter* = ref object finished*: bool next*: IterNext + dispose*: IterDispose const version* = block: @@ -477,8 +479,13 @@ proc queryIter*(self: LevelDb, prefix: string = "", keysOnly: bool = false, skip else: return (keyStr, valueStr) + proc dispose() {.gcsafe, closure.} = + if not iter.finished: + iter.closeIter(iterPtr) + iter.finished = false iter.next = getNext + iter.dispose = dispose return iter proc removeDb*(name: string) = diff --git a/leveldbstatic.nimble b/leveldbstatic.nimble index f4ee448..bdcf969 100644 --- a/leveldbstatic.nimble +++ b/leveldbstatic.nimble @@ -1,6 +1,6 @@ # Package -version = "0.1.2" +version = "0.1.3" author = "leveldbstatic authors" description = "Statically linked LevelDB wrapper for Nim" license = "MIT" diff --git a/tests/test.nim b/tests/test.nim index 858e993..7143e46 100644 --- a/tests/test.nim +++ b/tests/test.nim @@ -241,6 +241,22 @@ suite "leveldb queryIter": iter.next() == empty iter.finished + test "iterate until disposed": + let iter = db.queryIter() + check: + not iter.finished + iter.next() == (k1, v1) + not iter.finished + iter.next() == (k2, v2) + not iter.finished + + iter.dispose() + + check: + iter.finished + iter.next() == empty + iter.finished + test "skip": let iter = db.queryIter(skip = 1) check: