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-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
|
|
|
|
|
|
|
|
export key, query
|
|
|
|
|
|
|
|
|
|
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 19:24:56 -07:00
|
|
|
store*: SimpleTable[10_000]
|
2023-08-28 18:22:53 -07:00
|
|
|
|
2023-09-19 20:16:27 -07:00
|
|
|
proc has*(self: var MemoryDatastore, key: KeyBuffer): ?!bool =
|
2023-08-28 18:22:53 -07:00
|
|
|
|
2023-09-19 18:48:19 -07:00
|
|
|
withLock(self.lock):
|
2023-09-19 19:50:55 -07:00
|
|
|
let res: bool = self.store.hasKey(key)
|
|
|
|
|
return success res
|
2023-08-28 18:22:53 -07:00
|
|
|
|
2023-09-19 19:50:55 -07:00
|
|
|
proc delete*(
|
|
|
|
|
self: var MemoryDatastore,
|
|
|
|
|
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 18:48:19 -07:00
|
|
|
withLock(self.lock):
|
2023-09-19 19:50:55 -07:00
|
|
|
discard self.store.pop(key, val)
|
2023-08-28 18:22:53 -07:00
|
|
|
return success()
|
|
|
|
|
|
2023-09-19 19:50:55 -07:00
|
|
|
proc get*(
|
|
|
|
|
self: var MemoryDatastore,
|
|
|
|
|
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 18:48:19 -07:00
|
|
|
withLock(self.lock):
|
2023-09-19 19:50:55 -07:00
|
|
|
let res = self.store[dk].catch
|
|
|
|
|
return res
|
|
|
|
|
|
|
|
|
|
proc put*(
|
|
|
|
|
self: var MemoryDatastore,
|
|
|
|
|
key: KeyBuffer,
|
|
|
|
|
data: ValueBuffer
|
2023-09-19 20:16:27 -07:00
|
|
|
): ?!void =
|
2023-08-28 18:22:53 -07:00
|
|
|
|
2023-09-19 18:48:19 -07:00
|
|
|
withLock(self.lock):
|
2023-09-19 19:50:55 -07:00
|
|
|
self.store[key] = data
|
2023-08-28 18:22:53 -07:00
|
|
|
return success()
|
|
|
|
|
|
2023-09-19 19:50:55 -07:00
|
|
|
proc close*(self: var MemoryDatastore): ?!void =
|
2023-08-28 18:40:33 -07:00
|
|
|
self.store.clear()
|
2023-08-28 18:22:53 -07:00
|
|
|
return success()
|
|
|
|
|
|
2023-09-19 20:16:27 -07:00
|
|
|
func initMemoryDatastore*(): Datastore2[MemoryDatastore] =
|
|
|
|
|
var self = Datastore2[MemoryDatastore]()
|
|
|
|
|
self.ds.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
|