/soc/2015/igor.gajowiak/chatlog: 36ddf6ef71cc: Added Days table ...
Igor Gajowiak
igor.gajowiak at gmail.com
Wed Jul 29 20:03:26 EDT 2015
Changeset: 36ddf6ef71cc3c5b2e780631b721839b4644213a
Author: Igor Gajowiak <igor.gajowiak at gmail.com>
Date: 2015-07-30 02:03 +0200
Branch: default
URL: https://hg.pidgin.im/soc/2015/igor.gajowiak/chatlog/rev/36ddf6ef71cc
Description:
Added Days table and made some more SQL optimizations.
diffstat:
libpurple/genericlog.c | 14 +-
libpurple/genericlog.h | 47 ++-
libpurple/plugins/log/logsqlite.c | 498 ++++++++++++++++++++++++++++---------
3 files changed, 423 insertions(+), 136 deletions(-)
diffs (truncated from 1001 to 300 lines):
diff --git a/libpurple/genericlog.c b/libpurple/genericlog.c
--- a/libpurple/genericlog.c
+++ b/libpurple/genericlog.c
@@ -248,12 +248,12 @@ purple_genericlog_get_unseen_msgs(Purple
}
gboolean
-purple_genericlog_get_all_msgs(PurpleBuddy *buddy, GList **result,
+purple_genericlog_get_all_msgs(PurpleBuddy *buddy, guint64 day, 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);
+ "Getting all messages from %s failed", buddy, day, result);
}
gboolean
@@ -274,6 +274,15 @@ purple_genericlog_get_all_buddies(GList*
"Getting buddies from %s failed", result);
}
+gboolean
+purple_genericlog_get_all_days(PurpleBuddy *buddy, GArray **result,
+ GError **error)
+{
+ DEFINE_GENERICLOG_FUNC_WITH_RETURN(get_all_days,
+ "%s does not support getting all days",
+ "Getting all days from %s failed", buddy, result);
+}
+
#undef DEFINE_GENERICLOG_FUNC_WITH_RETURN
/**************************************************************************/
@@ -363,6 +372,7 @@ purple_genericlog_class_init(PurpleGener
klass->get_all_msgs = NULL;
klass->get_older_msgs = NULL;
klass->get_all_buddies = NULL;
+ klass->get_all_days = 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,9 +61,12 @@ 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_msgs: Gets all messages sent to or received from a buddy on
+ * a given day. Messages are sorted by their timestamp
+ * in ascending order. Returns %TRUE if operation succeeds,
+ * %FALSE otherwise. 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_older_msgs: Gets all messages sent to or received from a buddy, older
* than the message and not older than the timestamp.
* If message is %NULL then upper bound check is skipped.
@@ -73,6 +76,11 @@ struct _PurpleGenericLog
* message in the log. Returns %TRUE if operation succeeds,
* %FALSE otherwise. The client is responsible for freeing
* the result with g_list_free_full(result, g_object_unref).
+ * @get_all_days: Gets an array of all days with at least one message
+ * received from or sent to a given buddy. Day is represented
+ * as unix timestamp (guint64) (at 00:00). Returns %TRUE
+ * if operation succeeds, %FALSE otherwise. The client
+ * is responsible for freeing the result with g_array_unref.
*
* The abstract base class for all log implementations. A conforming plugin
* must implement at least activate and deactivate methods. Not supported
@@ -93,13 +101,15 @@ struct _PurpleGenericLogClass
gboolean (*get_unseen_msgs)(PurpleAccount *account, GList **result);
- gboolean (*get_all_msgs)(PurpleBuddy *buddy, GList **result);
+ gboolean (*get_all_msgs)(PurpleBuddy *buddy, guint64 day, GList **result);
gboolean (*get_older_msgs)(PurpleBuddy *buddy, guint64 timestamp,
PurpleMessage *message, GList **result);
gboolean (*get_all_buddies)(GList **result);
+ gboolean (*get_all_days)(PurpleBuddy *buddy, GArray **result);
+
void (*reserved1)(void);
void (*reserved2)(void);
void (*reserved3)(void);
@@ -251,21 +261,23 @@ purple_genericlog_get_unseen_msgs(Purple
/**
* purple_genericlog_get_all_msgs:
* @buddy: The buddy.
+ * @day: The day received from previous call to
+ * purple_genericlog_get_all_days.
* @result[out]: 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.
+ * Gets all messages sent to or received from a given buddy on a given day.
*
* 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).
+ * 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,
+purple_genericlog_get_all_msgs(PurpleBuddy *buddy, guint64 day, GList **result,
GError **error);
/**
@@ -308,6 +320,25 @@ purple_genericlog_get_older_msgs(PurpleB
gboolean
purple_genericlog_get_all_buddies(GList **result, GError **error);
+/**
+ * purple_genericlog_get_all_days:
+ * @buddy: The buddy.
+ * @result: Return location for a #GArray containing elements of type guint64
+ * representing days. 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 days fails.
+ *
+ * Gets an array of all days with at least one message received from
+ * or sent to a buddy.
+ *
+ * The caller is responsible for freeing the result with g_array_unref.
+ *
+ * Returns: %TRUE if succeeds, %FALSE otherwise.
+ */
+gboolean
+purple_genericlog_get_all_days(PurpleBuddy *buddy, GArray **result,
+ 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
@@ -20,6 +20,8 @@
*/
#include <stdlib.h>
+#include <time.h>
+
#include <sqlite3.h>
#include "debug.h"
@@ -74,11 +76,6 @@ typedef enum
GET_ACCOUNT_ID_QUERY_PARAM_PROTOCOLID = 2,
} GetAccountIdQueryParam;
-typedef enum
-{
- GET_ACCOUNT_ID_QUERY_COL_ID = 0
-} GetAccountIdQueryCol;
-
static sqlite3_stmt *insert_account_q = NULL;
static const char *insert_account_q_str =
@@ -91,10 +88,22 @@ typedef enum
INSERT_ACCOUNT_QUERY_PARAM_PROTOCOLID = 2,
} InsertAccountQueryParam;
+static sqlite3_stmt *get_buddy_id_q = NULL;
+
+static const char *get_buddy_id_q_str =
+ "SELECT Id FROM Buddies "
+ "WHERE Name = ?1 AND AccountId = ?2;";
+
+typedef enum
+{
+ GET_BUDDY_ID_QUERY_PARAM_NAME = 1,
+ GET_BUDDY_ID_QUERY_PARAM_ACCOUNTID = 2
+} GetBuddyIdQueryParam;
+
static sqlite3_stmt *insert_buddy_q = NULL;
static const char *insert_buddy_q_str =
- "INSERT OR IGNORE INTO Buddies (Name, AccountId) VALUES(?1, ?2);";
+ "INSERT INTO Buddies (Name, AccountId) VALUES(?1, ?2);";
typedef enum
{
@@ -102,12 +111,39 @@ typedef enum
INSERT_BUDDY_QUERY_PARAM_ACCOUNTID = 2
} InsertBuddyQueryParam;
+static sqlite3_stmt *get_day_id_q = NULL;
+
+static const char *get_day_id_q_str =
+ "SELECT Id FROM Days WHERE Time = ?1 AND BuddyId = ?2;";
+
+typedef enum
+{
+ GET_DAY_ID_QUERY_PARAM_TIME = 1,
+ GET_DAY_ID_QUERY_PARAM_BUDDYID = 2,
+} GetDayIdQueryParam;
+
+typedef enum
+{
+ GET_ID_QUERY_COL_ID = 0
+} GetIdQueryCol;
+
+static sqlite3_stmt *insert_day_q = NULL;
+
+static const char *insert_day_q_str =
+ "INSERT INTO Days(Time, BuddyId) VALUES (?1, ?2);";
+
+typedef enum
+{
+ INSERT_DAY_QUERY_PARAM_TIME = 1,
+ INSERT_DAY_QUERY_PARAM_BUDDYID = 2,
+} InsertDayQueryParam;
+
static sqlite3_stmt *insert_message_q = NULL;
static const char *insert_message_q_str =
"INSERT INTO Messages (Author, AuthorAlias, Recipient, "
- "Contents, MsgTime, Flags, Seen, Send, AccountId) "
- "VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9);";
+ "Contents, MsgTime, Flags, Seen, AccountId, BuddyId, DayId) "
+ "VALUES(?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10);";
typedef enum
{
@@ -118,8 +154,9 @@ typedef enum
INSERT_MESSAGE_QUERY_PARAM_MSGTIME = 5,
INSERT_MESSAGE_QUERY_PARAM_FLAGS = 6,
INSERT_MESSAGE_QUERY_PARAM_SEEN = 7,
- INSERT_MESSAGE_QUERY_PARAM_SEND = 8,
- INSERT_MESSAGE_QUERY_PARAM_ACCOUNTID = 9,
+ INSERT_MESSAGE_QUERY_PARAM_ACCOUNTID = 8,
+ INSERT_MESSAGE_QUERY_PARAM_BUDDYID = 9,
+ INSERT_MESSAGE_QUERY_PARAM_DAYID = 10,
} InsertMessageQueryParam;
static sqlite3_stmt *get_unseen_msgs_q = NULL;
@@ -140,13 +177,13 @@ static sqlite3_stmt *get_all_msgs_q = NU
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) "
+ "WHERE BuddyId = ?1 AND DayId = ?2 "
"ORDER BY MsgTime DESC, Id DESC;";
typedef enum
{
- GET_ALL_MSGS_QUERY_PARAM_ACCOUNTID = 1,
- GET_ALL_MSGS_QUERY_PARAM_WHO = 2,
+ GET_ALL_MSGS_QUERY_PARAM_BUDDYID = 1,
+ GET_ALL_MSGS_QUERY_PARAM_DAYID = 2,
} GetAllMsgsQueryParam;
static sqlite3_stmt *get_older_msgs_q = NULL;
@@ -154,15 +191,13 @@ static sqlite3_stmt *get_older_msgs_q =
static const char *get_older_msgs_q_str =
"SELECT Id, Author, AuthorAlias, Recipient, Contents, MsgTime, Flags "
"FROM Messages "
- "WHERE AccountId = ?1 AND MsgTime >= ?2 "
- "AND (Author = ?3 OR Recipient = ?3) "
+ "WHERE BuddyId = ?1 AND MsgTime >= ?2 "
"ORDER BY MsgTime, Id;";
typedef enum
{
- GET_OLDER_MSGS_QUERY_PARAM_ACCOUNTID = 1,
+ GET_OLDER_MSGS_QUERY_PARAM_BUDDYID = 1,
GET_OLDER_MSGS_QUERY_PARAM_LOWERBOUND = 2,
- GET_OLDER_MSGS_QUERY_PARAM_WHO = 3
} GetOlderMsgsQueryParam;
static sqlite3_stmt *get_older_msgs_upper_q = NULL;
@@ -170,17 +205,15 @@ static sqlite3_stmt *get_older_msgs_uppe
static const char *get_older_msgs_upper_q_str =
"SELECT Id, Author, AuthorAlias, Recipient, Contents, MsgTime, Flags "
"FROM Messages "
- "WHERE AccountId = ?1 AND MsgTime >= ?2 AND MsgTime <= ?3 AND Id != ?4 "
- "AND (Author = ?5 OR Recipient = ?5) "
+ "WHERE BuddyId = ?1 AND MsgTime >= ?2 AND MsgTime <= ?3 AND Id != ?4 "
"ORDER BY MsgTime, Id;";
typedef enum
{
- GET_OLDER_MSGS_UPPER_QUERY_PARAM_ACCOUNTID = 1,
+ GET_OLDER_MSGS_UPPER_QUERY_PARAM_BUDDYID = 1,
GET_OLDER_MSGS_UPPER_QUERY_PARAM_LOWERBOUND = 2,
GET_OLDER_MSGS_UPPER_QUERY_PARAM_UPPERBOUND = 3,
GET_OLDER_MSGS_UPPER_QUERY_PARAM_EXCEPTID = 4,
- GET_OLDER_MSGS_UPPER_QUERY_PARAM_WHO = 5
} GetOlderMsgsUpperQueryParam;
More information about the Commits
mailing list