mirror of
https://github.com/logos-storage/nim-datastore.git
synced 2026-01-03 22:23:10 +00:00
83 lines
1.5 KiB
Nim
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
|