From 8b494907c6027a7f522dd1f17ccec30cc6b3f574 Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Wed, 20 Sep 2023 22:43:56 -0700 Subject: [PATCH] fix test --- datastore/sql/sqliteds.nim | 2 +- datastore/sql/sqlitedsdb.nim | 56 +++++++++++++------------- tests/datastore/sql/testsqliteds.nim | 6 +-- tests/datastore/sql/testsqlitedsdb.nim | 8 +--- 4 files changed, 34 insertions(+), 38 deletions(-) diff --git a/datastore/sql/sqliteds.nim b/datastore/sql/sqliteds.nim index f9d486c..99a6aa4 100644 --- a/datastore/sql/sqliteds.nim +++ b/datastore/sql/sqliteds.nim @@ -47,7 +47,7 @@ proc delete*(self: SQLiteDatastore, keys: openArray[DbKey]): ?!void = return failure(err) for key in keys: - if err =? self.db.deleteStmt.exec((key.id)).errorOption: + if err =? self.db.deleteStmt.exec((key)).errorOption: if err =? self.db.rollbackStmt.exec().errorOption: return failure err.msg diff --git a/datastore/sql/sqlitedsdb.nim b/datastore/sql/sqlitedsdb.nim index 454c5f0..572bc44 100644 --- a/datastore/sql/sqlitedsdb.nim +++ b/datastore/sql/sqlitedsdb.nim @@ -33,7 +33,7 @@ type containsStmt*: ContainsStmt deleteStmt*: DeleteStmt env*: SQLite - getDataCol*: BoundDataCol + getDataCol*: (RawStmtPtr, int) getStmt*: GetStmt putStmt*: PutStmt beginStmt*: BeginStmt @@ -158,38 +158,38 @@ proc idCol*( return proc (): string = $sqlite3_column_text_not_null(s, index.cint) -proc dataCol*( - s: RawStmtPtr, - index: int): BoundDataCol = +proc dataCol*(data: (RawStmtPtr, int)): DataBuffer = + + let s = data[0] + let index = data[1] checkColMetadata(s, index, DataColName) - return proc (): DataBuffer = + let + i = index.cint + blob = sqlite3_column_blob(s, i) + + # detect out-of-memory error + # see the conversion table and final paragraph of: + # https://www.sqlite.org/c3ref/column_blob.html + # see also https://www.sqlite.org/rescode.html + + # the "data" column can be NULL so in order to detect an out-of-memory error + # it is necessary to check that the result is a null pointer and that the + # result code is an error code + if blob.isNil: let - i = index.cint - blob = sqlite3_column_blob(s, i) + v = sqlite3_errcode(sqlite3_db_handle(s)) - # detect out-of-memory error - # see the conversion table and final paragraph of: - # https://www.sqlite.org/c3ref/column_blob.html - # see also https://www.sqlite.org/rescode.html + if not (v in [SQLITE_OK, SQLITE_ROW, SQLITE_DONE]): + raise (ref Defect)(msg: $sqlite3_errstr(v)) - # the "data" column can be NULL so in order to detect an out-of-memory error - # it is necessary to check that the result is a null pointer and that the - # result code is an error code - if blob.isNil: - let - v = sqlite3_errcode(sqlite3_db_handle(s)) + let + dataLen = sqlite3_column_bytes(s, i) + dataBytes = cast[ptr UncheckedArray[byte]](blob) - if not (v in [SQLITE_OK, SQLITE_ROW, SQLITE_DONE]): - raise (ref Defect)(msg: $sqlite3_errstr(v)) - - let - dataLen = sqlite3_column_bytes(s, i) - dataBytes = cast[ptr UncheckedArray[byte]](blob) - - # copy data out, since sqlite will free it - DataBuffer.new(toOpenArray(dataBytes, 0, dataLen - 1)) + # copy data out, since sqlite will free it + DataBuffer.new(toOpenArray(dataBytes, 0, dataLen - 1)) proc timestampCol*( s: RawStmtPtr, @@ -306,9 +306,9 @@ proc open*( # "SQL logic error" let - getDataCol = dataCol(RawStmtPtr(getStmt), GetStmtDataCol) + getDataCol = (RawStmtPtr(getStmt), GetStmtDataCol) - success T( + success SQLiteDsDb( readOnly: readOnly, dbPath: path, containsStmt: containsStmt, diff --git a/tests/datastore/sql/testsqliteds.nim b/tests/datastore/sql/testsqliteds.nim index fff7354..32836b3 100644 --- a/tests/datastore/sql/testsqliteds.nim +++ b/tests/datastore/sql/testsqliteds.nim @@ -61,10 +61,10 @@ suite "Test Basic SQLiteDatastore": test "delete batch": var - batch: seq[Key] + batch: seq[string] for k in 0..<100: - batch.add(Key.init(key, $k).tryGet) + batch.add(Key.init(key, $k).tryGet().id()) ds.delete(batch).tryGet @@ -72,7 +72,7 @@ suite "Test Basic SQLiteDatastore": check: not ds.has(k).tryGet test "handle missing key": - let key = Key.init("/missing/key").tryGet() + let key = Key.init("/missing/key").tryGet().id() expect(DatastoreKeyNotFound): discard ds.get(key).tryGet() # non existing key diff --git a/tests/datastore/sql/testsqlitedsdb.nim b/tests/datastore/sql/testsqlitedsdb.nim index d104933..e5bd106 100644 --- a/tests/datastore/sql/testsqlitedsdb.nim +++ b/tests/datastore/sql/testsqlitedsdb.nim @@ -111,12 +111,10 @@ suite "Test SQLite Datastore DB operations": dsDb.putStmt.exec((key.id, data, timestamp())).tryGet() test "Should select key": - let - dataCol = dsDb.getDataCol var bytes: seq[byte] proc onData(s: RawStmtPtr) = - bytes = dataCol() + bytes = dataCol(dsDb.getDataCol) check: dsDb.getStmt.query((key.id), onData).tryGet() @@ -129,12 +127,10 @@ suite "Test SQLite Datastore DB operations": dsDb.putStmt.exec((key.id, otherData, timestamp())).tryGet() test "Should select updated key": - let - dataCol = dsDb.getDataCol var bytes: seq[byte] proc onData(s: RawStmtPtr) = - bytes = dataCol() + bytes = dataCol(dsDb.getDataCol) check: dsDb.getStmt.query((key.id), onData).tryGet()