[tracker] Added predicates to the SubjectsChanged signal



commit 37de848e83329e224acddb81d132f15d9161baf5
Author: Philip Van Hoof <philip codeminded be>
Date:   Mon Aug 10 11:06:32 2009 +0200

    Added predicates to the SubjectsChanged signal

 data/dbus/tracker-resources-class.xml      |    1 +
 src/tracker-store/tracker-events.c         |   11 +++-
 src/tracker-store/tracker-events.h         |    1 +
 src/tracker-store/tracker-marshal.list     |    1 +
 src/tracker-store/tracker-resource-class.c |  105 ++++++++++++++++++++++++----
 src/tracker-store/tracker-resource-class.h |    1 +
 src/tracker-store/tracker-resources.c      |   15 ++--
 7 files changed, 112 insertions(+), 23 deletions(-)
---
diff --git a/data/dbus/tracker-resources-class.xml b/data/dbus/tracker-resources-class.xml
index c595933..665c9ed 100644
--- a/data/dbus/tracker-resources-class.xml
+++ b/data/dbus/tracker-resources-class.xml
@@ -7,6 +7,7 @@
 
     <signal name="SubjectsChanged">
      <arg type="as" name="subject" />
+     <arg type="as" name="predicate" />
     </signal>
 
     <!-- Signal for added subjects -->
diff --git a/src/tracker-store/tracker-events.c b/src/tracker-store/tracker-events.c
index 9db79b9..b52acfa 100644
--- a/src/tracker-store/tracker-events.c
+++ b/src/tracker-store/tracker-events.c
@@ -64,6 +64,7 @@ is_allowed (EventsPrivate *private, const gchar *rdf_class)
 
 typedef struct {
 	const gchar *uri;
+	const gchar *predicate;
 	TrackerDBusEventsType type;
 } PreparableEvent;
 
@@ -73,6 +74,7 @@ prepare_event_for_rdf_types (gpointer data, gpointer user_data)
 	const gchar *rdf_class = data;
 	PreparableEvent *info = user_data;
 	const gchar *uri = info->uri;
+	const gchar *predicate = info->predicate;
 	TrackerDBusEventsType type = info->type;
 
 	EventsPrivate *private;
@@ -80,6 +82,7 @@ prepare_event_for_rdf_types (gpointer data, gpointer user_data)
 	GValue uri_value = { 0 , };
 	GValue rdfclass_value = { 0 , };
 	GValue type_value = { 0 , };
+	GValue predicate_value = { 0 , };
 
 	private = g_static_private_get (&private_key);
 	g_return_if_fail (private != NULL);
@@ -92,16 +95,19 @@ prepare_event_for_rdf_types (gpointer data, gpointer user_data)
 	}
 
 	g_value_init (&uri_value, G_TYPE_STRING);
+	g_value_init (&predicate_value, G_TYPE_STRING);
 	g_value_init (&rdfclass_value, G_TYPE_STRING);
 	g_value_init (&type_value, G_TYPE_INT);
 
-	event = g_value_array_new (3);
+	event = g_value_array_new (4);
 
 	g_value_set_string (&uri_value, uri);
+	g_value_set_string (&predicate_value, predicate);
 	g_value_set_string (&rdfclass_value, rdf_class);
 	g_value_set_int (&type_value, type);
 
 	g_value_array_append (event, &uri_value);
+	g_value_array_append (event, &predicate_value);
 	g_value_array_append (event, &rdfclass_value);
 	g_value_array_append (event, &type_value);
 
@@ -110,10 +116,12 @@ prepare_event_for_rdf_types (gpointer data, gpointer user_data)
 	g_value_unset (&uri_value);
 	g_value_unset (&rdfclass_value);
 	g_value_unset (&type_value);
+	g_value_unset (&predicate_value);
 }
 
 void 
 tracker_events_insert (const gchar *uri, 
+		       const gchar *predicate,
 		       const gchar *object, 
 		       GPtrArray *rdf_types, 
 		       TrackerDBusEventsType type)
@@ -122,6 +130,7 @@ tracker_events_insert (const gchar *uri,
 
 	info.uri = uri;
 	info.type = type;
+	info.predicate = predicate;
 
 	if (rdf_types && type == TRACKER_DBUS_EVENTS_TYPE_UPDATE) {
 		/* object is not very important for updates (we don't expose
diff --git a/src/tracker-store/tracker-events.h b/src/tracker-store/tracker-events.h
index 9c0197a..d078357 100644
--- a/src/tracker-store/tracker-events.h
+++ b/src/tracker-store/tracker-events.h
@@ -33,6 +33,7 @@ typedef GStrv (*TrackerNotifyClassGetter) (void);
 void       tracker_events_init        (TrackerNotifyClassGetter callback);
 void       tracker_events_shutdown    (void);
 void       tracker_events_insert      (const gchar           *uri,
+				       const gchar           *predicate,
 				       const gchar           *object,
 				       GPtrArray             *rdf_types,
 				       TrackerDBusEventsType  type);
diff --git a/src/tracker-store/tracker-marshal.list b/src/tracker-store/tracker-marshal.list
index 81dc924..910ccde 100644
--- a/src/tracker-store/tracker-marshal.list
+++ b/src/tracker-store/tracker-marshal.list
@@ -3,6 +3,7 @@ VOID:STRING,BOOLEAN
 VOID:STRING,STRING
 VOID:STRING,BOOLEAN,BOOLEAN,BOOLEAN,BOOLEAN,BOOLEAN,BOOLEAN
 VOID:BOXED
+VOID:BOXED,BOXED
 
 # Indexer signals
 VOID:DOUBLE,UINT,UINT,BOOL
diff --git a/src/tracker-store/tracker-resource-class.c b/src/tracker-store/tracker-resource-class.c
index c1b29cc..482d595 100644
--- a/src/tracker-store/tracker-resource-class.c
+++ b/src/tracker-store/tracker-resource-class.c
@@ -42,8 +42,13 @@
 typedef struct {
 	gchar *rdf_class;
 	GPtrArray *adds, *ups, *dels;
+	GStringChunk *changed_strings;
 } TrackerResourceClassPrivate;
 
+typedef struct {
+	gchar *uri, *predicate;
+} ChangedItem;
+
 enum {
 	SUBJECTS_ADDED,
 	SUBJECTS_REMOVED,
@@ -94,9 +99,10 @@ tracker_resource_class_class_init (TrackerResourceClassClass *klass)
 			      G_SIGNAL_RUN_LAST,
 			      0,
 			      NULL, NULL,
-			      tracker_marshal_VOID__BOXED,
+			      tracker_marshal_VOID__BOXED_BOXED,
 			      G_TYPE_NONE,
-			      1,
+			      2,
+			      G_TYPE_STRV,
 			      G_TYPE_STRV);
 
 	g_type_class_add_private (object_class, sizeof (TrackerResourceClassPrivate));
@@ -131,11 +137,39 @@ emit_strings (TrackerResourceClass *object, gint signal_, GPtrArray *array)
 }
 
 static void
-free_array (GPtrArray *array)
+emit_changed_strings (TrackerResourceClass *object, GPtrArray *array)
+{
+	GStrv stringsa_to_emit;
+	GStrv stringsb_to_emit;
+
+	guint i;
+
+	if (array->len > 0) {
+		stringsa_to_emit = (GStrv) g_malloc0  (sizeof (gchar *) * (array->len + 1));
+		stringsb_to_emit = (GStrv) g_malloc0  (sizeof (gchar *) * (array->len + 1));
+
+		for (i = 0; i < array->len; i++) {
+			ChangedItem *item = array->pdata [i];
+
+			stringsa_to_emit[i] = item->uri;
+			stringsb_to_emit[i] = item->predicate;
+		}
+
+		g_signal_emit (object, signals[SUBJECTS_CHANGED], 0, 
+		               stringsa_to_emit, stringsb_to_emit);
+
+		/* Normal free, not a GStrv free, we free the items later */
+		g_free (stringsa_to_emit);
+		g_free (stringsb_to_emit);
+	}
+}
+
+static void
+free_changed_array (GPtrArray *array)
 {
 	guint i;
 	for (i = 0; i < array->len; i++) {
-		g_free (array->pdata [i]);
+		g_slice_free (ChangedItem, array->pdata [i]);
 	}
 	g_ptr_array_free (array, TRUE);
 }
@@ -149,21 +183,27 @@ tracker_resource_class_emit_events (TrackerResourceClass  *object)
 
 	if (priv->adds) {
 		emit_strings (object, signals[SUBJECTS_ADDED], priv->adds);
-		free_array (priv->adds);
+		g_ptr_array_free (priv->adds, TRUE);
 		priv->adds = NULL;
 	}
 
 	if (priv->ups) {
-		emit_strings (object, signals[SUBJECTS_CHANGED], priv->ups);
-		free_array (priv->ups);
+		emit_changed_strings (object, priv->ups);
+		free_changed_array (priv->ups);
 		priv->ups = NULL;
 	}
 
 	if (priv->dels) {
 		emit_strings (object, signals[SUBJECTS_REMOVED], priv->dels);
-		free_array (priv->dels);
+		g_ptr_array_free (priv->dels, TRUE);
 		priv->dels = NULL;
 	}
+
+	if (priv->changed_strings) {
+		g_string_chunk_free (priv->changed_strings);
+		priv->changed_strings = NULL;
+	}
+
 }
 
 
@@ -208,30 +248,65 @@ tracker_resource_class_get_rdf_class (TrackerResourceClass  *object)
 	return priv->rdf_class;
 }
 
+static gboolean
+has_already (GPtrArray *array, const gchar *uri)
+{
+	guint i;
+
+	if (!array) {
+		return FALSE;
+	}
+
+	for (i = 0; i < array->len; i++) {
+		if (g_strcmp0 (g_ptr_array_index (array, i), uri) == 0) {
+			return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
 void 
 tracker_resource_class_add_event (TrackerResourceClass  *object,
 				  const gchar           *uri,
+				  const gchar           *predicate,
 				  TrackerDBusEventsType type)
 {
 	TrackerResourceClassPrivate *priv;
+	ChangedItem *item;
 
 	priv = TRACKER_RESOURCE_CLASS_GET_PRIVATE (object);
 
+	if (!priv->changed_strings) {
+		/* Default size a bit longer than this sample uri */
+		priv->changed_strings = g_string_chunk_new (strlen (uri) + 10);
+	}
+
 	switch (type) {
 		case TRACKER_DBUS_EVENTS_TYPE_ADD:
-		if (!priv->adds)
-			priv->adds = g_ptr_array_new ();
-		g_ptr_array_add (priv->adds, g_strdup (uri));
+		if (!has_already (priv->adds, uri)) {
+			if (!priv->adds)
+				priv->adds = g_ptr_array_new ();
+			g_ptr_array_add (priv->adds, g_string_chunk_insert_const (priv->changed_strings, uri));
+		}
 		break;
 		case TRACKER_DBUS_EVENTS_TYPE_UPDATE:
+
+		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);
+
 		if (!priv->ups)
 			priv->ups = g_ptr_array_new ();
-		g_ptr_array_add (priv->ups, g_strdup (uri));
+		g_ptr_array_add (priv->ups, item);
 		break;
 		case TRACKER_DBUS_EVENTS_TYPE_DELETE:
-		if (!priv->dels)
-			priv->dels = g_ptr_array_new ();
-		g_ptr_array_add (priv->dels, g_strdup (uri));
+		if (!has_already (priv->dels, uri)) {
+			if (!priv->dels)
+				priv->dels = g_ptr_array_new ();
+			g_ptr_array_add (priv->dels, g_string_chunk_insert_const (priv->changed_strings, uri));
+		}
 		break;
 		default:
 		break;
diff --git a/src/tracker-store/tracker-resource-class.h b/src/tracker-store/tracker-resource-class.h
index bb1e213..7b9bb38 100644
--- a/src/tracker-store/tracker-resource-class.h
+++ b/src/tracker-store/tracker-resource-class.h
@@ -57,6 +57,7 @@ TrackerResourceClass  *tracker_resource_class_new           (const gchar *rdf_cl
 const gchar *          tracker_resource_class_get_rdf_class (TrackerResourceClass  *object);
 
 void                   tracker_resource_class_add_event     (TrackerResourceClass  *object,
+                                                             const gchar           *predicate,
                                                              const gchar           *uri,
                                                              TrackerDBusEventsType  type);
 void                   tracker_resource_class_emit_events   (TrackerResourceClass  *object);
diff --git a/src/tracker-store/tracker-resources.c b/src/tracker-store/tracker-resources.c
index ee0bb48..9b0c63a 100644
--- a/src/tracker-store/tracker-resources.c
+++ b/src/tracker-store/tracker-resources.c
@@ -410,13 +410,14 @@ on_statements_committed (gpointer user_data)
 		for (i = 0; i < events->len; i++) {
 			GValueArray *event = events->pdata[i];
 			const gchar *uri = g_value_get_string (g_value_array_get_nth (event, 0));
-			const gchar *rdf_class = g_value_get_string (g_value_array_get_nth (event, 1));
-			TrackerDBusEventsType type = g_value_get_int (g_value_array_get_nth (event, 2));
+			const gchar *predicate = g_value_get_string (g_value_array_get_nth (event, 1));
+			const gchar *rdf_class = g_value_get_string (g_value_array_get_nth (event, 2));
+			TrackerDBusEventsType type = g_value_get_int (g_value_array_get_nth (event, 3));
 
 			for (l = event_sources; l; l = l->next) {
 				TrackerResourceClass *class_ = l->data;
 				if (g_strcmp0 (rdf_class, tracker_resource_class_get_rdf_class (class_)) == 0) {
-					tracker_resource_class_add_event (class_, uri, type);
+					tracker_resource_class_add_event (class_, uri, predicate, type);
 					to_emit = g_slist_prepend (to_emit, class_);
 				}
 			}
@@ -443,9 +444,9 @@ on_statement_inserted (const gchar *subject,
 		       gpointer user_data)
 {
 	if (g_strcmp0 (predicate, RDF_PREFIX "type") == 0) {
-		tracker_events_insert (subject, object, rdf_types, TRACKER_DBUS_EVENTS_TYPE_ADD);
+		tracker_events_insert (subject, predicate, object, rdf_types, TRACKER_DBUS_EVENTS_TYPE_ADD);
 	} else {
-		tracker_events_insert (subject, object, rdf_types, TRACKER_DBUS_EVENTS_TYPE_UPDATE);
+		tracker_events_insert (subject, predicate, object, rdf_types, TRACKER_DBUS_EVENTS_TYPE_UPDATE);
 	}
 }
 
@@ -457,9 +458,9 @@ on_statement_deleted (const gchar *subject,
 		      gpointer user_data)
 {
 	if (g_strcmp0 (predicate, RDF_PREFIX "type") == 0) {
-		tracker_events_insert (subject, object, rdf_types, TRACKER_DBUS_EVENTS_TYPE_DELETE);
+		tracker_events_insert (subject, object, predicate, rdf_types, TRACKER_DBUS_EVENTS_TYPE_DELETE);
 	} else {
-		tracker_events_insert (subject, object, rdf_types, TRACKER_DBUS_EVENTS_TYPE_UPDATE);
+		tracker_events_insert (subject, object, predicate, rdf_types, TRACKER_DBUS_EVENTS_TYPE_UPDATE);
 	}
 }
 



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