mirror of
https://github.com/logos-storage/nim-datastore.git
synced 2026-01-05 23:23:10 +00:00
change to generics
This commit is contained in:
parent
dbfb54f026
commit
04a30da700
@ -29,13 +29,13 @@ type
|
|||||||
offset*: int # Offset from which to start querying - not available in all backends
|
offset*: int # Offset from which to start querying - not available in all backends
|
||||||
sort*: SortOrder # Sort order - 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]
|
query*: DbQuery[K]
|
||||||
cancel*: bool
|
cancel*: bool
|
||||||
closed*: bool
|
closed*: bool
|
||||||
env*: T
|
env*: T
|
||||||
|
|
||||||
DbQueryResponse* = tuple[key: Option[KeyId], data: DataBuffer]
|
DbQueryResponse*[K, V] = tuple[key: Option[K], data: V]
|
||||||
|
|
||||||
proc `$`*(id: KeyId): string = $(id.data)
|
proc `$`*(id: KeyId): string = $(id.data)
|
||||||
|
|
||||||
|
|||||||
@ -106,7 +106,7 @@ proc close*[K,V](self: SQLiteBackend[K,V]): ?!void =
|
|||||||
proc query*[K,V](
|
proc query*[K,V](
|
||||||
self: SQLiteBackend[K,V],
|
self: SQLiteBackend[K,V],
|
||||||
query: DbQuery
|
query: DbQuery
|
||||||
): Result[DbQueryHandle[K, RawStmtPtr], ref CatchableError] =
|
): Result[DbQueryHandle[K,V,RawStmtPtr], ref CatchableError] =
|
||||||
|
|
||||||
var
|
var
|
||||||
queryStr = if query.value:
|
queryStr = if query.value:
|
||||||
@ -151,16 +151,16 @@ proc query*[K,V](
|
|||||||
if not (v == SQLITE_OK):
|
if not (v == SQLITE_OK):
|
||||||
return failure newException(DatastoreError, $sqlite3_errstr(v))
|
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:
|
if not handle.closed:
|
||||||
handle.closed = true
|
handle.closed = true
|
||||||
discard sqlite3_reset(handle.env)
|
discard sqlite3_reset(handle.env)
|
||||||
discard sqlite3_clear_bindings(handle.env)
|
discard sqlite3_clear_bindings(handle.env)
|
||||||
handle.env.dispose()
|
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:
|
while not handle.cancel:
|
||||||
|
|
||||||
let v = sqlite3_step(handle.env)
|
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]):
|
if not (v in [SQLITE_OK, SQLITE_ROW, SQLITE_DONE]):
|
||||||
handle.cancel = true
|
handle.cancel = true
|
||||||
yield DbQueryResponse.failure newException(DatastoreError, $sqlite3_errstr(v))
|
yield DbQueryResponse[K,V].failure newException(DatastoreError, $sqlite3_errstr(v))
|
||||||
|
|
||||||
let
|
let
|
||||||
dataLen = sqlite3_column_bytes(handle.env, QueryStmtDataCol)
|
dataLen = sqlite3_column_bytes(handle.env, QueryStmtDataCol)
|
||||||
data =
|
data =
|
||||||
if blob.isSome:
|
if blob.isSome:
|
||||||
let arr = cast[ptr UncheckedArray[byte]](blob)
|
let arr = cast[ptr UncheckedArray[byte]](blob)
|
||||||
DataBuffer.new(arr.toOpenArray(0, dataLen-1))
|
V.toVal(arr.toOpenArray(0, dataLen-1))
|
||||||
else: DataBuffer.new("")
|
else: DataBuffer.new("")
|
||||||
|
|
||||||
yield success (key.some, data)
|
yield success (key.some, data)
|
||||||
@ -203,7 +203,7 @@ iterator iter*[K](handle: var DbQueryHandle[K, RawStmtPtr]): ?!DbQueryResponse =
|
|||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
handle.cancel = true
|
handle.cancel = true
|
||||||
yield DbQueryResponse.failure newException(DatastoreError, $sqlite3_errstr(v))
|
yield DbQueryResponse[K,V].failure newException(DatastoreError, $sqlite3_errstr(v))
|
||||||
break
|
break
|
||||||
|
|
||||||
handle.close()
|
handle.close()
|
||||||
|
|||||||
@ -158,7 +158,7 @@ suite "queryTests":
|
|||||||
var
|
var
|
||||||
handle = ds.query(q).tryGet
|
handle = ds.query(q).tryGet
|
||||||
|
|
||||||
var res: seq[DbQueryResponse]
|
var res: seq[DbQueryResponse[KeyId, DataBuffer]]
|
||||||
var cnt = 0
|
var cnt = 0
|
||||||
for item in handle.iter():
|
for item in handle.iter():
|
||||||
cnt.inc
|
cnt.inc
|
||||||
@ -202,25 +202,28 @@ suite "queryTests":
|
|||||||
res[2].data.len == 0
|
res[2].data.len == 0
|
||||||
|
|
||||||
|
|
||||||
# test "Key should not query parent":
|
test "Key should not query parent":
|
||||||
# let
|
let
|
||||||
# q = DbQuery(key: key1)
|
q = DbQuery[KeyId](key: key1)
|
||||||
|
|
||||||
# ds.put(key1, val1).tryGet
|
ds.put(key1, val1).tryGet
|
||||||
# ds.put(key2, val2).tryGet
|
ds.put(key2, val2).tryGet
|
||||||
# ds.put(key3, val3).tryGet
|
ds.put(key3, val3).tryGet
|
||||||
|
|
||||||
# let
|
var
|
||||||
# (handle, iter) = ds.query(q).tryGet
|
handle = ds.query(q).tryGet
|
||||||
# res = iter.mapIt(it.tryGet())
|
let
|
||||||
|
res = handle.iter().toSeq().mapIt(it.tryGet())
|
||||||
|
|
||||||
# check:
|
echo "res: ", res.mapIt($it.key)
|
||||||
# res.len == 2
|
|
||||||
# res[0].key.get == key2
|
|
||||||
# res[0].data == val2
|
|
||||||
|
|
||||||
# res[1].key.get == key3
|
check:
|
||||||
# res[1].data == val3
|
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":
|
# test "Key should all list all keys at the same level":
|
||||||
# let
|
# let
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user