mirror of
https://github.com/logos-storage/nim-datastore.git
synced 2026-01-03 06:03:06 +00:00
95 lines
1.9 KiB
Nim
95 lines
1.9 KiB
Nim
|
|
import pkg/chronos/threadsync
|
|
import stew/results
|
|
import pkg/upraises
|
|
import pkg/taskpools
|
|
|
|
import ./key
|
|
import ./query
|
|
import ./datastore
|
|
import ./databuffer
|
|
|
|
import fsds
|
|
|
|
export key, query
|
|
|
|
push: {.upraises: [].}
|
|
|
|
type
|
|
ThreadBackendKind* {.pure.} = enum
|
|
FSBackend
|
|
SQliteBackend
|
|
|
|
ThreadBackend* = object
|
|
case kind*: ThreadBackendKind
|
|
of FSBackend:
|
|
root: StringBuffer
|
|
depth: int
|
|
caseSensitive: bool
|
|
ignoreProtected: bool
|
|
of SQliteBackend:
|
|
discard
|
|
|
|
ThreadDatastore* = ptr object
|
|
tp: Taskpool
|
|
|
|
var backendDatastore {.threadvar.}: Datastore
|
|
|
|
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 get*(
|
|
self: ThreadDatastore,
|
|
signal: ThreadSignalPtr,
|
|
key: KeyBuffer
|
|
): Result[DataBuffer, CatchableErrorBuffer] =
|
|
|
|
return ok(DataBuffer.new())
|
|
|
|
proc put*(
|
|
self: ThreadDatastore,
|
|
signal: ThreadSignalPtr,
|
|
key: KeyBuffer,
|
|
data: DataBuffer
|
|
): Result[void, CatchableErrorBuffer] =
|
|
|
|
return ok()
|
|
|
|
|
|
proc close*(
|
|
self: ThreadDatastore,
|
|
signal: ThreadSignalPtr,
|
|
): Result[void, CatchableErrorBuffer] =
|
|
try:
|
|
self[].tp.shutdown()
|
|
return ok()
|
|
except Exception as exc:
|
|
return err(exc.toBuffer())
|
|
|
|
func new*[S: ref Datastore](
|
|
T: typedesc[ThreadDatastore],
|
|
signal: ThreadSignalPtr,
|
|
backend: ThreadBackend,
|
|
): Result[ThreadDatastore, CatchableErrorBuffer] =
|
|
|
|
var self = T()
|
|
self.tp = Taskpool.new(num_threads = 1) ##\
|
|
## Default to one thread, multiple threads \
|
|
## will require more work
|
|
|
|
let pending = self.tp.spawn startupDatastore(backend)
|
|
sync pending
|
|
|
|
ok self
|