2023-08-28 18:22:53 -07:00
|
|
|
import std/tables
|
2023-08-28 19:22:16 -07:00
|
|
|
import std/sequtils
|
|
|
|
|
import std/strutils
|
2023-08-28 21:32:28 -07:00
|
|
|
import std/algorithm
|
2023-08-28 18:22:53 -07:00
|
|
|
|
|
|
|
|
import pkg/chronos
|
|
|
|
|
import pkg/questionable
|
|
|
|
|
import pkg/questionable/results
|
|
|
|
|
import pkg/upraises
|
|
|
|
|
|
|
|
|
|
import ./key
|
|
|
|
|
import ./query
|
2023-09-19 19:50:55 -07:00
|
|
|
import ./datastore2
|
2023-09-19 20:44:06 -07:00
|
|
|
import ./threads/sharedptr
|
2023-09-05 17:14:03 -07:00
|
|
|
import ./threads/databuffer
|
2023-09-19 19:50:55 -07:00
|
|
|
import ./threads/simpletable
|
|
|
|
|
|
|
|
|
|
import std/locks
|
2023-08-28 18:22:53 -07:00
|
|
|
|
2023-09-19 20:44:06 -07:00
|
|
|
export key, query, datastore2
|
2023-08-28 18:22:53 -07:00
|
|
|
|
|
|
|
|
push: {.upraises: [].}
|
|
|
|
|
|
2023-09-19 19:24:56 -07:00
|
|
|
type
|
2023-09-19 20:16:27 -07:00
|
|
|
MemoryDatastore* = object
|
2023-09-19 18:48:19 -07:00
|
|
|
lock*: Lock
|
2023-09-19 20:59:20 -07:00
|
|
|
store*: SimpleTable[100]
|
2023-08-28 18:22:53 -07:00
|
|
|
|
2023-09-19 20:44:06 -07:00
|
|
|
proc has(self: SharedPtr[MemoryDatastore], key: KeyBuffer): ?!bool =
|
2023-08-28 18:22:53 -07:00
|
|
|
|
2023-09-19 20:44:06 -07:00
|
|
|
withLock(self[].lock):
|
|
|
|
|
let res: bool = self[].store.hasKey(key)
|
2023-09-19 19:50:55 -07:00
|
|
|
return success res
|
2023-08-28 18:22:53 -07:00
|
|
|
|
2023-09-19 20:44:06 -07:00
|
|
|
proc delete(
|
|
|
|
|
self: SharedPtr[MemoryDatastore],
|
2023-09-19 19:50:55 -07:00
|
|
|
key: KeyBuffer
|
|
|
|
|
): ?!void =
|
2023-08-28 18:22:53 -07:00
|
|
|
|
2023-08-28 18:37:14 -07:00
|
|
|
var val: ValueBuffer
|
2023-09-19 20:44:06 -07:00
|
|
|
withLock(self[].lock):
|
|
|
|
|
discard self[].store.pop(key, val)
|
2023-08-28 18:22:53 -07:00
|
|
|
return success()
|
|
|
|
|
|
2023-09-19 20:44:06 -07:00
|
|
|
proc get(
|
|
|
|
|
self: SharedPtr[MemoryDatastore],
|
2023-09-19 19:50:55 -07:00
|
|
|
key: KeyBuffer
|
|
|
|
|
): ?!ValueBuffer =
|
2023-08-28 18:37:14 -07:00
|
|
|
|
2023-09-19 19:50:55 -07:00
|
|
|
let dk = key
|
2023-09-19 20:44:06 -07:00
|
|
|
withLock(self[].lock):
|
|
|
|
|
let res = self[].store[dk].catch
|
2023-09-19 19:50:55 -07:00
|
|
|
return res
|
|
|
|
|
|
2023-09-19 20:44:06 -07:00
|
|
|
proc put(
|
|
|
|
|
self: SharedPtr[MemoryDatastore],
|
2023-09-19 19:50:55 -07:00
|
|
|
key: KeyBuffer,
|
|
|
|
|
data: ValueBuffer
|
2023-09-19 20:16:27 -07:00
|
|
|
): ?!void =
|
2023-08-28 18:22:53 -07:00
|
|
|
|
2023-09-19 20:44:06 -07:00
|
|
|
withLock(self[].lock):
|
|
|
|
|
self[].store[key] = data
|
2023-08-28 18:22:53 -07:00
|
|
|
return success()
|
|
|
|
|
|
2023-09-19 20:44:06 -07:00
|
|
|
proc close(self: SharedPtr[MemoryDatastore]): ?!void =
|
|
|
|
|
self[].store.clear()
|
2023-08-28 18:22:53 -07:00
|
|
|
return success()
|
|
|
|
|
|
2023-09-19 20:44:06 -07:00
|
|
|
proc initMemoryDatastore*(): Datastore2[MemoryDatastore] =
|
2023-09-19 20:16:27 -07:00
|
|
|
var self = Datastore2[MemoryDatastore]()
|
2023-09-19 20:44:06 -07:00
|
|
|
self.ids = newSharedPtr(MemoryDatastore)
|
|
|
|
|
self.ids[].lock.initLock()
|
2023-09-19 19:50:55 -07:00
|
|
|
self.has = has
|
|
|
|
|
self.delete = delete
|
|
|
|
|
self.get = get
|
|
|
|
|
self.put = put
|
|
|
|
|
self.close = close
|
2023-08-28 18:43:42 -07:00
|
|
|
return self
|