/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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.