/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