From 1d22c623250da2fcb2e8d4d899a06abd0ae2df24 Mon Sep 17 00:00:00 2001 From: Giuliano Mega Date: Mon, 9 Feb 2026 10:01:13 -0300 Subject: [PATCH] fix: use proper object reference in hashing (#85) Uses `addr obj[]` instead of `addr obj`, fix tests. Signed-off-by: Giuliano Mega --- datastore.nimble | 2 +- datastore/leveldb/leveldbds.nim | 8 ++++++-- tests/datastore/leveldb/testleveldbds.nim | 7 +++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/datastore.nimble b/datastore.nimble index 289e9ec..f858f09 100644 --- a/datastore.nimble +++ b/datastore.nimble @@ -1,7 +1,7 @@ mode = ScriptMode.Verbose packageName = "datastore" -version = "0.2.2" +version = "0.2.3" author = "Status Research & Development GmbH" description = "Simple, unified API for multiple data stores" license = "Apache License 2.0 or MIT" diff --git a/datastore/leveldb/leveldbds.nim b/datastore/leveldb/leveldbds.nim index d4f4d46..8ceaf8c 100644 --- a/datastore/leveldb/leveldbds.nim +++ b/datastore/leveldb/leveldbds.nim @@ -6,6 +6,7 @@ import std/os import std/strformat import std/strutils import std/sets +import std/sequtils import pkg/leveldbstatic import pkg/chronos @@ -23,7 +24,7 @@ type openIterators: HashSet[QueryIter] proc hash(iter: QueryIter): Hash = - hash(addr iter) + hash(addr iter[]) method has*(self: LevelDbDatastore, key: Key): Future[?!bool] {.async: (raises: [CancelledError]).} = try: @@ -75,7 +76,7 @@ method put*(self: LevelDbDatastore, batch: seq[BatchEntry]): Future[?!void] {.as method close*(self: LevelDbDatastore): Future[?!void] {.async: (raises: [CancelledError]).} = try: - for iter in self.openIterators: + for iter in self.openIterators.toSeq: if err =? (await iter.dispose()).errorOption: return failure(err.msg) self.openIterators.clear() @@ -163,6 +164,9 @@ method modify*( if not lock.locked: self.locks.del(key) +proc openIteratorCount*(self: LevelDbDatastore): int = + self.openIterators.len + proc new*( T: type LevelDbDatastore, dbName: string): ?!T = try: diff --git a/tests/datastore/leveldb/testleveldbds.nim b/tests/datastore/leveldb/testleveldbds.nim index 9b39943..3497d92 100644 --- a/tests/datastore/leveldb/testleveldbds.nim +++ b/tests/datastore/leveldb/testleveldbds.nim @@ -195,3 +195,10 @@ suite "LevelDB Query": let iter = (await ds.query(q)).tryGet (await iter.dispose()).tryGet (await iter.dispose()).tryGet + + test "should stop tracking iterator objects once those are disposed": + let q = Query.init(Key.init("/a/b/c").tryGet) + let iter = (await ds.query(q)).tryGet + check ds.openIteratorCount == 1 + (await iter.dispose()).tryGet + check ds.openIteratorCount == 0