Just a sample of the Echomail archive
Cooperative anarchy at its finest, still active today. Darkrealms is the Zone 1 Hub.
|    SYNC_PROGRAMMING    |    Synchronet/Baja/XSDK Programming    |    49,116 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 46,923 of 49,116    |
|    Fernando Toledo to GitLab note in main/sbbs    |
|    Inital commit of sqlite support.    |
|    10 May 25 07:58:02    |
   
   TZUTC: -0700   
   MSGID: 52307.syncprog@1:103/705 2c856bcd   
   PID: Synchronet 3.21a-Linux master/85dea2614 Apr 11 2025 GCC 12.2.0   
   TID: SBBSecho 3.25-Linux master/0c503c4ea May 04 2025 GCC 12.2.0   
   BBSID: VERT   
   CHRS: UTF-8 4   
   FORMAT: flowed   
   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",    
   qlite3_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",    
   qlite3_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)   
   SEEN-BY: 103/705 105/81 106/201 124/5016 128/187 153/757 7715 154/10   
   SEEN-BY: 154/30 110 203/0 218/700 221/0 226/30 227/114 229/110 114   
   SEEN-BY: 229/206 317 400 426 428 470 550 700 705 240/1120 5832 263/1   
   SEEN-BY: 266/512 280/464 5003 5006 291/111 292/8125 301/1 320/219   
   SEEN-BY: 322/757 341/66 234 342/200 396/45 423/120 460/58 256 1124   
   SEEN-BY: 467/888 633/280 712/848 770/1 902/26 5020/400 8912 5054/30   
   SEEN-BY: 5075/35   
   PATH: 103/705 280/464 460/58 229/426   
      
|
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca