From b9618dc3b4e93f02eae448e7540ead198005e339 Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Thu, 2 Oct 2025 07:01:15 +0000 Subject: [PATCH] feat: dispose iterator when it goes out of scope --- leveldbstatic.nim | 4 ++++ tests/test.nim | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/leveldbstatic.nim b/leveldbstatic.nim index 11880bf..4cfaf1b 100644 --- a/leveldbstatic.nim +++ b/leveldbstatic.nim @@ -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) diff --git a/tests/test.nim b/tests/test.nim index 9799054..864de39 100644 --- a/tests/test.nim +++ b/tests/test.nim @@ -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: