[tracker] Avoid duplicate items in SubjectsChanged



commit 522c4e4c10e2545e08a2679c2794c65e4af4561d
Author: Philip Van Hoof <philip codeminded be>
Date:   Mon Aug 10 11:19:18 2009 +0200

    Avoid duplicate items in SubjectsChanged

 src/tracker-store/tracker-resource-class.c |   35 ++++++++++++++++++++++-----
 1 files changed, 28 insertions(+), 7 deletions(-)
---
diff --git a/src/tracker-store/tracker-resource-class.c b/src/tracker-store/tracker-resource-class.c
index 482d595..05e3184 100644
--- a/src/tracker-store/tracker-resource-class.c
+++ b/src/tracker-store/tracker-resource-class.c
@@ -266,6 +266,25 @@ has_already (GPtrArray *array, const gchar *uri)
 	return FALSE;
 }
 
+static gboolean
+changed_has_already (GPtrArray *array, const gchar *uri, const gchar *predicate)
+{
+	guint i;
+
+	if (!array) {
+		return FALSE;
+	}
+
+	for (i = 0; i < array->len; i++) {
+		ChangedItem *item = g_ptr_array_index (array, i);
+		if (g_strcmp0 (item->uri, uri) == 0 && g_strcmp0 (item->predicate, predicate) == 0) {
+			return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
 void 
 tracker_resource_class_add_event (TrackerResourceClass  *object,
 				  const gchar           *uri,
@@ -273,7 +292,6 @@ tracker_resource_class_add_event (TrackerResourceClass  *object,
 				  TrackerDBusEventsType type)
 {
 	TrackerResourceClassPrivate *priv;
-	ChangedItem *item;
 
 	priv = TRACKER_RESOURCE_CLASS_GET_PRIVATE (object);
 
@@ -291,15 +309,18 @@ tracker_resource_class_add_event (TrackerResourceClass  *object,
 		}
 		break;
 		case TRACKER_DBUS_EVENTS_TYPE_UPDATE:
+		if (!changed_has_already (priv->ups, uri, predicate)) {
+			ChangedItem *item;
 
-		item = g_slice_new (ChangedItem);
+			item = g_slice_new (ChangedItem);
 
-		item->uri = g_string_chunk_insert_const (priv->changed_strings, uri);
-		item->predicate = g_string_chunk_insert_const (priv->changed_strings, predicate);
+			item->uri = g_string_chunk_insert_const (priv->changed_strings, uri);
+			item->predicate = g_string_chunk_insert_const (priv->changed_strings, predicate);
 
-		if (!priv->ups)
-			priv->ups = g_ptr_array_new ();
-		g_ptr_array_add (priv->ups, item);
+			if (!priv->ups)
+				priv->ups = g_ptr_array_new ();
+			g_ptr_array_add (priv->ups, item);
+		}
 		break;
 		case TRACKER_DBUS_EVENTS_TYPE_DELETE:
 		if (!has_already (priv->dels, uri)) {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]