diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-06-18 19:31:10 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-06-18 19:31:10 +0100 |
commit | f9cb4972d1f96cffe2ca7aa1a8036259e045841f (patch) | |
tree | 930fcddbcb079b22d253fc3cd49b9db0ced2edef /src | |
parent | 2743fd9467479f1ff17e9f8664dd163a79a5ba92 (diff) | |
download | rspamd-f9cb4972d1f96cffe2ca7aa1a8036259e045841f.tar.gz rspamd-f9cb4972d1f96cffe2ca7aa1a8036259e045841f.zip |
Allow to return values from prepared statements.
Diffstat (limited to 'src')
-rw-r--r-- | src/libstat/backends/sqlite3_backend.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/src/libstat/backends/sqlite3_backend.c b/src/libstat/backends/sqlite3_backend.c index fa8018be3..46d02eaf3 100644 --- a/src/libstat/backends/sqlite3_backend.c +++ b/src/libstat/backends/sqlite3_backend.c @@ -75,6 +75,7 @@ static struct rspamd_sqlite3_prstmt { const gchar *args; sqlite3_stmt *stmt; gint result; + const gchar *ret; } prepared_stmts[RSPAMD_STAT_BACKEND_MAX] = { { @@ -82,21 +83,24 @@ static struct rspamd_sqlite3_prstmt { .sql = "BEGIN TRANSACTION;", .args = "", .stmt = NULL, - .result = SQLITE_DONE + .result = SQLITE_DONE, + .ret = "" }, { .idx = RSPAMD_STAT_BACKEND_TRANSACTION_COMMIT, .sql = "COMMIT;", .args = "", .stmt = NULL, - .result = SQLITE_DONE + .result = SQLITE_DONE, + .ret = "" }, { .idx = RSPAMD_STAT_BACKEND_TRANSACTION_ROLLBACK, .sql = "ROLLBACK;", .args = "", .stmt = NULL, - .result = SQLITE_DONE + .result = SQLITE_DONE, + .ret = "" }, }; @@ -179,6 +183,22 @@ rspamd_sqlite3_run_prstmt (struct rspamd_stat_sqlite3_db *db, int idx, ...) retcode = sqlite3_step (stmt); if (retcode == db->prstmt[idx].result) { + argtypes = db->prstmt[idx].ret; + + for (i = 0; argtypes != NULL && argtypes[i] != '\0'; i ++) { + switch (argtypes[i]) { + case 'T': + *va_arg (ap, char**) = g_strdup (sqlite3_column_text (stmt, i)); + break; + case 'I': + *va_arg (ap, gint64*) = sqlite3_column_int64 (stmt, i); + break; + case 'S': + *va_arg (ap, int*) = sqlite3_column_int (stmt, i); + break; + } + } + return SQLITE_OK; } else if (retcode != SQLITE_DONE) { @@ -277,6 +297,7 @@ rspamd_sqlite3_init (struct rspamd_stat_ctx *ctx, if ((bk = rspamd_sqlite3_opendb (filename, &err)) == NULL) { msg_err ("cannot open sqlite3 db: %e", err); g_error_free (err); + err = NULL; } if (bk != NULL) { |