diff --git a/datastore/backend.nim b/datastore/backend.nim index 80204cf..1382833 100644 --- a/datastore/backend.nim +++ b/datastore/backend.nim @@ -42,6 +42,9 @@ proc `$`*(id: KeyId): string = $(id.data) proc toKey*(tp: typedesc[KeyId], id: cstring): KeyId = KeyId.new(id) proc toKey*(tp: typedesc[string], id: cstring): string = $(id) +template toVal*(tp: typedesc[DataBuffer], id: openArray[byte]): DataBuffer = DataBuffer.new(id) +template toVal*(tp: typedesc[seq[byte]], id: openArray[byte]): seq[byte] = @(id) + proc new*(tp: typedesc[KeyId], id: cstring): KeyId = ## copy cstring including null terminator KeyId(data: DataBuffer.new(id.toOpenArray(0, id.len()-1))) @@ -50,15 +53,15 @@ proc new*(tp: typedesc[KeyId], id: string): KeyId = ## copy cstring including null terminator KeyId(data: DataBuffer.new(id)) -proc toCString*(key: KeyId): cstring = - ## copy cstring including null terminator - cast[cstring](baseAddr key.data) +# proc toCString*(key: KeyId): cstring = +# ## copy cstring including null terminator +# cast[cstring](baseAddr key.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 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: KeyId): Key {.inline, raises: [].} = Key.init(key.data).expect("expected valid key here for but got `" & $key.data & "`") diff --git a/datastore/sql/sqliteds.nim b/datastore/sql/sqliteds.nim index 6d916d5..f02e441 100644 --- a/datastore/sql/sqliteds.nim +++ b/datastore/sql/sqliteds.nim @@ -67,7 +67,7 @@ proc get*[K,V](self: SQLiteBackend[K,V], key: K): ?!seq[byte] = bytes: seq[byte] proc onData(s: RawStmtPtr) = - bytes = dataCol(self.db.getDataCol) + bytes = dataCol[V](self.db.getDataCol) if err =? self.db.getStmt.query((key), onData).errorOption: return failure(err) diff --git a/datastore/sql/sqlitedsdb.nim b/datastore/sql/sqlitedsdb.nim index a8d4f41..295e43c 100644 --- a/datastore/sql/sqlitedsdb.nim +++ b/datastore/sql/sqlitedsdb.nim @@ -157,7 +157,7 @@ proc idCol*( return proc (): string = $sqlite3_column_text_not_null(s, index.cint) -proc dataCol*(data: (RawStmtPtr, int)): DataBuffer = +proc dataCol*[V: DbVal](data: (RawStmtPtr, int)): V = let s = data[0] let index = data[1] @@ -188,7 +188,7 @@ proc dataCol*(data: (RawStmtPtr, int)): DataBuffer = dataBytes = cast[ptr UncheckedArray[byte]](blob) # copy data out, since sqlite will free it - DataBuffer.new(toOpenArray(dataBytes, 0, dataLen - 1)) + V.toVal(toOpenArray(dataBytes, 0, dataLen - 1)) proc timestampCol*( s: RawStmtPtr, diff --git a/datastore/sql/sqliteutils.nim b/datastore/sql/sqliteutils.nim index 9884083..884527b 100644 --- a/datastore/sql/sqliteutils.nim +++ b/datastore/sql/sqliteutils.nim @@ -72,7 +72,7 @@ proc bindParam( sqlite3_bind_text(s, n.cint, val.cstring, val.len().cint, SQLITE_TRANSIENT) elif val is KeyId: # same as previous - sqlite3_bind_text(s, n.cint, val.toCString(), val.data.len().cint, SQLITE_TRANSIENT) + sqlite3_bind_text(s, n.cint, cast[cstring](baseAddr val.data), val.data.len().cint, SQLITE_TRANSIENT) else: {.fatal: "Please add support for the '" & $typeof(val) & "' type".}