2022-09-16 21:13:25 -06:00
|
|
|
import std/os
|
|
|
|
|
import std/options
|
2022-09-20 20:18:33 -04:00
|
|
|
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]]
|
2022-09-20 20:18:33 -04:00
|
|
|
|
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)
|
2022-09-30 10:24:26 -04:00
|
|
|
|
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)
|