[tracker/anonymous-file-nodes: 12/27] Fixed the tracker-writeback function to cope with anonymous blank nodes
- From: Martyn James Russell <mr src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker/anonymous-file-nodes: 12/27] Fixed the tracker-writeback function to cope with anonymous blank nodes
- Date: Tue, 2 Feb 2010 17:02:11 +0000 (UTC)
commit fec74460f8abc0488f2f4d9340886326c55acd75
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 | 120 ++++++++++----------
4 files changed, 136 insertions(+), 82 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 1d53dd7..1144879 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 "metering-mode-center-weighted-average") == 0) {
+ if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "metering-mode-center-weighted-average") == 0) {
xmp_set_property (xmp, NS_EXIF, "MeteringMode", "0", 0);
- } else if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "metering-mode-average") == 0) {
+ } else if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "metering-mode-average") == 0) {
xmp_set_property (xmp, NS_EXIF, "MeteringMode", "1", 0);
- } else if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "metering-mode-spot") == 0) {
+ } else if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "metering-mode-spot") == 0) {
xmp_set_property (xmp, NS_EXIF, "MeteringMode", "3", 0);
- } else if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "metering-mode-multispot") == 0) {
+ } else if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "metering-mode-multispot") == 0) {
xmp_set_property (xmp, NS_EXIF, "MeteringMode", "4", 0);
- } else if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "metering-mode-pattern") == 0) {
+ } else if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "metering-mode-pattern") == 0) {
xmp_set_property (xmp, NS_EXIF, "MeteringMode", "5", 0);
- } else if (g_strcmp0 (row[2], TRACKER_NMM_PREFIX "metering-mode-partial") == 0) {
+ } else if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "metering-mode-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 "white-balance-auto") == 0) {
+ if (g_strcmp0 (row[3], TRACKER_NMM_PREFIX "white-balance-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]