Jaremy Creechley de20fa4c1e
reorg
2023-09-28 18:32:47 -07:00

73 lines
1.8 KiB
Nim

import std/os
import std/options
import std/strutils
import pkg/questionable
import pkg/questionable/results
from pkg/stew/results as stewResults import get, isErr
import pkg/upraises
import pkg/chronos
import pkg/taskpools
import ./threads/fsbackend
import ./threads/threadproxy
import ./datastore
export datastore, threadproxy, fsbackend, Taskpool
push: {.upraises: [].}
type
FSDatastore* = ref object of Datastore
db: ThreadProxy[FSBackend[KeyId, DataBuffer]]
proc validDepth*(self: FSDatastore, key: Key): bool =
key.len <= self.db.backend.depth
method has*(self: FSDatastore,
key: Key): Future[?!bool] {.async.} =
await self.db.has(key)
method delete*(self: FSDatastore,
key: Key): Future[?!void] {.async.} =
await self.db.delete(key)
method delete*(self: FSDatastore,
keys: seq[Key]): Future[?!void] {.async.} =
await self.db.delete(keys)
method get*(self: FSDatastore,
key: Key): Future[?!seq[byte]] {.async.} =
await self.db.get(key)
method put*(self: FSDatastore,
key: Key,
data: seq[byte]): Future[?!void] {.async.} =
await self.db.put(key, data)
method put*(self: FSDatastore,
batch: seq[BatchEntry]): Future[?!void] {.async.} =
await self.db.put(batch)
method query*(self: FSDatastore,
q: Query): Future[?!QueryIter] {.async.} =
await self.db.query(q)
method close*(self: FSDatastore): Future[?!void] {.async.} =
await self.db.close()
proc new*(
T: type FSDatastore,
root: string,
tp: Taskpool = Taskpool.new(4),
depth = 2,
caseSensitive = true,
ignoreProtected = false
): ?!FSDatastore =
let
backend = ? newFSBackend[KeyId, DataBuffer](
root=root, depth=depth, caseSensitive=caseSensitive, ignoreProtected=ignoreProtected)
db = ? ThreadProxy.new(backend, tp = tp)
success FSDatastore(db: db)