databuffer type

This commit is contained in:
Jaremy Creechley 2023-09-20 20:14:08 -07:00
parent 29ff227d37
commit ab5f8da736
No known key found for this signature in database
GPG Key ID: 4E66FB67B21D3300
4 changed files with 30 additions and 26 deletions

View File

@ -4,7 +4,30 @@ import pkg/upraises
import ./threads/databuffer
import ./threads/threadresult
import ./threads/semaphore
import ./key
import ./types
export databuffer, threadresult, semaphore, types
export upraises, results
type
KeyId* = object
## serialized Key ID, equivalent to `key.id()`
data: DataBuffer
DbKey* = string | KeyId
DbVal* = seq[byte] | DataBuffer
proc `$`*(id: KeyId): string = $(id.data)
proc toDb*(key: Key): DbKey {.inline, raises: [].} =
let id: string = key.id()
let db = DataBuffer.new(id.len()+1) # include room for null for cstring compat
db.setData(id)
DbKey(data: db)
proc toKey*(key: DbKey): Key {.inline, raises: [].} =
Key.init(key.data).expect("expected valid key here for but got `" & $key.data & "`")
template toOpenArray*(x: DbKey): openArray[char] =
x.data.toOpenArray(char)

View File

@ -26,7 +26,7 @@ proc readOnly*(self: SQLiteDatastore): bool = self.db.readOnly
proc timestamp*(t = epochTime()): int64 =
(t * 1_000_000).int64
proc has*(self: SQLiteDatastore, key: DbKey): ?!bool =
proc has*(self: SQLiteDatastore, key: DbKey|string): ?!bool =
var
exists = false
key = $key

View File

@ -20,7 +20,8 @@ type
ContainsStmt* = SQLiteStmt[(string), void]
DeleteStmt* = SQLiteStmt[(string), void]
GetStmt* = SQLiteStmt[(string), void]
PutStmt* = SQLiteStmt[(string, DataBuffer, int64), void]
PutStmt* = SQLiteStmt[(string, seq[byte], int64), void]
PutBufferStmt* = SQLiteStmt[(string, DataBuffer, int64), void]
QueryStmt* = SQLiteStmt[(string), void]
BeginStmt* = NoParamsStmt
EndStmt* = NoParamsStmt
@ -268,6 +269,7 @@ proc open*(
deleteStmt: DeleteStmt
getStmt: GetStmt
putStmt: PutStmt
putBufferStmt: PutStmt
beginStmt: BeginStmt
endStmt: EndStmt
rollbackStmt: RollbackStmt
@ -281,6 +283,9 @@ proc open*(
putStmt = ? PutStmt.prepare(
env.val, PutStmtStr, SQLITE_PREPARE_PERSISTENT)
putBufferStmt = ? PutBufferStmt.prepare(
env.val, PutStmtStr, SQLITE_PREPARE_PERSISTENT)
beginStmt = ? BeginStmt.prepare(
env.val, BeginTransactionStr, SQLITE_PREPARE_PERSISTENT)

View File

@ -22,30 +22,6 @@ type
ThreadQueryRes* = (DataBuffer, DataBuffer)
ThreadResult*[T: ThreadTypes] = Result[T, ThreadResErr]
DbKey* = object
data: DataBuffer
DbVal* = object
data: DataBuffer
proc toDb*(key: Key): DbKey {.inline, raises: [].} =
let id: string = key.id()
let db = DataBuffer.new(id.len()+1) # include room for null for cstring compat
db.setData(id)
DbKey(data: db)
proc toKey*(key: DbKey): Key {.inline, raises: [].} =
Key.init(key.data).expect("expected valid key here for but got `" & $key.data & "`")
proc toDb*(value: sink seq[byte]): DbVal {.inline, raises: [].} =
DbVal(data: DataBuffer.new(value))
proc toValue*(value: DbVal): seq[byte] {.inline, raises: [].} =
value.data.toSeq()
template toOpenArray*(x: DbKey): openArray[char] =
x.data.toOpenArray(char)
template toOpenArray*(x: DbVal): openArray[byte] =
x.data.toOpenArray(byte)
converter toThreadErr*(e: ref CatchableError): ThreadResErr {.inline, raises: [].} =
if e of DatastoreKeyNotFound: (ErrorEnum.DatastoreKeyNotFoundErr, DataBuffer.new(e.msg))