feat: dispose iterator when it goes out of scope

This commit is contained in:
Mark Spanbroek 2025-10-02 07:01:15 +00:00
parent f8e61524a9
commit b9618dc3b4
2 changed files with 13 additions and 0 deletions

View File

@ -446,6 +446,10 @@ proc next*(iter: LevelDbQueryIter): (string, string) =
proc dispose*(iter: LevelDbQueryIter) =
iter.dispose(iter[])
proc `=destroy`(iter: var LevelDbQueryIterObj) =
if iter.dispose != nil:
iter.dispose(iter)
proc closeIter(iter: var LevelDbQueryIterObj, iterPtr: ptr leveldb_iterator_t) =
iter.finished = true
leveldb_iter_destroy(iterPtr)

View File

@ -255,6 +255,15 @@ suite "leveldb queryIter":
iter.next() == empty
iter.finished
test "iterator is disposed when it goes out of scope":
when defined(gcOrc) or defined(gcArc):
block:
let iter = db.queryIter()
discard iter.next()
db.close() # crashes if iterator not disposed
else:
skip()
test "skip":
let iter = db.queryIter(skip = 1)
check: