summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-06-18 19:31:10 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-06-18 19:31:10 +0100
commitf9cb4972d1f96cffe2ca7aa1a8036259e045841f (patch)
tree930fcddbcb079b22d253fc3cd49b9db0ced2edef /src
parent2743fd9467479f1ff17e9f8664dd163a79a5ba92 (diff)
downloadrspamd-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.c27
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) {