diff options
author | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2011-05-26 18:18:44 -0400 |
---|---|---|
committer | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2011-05-26 18:18:44 -0400 |
commit | 945c4ec3bc883d9ed11fddd042240a0cc6602e82 (patch) | |
tree | 12f074691c3554aaaa385bec20ce84acca313585 | |
parent | 4230ec13757892520a2971dacbb82b55fda7a76e (diff) | |
parent | 246744179fc337ac588206c03bc2260938c7c7f1 (diff) | |
download | telepathy-logger-945c4ec3bc883d9ed11fddd042240a0cc6602e82.tar.gz |
Merge branch 'fix-insert-after'
-rw-r--r-- | telepathy-logger/log-manager.c | 53 | ||||
-rw-r--r-- | telepathy-logger/log-store-xml.c | 38 | ||||
-rw-r--r-- | telepathy-logger/util-internal.h | 5 | ||||
-rw-r--r-- | telepathy-logger/util.c | 37 | ||||
-rw-r--r-- | tests/dbus/test-log-manager.c | 2 | ||||
-rw-r--r-- | tests/dbus/test-tpl-log-store-xml.c | 63 | ||||
-rw-r--r-- | tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.call.log | 5 | ||||
-rw-r--r-- | tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.log | 5 |
8 files changed, 119 insertions, 89 deletions
diff --git a/telepathy-logger/log-manager.c b/telepathy-logger/log-manager.c index a94ee72..4f1ed9e 100644 --- a/telepathy-logger/log-manager.c +++ b/telepathy-logger/log-manager.c @@ -559,26 +559,6 @@ _tpl_log_manager_get_events_for_date (TplLogManager *manager, } -static gint -log_manager_event_date_cmp (gconstpointer a, - gconstpointer b) -{ - TplEvent *one = (TplEvent *) a; - TplEvent *two = (TplEvent *) b; - gint64 one_time, two_time; - - g_assert (TPL_IS_EVENT (one)); - g_assert (TPL_IS_EVENT (two)); - - one_time = tpl_event_get_timestamp (one); - two_time = tpl_event_get_timestamp (two); - - /* return -1, 0 or 1 depending on event1 being newer, the same or older - * than event2 */ - return CLAMP (one_time - two_time, -1, 1); -} - - GList * _tpl_log_manager_get_filtered_events (TplLogManager *manager, TpAccount *account, @@ -589,9 +569,8 @@ _tpl_log_manager_get_filtered_events (TplLogManager *manager, gpointer user_data) { TplLogManagerPriv *priv; - GList *out = NULL; + GQueue out = G_QUEUE_INIT; GList *l; - guint i = 0; g_return_val_if_fail (TPL_IS_LOG_MANAGER (manager), NULL); g_return_val_if_fail (TPL_IS_ENTITY (target), NULL); @@ -603,40 +582,26 @@ _tpl_log_manager_get_filtered_events (TplLogManager *manager, for (l = priv->readable_stores; l != NULL; l = g_list_next (l)) { TplLogStore *store = TPL_LOG_STORE (l->data); - GList *new; + GList *new, *index = NULL; new = _tpl_log_store_get_filtered_events (store, account, target, type_mask, num_events, filter, user_data); + while (new != NULL) { - if (i < num_events) - { - /* We have less events than needed so far. Keep this event. */ - out = g_list_insert_sorted (out, new->data, - (GCompareFunc) log_manager_event_date_cmp); - i++; - } - else if (log_manager_event_date_cmp (new->data, out->data) > 0) - { - /* This event is newer than the oldest event we have in out - * list. Remove the head of out list and insert this event. */ - g_object_unref (out->data); - out = g_list_delete_link (out, out); - out = g_list_insert_sorted (out, new->data, - (GCompareFunc) log_manager_event_date_cmp); - } - else + index = _tpl_event_queue_insert_sorted_after (&out, index, new->data); + + if (out.length > num_events) { - /* This event is older than the oldest event we have in out - * list. Drop it. */ - g_object_unref (new->data); + /* We have too many elements. Remove the oldest event. */ + g_object_unref (g_queue_pop_head (&out)); } new = g_list_delete_link (new, new); } } - return out; + return out.head; } diff --git a/telepathy-logger/log-store-xml.c b/telepathy-logger/log-store-xml.c index a27e0cf..bd748d2 100644 --- a/telepathy-logger/log-store-xml.c +++ b/telepathy-logger/log-store-xml.c @@ -122,6 +122,7 @@ G_DEFINE_TYPE_WITH_CODE (TplLogStoreXml, _tpl_log_store_xml, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (TPL_TYPE_LOG_STORE, log_store_iface_init)) + static void log_store_xml_dispose (GObject *object) { @@ -351,6 +352,7 @@ log_store_xml_get_dir (TplLogStoreXml *self, return basedir; } + static const gchar * log_store_xml_get_file_suffix (GType type) { @@ -362,6 +364,7 @@ log_store_xml_get_file_suffix (GType type) g_return_val_if_reached (NULL); } + static gchar * log_store_xml_get_timestamp_filename (GType type, guint64 timestamp) @@ -609,6 +612,7 @@ out: return ret; } + static gboolean add_call_event (TplLogStoreXml *self, TplCallEvent *event, @@ -729,6 +733,7 @@ log_store_xml_add_event (TplLogStore *store, return TRUE; } + static gboolean log_store_xml_exists_in_directory (const gchar *dirname, GRegex *regex, @@ -1278,27 +1283,6 @@ parse_call_node (TplLogStoreXml *self, return event; } -static GList * -event_queue_insert_sorted_after (GQueue *events, - GList *index, - TplEvent *event) -{ - while (index != NULL && - tpl_event_get_timestamp (event) < - tpl_event_get_timestamp (TPL_EVENT (index->data))) - index = g_list_next (index); - - if (index != NULL) - { - g_queue_insert_after (events, index, event); - return g_list_next (index); - } - else - { - g_queue_push_tail (events, event); - return events->head; - } -} static void event_queue_replace_and_supersede (GQueue *events, @@ -1313,6 +1297,7 @@ event_queue_replace_and_supersede (GQueue *events, index->data = event; } + static GList * event_queue_add_text_event (GQueue *events, GList *index, @@ -1324,7 +1309,8 @@ event_queue_add_text_event (GQueue *events, TplTextEvent *dummy_event; if (supersedes_token == NULL) - return event_queue_insert_sorted_after (events, index, TPL_EVENT (event)); + return _tpl_event_queue_insert_sorted_after (events, index, + TPL_EVENT (event)); l = g_hash_table_lookup (superseded_links, supersedes_token); if (l != NULL) @@ -1362,12 +1348,13 @@ event_queue_add_text_event (GQueue *events, "message-token", supersedes_token, NULL); - index = event_queue_insert_sorted_after (events, index, + index = _tpl_event_queue_insert_sorted_after (events, index, TPL_EVENT (dummy_event)); event_queue_replace_and_supersede (events, index, superseded_links, event); return index; } + /* returns a Glist of TplEvent instances */ static void log_store_xml_get_events_for_file (TplLogStoreXml *self, @@ -1454,7 +1441,7 @@ log_store_xml_get_events_for_file (TplLogStoreXml *self, supersedes_links = g_hash_table_new (g_str_hash, g_str_equal); /* Now get the events. */ - index = events->head; + index = NULL; for (node = log_node->children; node; node = node->next) { TplEvent *event = NULL; @@ -1481,7 +1468,7 @@ log_store_xml_get_events_for_file (TplLogStoreXml *self, if (event == NULL) continue; - index = event_queue_insert_sorted_after (events, index, event); + index = _tpl_event_queue_insert_sorted_after (events, index, event); num_events++; } } @@ -1653,6 +1640,7 @@ log_store_xml_search_new (TplLogStore *store, return _log_store_xml_search_in_files (self, text, files, type_mask); } + /* Returns: (GList *) of (TplLogSearchHit *) */ static GList * log_store_xml_get_entities_for_dir (TplLogStoreXml *self, diff --git a/telepathy-logger/util-internal.h b/telepathy-logger/util-internal.h index 3aa2fa5..eabcaa1 100644 --- a/telepathy-logger/util-internal.h +++ b/telepathy-logger/util-internal.h @@ -26,11 +26,16 @@ #include <glib-object.h> #include <gio/gio.h> +#include "event.h" + #define TPL_STR_EMPTY(x) ((x) == NULL || (x)[0] == '\0') void _tpl_rmdir_recursively (const gchar *dir_name); gint64 _tpl_time_parse (const gchar * str); +GList *_tpl_event_queue_insert_sorted_after (GQueue *events, + GList *index, + TplEvent *event); #endif // __TPL_UTIL_H__ diff --git a/telepathy-logger/util.c b/telepathy-logger/util.c index 03b9269..ba14704 100644 --- a/telepathy-logger/util.c +++ b/telepathy-logger/util.c @@ -22,8 +22,6 @@ #include "util-internal.h" -#include "log-store-sqlite-internal.h" - #include <errno.h> #include <glib.h> #include <glib/gstdio.h> @@ -98,3 +96,38 @@ _tpl_time_parse (const gchar *str) return ts; } + + +GList * +_tpl_event_queue_insert_sorted_after (GQueue *events, + GList *index, + TplEvent *event) +{ + if (g_queue_is_empty (events)) + { + g_queue_push_tail (events, event); + return events->tail; + } + + /* The initial index might go before the first one */ + if (index == NULL) + { + index = events->head; + + if (tpl_event_get_timestamp (event) < + tpl_event_get_timestamp (TPL_EVENT (index->data))) + { + g_queue_insert_before (events, index, event); + return events->head; + } + } + + /* Find the last event that this event can go after */ + while (g_list_next (index) != NULL && + tpl_event_get_timestamp (event) >= + tpl_event_get_timestamp (TPL_EVENT (g_list_next (index)->data))) + index = g_list_next (index); + + g_queue_insert_after (events, index, event); + return g_list_next (index); +} diff --git a/tests/dbus/test-log-manager.c b/tests/dbus/test-log-manager.c index 5deb349..c3a91a6 100644 --- a/tests/dbus/test-log-manager.c +++ b/tests/dbus/test-log-manager.c @@ -455,7 +455,7 @@ test_get_entities (TestCaseFixture *fixture, get_entities_cb, fixture); g_main_loop_run (fixture->main_loop); - g_assert_cmpint (g_list_length (fixture->ret), ==, 4); + g_assert_cmpint (g_list_length (fixture->ret), ==, 5); /* we do not want duplicates */ fixture->ret = g_list_sort (fixture->ret, (GCompareFunc) _tpl_entity_compare); diff --git a/tests/dbus/test-tpl-log-store-xml.c b/tests/dbus/test-tpl-log-store-xml.c index d049cf8..fd70ee9 100644 --- a/tests/dbus/test-tpl-log-store-xml.c +++ b/tests/dbus/test-tpl-log-store-xml.c @@ -469,7 +469,7 @@ test_add_superseding_event (XmlTestCaseFixture *fixture, gconstpointer user_data) { TpAccount *account; - TplEntity *me, *contact, *room; + TplEntity *me, *contact; TplEvent *event; TplTextEvent *new_event; TplTextEvent *new_new_event; @@ -489,8 +489,6 @@ test_add_superseding_event (XmlTestCaseFixture *fixture, me = tpl_entity_new ("me", TPL_ENTITY_SELF, "my-alias", "my-avatar"); contact = tpl_entity_new ("contact", TPL_ENTITY_CONTACT, "contact-alias", "contact-token"); - room = tpl_entity_new_from_room_id ("room"); - /* 1. Outgoing message to a contact. */ event = g_object_new (TPL_TYPE_TEXT_EVENT, @@ -918,10 +916,11 @@ test_get_events_for_date (XmlTestCaseFixture *fixture, gconstpointer user_data) { TpAccount *account; - TplEntity *user2, *user3, *user4; + TplEntity *user2, *user3, *user4, *user5; GList *events; GDate *date; GError *error = NULL; + gint idx; account = tp_account_new (fixture->bus, TP_ACCOUNT_OBJECT_PATH_BASE "gabble/jabber/user_40collabora_2eco_2euk", @@ -940,44 +939,71 @@ test_get_events_for_date (XmlTestCaseFixture *fixture, user4 = tpl_entity_new ("user4@collabora.co.uk", TPL_ENTITY_CONTACT, "User4", ""); + user5 = tpl_entity_new ("user5@collabora.co.uk", TPL_ENTITY_CONTACT, + "User5", ""); + + /* Check that text event and call event are merged properly, call events + * should come after any older or same timestamp event. */ events = _tpl_log_store_get_events_for_date (fixture->store, account, user4, TPL_EVENT_MASK_ANY, date); g_assert_cmpint (g_list_length (events), ==, 6); + idx = -1; - g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, 0))); + g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, ++idx))); g_assert_cmpstr ( - tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, 0))), + tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, idx))), ==, "7"); - g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, 1))); + g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, ++idx))); + g_assert_cmpstr ( + tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, idx))), + ==, "8"); + + g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, ++idx))); g_assert_cmpint ( - tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, 1))), + tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, idx))), ==, 1); - g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, 2))); + g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, ++idx))); g_assert_cmpint ( - tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, 2))), + tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, idx))), ==, 2); - g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, 3))); + g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, ++idx))); g_assert_cmpint ( - tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, 3))), + tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, idx))), ==, 3); - g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, 4))); + g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, ++idx))); g_assert_cmpstr ( - tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, 4))), - ==, "8"); + tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, idx))), + ==, "9"); + + g_list_foreach (events, (GFunc) g_object_unref, NULL); + g_list_free (events); + + /* Check that a call older then any text event is sorted first */ + events = _tpl_log_store_get_events_for_date (fixture->store, account, user5, + TPL_EVENT_MASK_ANY, date); + + g_assert_cmpint (g_list_length (events), ==, 2); + idx = -1; + + g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, ++idx))); + g_assert_cmpint ( + tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, idx))), + ==, 1); - g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, 5))); + g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, ++idx))); g_assert_cmpstr ( - tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, 5))), + tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, idx))), ==, "9"); g_list_foreach (events, (GFunc) g_object_unref, NULL); g_list_free (events); + /* Check that call mask work */ events = _tpl_log_store_get_events_for_date (fixture->store, account, user4, TPL_EVENT_MASK_CALL, date); @@ -990,6 +1016,7 @@ test_get_events_for_date (XmlTestCaseFixture *fixture, g_list_foreach (events, (GFunc) g_object_unref, NULL); g_list_free (events); + /* Check that text mask work */ events = _tpl_log_store_get_events_for_date (fixture->store, account, user4, TPL_EVENT_MASK_TEXT, date); @@ -1003,6 +1030,7 @@ test_get_events_for_date (XmlTestCaseFixture *fixture, g_list_foreach (events, (GFunc) g_object_unref, NULL); g_list_free (events); + /* Check that getting empty list is working */ events = _tpl_log_store_get_events_for_date (fixture->store, account, user2, TPL_EVENT_MASK_CALL, date); g_assert_cmpint (g_list_length (events), ==, 0); @@ -1015,6 +1043,7 @@ test_get_events_for_date (XmlTestCaseFixture *fixture, g_object_unref (user2); g_object_unref (user3); g_object_unref (user4); + g_object_unref (user5); g_date_free (date); } diff --git a/tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.call.log b/tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.call.log new file mode 100644 index 0000000..50b4e34 --- /dev/null +++ b/tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.call.log @@ -0,0 +1,5 @@ +<?xml version='1.0' encoding='utf-8'?> +<?xml-stylesheet type="text/xsl" href="empathy-log.xsl"?> +<log> +<call time='20100113T17:48:01' id='user@collabora.co.uk' name='Nicolas1' isuser='false' token='' duration='1' actor='user@collabora.co.uk' actortype='contact' actorname='User1' actortoken='' reason='user-requested' detail='org.freedesktop.Telepathy.Error.Cancelled' /> +</log> diff --git a/tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.log b/tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.log new file mode 100644 index 0000000..23d6859 --- /dev/null +++ b/tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.log @@ -0,0 +1,5 @@ +<?xml version='1.0' encoding='utf-8'?> +<?xml-stylesheet type="text/xsl" href="empathy-log.xsl"?> +<log> +<message time='20100113T17:49:10' cm_id='456' id='user1@collabora.co.uk' name='User1' token='' isuser='false' type='normal'>9</message> +</log> |