diff --git a/datastore/backend.nim b/datastore/backend.nim index 9559f50..8b6daa2 100644 --- a/datastore/backend.nim +++ b/datastore/backend.nim @@ -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) diff --git a/datastore/sql/sqliteds.nim b/datastore/sql/sqliteds.nim index 9b5604f..2401095 100644 --- a/datastore/sql/sqliteds.nim +++ b/datastore/sql/sqliteds.nim @@ -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 diff --git a/datastore/sql/sqlitedsdb.nim b/datastore/sql/sqlitedsdb.nim index 7dc1c92..c4572c6 100644 --- a/datastore/sql/sqlitedsdb.nim +++ b/datastore/sql/sqlitedsdb.nim @@ -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) diff --git a/datastore/threads/threadresult.nim b/datastore/threads/threadresult.nim index f430d8f..b2c2d91 100644 --- a/datastore/threads/threadresult.nim +++ b/datastore/threads/threadresult.nim @@ -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))