summaryrefslogtreecommitdiffstats
path: root/src/libstat
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-06-23 18:23:12 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-06-24 13:54:15 +0100
commit090643295a7e48d969adad833276e7a283d7f503 (patch)
tree4b17b54181e495b14dd8f3c881cf2ce0e5bf9cec /src/libstat
parent07c0b80530f9b6ff44c014574ec48bb699b60261 (diff)
downloadrspamd-090643295a7e48d969adad833276e7a283d7f503.tar.gz
rspamd-090643295a7e48d969adad833276e7a283d7f503.zip
Allow variable lenght arguments in prepared queries.
Diffstat (limited to 'src/libstat')
-rw-r--r--src/libstat/backends/sqlite3_backend.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/src/libstat/backends/sqlite3_backend.c b/src/libstat/backends/sqlite3_backend.c
index 12079196f..ea52314fc 100644
--- a/src/libstat/backends/sqlite3_backend.c
+++ b/src/libstat/backends/sqlite3_backend.c
@@ -193,10 +193,10 @@ rspamd_sqlite3_init_prstmt (struct rspamd_stat_sqlite3_db *db, GError **err)
static int
rspamd_sqlite3_run_prstmt (struct rspamd_stat_sqlite3_db *db, int idx, ...)
{
- int retcode;
+ gint retcode;
va_list ap;
sqlite3_stmt *stmt;
- int i;
+ gint i, rowid, nargs, j;
const char *argtypes;
if (idx < 0 || idx >= RSPAMD_STAT_BACKEND_MAX) {
@@ -220,18 +220,37 @@ rspamd_sqlite3_run_prstmt (struct rspamd_stat_sqlite3_db *db, int idx, ...)
argtypes = db->prstmt[idx].args;
sqlite3_reset (stmt);
va_start (ap, idx);
+ nargs = 1;
- for (i = 0; argtypes[i] != '\0'; i++) {
+ for (i = 0, rowid = 1; argtypes[i] != '\0'; i ++, rowid ++) {
switch (argtypes[i]) {
case 'T':
- sqlite3_bind_text (stmt, i + 1, va_arg (ap, const char*), -1,
+
+ for (j = 0; j < nargs; j ++, rowid ++) {
+ sqlite3_bind_text (stmt, rowid, va_arg (ap, const char*), -1,
SQLITE_STATIC);
+ }
+
+ nargs = 1;
break;
case 'I':
- sqlite3_bind_int64 (stmt, i + 1, va_arg (ap, gint64));
+
+ for (j = 0; j < nargs; j ++, rowid ++) {
+ sqlite3_bind_int64 (stmt, rowid, va_arg (ap, gint64));
+ }
+
+ nargs = 1;
break;
case 'S':
- sqlite3_bind_int (stmt, i + 1, va_arg (ap, gint));
+
+ for (j = 0; j < nargs; j ++, rowid ++) {
+ sqlite3_bind_int (stmt, rowid, va_arg (ap, gint));
+ }
+
+ nargs = 1;
+ break;
+ case '*':
+ nargs = va_arg (ap, gint);
break;
}
}