/soc/2015/igor.gajowiak/chatlog: 42756bbb95bd: Implemented getti...

Igor Gajowiak <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: 42756bbb95bd1bc04895ca2770701ff05854caef
Author:	 Igor Gajowiak <[email protected]>
Date:	 2015-07-25 22:21 +0200
Branch:	 default
URL: https://hg.pidgin.im/soc/2015/igor.gajowiak/chatlog/rev/42756bbb95bd

Description:

Implemented getting messages send to or received from a buddy. Refactored some queries to use common enums.

diffstat:

 libpurple/genericlog.c            |   11 ++
 libpurple/genericlog.h            |   25 +++++
 libpurple/plugins/log/logsqlite.c |  171 +++++++++++++++++++++++++++----------
 3 files changed, 159 insertions(+), 48 deletions(-)

diffs (truncated from 331 to 300 lines):

diff --git a/libpurple/genericlog.c b/libpurple/genericlog.c
--- a/libpurple/genericlog.c
+++ b/libpurple/genericlog.c
@@ -248,6 +248,15 @@ purple_genericlog_get_unseen_msgs(Purple
 }
 
 gboolean
+purple_genericlog_get_all_msgs(PurpleBuddy *buddy, GList **result,
+	GError **error)
+{
+	DEFINE_GENERICLOG_FUNC_WITH_RETURN(get_all_msgs,
+		"%s does not support getting all messages",
+		"Getting all messages from %s failed", buddy, result);
+}
+
+gboolean
 purple_genericlog_get_all_buddies(GList** result, GError** error)
 {
 	DEFINE_GENERICLOG_FUNC_WITH_RETURN(get_all_buddies,
@@ -341,6 +350,8 @@ purple_genericlog_class_init(PurpleGener
 	klass->log_im = NULL;
 	klass->mark_as_seen = NULL;
 	klass->get_unseen_msgs = NULL;
+	klass->get_all_msgs = NULL;
+	klass->get_all_buddies = 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
@@ -61,6 +61,9 @@ struct _PurpleGenericLog
  *                   In case of any error the result is not set.
  *                   The client is responsible for freeing the result with
  *                   g_list_free_full(result, g_object_unref).
+ * @get_all_msgs:    Gets all messages sent to or received from a buddy.
+ *                   Messages are sorted by their timestamp in ascending order.
+ *                   Returns %TRUE if operation succeeds, %FALSE otherwise.
  * @get_all_buddies: Gets a list of all #PurpleBuddy objects with at least one
  *                   message in the log. Returns %TRUE if operation succeeds,
  *                   %FALSE otherwise. The client is responsible for freeing
@@ -85,6 +88,8 @@ struct _PurpleGenericLogClass
 
 	gboolean (*get_unseen_msgs)(PurpleAccount *account, GList **result);
 
+	gboolean (*get_all_msgs)(PurpleBuddy *buddy, GList **result);
+
 	gboolean (*get_all_buddies)(GList **result);
 
 	void (*reserved1)(void);
@@ -236,6 +241,26 @@ purple_genericlog_get_unseen_msgs(Purple
 	GError **error);
 
 /**
+ * purple_genericlog_get_all_msgs:
+ * @buddy:  The buddy.
+ * @result: Return location for a #GList of #PurpleMessage objects.
+ *          This will not be set in case of any errors.
+ * @error:  Return location for a #GError or %NULL. If provided, this
+ *          will be set to the reason if getting messages fails.
+ *
+ * Gets all messages from the active log sent to or received from a buddy.
+ *
+ * Messages are sorted by their timestamp in ascending order.
+ * The caller is responsible for freeing the result with
+ * g_list_free_full(result, g_object_unref).
+ *
+ * Returns: %TRUE if succeeds, %FALSE otherwise.
+ */
+gboolean
+purple_genericlog_get_all_msgs(PurpleBuddy *buddy, GList **result,
+	GError **error);
+
+/**
  * purple_genericlog_get_all_buddies:
  * @result[out]: Return location for a #GList containing a list of #PurpleBuddy
  *               objects. This will not be set in case of any errors.
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
@@ -99,29 +99,40 @@ typedef enum
 static sqlite3_stmt *get_unseen_msgs_q = NULL;
 
 static const char *get_unseen_msgs_q_str =
-	"SELECT Messages.Id, Author, AuthorAlias, Recipient, Contents, "
-	"MsgTime, Flags, Seen "
-	"FROM Messages JOIN Accounts ON Accounts.Id = AccountId "
-	"WHERE Username = ?1 AND ProtocolId = ?2 AND Seen = 0 "
-	"ORDER BY Messages.Id DESC;";
+	"SELECT Id, Author, AuthorAlias, Recipient, Contents, MsgTime, Flags "
+	"FROM Messages "
+	"WHERE AccountId = ?1 AND Seen = 0 "
+	"ORDER BY MsgTime DESC, Id DESC;";
 
 typedef enum
 {
-	GET_UNSEEN_MSGS_QUERY_PARAM_USERNAME   = 1,
-	GET_UNSEEN_MSGS_QUERY_PARAM_PROTOCOLID = 2,
+	GET_UNSEEN_MSGS_QUERY_PARAM_ACCOUNTID  = 1,
 } GetUnseenMsgsQueryParam;
 
+static sqlite3_stmt *get_all_msgs_q = NULL;
+
+static const char *get_all_msgs_q_str =
+	"SELECT Id, Author, AuthorAlias, Recipient, Contents, MsgTime, Flags "
+	"FROM Messages "
+	"WHERE AccountId = ?1 AND (Author = ?2 OR Recipient = ?2) "
+	"ORDER BY MsgTime DESC, Id DESC;";
+
 typedef enum
 {
-	GET_UNSEEN_MSGS_QUERY_COL_ID          = 0,
-	GET_UNSEEN_MSGS_QUERY_COL_AUTHOR      = 1,
-	GET_UNSEEN_MSGS_QUERY_COL_AUTHORALIAS = 2,
-	GET_UNSEEN_MSGS_QUERY_COL_RECIPIENT   = 3,
-	GET_UNSEEN_MSGS_QUERY_COL_CONTENTS    = 4,
-	GET_UNSEEN_MSGS_QUERY_COL_MSGTIME     = 5,
-	GET_UNSEEN_MSGS_QUERY_COL_FLAGS       = 6,
-	GET_UNSEEN_MSGS_QUERY_COL_SEEN        = 7,
-} GetUnseenMsgsQueryCol;
+	GET_ALL_MSGS_QUERY_PARAM_ACCOUNTID = 1,
+	GET_ALL_MSGS_QUERY_PARAM_WHO       = 2,
+} GetAllMsgsQueryParam;
+
+typedef enum
+{
+	GET_MSGS_QUERY_COL_ID          = 0,
+	GET_MSGS_QUERY_COL_AUTHOR      = 1,
+	GET_MSGS_QUERY_COL_AUTHORALIAS = 2,
+	GET_MSGS_QUERY_COL_RECIPIENT   = 3,
+	GET_MSGS_QUERY_COL_CONTENTS    = 4,
+	GET_MSGS_QUERY_COL_MSGTIME     = 5,
+	GET_MSGS_QUERY_COL_FLAGS       = 6,
+} GetMsgsQueryCol;
 
 static sqlite3_stmt *mark_as_seen_q = NULL;
 
@@ -173,6 +184,7 @@ sqlitelog_finalize_queries()
 	sqlitelog_finalize_query(&insert_account_q);
 	sqlitelog_finalize_query(&insert_message_q);
 	sqlitelog_finalize_query(&get_unseen_msgs_q);
+	sqlitelog_finalize_query(&get_all_msgs_q);
 	sqlitelog_finalize_query(&mark_as_seen_q);
 	sqlitelog_finalize_query(&get_all_buddies_q);
 }
@@ -206,6 +218,7 @@ sqlitelog_prepare_queries()
 	    !sqlitelog_prepare_query(insert_account_q_str, &insert_account_q) ||
 		!sqlitelog_prepare_query(insert_message_q_str, &insert_message_q) ||
 		!sqlitelog_prepare_query(get_unseen_msgs_q_str, &get_unseen_msgs_q) ||
+		!sqlitelog_prepare_query(get_all_msgs_q_str, &get_all_msgs_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)) {
 
@@ -403,8 +416,8 @@ sqlitelog_insert_message(PurpleAccount *
 			seen) != SQLITE_OK ||
 		sqlite3_bind_int(insert_message_q, INSERT_MESSAGE_QUERY_PARAM_SEND,
 			send) != SQLITE_OK ||
-		sqlite3_bind_int(insert_message_q, INSERT_MESSAGE_QUERY_PARAM_ACCOUNTID,
-			account_id) != SQLITE_OK) {
+		sqlite3_bind_int64(insert_message_q,
+			INSERT_MESSAGE_QUERY_PARAM_ACCOUNTID, account_id) != SQLITE_OK) {
 		return FALSE;
 	}
 
@@ -420,45 +433,29 @@ sqlitelog_insert_message(PurpleAccount *
 }
 
 static gboolean
-sqlitelog_get_unseen_msgs_impl(PurpleAccount *account, GList **result)
+sqlitelog_execute_get_msgs_query(sqlite3_stmt *query, GList **result)
 {
-	g_assert(account);
+	g_assert(query);
 	g_assert(result);
 
-	g_assert(get_unseen_msgs_q);
-
-	const char *username = purple_account_get_username(account);
-	const char *protocol_id = purple_account_get_protocol_id(account);
-
-	if (sqlite3_bind_text(get_unseen_msgs_q,
-			GET_UNSEEN_MSGS_QUERY_PARAM_USERNAME, username, -1,
-			SQLITE_STATIC) != SQLITE_OK ||
-		sqlite3_bind_text(get_unseen_msgs_q,
-			GET_UNSEEN_MSGS_QUERY_PARAM_PROTOCOLID, protocol_id, -1,
-			SQLITE_STATIC) != SQLITE_OK) {
-		return FALSE;
-	}
-
 	GList *messages = NULL;
 
 	int rc;
-	while ((rc = sqlite3_step(get_unseen_msgs_q)) == SQLITE_ROW) {
-		unsigned id = sqlite3_column_int(get_unseen_msgs_q,
-			GET_UNSEEN_MSGS_QUERY_COL_ID);
+	while ((rc = sqlite3_step(query)) == SQLITE_ROW) {
+		unsigned id = sqlite3_column_int(query,
+			GET_MSGS_QUERY_COL_ID);
 		const char *author = (const char*) sqlite3_column_text(
-			get_unseen_msgs_q, GET_UNSEEN_MSGS_QUERY_COL_AUTHOR);
+			query, GET_MSGS_QUERY_COL_AUTHOR);
 		const char *author_alias = (const char*) sqlite3_column_text(
-			get_unseen_msgs_q, GET_UNSEEN_MSGS_QUERY_COL_AUTHORALIAS);
+			query, GET_MSGS_QUERY_COL_AUTHORALIAS);
 		const char *recipient = (const char*) sqlite3_column_text(
-			get_unseen_msgs_q, GET_UNSEEN_MSGS_QUERY_COL_RECIPIENT);
+			query, GET_MSGS_QUERY_COL_RECIPIENT);
 		const char *contents = (const char*) sqlite3_column_text(
-			get_unseen_msgs_q, GET_UNSEEN_MSGS_QUERY_COL_CONTENTS);
-		guint64 msg_time = sqlite3_column_int64(get_unseen_msgs_q,
-			GET_UNSEEN_MSGS_QUERY_COL_MSGTIME);
-		PurpleMessageFlags msg_flags = sqlite3_column_int(get_unseen_msgs_q,
-			GET_UNSEEN_MSGS_QUERY_COL_FLAGS);
-		int seen = sqlite3_column_int(get_unseen_msgs_q,
-			GET_UNSEEN_MSGS_QUERY_COL_SEEN);
+			query, GET_MSGS_QUERY_COL_CONTENTS);
+		guint64 msg_time = (guint64) sqlite3_column_int64(query,
+			GET_MSGS_QUERY_COL_MSGTIME);
+		PurpleMessageFlags msg_flags = sqlite3_column_int(query,
+			GET_MSGS_QUERY_COL_FLAGS);
 
 		PurpleMessage *msg = purple_message_new(author, author_alias,
 			recipient, contents, msg_time, msg_flags);
@@ -469,7 +466,7 @@ sqlitelog_get_unseen_msgs_impl(PurpleAcc
 		messages = g_list_prepend(messages, msg);
 	}
 
-	sqlite3_reset(get_accunt_id_q);
+	sqlite3_reset(query);
 
 	if (rc != SQLITE_DONE) {
 		g_list_free_full(messages, g_object_unref);
@@ -481,6 +478,69 @@ sqlitelog_get_unseen_msgs_impl(PurpleAcc
 }
 
 static gboolean
+sqlitelog_get_unseen_msgs_impl(PurpleAccount *account, GList **result)
+{
+	g_assert(account);
+	g_assert(result);
+
+	g_assert(get_unseen_msgs_q);
+
+	unsigned account_id;
+	if (!sqlitelog_get_account_id(account, &account_id))
+		return FALSE;
+
+	// If there are no messages sent or received from account
+	// then return empty list
+	if (account_id == SQLITELOG_DB_ID_NONE) {
+		*result = NULL;
+		return TRUE;
+	}
+
+	if (sqlite3_bind_int64(get_unseen_msgs_q,
+			GET_UNSEEN_MSGS_QUERY_PARAM_ACCOUNTID, account_id) != SQLITE_OK) {
+		return FALSE;
+	}
+
+	return sqlitelog_execute_get_msgs_query(get_unseen_msgs_q, result);
+}
+
+static gboolean
+sqlitelog_get_all_msgs_impl(PurpleBuddy *buddy, GList **result)
+{
+	g_assert(buddy);
+	g_assert(result);
+
+	g_assert(get_all_msgs_q);
+
+	PurpleAccount *account = purple_buddy_get_account(buddy);
+
+	g_return_val_if_fail(account != NULL, FALSE);
+
+	unsigned account_id;
+	if (!sqlitelog_get_account_id(account, &account_id))
+		return FALSE;
+
+	if (account_id == SQLITELOG_DB_ID_NONE) {
+		*result = NULL;
+		return TRUE;
+	}
+
+	const char *buddy_name = purple_buddy_get_name(buddy);
+
+	g_return_val_if_fail(buddy_name != NULL, FALSE);
+
+	if (sqlite3_bind_int64(get_all_msgs_q,
+			GET_ALL_MSGS_QUERY_PARAM_ACCOUNTID, account_id) != SQLITE_OK ||
+		sqlite3_bind_text(get_all_msgs_q,
+			GET_ALL_MSGS_QUERY_PARAM_WHO, buddy_name, -1, SQLITE_STATIC)
+		!= SQLITE_OK) {
+		return FALSE;
+	}
+
+	return sqlitelog_execute_get_msgs_query(get_all_msgs_q, result);
+}
+
+static gboolean
 sqlitelog_mark_as_seen_impl(unsigned msg_id)

_______________________________________________
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.