mirror of
https://github.com/logos-storage/nim-datastore.git
synced 2026-01-03 06:03:06 +00:00
79 lines
1.5 KiB
Nim
79 lines
1.5 KiB
Nim
import std/tables
|
|
import std/sequtils
|
|
import std/strutils
|
|
import std/algorithm
|
|
|
|
import pkg/chronos
|
|
import pkg/questionable
|
|
import pkg/questionable/results
|
|
import pkg/upraises
|
|
|
|
import ./key
|
|
import ./query
|
|
import ./datastore2
|
|
import ./threads/sharedptr
|
|
import ./threads/databuffer
|
|
import ./threads/simpletable
|
|
|
|
import std/locks
|
|
|
|
export key, query, datastore2
|
|
|
|
push: {.upraises: [].}
|
|
|
|
type
|
|
MemoryDatastore* = object
|
|
lock*: Lock
|
|
store*: SimpleTable[10_000]
|
|
|
|
proc has(self: SharedPtr[MemoryDatastore], key: KeyBuffer): ?!bool =
|
|
|
|
withLock(self[].lock):
|
|
let res: bool = self[].store.hasKey(key)
|
|
return success res
|
|
|
|
proc delete(
|
|
self: SharedPtr[MemoryDatastore],
|
|
key: KeyBuffer
|
|
): ?!void =
|
|
|
|
var val: ValueBuffer
|
|
withLock(self[].lock):
|
|
discard self[].store.pop(key, val)
|
|
return success()
|
|
|
|
proc get(
|
|
self: SharedPtr[MemoryDatastore],
|
|
key: KeyBuffer
|
|
): ?!ValueBuffer =
|
|
|
|
let dk = key
|
|
withLock(self[].lock):
|
|
let res = self[].store[dk].catch
|
|
return res
|
|
|
|
proc put(
|
|
self: SharedPtr[MemoryDatastore],
|
|
key: KeyBuffer,
|
|
data: ValueBuffer
|
|
): ?!void =
|
|
|
|
withLock(self[].lock):
|
|
self[].store[key] = data
|
|
return success()
|
|
|
|
proc close(self: SharedPtr[MemoryDatastore]): ?!void =
|
|
self[].store.clear()
|
|
return success()
|
|
|
|
proc initMemoryDatastore*(): Datastore2[MemoryDatastore] =
|
|
var self = Datastore2[MemoryDatastore]()
|
|
self.ids = newSharedPtr(MemoryDatastore)
|
|
self.ids[].lock.initLock()
|
|
self.has = has
|
|
self.delete = delete
|
|
self.get = get
|
|
self.put = put
|
|
self.close = close
|
|
return self
|