mirror of
https://github.com/logos-storage/nim-datastore.git
synced 2026-01-02 13:43:11 +00:00
add querybuffer type
This commit is contained in:
parent
e52f7949b9
commit
a2f77458ae
@ -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
|
||||
|
||||
@ -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)
|
||||
@ -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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user