[tracker] rss: Handle mfo:FeedChannel deletes
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker] rss: Handle mfo:FeedChannel deletes
- Date: Thu, 16 Jul 2015 22:32:34 +0000 (UTC)
commit e72a3a8ee676affbd4509e8e589884335d883c64
Author: Carlos Garnacho <carlosg gnome org>
Date: Fri Jul 17 00:27:59 2015 +0200
rss: Handle mfo:FeedChannel deletes
If we receive a delete for one of those, we'll delete all feed messages
associated with it.
src/miners/rss/tracker-miner-rss.c | 109 ++++++++++++++++++++++++++++++++++++
1 files changed, 109 insertions(+), 0 deletions(-)
---
diff --git a/src/miners/rss/tracker-miner-rss.c b/src/miners/rss/tracker-miner-rss.c
index 4a185b2..5b665fb 100644
--- a/src/miners/rss/tracker-miner-rss.c
+++ b/src/miners/rss/tracker-miner-rss.c
@@ -218,6 +218,114 @@ tracker_miner_rss_init (TrackerMinerRSS *object)
}
static void
+query_deleted_feed_messages_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ TrackerSparqlConnection *connection;
+ TrackerSparqlCursor *cursor;
+ GError *error = NULL;
+ const gchar *urn;
+ GString *query;
+
+ connection = TRACKER_SPARQL_CONNECTION (source_object);
+ cursor = tracker_sparql_connection_query_finish (connection, res, &error);
+
+ if (error != NULL) {
+ g_message ("Could not query messages to delete: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ query = g_string_new (NULL);
+
+ while (tracker_sparql_cursor_next (cursor, NULL, &error)) {
+ urn = tracker_sparql_cursor_get_string (cursor, 0, NULL);
+ g_string_append_printf (query,
+ "DELETE { <%s> ?p ?o }"
+ "WHERE { <%s> ?p ?o }\n",
+ urn, urn);
+ }
+
+ g_object_unref (cursor);
+
+ if (error) {
+ g_message ("Could not iterate messages to be deleted: %s",
+ error->message);
+ g_string_free (query, TRUE);
+ g_error_free (error);
+ return;
+ }
+
+ tracker_sparql_connection_update_async (connection, query->str,
+ G_PRIORITY_DEFAULT,
+ NULL, NULL, NULL);
+ g_string_free (query, TRUE);
+}
+
+static void
+delete_feed_messages (TrackerMinerRSS *miner,
+ GArray *channel_ids)
+{
+ GString *query, *ids_str;
+ gint i, id;
+
+ ids_str = g_string_new (NULL);
+ query = g_string_new (NULL);
+
+ for (i = 0; i < channel_ids->len; i++) {
+ id = g_array_index (channel_ids, gint, i);
+ if (i != 0)
+ g_string_append (ids_str, ",");
+ g_string_append_printf (ids_str, "%d", id);
+ }
+
+ g_string_append_printf (query,
+ "SELECT ?urn {"
+ " {"
+ " ?urn a mfo:FeedMessage ;"
+ " nmo:communicationChannel ?chan ."
+ " FILTER (tracker:id (?chan) IN (%s))"
+ " } UNION {"
+ " ?urn a rdfs:Resource ."
+ " FILTER (tracker:id (?urn) IN (%s))"
+ " }"
+ "}", ids_str->str, ids_str->str);
+
+ tracker_sparql_connection_query_async (tracker_miner_get_connection (TRACKER_MINER (miner)),
+ query->str,
+ NULL,
+ query_deleted_feed_messages_cb,
+ miner);
+ g_string_free (ids_str, TRUE);
+ g_string_free (query, TRUE);
+}
+
+static void
+handle_deletes (TrackerMinerRSS *miner,
+ GVariantIter *iter)
+{
+ GArray *deleted = g_array_new (FALSE, FALSE, sizeof (gint));
+ gint graph, subject, pred, object;
+ TrackerMinerRSSPrivate *priv;
+
+ priv = TRACKER_MINER_RSS_GET_PRIVATE (miner);
+
+ while (g_variant_iter_next (iter, "(iiii)",
+ &graph, &subject, &pred, &object)) {
+ if (pred == priv->rdf_type_id &&
+ object == priv->mfo_feed_channel_id) {
+ g_array_append_val (deleted, subject);
+ }
+ }
+
+ if (deleted->len > 0)
+ delete_feed_messages (miner, deleted);
+
+ g_array_free (deleted, TRUE);
+}
+
+static void
handle_updates (TrackerMinerRSS *miner,
GVariantIter *iter)
{
@@ -254,6 +362,7 @@ graph_updated_cb (GDBusConnection *connection,
GVariantIter *deletes, *updates;
g_variant_get (parameters, "(&sa(iiii)a(iiii))", NULL, &deletes, &updates);
+ handle_deletes (miner, deletes);
handle_updates (miner, updates);
g_variant_iter_free (deletes);
g_variant_iter_free (updates);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]