diff --git a/datastore/databuffer.nim b/datastore/databuffer.nim index 6f7543e..9be717a 100644 --- a/datastore/databuffer.nim +++ b/datastore/databuffer.nim @@ -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) diff --git a/datastore/threadbackend.nim b/datastore/threadbackend.nim index 27fe9c3..3bc5c91 100644 --- a/datastore/threadbackend.nim +++ b/datastore/threadbackend.nim @@ -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,