add querybuffer type

This commit is contained in:
Jaremy Creechley 2023-08-29 15:15:00 -07:00 committed by Dmitriy Ryajov
parent e52f7949b9
commit a2f77458ae
No known key found for this signature in database
GPG Key ID: DA8C680CE7C657A4
3 changed files with 64 additions and 11 deletions

View File

@ -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

View File

@ -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)

View File

@ -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)