/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