storage_sqlite.c.patch [plain text]
--- jabberd-2.2.17/storage/storage_sqlite.c 2011-10-30 11:46:36.000000000 -0700
+++ jabberd/storage/storage_sqlite.c 2013-06-19 13:18:39.000000000 -0700
@@ -666,6 +666,97 @@
return st_SUCCESS;
}
+static st_ret_t _st_sqlite_get_custom_sql (st_driver_t drv, const char *request, os_t *os) {
+ drvdata_t data = (drvdata_t) drv->private;
+ int i;
+ unsigned int num_rows = 0;
+ os_object_t o;
+ const char *val;
+ os_type_t ot;
+ int ival;
+
+ sqlite3_stmt *stmt;
+ int result;
+
+ if (request == NULL) {
+ return st_NOTFOUND;
+ }
+
+ log_debug (ZONE, "got prepared sql: %s", request);
+
+ result = sqlite3_prepare (data->db, request, strlen(request), &stmt, NULL);
+
+ if (result != SQLITE_OK) {
+ return st_FAILED;
+ }
+
+ *os = os_new ();
+
+ do {
+
+ unsigned int num_cols;
+
+ result = sqlite3_step (stmt);
+
+ if (result != SQLITE_ROW) {
+ continue;
+ }
+
+ o = os_object_new (*os);
+ num_cols = sqlite3_data_count (stmt);
+
+ for (i = 0; i < num_cols; i++) {
+
+ const char *colname;
+ int coltype;
+
+ colname = sqlite3_column_name (stmt, i);
+ coltype = sqlite3_column_type (stmt, i);
+
+ if (coltype == SQLITE_NULL) {
+ log_debug (ZONE, "coldata is NULL");
+ continue;
+ }
+
+ if (coltype == SQLITE_INTEGER) {
+ if (!strcmp (sqlite3_column_decltype (stmt, i), "BOOL")) {
+ ot = os_type_BOOLEAN;
+ } else {
+ ot = os_type_INTEGER;
+ }
+
+ ival = sqlite3_column_int (stmt, i);
+ os_object_put (o, colname, &ival, ot);
+
+ } else if (coltype == SQLITE3_TEXT) {
+ ot = os_type_STRING;
+
+ val = sqlite3_column_text (stmt, i);
+ os_object_put (o, colname, val, ot);
+
+ } else {
+ log_write (drv->st->log,
+ LOG_NOTICE,
+ "sqlite: unknown field: %s:%d",
+ colname, coltype);
+ }
+ }
+
+ num_rows++;
+
+ } while (result == SQLITE_ROW);
+
+ sqlite3_finalize (stmt);
+
+ if (num_rows == 0) {
+ os_free(*os);
+ *os = NULL;
+ return st_NOTFOUND;
+ }
+
+ return st_SUCCESS;
+}
+
static void _st_sqlite_free (st_driver_t drv) {
drvdata_t data = (drvdata_t) drv->private;
@@ -726,6 +817,7 @@
drv->get = _st_sqlite_get;
drv->delete = _st_sqlite_delete;
drv->replace = _st_sqlite_replace;
+ drv->get_custom_sql = _st_sqlite_get_custom_sql;
drv->free = _st_sqlite_free;
return st_SUCCESS;