/soc/2015/igor.gajowiak/chatlog: 66b0421171b3: Implemented delet...
Igor Gajowiak <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: 66b0421171b3035eaffa6c8e8bec5671d9f6e7b2 Author: Igor Gajowiak <[email protected]> Date: 2015-08-01 20:08 +0200 Branch: default URL: https://hg.pidgin.im/soc/2015/igor.gajowiak/chatlog/rev/66b0421171b3 Description: Implemented deleting a buddy from the log. diffstat: libpurple/genericlog.c | 9 +++++ libpurple/genericlog.h | 19 ++++++++++ libpurple/plugins/log/logsqlite.c | 69 +++++++++++++++++++++++++++++++++++--- 3 files changed, 91 insertions(+), 6 deletions(-) diffs (191 lines): diff --git a/libpurple/genericlog.c b/libpurple/genericlog.c --- a/libpurple/genericlog.c +++ b/libpurple/genericlog.c @@ -283,6 +283,14 @@ purple_genericlog_get_all_days(PurpleBud "Getting all days from %s failed", buddy, result); } +gboolean +purple_genericlog_wipe_log_for_buddy(PurpleBuddy *buddy, GError **error) +{ + DEFINE_GENERICLOG_FUNC_WITH_RETURN(wipe_log_for_buddy, + "%s does not support removing messages", + "Removing messages from %s failed", buddy); +} + #undef DEFINE_GENERICLOG_FUNC_WITH_RETURN /**************************************************************************/ @@ -373,6 +381,7 @@ purple_genericlog_class_init(PurpleGener klass->get_older_msgs = NULL; klass->get_all_buddies = NULL; klass->get_all_days = NULL; + klass->wipe_log_for_buddy = NULL; klass->reserved1 = NULL; klass->reserved2 = NULL; diff --git a/libpurple/genericlog.h b/libpurple/genericlog.h --- a/libpurple/genericlog.h +++ b/libpurple/genericlog.h @@ -82,6 +82,9 @@ struct _PurpleGenericLog * (guint64) (at 00:00). Returns %TRUE if operation succeeds, * %FALSE otherwise. The client is responsible for freeing * the result with g_array_unref. + * @wipe_log_for_buddy: Deletes all messages sent to or received from + * a given buddy. Returns %TRUE if operation succeeds, + * %FALSE otherwise. * * The abstract base class for all log implementations. A conforming plugin * must implement at least activate and deactivate methods. Not supported @@ -111,6 +114,8 @@ struct _PurpleGenericLogClass gboolean (*get_all_days)(PurpleBuddy *buddy, GArray **result); + gboolean (*wipe_log_for_buddy)(PurpleBuddy *buddy); + void (*reserved1)(void); void (*reserved2)(void); void (*reserved3)(void); @@ -341,6 +346,20 @@ gboolean purple_genericlog_get_all_days(PurpleBuddy *buddy, GArray **result, GError **error); +/** + * purple_genericlog_wipe_log_for_buddy: + * @buddy: The buddy. + * @error: Return location for a #GError or %NULL. If provided, this + * will be set to the reason if getting days fails. + * + * Deletes all messages sent to or received from a given buddy from the + * active log. + * + * Returns: %TRUE if succeeds. %FALSE otherwise. + */ +gboolean +purple_genericlog_wipe_log_for_buddy(PurpleBuddy *buddy, GError **error); + /**************************************************************************/ /* Error Codes */ /**************************************************************************/ diff --git a/libpurple/plugins/log/logsqlite.c b/libpurple/plugins/log/logsqlite.c --- a/libpurple/plugins/log/logsqlite.c +++ b/libpurple/plugins/log/logsqlite.c @@ -265,6 +265,17 @@ typedef enum GET_DAYS_QUERY_COL_TIME = 0 } GetAllDaysQueryCol; +static sqlite3_stmt *delete_buddy_q = NULL; + +static const char *delete_buddy_q_str = + "DELETE FROM Buddies WHERE Name = ?1 AND AccountId = ?2;"; + +typedef enum +{ + DELETE_BUDDY_QUERY_PARAM_BUDDY_NAME = 1, + DELETE_BUDDY_QUERY_PARAM_ACCOUNTID = 2, +} DeleteBuddyQueryParam; + static void sqlitelog_finalize_query(sqlite3_stmt **query) { @@ -298,6 +309,7 @@ sqlitelog_finalize_queries() sqlitelog_finalize_query(&mark_as_seen_q); sqlitelog_finalize_query(&get_all_buddies_q); sqlitelog_finalize_query(&get_all_days_q); + sqlitelog_finalize_query(&delete_buddy_q); } static gboolean @@ -344,7 +356,8 @@ sqlitelog_prepare_queries() &get_older_msgs_upper_q) || !sqlitelog_prepare_query(mark_as_seen_q_str, &mark_as_seen_q) || !sqlitelog_prepare_query(get_all_buddies_q_str, &get_all_buddies_q) || - !sqlitelog_prepare_query(get_all_days_q_str, &get_all_days_q)) { + !sqlitelog_prepare_query(get_all_days_q_str, &get_all_days_q) || + !sqlitelog_prepare_query(delete_buddy_q_str, &delete_buddy_q)) { sqlitelog_finalize_queries(); return FALSE; @@ -426,12 +439,8 @@ sqlitelog_create_tables(sqlite3 *db_hand "CREATE TRIGGER BuddyDeleted AFTER DELETE ON Buddies " "BEGIN " + "DELETE FROM Messages WHERE BuddyId = OLD.Id; " "DELETE FROM Days WHERE BuddyId = OLD.Id; " - "END; " - - "CREATE TRIGGER DayDeleted AFTER DELETE ON Days " - "BEGIN " - "DELETE FROM Messages WHERE DayId = OLD.Id; " "END; "; return sqlite3_exec(db_handle, query, NULL, NULL, NULL); @@ -1004,6 +1013,38 @@ sqlitelog_get_all_days_impl(PurpleBuddy return TRUE; } +static gboolean +sqlitelog_delete_buddy_impl(PurpleBuddy *buddy) +{ + g_assert(buddy); + + g_assert(delete_buddy_q); + + PurpleAccount *account = purple_buddy_get_account(buddy); + g_return_val_if_fail(account != NULL, FALSE); + + unsigned account_id = SQLITELOG_DB_ID_NONE; + if (!sqlitelog_get_account_id(account, &account_id)) + return FALSE; + + if (account_id == SQLITELOG_DB_ID_NONE) + return TRUE; + + const char* name = purple_buddy_get_name(buddy); + + if (sqlite3_bind_text(delete_buddy_q, DELETE_BUDDY_QUERY_PARAM_BUDDY_NAME, + name, -1, SQLITE_STATIC) != SQLITE_OK || + sqlite3_bind_int64(delete_buddy_q, DELETE_BUDDY_QUERY_PARAM_ACCOUNTID, + account_id) != SQLITE_OK) { + return FALSE; + } + + int rc = sqlite3_step(delete_buddy_q); + sqlite3_reset(delete_buddy_q); + + return rc == SQLITE_DONE; +} + /**************************************************************************/ /* PurpleGenericLog API implementation */ /**************************************************************************/ @@ -1247,6 +1288,20 @@ sqlitelog_get_all_days(PurpleBuddy *budd return sqlitelog_get_all_days_impl(buddy, result); } +static gboolean +sqlitelog_wipe_log_for_buddy(PurpleBuddy *buddy) +{ + g_return_val_if_fail(buddy != NULL, FALSE); + + if (!sqlitelog_db_handle) { + purple_debug_error(SQLITELOG_DEBUG_CATEGORY, + "Log is not active"); + return FALSE; + } + + return sqlitelog_delete_buddy_impl(buddy); +} + /**************************************************************************/ /* GObject stuff */ /**************************************************************************/ @@ -1295,6 +1350,8 @@ purple_sqlitelog_class_init (PurpleSqlit klass->parent_class.get_older_msgs = sqlitelog_get_older_msgs; klass->parent_class.get_all_buddies = sqlitelog_get_all_buddies; klass->parent_class.get_all_days = sqlitelog_get_all_days; + klass->parent_class.wipe_log_for_buddy = + sqlitelog_wipe_log_for_buddy; } static GType _______________________________________________ Commits mailing list [email protected] https://pidgin.im/cgi-bin/mailman/listinfo/commits