diff --git a/src/sbbs3/js_sqlite.c b/src/sbbs3/js_sqlite.c index e2af242e923c7a0b7f850ccdb9bb3e7d2febec3a..1a9448c6b1dcda1139f6e308f43b0f27e0d671f2 100644 --- a/src/sbbs3/js_sqlite.c +++ b/src/sbbs3/js_sqlite.c @@ -119,8 +119,66 @@ js_close(JSContext *cx, uintN argc, jsval *arglist) JS_SET_RVAL(cx, arglist, JSVAL_TRUE); return JS_TRUE; } + static JSBool js_exec(JSContext *cx, uintN argc, jsval *arglist) +{ + int rc; + private_t* p; + JSString* str; + size_t stmt_sz = 0; + jsval * argv = JS_ARGV(cx, arglist); + JSObject * parent = JS_THIS_OBJECT(cx, arglist); + char * dberror = NULL; + + if ((p = (private_t*)JS_GetPrivate(cx, parent)) == NULL) { + JS_ReportError(cx, getprivate_failure, WHERE); + return JS_FALSE; + } + + // use the parameter as query + if (argc <= 0) { + dbprintf(TRUE, p, "exec expects at least one string parameter"); + JS_SET_RVAL(cx, arglist, JSVAL_FALSE); + return JS_TRUE; + } + + dbprintf (FALSE, p, "exec has stmt"); + str = JS_ValueToString(cx, argv[0]); + if (str != NULL) { + JSSTRING_TO_RASTRING(cx, str, p->stmt, &stmt_sz, NULL); + dbprintf (FALSE, p, "exec param: %s", p->stmt); + } + + if (p->db == NULL) { + dbprintf(TRUE, p, "Database is not opened"); + JS_SET_RVAL(cx, arglist, JSVAL_FALSE); + return JS_TRUE; + } + + if (p->stmt == NULL) { + dbprintf(FALSE, p, "Empy statement"); + p->errormsg = "Empty statement"; + JS_SET_RVAL(cx, arglist, JSVAL_FALSE); + return JS_TRUE; + } + + dbprintf (FALSE, p, "Execute: %s", p->stmt); + rc = sqlite3_exec(p->db, p->stmt, NULL, NULL, &dberror); + + if (rc == SQLITE_OK) { + return JS_TRUE; + } + else { + p->errormsg = (char* ) sqlite3_errmsg(p->db); + JS_SET_RVAL(cx, arglist, JSVAL_FALSE); + dbprintf(FALSE, p, "Prepare error: %s. %s", sqlite3_errmsg(p->db), dberror); + return JS_TRUE; + } +} + +static JSBool +js_query(JSContext *cx, uintN argc, jsval *arglist) { int rc, i; private_t* p; @@ -215,7 +273,6 @@ js_exec(JSContext *cx, uintN argc, jsval *arglist) /* Sqlite Object Properites */ enum { SQLITE_PROP_NAME - , SQLITE_PROP_STMT , SQLITE_PROP_DEBUG , SQLITE_PROP_ERRORMSG }; @@ -226,8 +283,6 @@ static JSBool js_sqlite_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict jsint tiny; private_t* p; int32 intval = 0; - JSString* js_str; - size_t js_str_sz = 0; jsval idval; if ((p = (private_t*)JS_GetPrivate(cx, obj)) == NULL) { @@ -246,11 +301,6 @@ static JSBool js_sqlite_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict dbprintf(FALSE, p, "Setting property %d", tiny); switch (tiny) { - case SQLITE_PROP_STMT: - if ((js_str = JS_ValueToString(cx, *vp)) == NULL) - return JS_FALSE; - JSSTRING_TO_RASTRING(cx, js_str, p->stmt, &js_str_sz, NULL); - break; case SQLITE_PROP_DEBUG: p->debug = intval; break; @@ -282,11 +332,6 @@ static JSBool js_sqlite_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) return JS_FALSE; *vp = STRING_TO_JSVAL(js_str); break; - case SQLITE_PROP_STMT: - if ((js_str = JS_NewStringCopyZ(cx, p->stmt)) == NULL) - return JS_FALSE; - *vp = STRING_TO_JSVAL(js_str); - break; case SQLITE_PROP_DEBUG: *vp = BOOLEAN_TO_JSVAL(p->debug); break; @@ -306,7 +351,6 @@ static JSBool js_sqlite_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp) static jsSyncPropertySpec js_sqlite_properties[] = { /* name ,tinyid ,flags, ver */ { "name", SQLITE_PROP_NAME, SQLITE_PROP_ROFLAGS, 321}, - { "stmt", SQLITE_PROP_STMT, JSPROP_ENUMERATE, 321}, { "debug", SQLITE_PROP_DEBUG, JSPROP_ENUMERATE, 321}, { "errormsg", SQLITE_PROP_ERRORMSG, SQLITE_PROP_ROFLAGS, 321}, {0} @@ -315,7 +359,6 @@ static jsSyncPropertySpec js_sqlite_properties[] = { #ifdef BUILD_JSDOCS static char* sqlite_prop_desc[] = { "filename specified in constructor - <small>READ ONLY</small>" - , "string sql statement" , "set to <i>true</i> to enable debug log output" , "get the last error message - <small>READ ONLY</small>" , NULL @@ -331,7 +374,10 @@ static jsSyncMethodSpec js_sqlite_functions[] = { , JSDOCSTR("close database") , 321}, {"exec", js_exec, 0, JSTYPE_BOOLEAN, JSDOCSTR("") - , JSDOCSTR("exec the sql query on database") + , JSDOCSTR("exec the sql query on database without results") + , 321}, + {"query", js_query, 0, JSTYPE_BOOLEAN, JSDOCSTR("") + , JSDOCSTR("exec the sql query on database that return rows") , 321}, {0} };