quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

commit 5f5da3552e8b23fec0f199f5c2a4dc3732aec30f
parent 2378aeb83eae59c5feed0060baf825526ae0213d
Author: Florian Dold <florian@dold.me>
Date:   Tue, 27 Feb 2024 13:44:41 +0100

sqlite: reset after running statement

Diffstat:
Mtart_module.c | 25++++++++++++++++++++++++-
Mtest_sqlite3.js | 3+++
2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/tart_module.c b/tart_module.c @@ -1858,6 +1858,7 @@ static JSValue js_sqlite3_stmt_run(JSContext *ctx, JSValue this_val, goto done; } db = sqlite3_db_handle(stmt); + // Reset is not strictly necessary, we do it anyway just to be safe sqlret = sqlite3_reset(stmt); if (SQLITE_OK != sqlret) { fprintf(stderr, "sqlite3_reset failed (in stmt_run): %s\n", sqlite3_errmsg(db)); @@ -1890,10 +1891,18 @@ static JSValue js_sqlite3_stmt_run(JSContext *ctx, JSValue this_val, rowid_val = JS_NewBigInt64(ctx, rowid); } JS_SetPropertyStr(ctx, ret_val, "lastInsertRowid", rowid_val); + sqlret = sqlite3_reset(stmt); + if (SQLITE_OK != sqlret) { + fprintf(stderr, "sqlite3_reset failed (in stmt_run after SQLITE_DONE): %s\n", sqlite3_errmsg(db)); + JS_FreeValue(ctx, ret_val); + ret_val = JS_ThrowTypeError(ctx, "failed to reset"); + goto done; + } goto done; } default: ret_val = throw_sqlite3_error(ctx, db); + sqlite3_reset(stmt); goto done; } } @@ -1998,11 +2007,18 @@ static JSValue js_sqlite3_stmt_get_all(JSContext *ctx, JSValue this_val, break; } case SQLITE_DONE: { - ret_val = JS_DupValue(ctx, rows_array); + sqlret = sqlite3_reset(stmt); + if (SQLITE_OK != sqlret) { + fprintf(stderr, "sqlite3_reset failed (in stmt_get_all after SQLITE_DONE): %s\n", sqlite3_errmsg(db)); + ret_val = JS_ThrowTypeError(ctx, "failed to reset"); + } else { + ret_val = JS_DupValue(ctx, rows_array); + } goto done; } default: ret_val = throw_sqlite3_error(ctx, db); + sqlite3_reset(stmt); goto done; } } @@ -2066,6 +2082,13 @@ static JSValue js_sqlite3_stmt_get_first(JSContext *ctx, JSValue this_val, goto done; } } +reset: + sqlret = sqlite3_reset(stmt); + if (SQLITE_OK != sqlret) { + fprintf(stderr, "sqlite3_reset failed (in stmt_get_first): %s\n", sqlite3_errmsg(db)); + JS_FreeValue(ctx, ret_val); + ret_val = JS_ThrowTypeError(ctx, "failed to reset"); + } done: return ret_val; fail: diff --git a/test_sqlite3.js b/test_sqlite3.js @@ -58,3 +58,6 @@ const exc = expectThrows(() => { }); expectStrictEquals(exc.code, "SQLITE_CONSTRAINT"); + +// Make sure that we can continue properly after a failed run +res = tart.sqlite3StmtRun(stmt4, { name: "n4", value: "v4" });