change to generics

This commit is contained in:
Jaremy Creechley 2023-09-25 18:12:48 -07:00
parent dbfb54f026
commit 04a30da700
No known key found for this signature in database
GPG Key ID: 4E66FB67B21D3300
3 changed files with 28 additions and 25 deletions

View File

@ -29,13 +29,13 @@ type
offset*: int # Offset from which to start querying - not available in all backends
sort*: SortOrder # Sort order - not available in all backends
DbQueryHandle*[K, T] = object
DbQueryHandle*[K, V, T] = object
query*: DbQuery[K]
cancel*: bool
closed*: bool
env*: T
DbQueryResponse* = tuple[key: Option[KeyId], data: DataBuffer]
DbQueryResponse*[K, V] = tuple[key: Option[K], data: V]
proc `$`*(id: KeyId): string = $(id.data)

View File

@ -106,7 +106,7 @@ proc close*[K,V](self: SQLiteBackend[K,V]): ?!void =
proc query*[K,V](
self: SQLiteBackend[K,V],
query: DbQuery
): Result[DbQueryHandle[K, RawStmtPtr], ref CatchableError] =
): Result[DbQueryHandle[K,V,RawStmtPtr], ref CatchableError] =
var
queryStr = if query.value:
@ -151,16 +151,16 @@ proc query*[K,V](
if not (v == SQLITE_OK):
return failure newException(DatastoreError, $sqlite3_errstr(v))
success DbQueryHandle[K, RawStmtPtr](query: query, env: s)
success DbQueryHandle[K,V,RawStmtPtr](query: query, env: s)
proc close*[K](handle: var DbQueryHandle[K, RawStmtPtr]) =
proc close*[K,V](handle: var DbQueryHandle[K,V,RawStmtPtr]) =
if not handle.closed:
handle.closed = true
discard sqlite3_reset(handle.env)
discard sqlite3_clear_bindings(handle.env)
handle.env.dispose()
iterator iter*[K](handle: var DbQueryHandle[K, RawStmtPtr]): ?!DbQueryResponse =
iterator iter*[K, V](handle: var DbQueryHandle[K, V, RawStmtPtr]): ?!DbQueryResponse[K, V] =
while not handle.cancel:
let v = sqlite3_step(handle.env)
@ -187,14 +187,14 @@ iterator iter*[K](handle: var DbQueryHandle[K, RawStmtPtr]): ?!DbQueryResponse =
if not (v in [SQLITE_OK, SQLITE_ROW, SQLITE_DONE]):
handle.cancel = true
yield DbQueryResponse.failure newException(DatastoreError, $sqlite3_errstr(v))
yield DbQueryResponse[K,V].failure newException(DatastoreError, $sqlite3_errstr(v))
let
dataLen = sqlite3_column_bytes(handle.env, QueryStmtDataCol)
data =
if blob.isSome:
let arr = cast[ptr UncheckedArray[byte]](blob)
DataBuffer.new(arr.toOpenArray(0, dataLen-1))
V.toVal(arr.toOpenArray(0, dataLen-1))
else: DataBuffer.new("")
yield success (key.some, data)
@ -203,7 +203,7 @@ iterator iter*[K](handle: var DbQueryHandle[K, RawStmtPtr]): ?!DbQueryResponse =
break
else:
handle.cancel = true
yield DbQueryResponse.failure newException(DatastoreError, $sqlite3_errstr(v))
yield DbQueryResponse[K,V].failure newException(DatastoreError, $sqlite3_errstr(v))
break
handle.close()

View File

@ -158,7 +158,7 @@ suite "queryTests":
var
handle = ds.query(q).tryGet
var res: seq[DbQueryResponse]
var res: seq[DbQueryResponse[KeyId, DataBuffer]]
var cnt = 0
for item in handle.iter():
cnt.inc
@ -202,25 +202,28 @@ suite "queryTests":
res[2].data.len == 0
# test "Key should not query parent":
# let
# q = DbQuery(key: key1)
test "Key should not query parent":
let
q = DbQuery[KeyId](key: key1)
# ds.put(key1, val1).tryGet
# ds.put(key2, val2).tryGet
# ds.put(key3, val3).tryGet
ds.put(key1, val1).tryGet
ds.put(key2, val2).tryGet
ds.put(key3, val3).tryGet
# let
# (handle, iter) = ds.query(q).tryGet
# res = iter.mapIt(it.tryGet())
var
handle = ds.query(q).tryGet
let
res = handle.iter().toSeq().mapIt(it.tryGet())
# check:
# res.len == 2
# res[0].key.get == key2
# res[0].data == val2
echo "res: ", res.mapIt($it.key)
# res[1].key.get == key3
# res[1].data == val3
check:
res.len == 2
res[0].key.get == key2
res[0].data == val2
res[1].key.get == key3
res[1].data == val3
# test "Key should all list all keys at the same level":
# let