diff --git a/datastore/backend.nim b/datastore/backend.nim index 1382833..54c7c62 100644 --- a/datastore/backend.nim +++ b/datastore/backend.nim @@ -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) diff --git a/datastore/sql/sqliteds.nim b/datastore/sql/sqliteds.nim index f02e441..b3b7c4e 100644 --- a/datastore/sql/sqliteds.nim +++ b/datastore/sql/sqliteds.nim @@ -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() diff --git a/tests/datastore/sql/testsqliteds.nim b/tests/datastore/sql/testsqliteds.nim index 8debb41..7cfd12e 100644 --- a/tests/datastore/sql/testsqliteds.nim +++ b/tests/datastore/sql/testsqliteds.nim @@ -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