diff --git a/datastore/databuffer.nim b/datastore/databuffer.nim index 69f4579..e3fa207 100644 --- a/datastore/databuffer.nim +++ b/datastore/databuffer.nim @@ -21,17 +21,6 @@ type CatchableErrorBuffer* = object msg: StringBuffer - QSortOrder* {.pure.} = enum - Ascending, - Descending - - QueryBuffer* = object - key*: KeyBuffer # Key to be queried - value*: bool # Flag to indicate if data should be returned - limit*: int # Max items to return - not available in all backends - offset*: int # Offset from which to start querying - not available in all backends - sort*: QSortOrder # Sort order - not available in all backends - proc `=destroy`*(x: var DataBufferHolder) = ## copy pointer implementation diff --git a/datastore/query.nim b/datastore/query.nim index f3330fc..c86bacb 100644 --- a/datastore/query.nim +++ b/datastore/query.nim @@ -1,3 +1,4 @@ +import std/options import pkg/upraises import pkg/chronos import pkg/questionable @@ -6,6 +7,7 @@ import pkg/questionable/results import ./key import ./types import ./databuffer +export options type SortOrder* {.pure.} = enum @@ -54,6 +56,29 @@ proc init*( offset: offset, limit: limit) +type + QSortOrder* {.pure.} = enum + Ascending, + Descending + + QueryBuffer* = object + key*: KeyBuffer # Key to be queried + value*: bool # Flag to indicate if data should be returned + limit*: int # Max items to return - not available in all backends + offset*: int # Offset from which to start querying - not available in all backends + sort*: QSortOrder # Sort order - not available in all backends + + QueryResponseBuffer* = object + key*: KeyBuffer + data*: ValueBuffer + + # GetNext* = proc(): Future[?!QueryResponse] {.upraises: [], gcsafe, closure.} + # IterDispose* = proc(): Future[?!void] {.upraises: [], gcsafe.} + # QueryIter* = ref object + # finished*: bool + # next*: GetNext + # dispose*: IterDispose + proc toBuffer*(q: Query): QueryBuffer = ## convert Query to thread-safe QueryBuffer return QueryBuffer( @@ -65,3 +90,34 @@ proc toBuffer*(q: Query): QueryBuffer = of SortOrder.Assending: QSortOrder.Ascending of SortOrder.Descending: QSortOrder.Descending ) + +proc toBuffer*(q: QueryResponse): QueryResponseBuffer = + ## convert QueryReponses to thread safe type + var kb: KeyBuffer + if q.key.isSome(): + kb = KeyBuffer.new(q.key.get()) + var kv: KeyBuffer + if q.data.len() > 0: + kv = ValueBuffer.new(q.data) + + QueryResponseBuffer(key: kb, data: kv) + +proc toQueryResponse*(qb: QueryResponseBuffer): QueryResponse = + ## convert QueryReponseBuffer to regular QueryResponse + let key = + if qb.key.isNil: none(Key) + else: some qb.key.toKey().expect("key response should work") + let data = + if qb.data.isNil: EmptyBytes + else: qb.data.toSeq(byte) + + (key: key, data: data) + +# proc convert*(ret: TResult[QueryResponseBuffer], +# tp: typedesc[QueryResponse] +# ): Result[QueryResponse, ref CatchableError] = +# if ret[].results.isOk(): +# result.ok(ret[].results.get().toString()) +# else: +# let exc: ref CatchableError = ret[].results.error().toCatchable() +# result.err(exc) \ No newline at end of file diff --git a/datastore/threadbackend.nim b/datastore/threadbackend.nim index 75b5000..c067f1a 100644 --- a/datastore/threadbackend.nim +++ b/datastore/threadbackend.nim @@ -204,3 +204,11 @@ method queryTask*( iter.next = next return success iter + +proc query*( + ret: TResult[void], + tds: ThreadDatastorePtr, + query: Query, +) = + let bkey = StringBuffer.new(key.id()) + tds[].tp.spawn deleteTask(ret, tds, bkey)