[tracker/anonymous-file-nodes] Fixed the tracker-writeback function to cope with anonymous blank nodes



commit 61d262acfb406b368447f721008808fb8303269a
Author: Philip Van Hoof <philip codeminded be>
Date:   Wed Jan 27 17:51:30 2010 +0100

    Fixed the tracker-writeback function to cope with anonymous blank nodes
    
    Files now have an anonymous blank node as subject, this means that the subject
    no longer is the same as nie:url. This commit fixes this situation.

 src/tracker-writeback/tracker-writeback-consumer.c |   92 ++++++++++++---
 src/tracker-writeback/tracker-writeback-mp3.c      |    4 +-
 src/tracker-writeback/tracker-writeback-playlist.c |    2 +-
 src/tracker-writeback/tracker-writeback-xmp.c      |  122 ++++++++++----------
 4 files changed, 137 insertions(+), 83 deletions(-)
---
diff --git a/src/tracker-writeback/tracker-writeback-consumer.c b/src/tracker-writeback/tracker-writeback-consumer.c
index 98c86ee..03c1b17 100644
--- a/src/tracker-writeback/tracker-writeback-consumer.c
+++ b/src/tracker-writeback/tracker-writeback-consumer.c
@@ -50,6 +50,13 @@ typedef struct {
 	guint state;
 } TrackerWritebackConsumerPrivate;
 
+typedef struct {
+	TrackerWritebackConsumerPrivate *priv;
+	TrackerWritebackConsumer *consumer;
+	QueryData *data;
+} ContData;
+
+
 enum {
 	STATE_IDLE,
 	STATE_PROCESSING
@@ -157,19 +164,31 @@ sparql_rdf_types_match (const gchar * const *module_types,
 }
 
 static void
-sparql_query_cb (GPtrArray *result,
-                 GError    *error,
-                 gpointer   user_data)
+end_consumer (TrackerWritebackConsumer *consumer, 
+              QueryData *data)
 {
 	TrackerWritebackConsumerPrivate *priv;
-	TrackerWritebackConsumer *consumer;
-	QueryData *data;
 
-	consumer = TRACKER_WRITEBACK_CONSUMER (user_data);
 	priv = TRACKER_WRITEBACK_CONSUMER_GET_PRIVATE (consumer);
-	data = g_queue_pop_head (priv->process_queue);
 
-	if (result && result->len > 0) {
+	g_free (data->subject);
+	g_strfreev (data->rdf_types);
+	g_slice_free (QueryData, data);
+
+	priv->idle_id = g_idle_add (process_queue_cb, consumer);
+}
+
+static void
+sparql_query_cb (GPtrArray *result,
+                 GError    *error,
+                 gpointer   user_data)
+{
+	ContData *cont_data = user_data;
+	TrackerWritebackConsumerPrivate *priv = cont_data->priv;
+	TrackerWritebackConsumer *consumer = cont_data->consumer;
+	QueryData *data = cont_data->data;
+
+	if (!error && result && result->len > 0) {
 		GHashTableIter iter;
 		gpointer key, value;
 		GStrv rdf_types;
@@ -201,11 +220,52 @@ sparql_query_cb (GPtrArray *result,
 		g_message ("  No files qualify for updates");
 	}
 
-	g_free (data->subject);
-	g_strfreev (data->rdf_types);
-	g_slice_free (QueryData, data);
+	end_consumer (consumer, data);
 
-	priv->idle_id = g_idle_add (process_queue_cb, consumer);
+	g_object_unref (cont_data->consumer);
+	g_slice_free (ContData, cont_data);
+}
+
+static void
+get_url_cb (GPtrArray *result,
+            GError    *error,
+            gpointer   user_data)
+{
+	TrackerWritebackConsumerPrivate *priv;
+	TrackerWritebackConsumer *consumer;
+	QueryData *data;
+
+	consumer = TRACKER_WRITEBACK_CONSUMER (user_data);
+	priv = TRACKER_WRITEBACK_CONSUMER_GET_PRIVATE (consumer);
+	data = g_queue_pop_head (priv->process_queue);
+
+	if (!error && result && result->len > 0) {
+		GStrv row = g_ptr_array_index (result, 0);
+
+		if (row && row[0]) {
+			const gchar *url = row[0];
+			gchar *query;
+			ContData *cont_data = g_slice_new (ContData);
+
+			cont_data->priv = priv;
+			cont_data->consumer = g_object_ref (consumer);
+			cont_data->data = data;
+
+			query = g_strdup_printf ("SELECT '%s' '%s' ?predicate ?object {"
+			                         "  <%s> ?predicate ?object ."
+			                         "  ?predicate tracker:writeback true "
+			                         "}", url, data->subject, data->subject);
+
+			tracker_resources_sparql_query_async (priv->client,
+			                                      query,
+			                                      sparql_query_cb,
+			                                      cont_data);
+
+			g_free (query);
+		}
+	} else {
+		end_consumer (consumer, data);
+	}
 }
 
 static gboolean
@@ -230,16 +290,12 @@ process_queue_cb (gpointer user_data)
 	/* We use IE = DO, so we can optimize using nie:isStoredAs instead of
 	 * nie:url here. Please change this when we change that decision. */
 
-	query = g_strdup_printf ("SELECT ?url ?predicate ?object {"
-	                         "  <%s> ?predicate ?object ;"
-	                         "  nie:isStoredAs ?url ."
-	                         "  ?predicate tracker:writeback true "
-	                         "}",
+	query = g_strdup_printf ("SELECT ?url { <%s> nie:url ?url }",
 	                         data->subject);
 
 	tracker_resources_sparql_query_async (priv->client,
 	                                      query,
-	                                      sparql_query_cb,
+	                                      get_url_cb,
 	                                      consumer);
 
 	g_free (query);
diff --git a/src/tracker-writeback/tracker-writeback-mp3.c b/src/tracker-writeback/tracker-writeback-mp3.c
index 53cdf5f..f37b67c 100644
--- a/src/tracker-writeback/tracker-writeback-mp3.c
+++ b/src/tracker-writeback/tracker-writeback-mp3.c
@@ -106,13 +106,13 @@ writeback_mp3_update_file_metadata (TrackerWritebackFile *writeback_file,
 				ID3Field *field;
 
 				field = ID3Frame_GetField (frame, ID3FN_TEXT);
-				ID3Field_SetASCII (field, row[2]);
+				ID3Field_SetASCII (field, row[3]);
 			} else {
 				ID3Field *field;
 
 				frame = ID3Frame_NewID (ID3FID_TITLE);
 				field = ID3Frame_GetField (frame, ID3FN_TEXT);
-				ID3Field_SetASCII (field, row[2]);
+				ID3Field_SetASCII (field, row[3]);
 				ID3Tag_AddFrame (tag, frame);
 			}
 
diff --git a/src/tracker-writeback/tracker-writeback-playlist.c b/src/tracker-writeback/tracker-writeback-playlist.c
index bac238b..5088843 100644
--- a/src/tracker-writeback/tracker-writeback-playlist.c
+++ b/src/tracker-writeback/tracker-writeback-playlist.c
@@ -221,7 +221,7 @@ writeback_playlist_update_file_metadata (TrackerWritebackFile *writeback_file,
 
 	for (n = 0; n < values->len; n++) {
 		const GStrv row = g_ptr_array_index (values, n);
-		if (g_strcmp0 (row[1], TRACKER_NFO_PREFIX "entryCounter") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NFO_PREFIX "entryCounter") == 0) {
 			rewrite_playlist (client, file, row[0]);
 			break;
 		}
diff --git a/src/tracker-writeback/tracker-writeback-xmp.c b/src/tracker-writeback/tracker-writeback-xmp.c
index a023503..3bea8b0 100644
--- a/src/tracker-writeback/tracker-writeback-xmp.c
+++ b/src/tracker-writeback/tracker-writeback-xmp.c
@@ -143,21 +143,21 @@ writeback_xmp_update_file_metadata (TrackerWritebackFile *wbf,
 	for (n = 0; n < values->len; n++) {
 		const GStrv row = g_ptr_array_index (values, n);
 
-		if (g_strcmp0 (row[1], TRACKER_NIE_PREFIX "title") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NIE_PREFIX "title") == 0) {
 			xmp_delete_property (xmp, NS_EXIF, "Title");
-			xmp_set_property (xmp, NS_EXIF, "Title", row[2], 0);
+			xmp_set_property (xmp, NS_EXIF, "Title", row[3], 0);
 			xmp_delete_property (xmp, NS_DC, "title");
-			xmp_set_property (xmp, NS_DC, "title", row[2], 0);
+			xmp_set_property (xmp, NS_DC, "title", row[3], 0);
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NCO_PREFIX "creator") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NCO_PREFIX "creator") == 0) {
 			GPtrArray *name_array;
 			GError *error = NULL;
 			gchar *query;
 
 			query = g_strdup_printf ("SELECT ?fullname { "
 			                         "  <%s> nco:fullname ?fullname "
-			                         "}", row[2]);
+			                         "}", row[3]);
 
 			name_array = tracker_resources_sparql_query (client, query, &error);
 
@@ -182,14 +182,14 @@ writeback_xmp_update_file_metadata (TrackerWritebackFile *wbf,
 			g_clear_error (&error);
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NCO_PREFIX "contributor") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NCO_PREFIX "contributor") == 0) {
 			GPtrArray *name_array;
 			GError *error = NULL;
 			gchar *query;
 
 			query = g_strdup_printf ("SELECT ?fullname { "
 			                         "  <%s> nco:fullname ?fullname "
-			                         "}", row[2]);
+			                         "}", row[3]);
 
 			name_array = tracker_resources_sparql_query (client, query, &error);
 
@@ -214,58 +214,58 @@ writeback_xmp_update_file_metadata (TrackerWritebackFile *wbf,
 			g_clear_error (&error);
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NIE_PREFIX "description") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NIE_PREFIX "description") == 0) {
 			xmp_delete_property (xmp, NS_DC, "description");
-			xmp_set_property (xmp, NS_DC, "description", row[2], 0);
+			xmp_set_property (xmp, NS_DC, "description", row[3], 0);
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NIE_PREFIX "copyright") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NIE_PREFIX "copyright") == 0) {
 			xmp_delete_property (xmp, NS_EXIF, "Copyright");
-			xmp_set_property (xmp, NS_EXIF, "Copyright", row[2], 0);
+			xmp_set_property (xmp, NS_EXIF, "Copyright", row[3], 0);
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NIE_PREFIX "comment") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NIE_PREFIX "comment") == 0) {
 			xmp_delete_property (xmp, NS_EXIF, "UserComment");
-			xmp_set_property (xmp, NS_EXIF, "UserComment", row[2], 0);
+			xmp_set_property (xmp, NS_EXIF, "UserComment", row[3], 0);
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NIE_PREFIX "keyword") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NIE_PREFIX "keyword") == 0) {
 			if (!keywords) {
-				keywords = g_string_new (row[2]);
+				keywords = g_string_new (row[3]);
 			} else {
-				g_string_append_printf (keywords, ", %s", row[2]);
+				g_string_append_printf (keywords, ", %s", row[3]);
 			}
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NIE_PREFIX "contentCreated") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NIE_PREFIX "contentCreated") == 0) {
 			xmp_delete_property (xmp, NS_EXIF, "Date");
-			xmp_set_property (xmp, NS_EXIF, "Date", row[2], 0);
+			xmp_set_property (xmp, NS_EXIF, "Date", row[3], 0);
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NFO_PREFIX "orientation") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NFO_PREFIX "orientation") == 0) {
 
 			xmp_delete_property (xmp, NS_EXIF, "Orientation");
 
-			if        (g_strcmp0 (row[2], TRACKER_NFO_PREFIX "orientation-top") == 0) {
+			if        (g_strcmp0 (row[3], TRACKER_NFO_PREFIX "orientation-top") == 0) {
 				xmp_set_property (xmp, NS_EXIF, "Orientation", "top - left", 0);
-			} else if (g_strcmp0 (row[2], TRACKER_NFO_PREFIX "orientation-top-mirror") == 0) {
+			} else if (g_strcmp0 (row[3], TRACKER_NFO_PREFIX "orientation-top-mirror") == 0) {
 				xmp_set_property (xmp, NS_EXIF, "Orientation", "top - right", 0);
-			} else if (g_strcmp0 (row[2], TRACKER_NFO_PREFIX "orientation-bottom") == 0) {
+			} else if (g_strcmp0 (row[3], TRACKER_NFO_PREFIX "orientation-bottom") == 0) {
 				xmp_set_property (xmp, NS_EXIF, "Orientation", "bottom - right", 0);
-			} else if (g_strcmp0 (row[2], TRACKER_NFO_PREFIX "orientation-bottom-mirror") == 0) {
+			} else if (g_strcmp0 (row[3], TRACKER_NFO_PREFIX "orientation-bottom-mirror") == 0) {
 				xmp_set_property (xmp, NS_EXIF, "Orientation", "bottom - left", 0);
-			} else if (g_strcmp0 (row[2], TRACKER_NFO_PREFIX "orientation-left-mirror") == 0) {
+			} else if (g_strcmp0 (row[3], TRACKER_NFO_PREFIX "orientation-left-mirror") == 0) {
 				xmp_set_property (xmp, NS_EXIF, "Orientation", "left - top", 0);
-			} else if (g_strcmp0 (row[2], TRACKER_NFO_PREFIX "orientation-right") == 0) {
+			} else if (g_strcmp0 (row[3], TRACKER_NFO_PREFIX "orientation-right") == 0) {
 				xmp_set_property (xmp, NS_EXIF, "Orientation", "right - top", 0);
-			} else if (g_strcmp0 (row[2], TRACKER_NFO_PREFIX "orientation-right-mirror") == 0) {
+			} else if (g_strcmp0 (row[3], TRACKER_NFO_PREFIX "orientation-right-mirror") == 0) {
 					xmp_set_property (xmp, NS_EXIF, "Orientation", "right - bottom", 0);
-			} else if (g_strcmp0 (row[2], TRACKER_NFO_PREFIX "orientation-left") == 0) {
+			} else if (g_strcmp0 (row[3], TRACKER_NFO_PREFIX "orientation-left") == 0) {
 				xmp_set_property (xmp, NS_EXIF, "Orientation", "left - bottom", 0);
 			}
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NMM_PREFIX "meteringMode") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "meteringMode") == 0) {
 
 			xmp_delete_property (xmp, NS_EXIF, "MeteringMode");
 
@@ -278,28 +278,28 @@ writeback_xmp_update_file_metadata (TrackerWritebackFile *wbf,
 			   6 = Partial
 			   255 = other  */
 
-			if        (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "meteringMode-center-weighted-average") == 0) {
+			if        (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "meteringMode-center-weighted-average") == 0) {
 				xmp_set_property (xmp, NS_EXIF, "MeteringMode", "0", 0);
-			} else if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "meteringMode-average") == 0) {
-				xmp_set_property (xmp, NS_EXIF, "MeteringMode", "1", 0);
-			} else if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "meteringMode-spot") == 0) {
+			} else if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "meteringMode-average") == 0) {
+				xmp_set_property (xmp,NS_EXIF, "MeteringMode", "1", 0);
+			} else if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "meteringMode-spot") == 0) {
 				xmp_set_property (xmp, NS_EXIF, "MeteringMode", "3", 0);
-			} else if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "meteringMode-multispot") == 0) {
+			} else if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "meteringMode-multispot") == 0) {
 				xmp_set_property (xmp, NS_EXIF, "MeteringMode", "4", 0);
-			} else if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "meteringMode-pattern") == 0) {
+			} else if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "meteringMode-pattern") == 0) {
 				xmp_set_property (xmp, NS_EXIF, "MeteringMode", "5", 0);
-			} else if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "meteringMode-partial") == 0) {
+			} else if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "meteringMode-partial") == 0) {
 				xmp_set_property (xmp, NS_EXIF, "MeteringMode", "6", 0);
 			} else {
 				xmp_set_property (xmp, NS_EXIF, "MeteringMode", "255", 0);
 			}
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NMM_PREFIX "whiteBalance") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "whiteBalance") == 0) {
 
 			xmp_delete_property (xmp, NS_EXIF, "WhiteBalance");
 
-			if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "whiteBalance-auto") == 0) {
+			if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "whiteBalance-auto") == 0) {
 				/* 0 = Auto white balance
 				 * 1 = Manual white balance */
 				xmp_set_property (xmp, NS_EXIF, "WhiteBalance", "0", 0);
@@ -308,11 +308,11 @@ writeback_xmp_update_file_metadata (TrackerWritebackFile *wbf,
 			}
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NMM_PREFIX "flash") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "flash") == 0) {
 
 			xmp_delete_property (xmp, NS_EXIF, "Flash");
 
-			if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "flash-on") == 0) {
+			if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "flash-on") == 0) {
 				/* 0 = Flash did not fire
 				   1 = Flash fired */
 				xmp_set_property (xmp, NS_EXIF, "Flash", "0", 0);
@@ -321,28 +321,28 @@ writeback_xmp_update_file_metadata (TrackerWritebackFile *wbf,
 			}
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NMM_PREFIX "focalLength") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "focalLength") == 0) {
 			xmp_delete_property (xmp, NS_EXIF, "FocalLength");
-			xmp_set_property (xmp, NS_EXIF, "FocalLength", row[2], 0);
+			xmp_set_property (xmp, NS_EXIF, "FocalLength", row[3], 0);
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NMM_PREFIX "exposureTime") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "exposureTime") == 0) {
 			xmp_delete_property (xmp, NS_EXIF, "ExposureTime");
-			xmp_set_property (xmp, NS_EXIF, "ExposureTime", row[2], 0);
+			xmp_set_property (xmp, NS_EXIF, "ExposureTime", row[3], 0);
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NMM_PREFIX "isoSpeed") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "isoSpeed") == 0) {
 			xmp_delete_property (xmp, NS_EXIF, "ISOSpeedRatings");
-			xmp_set_property (xmp, NS_EXIF, "ISOSpeedRatings", row[2], 0);
+			xmp_set_property (xmp, NS_EXIF, "ISOSpeedRatings", row[3], 0);
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NMM_PREFIX "fnumber") == 0) {
+		if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "fnumber") == 0) {
 			xmp_delete_property (xmp, NS_EXIF, "FNumber");
-			xmp_set_property (xmp, NS_EXIF, "FNumber", row[2], 0);
+			xmp_set_property (xmp, NS_EXIF, "FNumber", row[3], 0);
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_NMM_PREFIX "camera") == 0) {
-			gchar *work_on = g_strdup (row[2]);
+		if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "camera") == 0) {
+			gchar *work_on = g_strdup (row[3]);
 			gchar *ptr = strchr (work_on, ' ');
 
 			if (ptr) {
@@ -362,23 +362,21 @@ writeback_xmp_update_file_metadata (TrackerWritebackFile *wbf,
 			g_free (work_on);
 		}
 
-		if (g_strcmp0 (row[1], TRACKER_MLO_PREFIX "location") == 0 ||
-		    g_strcmp0 (row[1], TRACKER_MLO_PREFIX "city") == 0     ||
-		    g_strcmp0 (row[1], TRACKER_MLO_PREFIX "country") == 0  ||
-		    g_strcmp0 (row[1], TRACKER_MLO_PREFIX "state") == 0    ||
-		    g_strcmp0 (row[1], TRACKER_MLO_PREFIX "address") == 0) 
+		if (g_strcmp0 (row[2], TRACKER_MLO_PREFIX "location") == 0 ||
+		    g_strcmp0 (row[2], TRACKER_MLO_PREFIX "city") == 0     ||
+		    g_strcmp0 (row[2], TRACKER_MLO_PREFIX "country") == 0  ||
+		    g_strcmp0 (row[2], TRACKER_MLO_PREFIX "state") == 0    ||
+		    g_strcmp0 (row[2], TRACKER_MLO_PREFIX "address") == 0) 
 		{
 			GPtrArray *array;
 			GError *error = NULL;
 			gchar *query;
 
-			query = g_strdup_printf ("SELECT ?city ?state ?address ?country "
-			                         "WHERE { <%s> mlo:location ?location . "
-			                                 "OPTIONAL { ?location mlo:address ?address } . "
-			                                 "OPTIONAL { ?location mlo:city ?city } . "
-			                                 "OPTIONAL { ?location mlo:country ?country } . "
-			                                 "OPTIONAL { ?location mlo:state ?state} "
-			                         "}", row[0]);
+			query = g_strdup_printf ("SELECT mlo:city (?city) mlo:state (?state) "
+			                               " mlo:address (?address) "
+			                               " mlo:country (?country) "
+			                         "WHERE { <%s> mlo:location ?location }",
+			                         row[1]); /* The urn is at 1 */
 
 			array = tracker_resources_sparql_query (client, query, &error);
 
@@ -442,7 +440,7 @@ writeback_xmp_update_file_metadata (TrackerWritebackFile *wbf,
 
 		/* TODO: When a photo contains a known face
 		 * 
-		 * if (g_strcmp0 (row[1], PHOTO_HAS "contact") == 0) {
+		 * if (g_strcmp0 (row[2], PHOTO_HAS "contact") == 0) {
 		  xmp_delete_property (xmp, FACE, "contact");
 		  Fetch full name of the contact?
 		  xmp_set_array_item (xmp, FACE, "contact", 1, fetched, 0);



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