[tracker] rss: Handle mfo:FeedChannel deletes



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]