nim-datastore/datastore/tiered_datastore.nim
2022-06-22 13:16:43 -05:00

83 lines
1.5 KiB
Nim

import pkg/questionable
import pkg/questionable/results
import pkg/upraises
import ./datastore
export datastore
push: {.upraises: [].}
type
TieredDatastore* = ref object of Datastore
stores: seq[Datastore]
proc new*(
T: type TieredDatastore,
stores: varargs[Datastore]): ?!T =
if stores.len == 0:
failure "stores must contain at least one Datastore"
else:
success T(stores: @stores)
proc stores*(self: TieredDatastore): seq[Datastore] =
self.stores
method contains*(
self: TieredDatastore,
key: Key): ?!bool {.locks: "unknown".} =
var
exists = false
for store in self.stores:
exists = ? store.contains(key)
if exists: break
success exists
method delete*(
self: TieredDatastore,
key: Key): ?!void {.locks: "unknown".} =
for store in self.stores:
? store.delete(key)
success()
method get*(
self: TieredDatastore,
key: Key): ?!(?seq[byte]) {.locks: "unknown".} =
var
bytesOpt: ?seq[byte]
for store in self.stores:
bytesOpt = ? store.get(key)
# put found data into stores logically in front of the current store
if bytes =? bytesOpt:
for s in self.stores:
if s == store: break
? s.put(key, bytes)
break
success bytesOpt
method put*(
self: TieredDatastore,
key: Key,
data: openArray[byte]): ?!void {.locks: "unknown".} =
for store in self.stores:
? store.put(key, data)
success()
# method query*(
# self: TieredDatastore,
# query: ...): ?!(?...) {.locks: "unknown".} =
#
# success ....none