]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
Fix SQL queries.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 25 Jun 2015 17:58:27 +0000 (18:58 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 27 Jun 2015 15:42:16 +0000 (16:42 +0100)
src/libstat/backends/sqlite3_backend.c

index 79198976eb1199716966cf8424d2c70a7d9ab752..206317a988892a2b4c532232fe22d7b916cf62d7 100644 (file)
@@ -49,8 +49,8 @@ struct rspamd_stat_sqlite3_rt {
        struct rspamd_stat_sqlite3_ctx *ctx;
        struct rspamd_task *task;
        struct rspamd_stat_sqlite3_db *db;
-       const gchar *user;
-       const gchar *language;
+       gint64 user_id;
+       gint64 lang_id;
 };
 
 static const char *create_tables_sql =
@@ -67,8 +67,8 @@ static const char *create_tables_sql =
                ");"
                "CREATE TABLE tokens("
                "token INTEGER NOT NULL,"
-               "user INTEGER REFERENCES users(id) ON DELETE CASCADE,"
-               "language INTEGER REFERENCES languages(id) ON DELETE CASCADE,"
+               "user INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,"
+               "language INTEGER NOT NULL REFERENCES languages(id) ON DELETE CASCADE,"
                "value INTEGER,"
                "CONSTRAINT tid UNIQUE (token, user, language) ON CONFLICT REPLACE"
                ");"
@@ -130,15 +130,16 @@ static struct rspamd_sqlite3_prstmt {
                .sql = "SELECT value FROM tokens "
                                "LEFT JOIN languages ON tokens.language=languages.id "
                                "LEFT JOIN users ON tokens.user=users.id "
-                               "WHERE token=?1 AND users.name=?2 AND languages.name=?3;",
+                               "WHERE token=?1 AND (users.id=?2 OR users.id=0) "
+                               "AND (languages.id=?3 OR languages.id=0);",
                .stmt = NULL,
-               .args = "ITT",
+               .args = "III",
                .result = SQLITE_ROW,
                .ret = "I"
        },
        {
                .idx = RSPAMD_STAT_BACKEND_SET_TOKEN,
-               .sql = "INSERT OR REPLACE INTO tokens(token, user, language, value)"
+               .sql = "INSERT OR REPLACE INTO tokens (token, user, language, value) "
                                "VALUES (?1, ?2, ?3, ?4);",
                .stmt = NULL,
                .args = "IIII",
@@ -234,7 +235,7 @@ rspamd_sqlite3_run_prstmt (struct rspamd_stat_sqlite3_db *db, int idx, ...)
        va_start (ap, idx);
        nargs = 1;
 
-       for (i = 0, rowid = 1; argtypes[i] != '\0'; i ++, rowid ++) {
+       for (i = 0, rowid = 1; argtypes[i] != '\0'; i ++) {
                switch (argtypes[i]) {
                case 'T':
 
@@ -498,7 +499,7 @@ rspamd_sqlite3_runtime (struct rspamd_task *task,
        bk = g_hash_table_lookup (ctx->files, stcf);
 
        if (bk) {
-               rt = rspamd_mempool_alloc (task->task_pool, sizeof (*rt));
+               rt = rspamd_mempool_alloc0 (task->task_pool, sizeof (*rt));
                rt->ctx = ctx;
                rt->db = bk;
                rt->task = task;
@@ -534,7 +535,7 @@ rspamd_sqlite3_process_token (struct rspamd_task *task, struct token_node_s *tok
 
        /* TODO: language and user support */
        if (rspamd_sqlite3_run_prstmt (bk, RSPAMD_STAT_BACKEND_GET_TOKEN,
-                       idx, SQLITE3_DEFAULT, SQLITE3_DEFAULT, &iv) == SQLITE_OK) {
+                       idx, rt->user_id, rt->lang_id, &iv) == SQLITE_OK) {
                res->value = iv;
        }
        else {
@@ -577,7 +578,7 @@ rspamd_sqlite3_learn_token (struct rspamd_task *task, struct token_node_s *tok,
        memcpy (&idx, tok->data, sizeof (idx));
 
        if (rspamd_sqlite3_run_prstmt (bk, RSPAMD_STAT_BACKEND_SET_TOKEN,
-                               idx, 0, 0, iv) == SQLITE_OK) {
+                               idx, rt->user_id, rt->lang_id, iv) == SQLITE_OK) {
                return FALSE;
        }