70 lines
1.7 KiB
Nim
Raw Normal View History

2022-09-16 21:13:25 -06:00
import std/os
import std/options
import std/strutils
2022-09-16 21:13:25 -06:00
import pkg/questionable
import pkg/questionable/results
from pkg/stew/results as stewResults import get, isErr
import pkg/upraises
2023-09-28 17:36:05 -07:00
import pkg/chronos
import pkg/taskpools
2022-09-16 21:13:25 -06:00
2023-09-28 17:40:19 -07:00
import ./threads/fsbackend
2023-09-28 18:13:37 -07:00
import ./threads/threadproxy
2022-09-16 21:13:25 -06:00
import ./datastore
2023-09-28 17:36:05 -07:00
export datastore, Taskpool
2022-09-16 21:13:25 -06:00
push: {.upraises: [].}
2023-09-28 17:14:27 -07:00
type
2023-09-28 17:37:44 -07:00
FSDatastore* = ref object of Datastore
2023-09-28 17:40:19 -07:00
db: ThreadDatastore[FSBackend[KeyId, DataBuffer]]
2023-09-28 17:37:44 -07:00
method has*(self: FSDatastore,
2023-09-28 17:14:27 -07:00
key: Key): Future[?!bool] {.async.} =
2023-09-28 17:36:05 -07:00
await self.db.has(key)
2022-09-16 21:13:25 -06:00
2023-09-28 17:37:44 -07:00
method delete*(self: FSDatastore,
2023-09-28 17:14:27 -07:00
key: Key): Future[?!void] {.async.} =
2023-09-28 17:36:05 -07:00
await self.db.delete(key)
2022-09-16 21:13:25 -06:00
2023-09-28 17:37:44 -07:00
method delete*(self: FSDatastore,
2023-09-28 17:14:27 -07:00
keys: seq[Key]): Future[?!void] {.async.} =
2023-09-28 17:36:05 -07:00
await self.db.delete(keys)
2022-09-16 21:13:25 -06:00
2023-09-28 17:37:44 -07:00
method get*(self: FSDatastore,
2023-09-28 17:14:27 -07:00
key: Key): Future[?!seq[byte]] {.async.} =
2023-09-28 17:36:05 -07:00
await self.db.get(key)
2022-09-16 21:13:25 -06:00
2023-09-28 17:37:44 -07:00
method put*(self: FSDatastore,
2023-09-28 17:14:27 -07:00
key: Key,
data: seq[byte]): Future[?!void] {.async.} =
2023-09-28 17:36:05 -07:00
await self.db.put(key, data)
2023-09-28 17:37:44 -07:00
method put*(self: FSDatastore,
2023-09-28 17:14:27 -07:00
batch: seq[BatchEntry]): Future[?!void] {.async.} =
2023-09-28 17:36:05 -07:00
await self.db.put(batch)
2023-09-28 17:14:27 -07:00
2023-09-28 17:37:44 -07:00
method query*(self: FSDatastore,
2023-09-28 17:36:05 -07:00
q: Query): Future[?!QueryIter] {.async.} =
await self.db.query(q)
2022-09-16 21:13:25 -06:00
2023-09-28 18:03:41 -07:00
method close*(self: FSDatastore): Future[?!void] {.async.} =
await self.db.close()
2023-09-28 17:14:27 -07:00
proc new*(
2023-09-28 17:37:44 -07:00
T: type FSDatastore,
2023-09-28 18:02:21 -07:00
root: string,
2023-09-28 17:36:05 -07:00
tp: Taskpool,
2023-09-28 18:02:21 -07:00
depth = 2,
caseSensitive = true,
ignoreProtected = false
2023-09-28 17:37:44 -07:00
): ?!FSDatastore =
2023-09-28 17:36:05 -07:00
let
2023-09-28 18:02:21 -07:00
backend = ? newFSBackend[KeyId, DataBuffer](
root=root, depth=depth, caseSensitive=caseSensitive, ignoreProtected=ignoreProtected)
2023-09-28 17:36:05 -07:00
db = ? ThreadDatastore.new(backend, tp = tp)
2023-09-28 17:37:44 -07:00
success FSDatastore(db: db)