Subj : Inital commit of sqlite support. To : GitLab note in main/sbbs From : Fernando Toledo Date : Sat May 10 2025 07:58:02 https://gitlab.synchro.net/main/sbbs/-/merge_requests/538#note_7225 What I'm trying to say is that from JavaScript, just use exec() or query() as needed, without needing to do a prepare. Because the prepare is done directly within the C code. So both methods in JS receive the string with the SQL as parameters. The difference is that exec() can return true/false (or the number of rows affected) and query() can return an array of result rows. Each method must be implemented in the C code, for example. ```c++ static JSBool js_sqlite_exec(JSContext *cx, uintN argc, jsval *arglist) { JSObject *obj = JS_THIS_OBJECT(cx, arglist); jsval *argv = JS_ARGV(cx, arglist); char *sql; sqlite3 *db; char *errmsg = NULL; int rc; if (!JS_ConvertArguments(cx, argc, argv, "s", &sql)) return JS_FALSE; // Obtener la conexión a la base de datos desde el objeto JavaScript db = JS_GetPrivate(cx, obj); if (!db) return JS_FALSE; rc = sqlite3_exec(db, sql, NULL, NULL, &errmsg); if (rc != SQLITE_OK) { JS_ReportError(cx, "Error al ejecutar SQL: %s", errmsg); sqlite3_free(errmsg); return JS_FALSE; } JS_SET_RVAL(cx, arglist, JSVAL_TRUE); return JS_TRUE; } ``` and query method ```c++ static JSBool js_sqlite_query(JSContext *cx, uintN argc, jsval *arglist) { JSObject *obj = JS_THIS_OBJECT(cx, arglist); jsval *argv = JS_ARGV(cx, arglist); char *sql; sqlite3 *db; sqlite3_stmt *stmt; int rc; if (!JS_ConvertArguments(cx, argc, argv, "s", &sql)) return JS_FALSE; // Obtener la conexión a la base de datos desde el objeto JavaScript db = JS_GetPrivate(cx, obj); if (!db) return JS_FALSE; rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); if (rc != SQLITE_OK) { JS_ReportError(cx, "Error al preparar la consulta: %s", sqlite3_errmsg(db)); return JS_FALSE; } JSObject *resultArray = JS_NewArrayObject(cx, 0, NULL); int index = 0; while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) { int colCount = sqlite3_column_count(stmt); JSObject *rowObj = JS_NewObject(cx, NULL, NULL, NULL); for (int i = 0; i < colCount; i++) { const char *colName = sqlite3_column_name(stmt, i); const char *colValue = (const char *)sqlite3_column_text(stmt, i); jsval val = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, colValue ? colValue : "")); JS_SetProperty(cx, rowObj, colName, &val); } jsval rowVal = OBJECT_TO_JSVAL(rowObj); JS_SetElement(cx, resultArray, index++, &rowVal); } sqlite3_finalize(stmt); if (rc != SQLITE_DONE) { JS_ReportError(cx, "Error al ejecutar la consulta: %s", sqlite3_errmsg(db)); return JS_FALSE; } JS_SET_RVAL(cx, arglist, OBJECT_TO_JSVAL(resultArray)); return JS_TRUE; } ``` --- SBBSecho 3.25-Linux * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705) .