diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-06-23 18:23:12 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-06-24 13:54:15 +0100 |
commit | 090643295a7e48d969adad833276e7a283d7f503 (patch) | |
tree | 4b17b54181e495b14dd8f3c881cf2ce0e5bf9cec /src/libstat | |
parent | 07c0b80530f9b6ff44c014574ec48bb699b60261 (diff) | |
download | rspamd-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.c | 31 |
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; } } |