simplifying

This commit is contained in:
Jaremy Creechley 2023-09-25 22:50:11 -07:00
parent 575d973118
commit 77e53d2bf6
No known key found for this signature in database
GPG Key ID: 4E66FB67B21D3300
2 changed files with 21 additions and 24 deletions

View File

@ -26,7 +26,7 @@ proc readOnly*[K,V](self: SQLiteBackend[K,V]): bool = self.db.readOnly
proc timestamp*(t = epochTime()): int64 = proc timestamp*(t = epochTime()): int64 =
(t * 1_000_000).int64 (t * 1_000_000).int64
proc has*[K,V](self: SQLiteBackend[K,V], key: DbKey): ?!bool = proc has*[K,V](self: SQLiteBackend[K,V], key: K): ?!bool =
var var
exists = false exists = false
key = key key = key
@ -42,7 +42,7 @@ proc has*[K,V](self: SQLiteBackend[K,V], key: DbKey): ?!bool =
proc delete*[K,V](self: SQLiteBackend[K,V], key: K): ?!void = proc delete*[K,V](self: SQLiteBackend[K,V], key: K): ?!void =
return self.db.deleteStmt.exec((key)) return self.db.deleteStmt.exec((key))
proc delete*[K,V](self: SQLiteBackend[K,V], keys: openArray[DbKey]): ?!void = proc delete*[K,V](self: SQLiteBackend[K,V], keys: openArray[K]): ?!void =
if err =? self.db.beginStmt.exec().errorOption: if err =? self.db.beginStmt.exec().errorOption:
return failure(err) return failure(err)
@ -74,7 +74,7 @@ proc get*[K,V](self: SQLiteBackend[K,V], key: K): ?!seq[byte] =
if bytes.len <= 0: if bytes.len <= 0:
return failure( return failure(
newException(DatastoreKeyNotFound, "DbKey doesn't exist")) newException(DatastoreKeyNotFound, "key doesn't exist"))
return success bytes return success bytes
@ -212,7 +212,7 @@ iterator iter*[K, V](handle: var DbQueryHandle[K, V, RawStmtPtr]): ?!DbQueryResp
handle.close() handle.close()
proc contains*[K,V](self: SQLiteBackend[K,V], key: DbKey): bool = proc contains*[K,V](self: SQLiteBackend[K,V], key: K): bool =
return self.has(key).get() return self.has(key).get()

View File

@ -50,7 +50,7 @@ type
TaskCtx[D; T: ThreadTypes] = object TaskCtx[D; T: ThreadTypes] = object
ds: D key: KeyId
res: ThreadResult[T] res: ThreadResult[T]
signal: ThreadSignalPtr signal: ThreadSignalPtr
running: bool running: bool
@ -74,14 +74,20 @@ proc setCancelled(ctx: var TaskCtx): bool =
ctx.cancelled = true ctx.cancelled = true
return true return true
proc dispatchTask[D, T](self: ThreadDatastore, template dispatchTask(self: ThreadDatastore,
ctx: var TaskCtx[D, T], signal: ThreadSignalPtr,
key: ?KeyId = KeyId.none, fn: untyped): auto =
runTask: proc(): void var
): Future[?!T] {.async.} = ctx = TaskCtx[SqliteDB, bool](signal: signal)
try: try:
runTask() case self.backend.kind:
await wait(ctx.signal) of Sqlite:
var ds = self.backend.sql
proc runTask() =
`fn`(addr ctx, ds)
runTask()
await wait(ctx.signal)
except CancelledError as exc: except CancelledError as exc:
trace "Cancelling thread future!", exc = exc.msg trace "Cancelling thread future!", exc = exc.msg
while not ctx.setCancelled(): while not ctx.setCancelled():
@ -98,13 +104,13 @@ proc acquireSignal(): ?!ThreadSignalPtr =
else: else:
success signal.get() success signal.get()
proc hasTask(ctx: ptr TaskCtx, key: KeyId) = proc hasTask[D](ctx: ptr TaskCtx, ds: D) =
defer: defer:
if not ctx.isNil: if not ctx.isNil:
discard ctx[].signal.fireSync() discard ctx[].signal.fireSync()
try: try:
let res = has(ctx.ds, key) let res = has(ds, key)
ctx.res = res.mapErr() do(e: ref CatchableError) -> ThreadResErr: ctx.res = res.mapErr() do(e: ref CatchableError) -> ThreadResErr:
e.toThreadErr() e.toThreadErr()
except CatchableError as exc: except CatchableError as exc:
@ -118,16 +124,7 @@ method has*(self: ThreadDatastore, key: Key): Future[?!bool] {.async.} =
without signal =? acquireSignal(), err: without signal =? acquireSignal(), err:
return bool.failure err return bool.failure err
case self.backend.kind: dispatchTask(self, signal, hasTask)
of Sqlite:
var
ds = self.backend.sql
ctx = TaskCtx[SqliteDB, bool](ds: self.backend.sql, signal: signal)
proc runTask() =
self.tp.spawn hasTask(addr ctx, key)
return await self.dispatchTask(ctx, key.some, runTask)
# proc asyncDelTask(ctx: ptr TaskCtx[void], key: ptr Key) {.async.} = # proc asyncDelTask(ctx: ptr TaskCtx[void], key: ptr Key) {.async.} =
# if ctx.isNil: # if ctx.isNil: