From cbb38a51fb42539d7b9e1565b26d46a73ee66f37 Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Thu, 21 Sep 2023 18:29:07 -0700 Subject: [PATCH] trying to fixup query --- datastore/backend.nim | 3 +++ datastore/sql/sqliteds.nim | 23 +++++++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/datastore/backend.nim b/datastore/backend.nim index 3d757bc..3ad4920 100644 --- a/datastore/backend.nim +++ b/datastore/backend.nim @@ -29,6 +29,9 @@ type offset*: int # Offset from which to start querying - not available in all backends sort*: SortOrder # Sort order - not available in all backends + DbQueryHandle* = ref object + cancel*: bool + DbQueryResponse* = tuple[key: Option[KeyId], val: DataBuffer] proc `$`*(id: KeyId): string = $(id.data) diff --git a/datastore/sql/sqliteds.nim b/datastore/sql/sqliteds.nim index c4e6230..09ce348 100644 --- a/datastore/sql/sqliteds.nim +++ b/datastore/sql/sqliteds.nim @@ -114,9 +114,11 @@ proc close*(self: SQLiteBackend): ?!void = return success() -proc query*(self: SQLiteBackend, - query: DbQuery - ): Result[iterator(): ?!DbQueryResponse {.closure.}, ref CatchableError] = +proc query*( + self: SQLiteBackend, + query: DbQuery +): Result[(DbQueryHandle, iterator(): ?!DbQueryResponse {.closure.}), + ref CatchableError] = var queryStr = if query.value: @@ -161,11 +163,14 @@ proc query*(self: SQLiteBackend, if not (v == SQLITE_OK): return failure newException(DatastoreError, $sqlite3_errstr(v)) - success iterator(): ?!DbQueryResponse {.closure.} = + let handle = DbQueryHandle() + let iter = iterator(): ?!DbQueryResponse {.closure.} = try: - let - v = sqlite3_step(s) + if handle.cancel: + return + + let v = sqlite3_step(s) case v of SQLITE_ROW: @@ -196,9 +201,9 @@ proc query*(self: SQLiteBackend, if blob.isSome: DataBuffer.new(blob.get(), 0, dataLen - 1) else: DataBuffer.new(0) - return success (key.some, data) + yield success (key.some, data) of SQLITE_DONE: - return success (KeyId.none, DataBuffer.new()) + return else: return failure newException(DatastoreError, $sqlite3_errstr(v)) @@ -208,6 +213,8 @@ proc query*(self: SQLiteBackend, discard sqlite3_clear_bindings(s) s.dispose() return + + success (handle, iter) proc contains*(self: SQLiteBackend, key: DbKey): bool =