[tracker/direct-access: 90/121] tracker-tag: Use new libtracker-sparql API



commit 939470e13a3f30824308df4ad0257e7e64ae0ccf
Author: Martyn Russell <martyn lanedo com>
Date:   Wed Jul 21 14:50:37 2010 +0100

    tracker-tag: Use new libtracker-sparql API
    
    Currently, rewind seems to not work as expected, needs more testing

 src/tracker-utils/tracker-tag.c |  451 +++++++++++++++++++++------------------
 1 files changed, 240 insertions(+), 211 deletions(-)
---
diff --git a/src/tracker-utils/tracker-tag.c b/src/tracker-utils/tracker-tag.c
index 70a6ffb..ab16bcc 100644
--- a/src/tracker-utils/tracker-tag.c
+++ b/src/tracker-utils/tracker-tag.c
@@ -27,8 +27,7 @@
 #include <glib/gi18n.h>
 #include <gio/gio.h>
 
-#include <libtracker-client/tracker-client.h>
-#include <libtracker-common/tracker-common.h>
+#include <libtracker-sparql/tracker-sparql.h>
 
 #define ABOUT	  \
 	"Tracker " PACKAGE_VERSION "\n"
@@ -269,12 +268,12 @@ get_uris (GStrv files)
 	return uris;
 }
 
-static GPtrArray *
-get_file_urns (TrackerClient *client,
-	       GStrv          uris,
-	       const gchar   *tag)
+static TrackerSparqlCursor *
+get_file_urns (TrackerSparqlConnection *connection,
+	       GStrv                    uris,
+	       const gchar             *tag)
 {
-	GPtrArray *results;
+	TrackerSparqlCursor *cursor;
 	gchar *query, *filter;
 	GError *error = NULL;
 
@@ -289,7 +288,7 @@ get_file_urns (TrackerClient *client,
 	                         tag ? "nao:hasTag ?t ; " : "",
 	                         filter);
 
-	results = tracker_resources_sparql_query (client, query, &error);
+	cursor = tracker_sparql_connection_query (connection, query, NULL, &error);
 
 	g_free (query);
 	g_free (filter);
@@ -302,77 +301,51 @@ get_file_urns (TrackerClient *client,
 		return NULL;
 	}
 
-	return results;
+	return cursor;
 }
 
 static GStrv
-result_to_strv (GPtrArray *result,
-                gint       n_col)
+result_to_strv (TrackerSparqlCursor *cursor,
+                gint                 n_col)
 {
 	GStrv strv;
-	gint i;
+	gint count, i;
 
-	if (!result || result->len == 0) {
+	if (!cursor) {
 		return NULL;
 	}
 
-	strv = g_new0 (gchar *, result->len + 1);
+        i = 0;
+        count = 0;
 
-	for (i = 0; i < result->len; i++) {
-		gchar **row;
+        /* Really no other option here, but we iterate the cursor
+         * first to get the length.
+         */
+        while (tracker_sparql_cursor_next (cursor, NULL, NULL)) {
+                count++;
+        }
+        
+	strv = g_new0 (gchar *, count + 1);
 
-		row = g_ptr_array_index (result, i);
-		strv[i] = g_strdup (row[n_col]);
+        tracker_sparql_cursor_rewind (cursor);
+
+        while (tracker_sparql_cursor_next (cursor, NULL, NULL)) {
+		const gchar *str;
+
+		str = tracker_sparql_cursor_get_string (cursor, n_col, NULL);
+		strv[i++] = g_strdup (str);
 	}
 
 	return strv;
 }
 
 static void
-get_all_tags_foreach (gpointer value,
-                      gpointer user_data)
+get_all_tags_show_tag_id (TrackerSparqlConnection *connection,
+                          const gchar             *id)
 {
-	TrackerClient *client;
+        TrackerSparqlCursor *cursor;
 	GError *error = NULL;
-	GPtrArray *results;
-	GStrv data;
-	const gchar *id;
-	const gchar *tag;
-	const gchar *description;
-	gchar *query;
-	gint files, i;
-
-	data = value;
-	client = user_data;
-
-	files = atoi (data[3]);
-	id = data[0];
-	tag = data[1];
-	description = data[2];
-
-	if (description && *description == '\0') {
-		description = NULL;
-	}
-
-	g_print ("  %s %s%s%s\n", 
-		 tag,
-		 description ? "(" : "",
-		 description ? description : "",
-		 description ? ")" : "");
-
-	g_print ("    %s\n", id);
-
-	g_print ("    ");
-	g_print (g_dngettext (NULL,
-	                      "%d file",
-	                      "%d files",
-	                      files),
-	         files);
-	g_print ("\n");
-
-	if (!client || files < 1) {
-		return;
-	}
+        gchar *query;
 
 	/* Get files associated */
 	query = g_strdup_printf ("SELECT ?uri WHERE {"
@@ -382,38 +355,40 @@ get_all_tags_foreach (gpointer value,
 	                         "}",
 	                         id);
 
-	results = tracker_resources_sparql_query (client, query, &error);
+	cursor = tracker_sparql_connection_query (connection, query, NULL, &error);
 	g_free (query);
 
 	if (error) {
-		g_print ("    %s, %s\n",
-		         _("Could not get files related to tag"),
-		         error->message);
+		g_printerr ("    %s, %s\n",
+                            _("Could not get files related to tag"),
+                            error->message);
 		g_error_free (error);
 		return;
 	}
 
-	for (i = 0; i < results->len; i++) {
-		GStrv files;
+        if (!cursor) {
+                g_print ("    %s\n", _("None"));
+                return;
+        }
+
 
-		files = g_ptr_array_index (results, i);
-		g_print ("    %s\n", files[0]);
-		g_strfreev (files);
+        while (tracker_sparql_cursor_next (cursor, NULL, NULL)) {
+		g_print ("    %s\n", tracker_sparql_cursor_get_string (cursor, 0, NULL));
 	}
 
-	g_ptr_array_free (results, TRUE);
+        g_object_unref (cursor);
 }
 
 static gboolean
-get_all_tags (TrackerClient *client,
-              GStrv          files,
-              gint           search_offset,
-              gint           search_limit,
-              gboolean       use_or_operator,
-              gboolean       show_files)
+get_all_tags (TrackerSparqlConnection *connection,
+              GStrv                    files,
+              gint                     search_offset,
+              gint                     search_limit,
+              gboolean                 use_or_operator,
+              gboolean                 show_files)
 {
+        TrackerSparqlCursor *cursor;
 	GError *error = NULL;
-	GPtrArray *results;
 	gchar *fts;
 	gchar *query;
 
@@ -455,7 +430,7 @@ get_all_tags (TrackerClient *client,
 
 	g_free (fts);
 
-	results = tracker_resources_sparql_query (client, query, &error);
+	cursor = tracker_sparql_connection_query (connection, query, NULL, &error);
 	g_free (query);
 
 	if (error) {
@@ -467,55 +442,97 @@ get_all_tags (TrackerClient *client,
 		return FALSE;
 	}
 
-	if (!results) {
+	if (!cursor) {
 		g_print ("%s\n",
 		         _("No tags were found"));
 	} else {
-		g_print (g_dngettext (NULL,
-		                      "Tag: %d (shown by name)",
-		                      "Tags: %d (shown by name)",
-		                      results->len),
-		         results->len);
-		g_print ("\n");
+                gint count = 0;
+
+                g_print ("%s:\n", _("Tags (shown by name)"));
+
+		while (tracker_sparql_cursor_next (cursor, NULL, NULL)) {
+                        const gchar *id;
+                        const gchar *tag;
+                        const gchar *description;
+                        const gchar *files;
+                        gint n_files = 0;
+
+                        id = tracker_sparql_cursor_get_string (cursor, 0, NULL);
+                        files = tracker_sparql_cursor_get_string (cursor, 3, NULL);
+                        n_files = atoi (files);
+
+                        tag = tracker_sparql_cursor_get_string (cursor, 1, NULL);
+                        description = tracker_sparql_cursor_get_string (cursor, 2, NULL);
+
+                        if (description && *description == '\0') {
+                                description = NULL;
+                        }
+
+                        g_print ("  %s %s%s%s\n", 
+                                 tag,
+                                 description ? "(" : "",
+                                 description ? description : "",
+                                 description ? ")" : "");
+
+                        if (show_files && n_files > 0) {
+                                get_all_tags_show_tag_id (connection, id);
+                        } else {
+                                g_print ("    %s\n", id);
+                                g_print ("    ");
+                                g_print (g_dngettext (NULL,
+                                                      "%d file",
+                                                      "%d files",
+                                                      n_files),
+                                         n_files);
+                                g_print ("\n");
+                        }
+
+			count++;
+		}
 
-		g_ptr_array_foreach (results,
-		                     get_all_tags_foreach,
-		                     show_files ? client : NULL);
+                if (count == 0) {
+                        g_print ("  %s\n", _("None"));
+                }
+
+		g_print ("\n");
 
-		if (results->len >= search_limit) {
+		if (count >= search_limit) {
 			show_limit_warning ();
 		}
 
-		g_ptr_array_foreach (results, (GFunc) g_strfreev, NULL);
-		g_ptr_array_free (results, TRUE);
+		g_object_unref (cursor);
 	}
 
 	return TRUE;
 }
 
 static void
-print_file_report (GPtrArray   *urns,
-                   GStrv        uris,
-                   const gchar *found_msg,
-                   const gchar *not_found_msg)
+print_file_report (TrackerSparqlCursor *cursor,
+                   GStrv                uris,
+                   const gchar         *found_msg,
+                   const gchar         *not_found_msg)
 {
-	gint i, j;
+        gint i;
 
-	if (!urns || !uris) {
-		g_print ("  No files were modified.\n");
+	if (!cursor || !uris) {
+		g_print ("  %s\n", _("No files were modified"));
 		return;
 	}
 
 	for (i = 0; uris[i]; i++) {
 		gboolean found = FALSE;
 
-		for (j = 0; j < urns->len; j++) {
-			gchar **row;
+                g_print ("*** checking uri:'%s' and rewinding cursor\n", uris[i]);
 
-			row = g_ptr_array_index (urns, j);
+                while (tracker_sparql_cursor_next (cursor, NULL, NULL)) {
+			const gchar *str;
 
-			if (g_strcmp0 (row[1], uris[i]) == 0) {
+			str = tracker_sparql_cursor_get_string (cursor, 1, NULL);
+                        g_print ("***   comparing to str:'%s'\n", str);
+
+			if (g_strcmp0 (str, uris[i]) == 0) {
 				found = TRUE;
+                                g_print ("***   FOUND FOUND FOUND!\n");
 				break;
 			}
 		}
@@ -523,16 +540,18 @@ print_file_report (GPtrArray   *urns,
 		g_print ("  %s: %s\n",
 		         found ? found_msg : not_found_msg,
 		         uris[i]);
+
+                tracker_sparql_cursor_rewind (cursor);
 	}
 }
 
 static gboolean
-add_tag_for_urns (TrackerClient *client,
-                  GStrv          files,
-                  const gchar   *tag,
-		  const gchar   *description)
+add_tag_for_urns (TrackerSparqlConnection *connection,
+                  GStrv                    files,
+                  const gchar             *tag,
+		  const gchar             *description)
 {
-	GPtrArray *urns = NULL;
+	TrackerSparqlCursor *cursor;
 	GError *error = NULL;
 	GStrv  uris;
 	gchar *tag_escaped;
@@ -578,7 +597,7 @@ add_tag_for_urns (TrackerClient *client,
 					 tag_escaped);
 	}
 
-	tracker_resources_sparql_update (client, query, &error);
+	tracker_sparql_connection_update (connection, query, NULL, &error);
 	g_free (query);
 
 	if (error) {
@@ -602,54 +621,52 @@ add_tag_for_urns (TrackerClient *client,
 		return TRUE;
 	}
 
-	urns = get_file_urns (client, uris, NULL);
+	cursor = get_file_urns (connection, uris, NULL);
 
 	/* First we check if the tag is already set and only add if it
 	 * is, then we add the urns specified to the new tag.
 	 */
-	if (urns && urns->len > 0) {
-		GStrv urns_strv;
-		gchar *filter;
-
-		urns_strv = result_to_strv (urns, 0);
-		filter = get_filter_string (urns_strv, TRUE, NULL);
-
-		/* Add tag to specific urns */
-		query = g_strdup_printf ("INSERT { "
-		                         "  ?urn nao:hasTag ?id "
-		                         "} "
-		                         "WHERE {"
-		                         "  ?urn nie:url ?f ."
-		                         "  ?id nao:prefLabel %s "
-		                         "  %s "
-		                         "}",
-		                         tag_escaped,
-		                         filter);
-
-		tracker_resources_sparql_update (client, query, &error);
-		g_strfreev (urns_strv);
-		g_free (filter);
-		g_free (query);
-
-		if (error) {
-			g_printerr ("%s, %s\n",
-			            _("Could not add tag to files"),
-			            error->message);
-			g_error_free (error);
-			g_free (tag_escaped);
-
-			return FALSE;
-		}
-	}
+        if (cursor) {
+                GStrv urns_strv;
+                gchar *filter;
+
+                urns_strv = result_to_strv (cursor, 0);
+                filter = get_filter_string (urns_strv, TRUE, NULL);
+
+                /* Add tag to specific urns */
+                query = g_strdup_printf ("INSERT { "
+                                         "  ?urn nao:hasTag ?id "
+                                         "} "
+                                         "WHERE {"
+                                         "  ?urn nie:url ?f ."
+                                         "  ?id nao:prefLabel %s "
+                                         "  %s "
+                                         "}",
+                                         tag_escaped,
+                                         filter);
+
+                tracker_sparql_connection_update (connection, query, NULL, &error);
+                g_strfreev (urns_strv);
+                g_free (filter);
+                g_free (query);
+
+                if (error) {
+                        g_printerr ("%s, %s\n",
+                                    _("Could not add tag to files"),
+                                    error->message);
+                        g_error_free (error);
+                        g_free (tag_escaped);
+                        g_object_unref (cursor);
+
+                        return FALSE;
+                }
 
-	if (urns) {
-		print_file_report (urns, uris,
-		                   _("Tagged"),
-		                   _("Not tagged, file is not indexed"));
+                print_file_report (cursor, uris,
+                                   _("Tagged"),
+                                   _("Not tagged, file is not indexed"));
 
-		g_ptr_array_foreach (urns, (GFunc) g_strfreev, NULL);
-		g_ptr_array_free (urns, TRUE);
-	}
+                g_object_unref (cursor);
+        }
 
 	g_strfreev (uris);
 	g_free (tag_escaped);
@@ -658,11 +675,11 @@ add_tag_for_urns (TrackerClient *client,
 }
 
 static gboolean
-remove_tag_for_urns (TrackerClient *client,
-                     GStrv          files,
-                     const gchar   *tag)
+remove_tag_for_urns (TrackerSparqlConnection *connection,
+                     GStrv                    files,
+                     const gchar             *tag)
 {
-	GPtrArray *urns = NULL;
+	TrackerSparqlCursor *urns_cursor = NULL;
 	GError *error = NULL;
 	gchar *tag_escaped;
 	gchar *query;
@@ -672,7 +689,7 @@ remove_tag_for_urns (TrackerClient *client,
 	uris = get_uris (files);
 
 	if (uris && *uris) {
-		GPtrArray *results;
+		TrackerSparqlCursor *tag_cursor;
 		gchar *filter;
 		const gchar *urn;
 		GStrv urns_strv;
@@ -685,7 +702,7 @@ remove_tag_for_urns (TrackerClient *client,
 		                         "}",
 		                         tag_escaped);
 
-		results = tracker_resources_sparql_query (client, query, &error);
+		tag_cursor = tracker_sparql_connection_query (connection, query, NULL, &error);
 		g_free (query);
 
 		if (error) {
@@ -699,31 +716,41 @@ remove_tag_for_urns (TrackerClient *client,
 			return FALSE;
 		}
 
-		if (!results || !results->pdata || !results->pdata[0]) {
+		if (!tag_cursor || !tracker_sparql_cursor_next (tag_cursor, NULL, NULL)) {
 			g_print ("%s\n",
 			         _("No tags were found by that name"));
 
 			g_free (tag_escaped);
 			g_strfreev (uris);
 
+                        if (tag_cursor) {
+                                g_object_unref (tag_cursor);
+                        }
+
 			return TRUE;
 		}
 
-		urn = * (GStrv) results->pdata[0];
-		urns = get_file_urns (client, uris, urn);
+                urn = tracker_sparql_cursor_get_string (tag_cursor, 0, NULL);
+                urns_cursor = get_file_urns (connection, uris, urn);
 
-		if (!urns || urns->len == 0) {
+		if (!urns_cursor || !tracker_sparql_cursor_next (urns_cursor, NULL, NULL)) {
 			g_print ("%s\n",
 			         _("None of the files had this tag set"));
 
 			g_strfreev (uris);
 			g_free (tag_escaped);
+                        g_object_unref (tag_cursor);
+
+                        if (urns_cursor) {
+                                g_object_unref (urns_cursor);
+                        }
 
 			return TRUE;
 		}
 
-		urns_strv = result_to_strv (urns, 0);
+		urns_strv = result_to_strv (urns_cursor, 0);
 		filter = get_filter_string (urns_strv, TRUE, urn);
+		g_strfreev (urns_strv);
 
 		query = g_strdup_printf ("DELETE { "
 		                         "  ?urn nao:hasTag ?t "
@@ -734,10 +761,8 @@ remove_tag_for_urns (TrackerClient *client,
 		                         "}",
 		                         filter);
 		g_free (filter);
-		g_strfreev (urns_strv);
 
-		g_ptr_array_foreach (results, (GFunc) g_strfreev, NULL);
-		g_ptr_array_free (results, TRUE);
+                g_object_unref (tag_cursor);
 	} else {
 		/* Remove tag completely */
 		query = g_strdup_printf ("DELETE { "
@@ -751,7 +776,7 @@ remove_tag_for_urns (TrackerClient *client,
 
 	g_free (tag_escaped);
 
-	tracker_resources_sparql_update (client, query, &error);
+	tracker_sparql_connection_update (connection, query, NULL, &error);
 	g_free (query);
 
 	if (error) {
@@ -759,7 +784,6 @@ remove_tag_for_urns (TrackerClient *client,
 		            _("Could not remove tag"),
 		            error->message);
 		g_error_free (error);
-		g_strfreev (uris);
 
 		return FALSE;
 	}
@@ -767,35 +791,24 @@ remove_tag_for_urns (TrackerClient *client,
 	g_print ("%s\n",
 	         _("Tag was removed successfully"));
 
-	if (urns) {
-		print_file_report (urns, uris,
-		                   _("Untagged"),
-		                   _("File not indexed or already untagged"));
+        if (urns_cursor) {
+                print_file_report (urns_cursor, uris,
+                                   _("Untagged"),
+                                   _("File not indexed or already untagged"));
+                g_object_unref (urns_cursor);
+        }
 
-		g_ptr_array_foreach (urns, (GFunc) g_strfreev, NULL);
-		g_ptr_array_free (urns, TRUE);
-	}
-
-	g_strfreev (uris);
+        g_strfreev (uris);
 
 	return TRUE;
 }
 
-static void
-get_tags_by_file_foreach (gpointer value,
-                          gpointer user_data)
-{
-	GStrv data = value;
-
-	g_print ("  %s\n", data[1]);
-}
-
 static gboolean
-get_tags_by_file (TrackerClient *client,
-                  const gchar   *uri)
+get_tags_by_file (TrackerSparqlConnection *connection,
+                  const gchar             *uri)
 {
+        TrackerSparqlCursor *cursor;
 	GError *error = NULL;
-	GPtrArray *results;
 	gchar *query;
 
 	query = g_strdup_printf ("SELECT ?tags ?labels "
@@ -808,7 +821,7 @@ get_tags_by_file (TrackerClient *client,
 	                         "ORDER BY ASC(?labels)",
 	                         uri);
 
-	results = tracker_resources_sparql_query (client, query, &error);
+	cursor = tracker_sparql_connection_query (connection, query, NULL, &error);
 	g_free (query);
 
 	if (error) {
@@ -820,16 +833,24 @@ get_tags_by_file (TrackerClient *client,
 		return FALSE;
 	}
 
-	if (!results || results->len < 1) {
+	if (!cursor) {
 		g_print ("  %s\n",
 		         _("No tags were found"));
 	} else {
-		g_ptr_array_foreach (results,
-		                     get_tags_by_file_foreach,
-		                     NULL);
+                gint count = 0;
 
-		g_ptr_array_foreach (results, (GFunc) g_strfreev, NULL);
-		g_ptr_array_free (results, TRUE);
+		while (tracker_sparql_cursor_next (cursor, NULL, NULL)) {
+                        g_print ("  %s\n", tracker_sparql_cursor_get_string (cursor, 1, NULL));
+                        count++;
+		}
+
+                if (count == 0) {
+                        g_print ("  %s\n", _("None"));
+                }
+
+		g_print ("\n");
+
+		g_object_unref (cursor);
 	}
 
 	return TRUE;
@@ -838,9 +859,10 @@ get_tags_by_file (TrackerClient *client,
 int
 main (int argc, char **argv)
 {
-	TrackerClient   *client;
-	GOptionContext  *context;
-	const gchar     *failed = NULL;
+	TrackerSparqlConnection *connection;
+	GOptionContext *context;
+        GError *error = NULL;
+	const gchar *failed = NULL;
 
 	setlocale (LC_ALL, "");
 
@@ -891,19 +913,27 @@ main (int argc, char **argv)
 
 	g_option_context_free (context);
 
-	client = tracker_client_new (0, G_MAXINT);
+	g_type_init ();
+
+	if (!g_thread_supported ()) {
+		g_thread_init (NULL);
+	}
+
+	connection = tracker_sparql_connection_get (&error);
 
-	if (!client) {
-		g_printerr ("%s\n",
-		            _("Could not establish a D-Bus connection to Tracker"));
+	if (!connection) {
+		g_printerr ("%s: %s\n",
+		            _("Could not establish a connection to Tracker"),
+		            error ? error->message : _("No error given"));
+		g_clear_error (&error);
 		return EXIT_FAILURE;
 	}
 
 	if (list) {
 		gboolean success;
 
-		success = get_all_tags (client, files, offset, limit, or_operator, show_files);
-		g_object_unref (client);
+		success = get_all_tags (connection, files, offset, limit, or_operator, show_files);
+		g_object_unref (connection);
 
 		return success ? EXIT_SUCCESS : EXIT_FAILURE;
 	}
@@ -911,8 +941,8 @@ main (int argc, char **argv)
 	if (add_tag) {
 		gboolean success;
 
-		success = add_tag_for_urns (client, files, add_tag, description);
-		g_object_unref (client);
+		success = add_tag_for_urns (connection, files, add_tag, description);
+		g_object_unref (connection);
 
 		return success ? EXIT_SUCCESS : EXIT_FAILURE;
 	}
@@ -920,8 +950,8 @@ main (int argc, char **argv)
 	if (remove_tag) {
 		gboolean success;
 
-		success = remove_tag_for_urns (client, files, remove_tag);
-		g_object_unref (client);
+		success = remove_tag_for_urns (connection, files, remove_tag);
+		g_object_unref (connection);
 
 		return success ? EXIT_SUCCESS : EXIT_FAILURE;
 	}
@@ -939,18 +969,17 @@ main (int argc, char **argv)
 			g_object_unref (file);
 
 			g_print ("%s\n", uri);
-			success &= get_tags_by_file (client, uri);
-			g_print ("\n");
+			success &= get_tags_by_file (connection, uri);
 
 			g_free (uri);
 		}
 
-		g_object_unref (client);
+		g_object_unref (connection);
 
 		return success ? EXIT_SUCCESS : EXIT_FAILURE;
 	}
 
-	g_object_unref (client);
+	g_object_unref (connection);
 
 	/* This is a failure because we should have done something.
 	 * This code should never be reached in practise.



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