summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2016-11-13 21:29:55 +0100
committerCarlos Garnacho <carlosg@gnome.org>2016-11-20 20:16:46 +0100
commitf3f0033e7fcae4efa97b51ede3ec464186ca5ecd (patch)
treef1a3768cc8bf377ce7a8d620ce5fedcee4db180a
parent8152d6d432578371b779c63dbbee4a1d9d780a93 (diff)
downloadtracker-f3f0033e7fcae4efa97b51ede3ec464186ca5ecd.tar.gz
libtracker-miner: Use TrackerNotifier on TrackerDecorator
Remove the GraphUpdated handler in favor of TrackerNotifier, it's been made to be a good fit here, and the porting results in a nice code removal. Given that the RDF types list is readwrite in TrackerDecorator, but construct-only in TrackerNotifier, this means we need to cater for changes in the RDF types list, just by creating another TrackerNotifier and dropping the older one. https://bugzilla.gnome.org/show_bug.cgi?id=773028
-rw-r--r--src/libtracker-miner/tracker-decorator.c214
1 files changed, 49 insertions, 165 deletions
diff --git a/src/libtracker-miner/tracker-decorator.c b/src/libtracker-miner/tracker-decorator.c
index 1ac319acf..aeffe03d9 100644
--- a/src/libtracker-miner/tracker-decorator.c
+++ b/src/libtracker-miner/tracker-decorator.c
@@ -60,7 +60,6 @@ struct _TrackerDecoratorInfo {
struct _ClassInfo {
gchar *class_name;
- gint class_id;
gint priority;
};
@@ -70,7 +69,7 @@ struct _SparqlUpdate {
};
struct _TrackerDecoratorPrivate {
- guint graph_updated_signal_id;
+ TrackerNotifier *notifier;
gchar *data_source;
GArray *classes; /* Array of ClassInfo */
@@ -91,14 +90,10 @@ struct _TrackerDecoratorPrivate {
GTimer *timer;
GQueue next_elem_queue; /* Queue of incoming tasks */
- gint rdf_type_id;
- gint nie_data_source_id;
- gint data_source_id;
gint batch_size;
guint processing : 1;
guint querying : 1;
- guint validated : 1;
};
enum {
@@ -125,6 +120,10 @@ static void decorator_task_done (GObject *object,
static void decorator_cache_next_items (TrackerDecorator *decorator);
static gboolean decorator_check_commit (TrackerDecorator *decorator);
+static void notifier_events_cb (TrackerDecorator *decorator,
+ GPtrArray *events,
+ TrackerNotifier *notifier);
+
/**
* tracker_decorator_error_quark:
*
@@ -720,9 +719,6 @@ create_query_string (TrackerDecorator *decorator,
GString *query;
gint i;
- if (!priv->validated)
- return NULL;
-
query = g_string_new ("SELECT ");
for (i = 0; select_clauses[i]; i++) {
@@ -941,83 +937,30 @@ decorator_cache_next_items (TrackerDecorator *decorator)
}
}
-static gint
-get_class_id (TrackerSparqlConnection *conn,
- const gchar *class,
- gboolean is_iri)
-{
- TrackerSparqlCursor *cursor;
- GError *error = NULL;
- gchar *query;
- gint id = -1;
-
- if (is_iri)
- query = g_strdup_printf ("select tracker:id (<%s>) { }", class);
- else
- query = g_strdup_printf ("select tracker:id (%s) { }", class);
-
- cursor = tracker_sparql_connection_query (conn, query, NULL, &error);
- g_free (query);
-
- if (error) {
- g_critical ("Could not get class ID for '%s': %s\n",
- class, error->message);
- g_error_free (error);
- return -1;
- }
-
- if (tracker_sparql_cursor_next (cursor, NULL, NULL))
- id = tracker_sparql_cursor_get_integer (cursor, 0);
- else
- g_critical ("'%s' didn't resolve to a known class ID", class);
-
- g_object_unref (cursor);
-
- return id;
-}
-
static void
-tracker_decorator_validate_class_ids (TrackerDecorator *decorator)
+update_notifier (TrackerDecorator *decorator)
{
- TrackerSparqlConnection *sparql_conn;
- TrackerDecoratorPrivate *priv;
- ClassInfo *info;
- GArray *array;
- gint i = 0;
-
- priv = decorator->priv;
- sparql_conn = tracker_miner_get_connection (TRACKER_MINER (decorator));
- array = g_array_new (TRUE, FALSE, sizeof (gchar*));
+ TrackerDecoratorPrivate *priv = decorator->priv;
- for (i = 0; i < priv->classes->len; i++) {
- info = &g_array_index (priv->classes, ClassInfo, i);
- info->class_id = get_class_id (sparql_conn,
- info->class_name, FALSE);
- if (info->class_id > 0) {
- priv->validated = TRUE;
- g_array_append_val (array, info->class_name);
- }
- }
+ g_clear_object (&priv->notifier);
- priv->class_names = (gchar **) g_array_free (array, FALSE);
-}
+ if (priv->class_names) {
+ GError *error = NULL;
-static gboolean
-tracker_decorator_has_class_id (TrackerDecorator *decorator,
- gint id)
-{
- TrackerDecoratorPrivate *priv = decorator->priv;
- ClassInfo *info;
- gint i;
+ priv->notifier = tracker_notifier_new ((const gchar * const *) priv->class_names,
+ TRACKER_NOTIFIER_FLAG_NOTIFY_UNEXTRACTED,
+ NULL, &error);
- for (i = 0; i < priv->classes->len; i++) {
- info = &g_array_index (priv->classes, ClassInfo, i);
+ if (error) {
+ g_warning ("Could not create notifier: %s\n",
+ error->message);
+ g_error_free (error);
+ }
- if (info->class_id == id)
- return TRUE;
+ g_signal_connect_swapped (priv->notifier, "events",
+ G_CALLBACK (notifier_events_cb),
+ decorator);
}
-
- return FALSE;
}
static void
@@ -1053,7 +996,6 @@ decorator_add_class (TrackerDecorator *decorator,
ClassInfo info;
info.class_name = g_strdup (class);
- info.class_id = -1;
info.priority = G_PRIORITY_DEFAULT;
g_array_append_val (priv->classes, info);
}
@@ -1065,6 +1007,9 @@ decorator_set_classes (TrackerDecorator *decorator,
TrackerDecoratorPrivate *priv = decorator->priv;
gint i;
+ g_strfreev (priv->class_names);
+ priv->class_names = g_strdupv ((gchar **) classes);
+
if (priv->classes->len > 0) {
g_array_remove_range (priv->classes, 0,
priv->classes->len);
@@ -1073,6 +1018,8 @@ decorator_set_classes (TrackerDecorator *decorator,
for (i = 0; classes[i]; i++) {
decorator_add_class (decorator, classes[i]);
}
+
+ update_notifier (decorator);
}
static void
@@ -1106,51 +1053,32 @@ tracker_decorator_set_property (GObject *object,
}
static void
-handle_deletes (TrackerDecorator *decorator,
- GVariantIter *iter)
-{
- gint graph, subject, predicate, object;
- TrackerDecoratorPrivate *priv;
-
- priv = decorator->priv;
-
- while (g_variant_iter_loop (iter, "(iiii)",
- &graph, &subject, &predicate, &object)) {
- if (predicate == priv->rdf_type_id) {
- decorator_item_cache_remove (decorator, subject);
- decorator_blacklist_remove (decorator, subject);
- } else if (predicate == priv->nie_data_source_id &&
- object == priv->data_source_id) {
- /* If only the decorator datasource is removed,
- * re-process the file from scratch if it's not already
- * queued. We don't know its class_name_id, so we have
- * to query it first. This should be rare enough that
- * it doesn't matter to accumulate them to query in
- * batches. */
- decorator_cache_next_items (decorator);
- }
- }
-}
-
-static void
-handle_updates (TrackerDecorator *decorator,
- GVariantIter *iter)
+notifier_events_cb (TrackerDecorator *decorator,
+ GPtrArray *events,
+ TrackerNotifier *notifier)
{
- gint graph, subject, predicate, object;
- TrackerDecoratorPrivate *priv;
gboolean check_added = FALSE;
+ gint64 id;
+ gint i;
- priv = decorator->priv;
+ for (i = 0; i < events->len; i++) {
+ TrackerNotifierEvent *event;
- while (g_variant_iter_loop (iter, "(iiii)",
- &graph, &subject, &predicate, &object)) {
- /* Merely use this as a hint that there is something
- * left to be processed.
- */
- if (predicate == priv->rdf_type_id &&
- tracker_decorator_has_class_id (decorator, object)) {
+ event = g_ptr_array_index (events, i);
+ id = tracker_notifier_event_get_id (event);
+
+ switch (tracker_notifier_event_get_event_type (event)) {
+ case TRACKER_NOTIFIER_EVENT_CREATE:
+ case TRACKER_NOTIFIER_EVENT_UPDATE:
+ /* Merely use this as a hint that there is something
+ * left to be processed.
+ */
check_added = TRUE;
break;
+ case TRACKER_NOTIFIER_EVENT_DELETE:
+ decorator_item_cache_remove (decorator, id);
+ decorator_blacklist_remove (decorator, id);
+ break;
}
}
@@ -1158,62 +1086,23 @@ handle_updates (TrackerDecorator *decorator,
decorator_cache_next_items (decorator);
}
-static void
-class_signal_cb (GDBusConnection *connection,
- const gchar *sender_name,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *signal_name,
- GVariant *parameters,
- gpointer user_data)
-{
- TrackerDecorator *decorator = user_data;
- GVariantIter *iter1, *iter2;
-
- g_variant_get (parameters, "(&sa(iiii)a(iiii))", NULL, &iter1, &iter2);
- handle_deletes (decorator, iter1);
- handle_updates (decorator, iter2);
- g_variant_iter_free (iter1);
- g_variant_iter_free (iter2);
-}
-
static gboolean
tracker_decorator_initable_init (GInitable *initable,
GCancellable *cancellable,
GError **error)
{
- TrackerSparqlConnection *sparql_conn;
- TrackerDecoratorPrivate *priv;
TrackerDecorator *decorator;
- GDBusConnection *conn;
if (!parent_initable_iface->init (initable, cancellable, error))
return FALSE;
decorator = TRACKER_DECORATOR (initable);
- priv = decorator->priv;
-
- sparql_conn = tracker_miner_get_connection (TRACKER_MINER (initable));
- conn = tracker_miner_get_dbus_connection (TRACKER_MINER (initable));
if (g_cancellable_is_cancelled (cancellable))
return FALSE;
- priv->rdf_type_id = get_class_id (sparql_conn, "rdf:type", FALSE);
- priv->nie_data_source_id = get_class_id (sparql_conn, "nie:dataSource", FALSE);
- priv->data_source_id = get_class_id (sparql_conn, priv->data_source, TRUE);
- tracker_decorator_validate_class_ids (decorator);
-
- priv->graph_updated_signal_id =
- g_dbus_connection_signal_subscribe (conn,
- TRACKER_DBUS_SERVICE,
- TRACKER_DBUS_INTERFACE_RESOURCES,
- "GraphUpdated",
- TRACKER_DBUS_OBJECT_RESOURCES,
- NULL,
- G_DBUS_SIGNAL_FLAGS_NONE,
- class_signal_cb,
- initable, NULL);
+ update_notifier (decorator);
+
decorator_update_state (decorator, "Idle", FALSE);
return TRUE;
}
@@ -1241,16 +1130,11 @@ tracker_decorator_finalize (GObject *object)
{
TrackerDecoratorPrivate *priv;
TrackerDecorator *decorator;
- GDBusConnection *conn;
decorator = TRACKER_DECORATOR (object);
priv = decorator->priv;
- if (priv->graph_updated_signal_id) {
- conn = tracker_miner_get_dbus_connection (TRACKER_MINER (object));
- g_dbus_connection_signal_unsubscribe (conn,
- priv->graph_updated_signal_id);
- }
+ g_clear_object (&priv->notifier);
g_queue_foreach (&priv->item_cache,
(GFunc) tracker_decorator_info_unref,