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:
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" });