nim-datastore/datastore/datastore.nim

79 lines
3.4 KiB
Nim
Raw Normal View History

{.push raises: [].}
import pkg/chronos
import pkg/questionable
2022-05-11 10:50:05 -05:00
import pkg/questionable/results
import ./key
2022-07-15 15:28:42 -05:00
import ./query
import ./types
2022-05-11 10:50:05 -05:00
export key, query, types
2022-05-11 10:50:05 -05:00
type
BatchEntry* = tuple[key: Key, data: seq[byte]]
2024-01-10 16:54:14 +01:00
Function*[T, U] = proc(value: T): U {.raises: [CatchableError], gcsafe, closure.}
Modify* = Function[?seq[byte], Future[?seq[byte]]]
ModifyGet* = Function[?seq[byte], Future[(?seq[byte], seq[byte])]]
2025-02-25 10:03:20 +01:00
method has*(self: Datastore, key: Key): Future[?!bool] {.base, gcsafe, async: (raises: [CancelledError]), locks: "unknown".} =
2022-05-11 10:50:05 -05:00
raiseAssert("Not implemented!")
2025-02-25 10:03:20 +01:00
method delete*(self: Datastore, key: Key): Future[?!void] {.base, gcsafe, async: (raises: [CancelledError]), locks: "unknown".} =
2022-05-11 10:50:05 -05:00
raiseAssert("Not implemented!")
2025-02-25 10:03:20 +01:00
method delete*(self: Datastore, keys: seq[Key]): Future[?!void] {.base, gcsafe, async: (raises: [CancelledError]), locks: "unknown".} =
raiseAssert("Not implemented!")
2025-02-25 10:03:20 +01:00
method get*(self: Datastore, key: Key): Future[?!seq[byte]] {.base, gcsafe, async: (raises: [CancelledError]), locks: "unknown".} =
2022-05-11 10:50:05 -05:00
raiseAssert("Not implemented!")
2025-02-25 10:03:20 +01:00
method put*(self: Datastore, key: Key, data: seq[byte]): Future[?!void] {.base, gcsafe, async: (raises: [CancelledError]), locks: "unknown".} =
2022-09-19 15:52:34 -06:00
raiseAssert("Not implemented!")
2022-05-11 10:50:05 -05:00
2025-02-25 10:03:20 +01:00
method put*(self: Datastore, batch: seq[BatchEntry]): Future[?!void] {.base, gcsafe, async: (raises: [CancelledError]), locks: "unknown".} =
raiseAssert("Not implemented!")
2025-02-25 11:01:10 +01:00
method close*(self: Datastore): Future[?!void] {.base, async: (raises: [CancelledError]), locks: "unknown".} =
raiseAssert("Not implemented!")
2022-05-11 10:50:05 -05:00
2022-09-19 15:52:34 -06:00
method query*(
2022-07-15 15:28:42 -05:00
self: Datastore,
2025-02-25 11:01:10 +01:00
query: Query): Future[?!QueryIter] {.base, gcsafe, async: (raises: [CancelledError]).} =
2022-07-15 15:28:42 -05:00
raiseAssert("Not implemented!")
2022-12-02 16:25:44 -06:00
2025-02-25 10:03:20 +01:00
proc contains*(self: Datastore, key: Key): Future[bool] {.async: (raises: [CancelledError]).} =
2022-12-02 16:25:44 -06:00
return (await self.has(key)) |? false
2025-02-25 11:21:01 +01:00
method modify*(self: Datastore, key: Key, fn: Modify): Future[?!void] {.base, gcsafe, async: (raises: [CancelledError]), locks: "unknown".} =
## Concurrently safe way of modifying the value associated with the `key`.
##
## Same as `modifyGet`, but this takes `fn` that doesn't produce any auxillary value.
##
raiseAssert("Not implemented!")
2025-02-25 11:21:01 +01:00
method modifyGet*(self: Datastore, key: Key, fn: ModifyGet): Future[?!seq[byte]] {.base, gcsafe, async: (raises: [CancelledError]), locks: "unknown".} =
## Concurrently safe way of updating value associated with the `key`. Returns auxillary value on
## successful update.
##
## This method first reads a value stored under the `key`, if such value exists it's wrapped into `some`
## and passed as the only arg to the `fn`, otherwise `none` is passed.
##
## Table below presents four possibilities of execution. `curr` represents a value passed to `fn`,
## while `fn(curr)` represents a value returned by calling `fn` (auxillary value is omitted for clarity).
##
## | curr | fn(curr) | action |
## |---------|----------|------------------------------|
## | none | none | no action |
## | none | some(v) | insert v |
## | some(u) | none | delete u |
## | some(u) | some(v) | replace u with v (if u != v) |
##
## Note that `fn` can be called multiple times (when concurrent modification was detected). In such case
## only the last auxillary value is returned.
##
raiseAssert("Not implemented!")