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 =
");"
"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"
");"
.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",
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':
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;
/* 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 {
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;
}