[tracker] Added predicates to the SubjectsChanged signal
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker] Added predicates to the SubjectsChanged signal
- Date: Mon, 10 Aug 2009 09:07:49 +0000 (UTC)
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]