setting up thread backend

This commit is contained in:
Jaremy Creechley 2023-08-24 16:29:25 -07:00 committed by Dmitriy Ryajov
parent edc9321658
commit d39c0965ff
No known key found for this signature in database
GPG Key ID: DA8C680CE7C657A4
2 changed files with 38 additions and 21 deletions

View File

@ -16,6 +16,7 @@ type
KeyBuffer* = DataBuffer
ValueBuffer* = DataBuffer
StringBuffer* = DataBuffer
proc `$`*(data: DataBuffer): string =
if data.buf.isNil:
@ -62,10 +63,6 @@ proc unsafeGetAtomicCount*(a: DataBuffer): int =
proc len*(a: DataBuffer): int = a.size
proc toSeq*[T: byte | char](a: DataBuffer, tp: typedesc[T]): seq[T] =
result = newSeq[T](a.len)
copyMem(addr result[0], unsafeAddr a.buf[0], a.len)
proc new*(tp: typedesc[DataBuffer], size: int = 0): DataBuffer =
let cnt = cast[ptr int](allocShared0(sizeof(result.cnt)))
cnt[] = 1
@ -81,3 +78,12 @@ proc new*[T: byte | char](tp: typedesc[DataBuffer], data: openArray[T]): DataBuf
result = DataBuffer.new(data.len)
if data.len() > 0:
copyMem(result.buf, unsafeAddr data[0], data.len)
proc toSeq*[T: byte | char](a: DataBuffer, tp: typedesc[T]): seq[T] =
result = newSeq[T](a.len)
copyMem(addr result[0], unsafeAddr a.buf[0], a.len)
proc toString*(data: StringBuffer): string =
result = newString(data.len())
if data.len() > 0:
copyMem(addr result[0], unsafeAddr data.buf[0], data.len)

View File

@ -5,40 +5,51 @@ import pkg/questionable
import pkg/questionable/results
import pkg/upraises
import pkg/taskpools
import pkg/patty
import ./key
import ./query
import ./datastore
import ./databuffer
import fsds
export key, query
push: {.upraises: [].}
variant Shape:
Circle(r: float)
Rectangle(w: float, h: float)
type
DatastoreBackend* {.pure.} = enum
FileSystem
SQlite
ThreadBackendKind* {.pure.} = enum
FSBackend
SQliteBackend
ThreadBackend* = object
case kind*: ThreadBackendKind
of FSBackend:
root: StringBuffer
depth: int
caseSensitive: bool
ignoreProtected: bool
of SQliteBackend:
discard
ThreadDatastore* = ref object of Datastore
tp: Taskpool
var backendDatastore {.threadvar.}: ref Datastore
proc startupDatastore(backend: DatastoreBackend): bool =
case backend:
of FileSystem:
backendDatastore = FSDatastore.new(
root: string,
depth = 2,
caseSensitive = true,
ignoreProtected = false
proc startupDatastore(backend: ThreadBackend): bool =
## starts up a FS instance on a give thread
case backend.kind:
of FSBackend:
let res = FSDatastore.new(
root = backend.root.toString(),
depth = backend.depth,
caseSensitive = backend.caseSensitive,
ignoreProtected = backend.ignoreProtected)
if res.isOk:
backendDatastore = res.get()
else:
discard
proc has*(
self: ThreadDatastore,