From 237f2d2b8a2c515ebbf54477a125310cc6cdda28 Mon Sep 17 00:00:00 2001 From: munna0908 Date: Thu, 27 Mar 2025 21:28:53 +0530 Subject: [PATCH 1/3] add support for batch deletes --- datastore/datastore.nim | 3 +++ datastore/leveldb/leveldbds.nim | 10 ++++++++++ datastore/typedds.nim | 3 +++ 3 files changed, 16 insertions(+) diff --git a/datastore/datastore.nim b/datastore/datastore.nim index b038165..3ced9ee 100644 --- a/datastore/datastore.nim +++ b/datastore/datastore.nim @@ -25,6 +25,9 @@ method delete*(self: Datastore, key: Key): Future[?!void] {.base, gcsafe, locks: method delete*(self: Datastore, keys: seq[Key]): Future[?!void] {.base, gcsafe, locks: "unknown".} = raiseAssert("Not implemented!") +method batchDelete*(self: Datastore, keys: seq[Key]): Future[?!void] {.base, gcsafe, locks: "unknown".} = + raiseAssert("Not implemented!") + method get*(self: Datastore, key: Key): Future[?!seq[byte]] {.base, gcsafe, locks: "unknown".} = raiseAssert("Not implemented!") diff --git a/datastore/leveldb/leveldbds.nim b/datastore/leveldb/leveldbds.nim index afa07ae..22f29ae 100644 --- a/datastore/leveldb/leveldbds.nim +++ b/datastore/leveldb/leveldbds.nim @@ -40,6 +40,16 @@ method delete*(self: LevelDbDatastore, keys: seq[Key]): Future[?!void] {.async.} return failure(err.msg) return success() +method batchDelete*(self: LevelDbDatastore, keys: seq[Key]): Future[?!void] {.async.} = + try: + let b = newBatch() + for key in keys: + b.delete($key) + self.db.write(b) + return success() + except LevelDbException as e: + return failure("LevelDbDatastore.batchDelete exception: " & e.msg) + method get*(self: LevelDbDatastore, key: Key): Future[?!seq[byte]] {.async.} = try: let str = self.db.get($key) diff --git a/datastore/typedds.nim b/datastore/typedds.nim index 21dc2a2..adffb9c 100644 --- a/datastore/typedds.nim +++ b/datastore/typedds.nim @@ -83,6 +83,9 @@ proc delete*(self: TypedDatastore, key: Key): Future[?!void] {.async.} = proc delete*(self: TypedDatastore, keys: seq[Key]): Future[?!void] {.async.} = await self.ds.delete(keys) +proc batchDelete*(self: TypedDatastore, keys: seq[Key]): Future[?!void] {.async.} = + await self.ds.batchDelete(keys) + proc close*(self: TypedDatastore): Future[?!void] {.async.} = await self.ds.close() From 39c400a87cee69b2c38db878f79c0f066108d303 Mon Sep 17 00:00:00 2001 From: munna0908 Date: Thu, 27 Mar 2025 21:33:39 +0530 Subject: [PATCH 2/3] change method signatures --- datastore/datastore.nim | 3 --- datastore/leveldb/leveldbds.nim | 9 ++------- datastore/typedds.nim | 3 --- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/datastore/datastore.nim b/datastore/datastore.nim index 3ced9ee..b038165 100644 --- a/datastore/datastore.nim +++ b/datastore/datastore.nim @@ -25,9 +25,6 @@ method delete*(self: Datastore, key: Key): Future[?!void] {.base, gcsafe, locks: method delete*(self: Datastore, keys: seq[Key]): Future[?!void] {.base, gcsafe, locks: "unknown".} = raiseAssert("Not implemented!") -method batchDelete*(self: Datastore, keys: seq[Key]): Future[?!void] {.base, gcsafe, locks: "unknown".} = - raiseAssert("Not implemented!") - method get*(self: Datastore, key: Key): Future[?!seq[byte]] {.base, gcsafe, locks: "unknown".} = raiseAssert("Not implemented!") diff --git a/datastore/leveldb/leveldbds.nim b/datastore/leveldb/leveldbds.nim index 22f29ae..78c2617 100644 --- a/datastore/leveldb/leveldbds.nim +++ b/datastore/leveldb/leveldbds.nim @@ -34,13 +34,8 @@ method delete*(self: LevelDbDatastore, key: Key): Future[?!void] {.async.} = except LevelDbException as e: return failure("LevelDbDatastore.delete exception: " & e.msg) -method delete*(self: LevelDbDatastore, keys: seq[Key]): Future[?!void] {.async.} = - for key in keys: - if err =? (await self.delete(key)).errorOption: - return failure(err.msg) - return success() -method batchDelete*(self: LevelDbDatastore, keys: seq[Key]): Future[?!void] {.async.} = +method delete*(self: LevelDbDatastore, keys: seq[Key]): Future[?!void] {.async.} = try: let b = newBatch() for key in keys: @@ -48,7 +43,7 @@ method batchDelete*(self: LevelDbDatastore, keys: seq[Key]): Future[?!void] {.as self.db.write(b) return success() except LevelDbException as e: - return failure("LevelDbDatastore.batchDelete exception: " & e.msg) + return failure("LevelDbDatastore.delete batch exception: " & e.msg) method get*(self: LevelDbDatastore, key: Key): Future[?!seq[byte]] {.async.} = try: diff --git a/datastore/typedds.nim b/datastore/typedds.nim index adffb9c..21dc2a2 100644 --- a/datastore/typedds.nim +++ b/datastore/typedds.nim @@ -83,9 +83,6 @@ proc delete*(self: TypedDatastore, key: Key): Future[?!void] {.async.} = proc delete*(self: TypedDatastore, keys: seq[Key]): Future[?!void] {.async.} = await self.ds.delete(keys) -proc batchDelete*(self: TypedDatastore, keys: seq[Key]): Future[?!void] {.async.} = - await self.ds.batchDelete(keys) - proc close*(self: TypedDatastore): Future[?!void] {.async.} = await self.ds.close() From 0beff39fbe702e58640244600f176bb84f1429a9 Mon Sep 17 00:00:00 2001 From: munna0908 Date: Thu, 27 Mar 2025 21:45:12 +0530 Subject: [PATCH 3/3] code cleanup --- datastore/leveldb/leveldbds.nim | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/datastore/leveldb/leveldbds.nim b/datastore/leveldb/leveldbds.nim index 78c2617..6fab4f7 100644 --- a/datastore/leveldb/leveldbds.nim +++ b/datastore/leveldb/leveldbds.nim @@ -34,8 +34,8 @@ method delete*(self: LevelDbDatastore, key: Key): Future[?!void] {.async.} = except LevelDbException as e: return failure("LevelDbDatastore.delete exception: " & e.msg) - -method delete*(self: LevelDbDatastore, keys: seq[Key]): Future[?!void] {.async.} = +method delete*(self: LevelDbDatastore, keys: seq[Key]): Future[ + ?!void] {.async.} = try: let b = newBatch() for key in keys: @@ -49,13 +49,15 @@ method get*(self: LevelDbDatastore, key: Key): Future[?!seq[byte]] {.async.} = try: let str = self.db.get($key) if not str.isSome: - return failure(newException(DatastoreKeyNotFound, "LevelDbDatastore.get: key not found " & $key)) + return failure(newException(DatastoreKeyNotFound, + "LevelDbDatastore.get: key not found " & $key)) let bytes = str.get().toBytes() return success(bytes) except LevelDbException as e: return failure("LevelDbDatastore.get exception: " & $e.msg) -method put*(self: LevelDbDatastore, key: Key, data: seq[byte]): Future[?!void] {.async.} = +method put*(self: LevelDbDatastore, key: Key, data: seq[byte]): Future[ + ?!void] {.async.} = try: let str = string.fromBytes(data) self.db.put($key, str) @@ -63,7 +65,8 @@ method put*(self: LevelDbDatastore, key: Key, data: seq[byte]): Future[?!void] { except LevelDbException as e: return failure("LevelDbDatastore.put exception: " & $e.msg) -method put*(self: LevelDbDatastore, batch: seq[BatchEntry]): Future[?!void] {.async.} = +method put*(self: LevelDbDatastore, batch: seq[BatchEntry]): Future[ + ?!void] {.async.} = try: let b = newBatch() for entry in batch: @@ -105,7 +108,8 @@ method query*( proc next(): Future[?!QueryResponse] {.async.} = if iter.finished: - return failure(newException(QueryEndedError, "Calling next on a finished query!")) + return failure(newException(QueryEndedError, + "Calling next on a finished query!")) try: let (keyStr, valueStr) = dbIter.next()