diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-05-23 19:15:57 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-05-23 19:15:57 +0100 |
commit | 20343707b64a8780656b0f1bbe1db39b95068da6 (patch) | |
tree | 0fb489a4622d9ce812c040178d3725da184f402a /src/libserver/fuzzy_backend.c | |
parent | f2daba8fdb6045ed4be8a5458b8450a73363e725 (diff) | |
download | rspamd-20343707b64a8780656b0f1bbe1db39b95068da6.tar.gz rspamd-20343707b64a8780656b0f1bbe1db39b95068da6.zip |
[Feature] Implement partial deleting for multi-flags
Diffstat (limited to 'src/libserver/fuzzy_backend.c')
-rw-r--r-- | src/libserver/fuzzy_backend.c | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/src/libserver/fuzzy_backend.c b/src/libserver/fuzzy_backend.c index 3f2bbafab..57cbb729d 100644 --- a/src/libserver/fuzzy_backend.c +++ b/src/libserver/fuzzy_backend.c @@ -831,16 +831,61 @@ gboolean rspamd_fuzzy_backend_del (struct rspamd_fuzzy_backend *backend, const struct rspamd_fuzzy_cmd *cmd) { - int rc; + int rc = -1; + guint32 flag; if (backend == NULL) { return FALSE; } - rc = rspamd_fuzzy_backend_run_stmt (backend, TRUE, - RSPAMD_FUZZY_BACKEND_DELETE, + rc = rspamd_fuzzy_backend_run_stmt (backend, FALSE, + RSPAMD_FUZZY_BACKEND_CHECK, cmd->digest); + if (rc == SQLITE_OK) { + /* Check flag */ + flag = sqlite3_column_int64 ( + prepared_stmts[RSPAMD_FUZZY_BACKEND_CHECK].stmt, + 2); + rspamd_fuzzy_backend_cleanup_stmt (backend, RSPAMD_FUZZY_BACKEND_CHECK); + + if (!(flag & flags_mask)) { + flag = (1U << (flag - 1)) | flags_mask; + } + + if (flag & (1U << (cmd->flag - 1))) { + flag &= ~(1U << (cmd->flag - 1)); + + if (flag == 0) { + /* It is the last flag, so delete hash completely */ + rc = rspamd_fuzzy_backend_run_stmt (backend, TRUE, + RSPAMD_FUZZY_BACKEND_DELETE, + cmd->digest); + } + else { + /* We need to delete specific flag */ + rc = rspamd_fuzzy_backend_run_stmt (backend, TRUE, + RSPAMD_FUZZY_BACKEND_UPDATE_FLAG, + (gint64) cmd->value, + (gint64) flag, + cmd->digest); + if (rc != SQLITE_OK) { + msg_warn_fuzzy_backend ("cannot update hash to %d -> " + "%*xs: %s", (gint) cmd->flag, + (gint) sizeof (cmd->digest), cmd->digest, + sqlite3_errmsg (backend->db)); + } + } + } + else { + /* The hash has a wrong flag, ignoring */ + } + } + else { + /* Hash is missing */ + rspamd_fuzzy_backend_cleanup_stmt (backend, RSPAMD_FUZZY_BACKEND_CHECK); + } + return (rc == SQLITE_OK); } |