adding serialization to query iter

This commit is contained in:
Dmitriy Ryajov 2023-09-14 18:34:20 -06:00
parent 71c704f0f5
commit 600dca6148
No known key found for this signature in database
GPG Key ID: DA8C680CE7C657A4
3 changed files with 27 additions and 1 deletions

View File

@ -188,10 +188,23 @@ method query*(
var
iter = QueryIter.new()
let lock = newAsyncLock()
proc next(): Future[?!QueryResponse] {.async.} =
defer:
if lock.locked:
lock.release()
if lock.locked:
return failure (ref DatastoreError)(msg: "Should always await query features")
let
path = walker()
if iter.finished:
return failure "iterator is finished"
await lock.acquire()
if finished(walker):
iter.finished = true
return success (Key.none, EmptyBytes)

View File

@ -151,9 +151,19 @@ method query*(
if not (v == SQLITE_OK):
return failure newException(DatastoreError, $sqlite3_errstr(v))
let lock = newAsyncLock()
proc next(): Future[?!QueryResponse] {.async.} =
defer:
if lock.locked:
lock.release()
if lock.locked:
return failure (ref DatastoreError)(msg: "Should always await query features")
if iter.finished:
return failure(newException(QueryEndedError, "Calling next on a finished query!"))
return failure((ref QueryEndedError)(msg: "Calling next on a finished query!"))
await lock.acquire()
let
v = sqlite3_step(s)

View File

@ -287,6 +287,9 @@ method query*(
if lock.locked:
lock.release()
if lock.locked:
return failure (ref DatastoreError)(msg: "Should always await query features")
if iter.finished == true:
return failure (ref QueryEndedError)(msg: "Calling next on a finished query!")