[tracker/urn-cache: 4/5] TrackerMinerFiles: Use existing URN in inserts if any.



commit 369652e6fcb8fb7988810581b836e46c03e5cc5e
Author: Carlos Garnacho <carlos lanedo com>
Date:   Tue Feb 16 15:15:16 2010 +0100

    TrackerMinerFiles: Use existing URN in inserts if any.
    
    if the GFile already has an assigned URN in the store,
    use that one when composing the insert.

 src/tracker-miner-fs/tracker-miner-files.c |   46 +++++++++++++++++++++++++---
 1 files changed, 41 insertions(+), 5 deletions(-)
---
diff --git a/src/tracker-miner-fs/tracker-miner-files.c b/src/tracker-miner-fs/tracker-miner-files.c
index 1a7f01b..048ce57 100644
--- a/src/tracker-miner-fs/tracker-miner-files.c
+++ b/src/tracker-miner-fs/tracker-miner-files.c
@@ -54,6 +54,7 @@ struct ProcessFileData {
 	TrackerSparqlBuilder *sparql;
 	GCancellable *cancellable;
 	GFile *file;
+	gchar *urn;
 	DBusGProxyCall *call;
 };
 
@@ -1326,6 +1327,7 @@ miner_files_monitor_directory (TrackerMinerFS *fs,
 static void
 miner_files_add_to_datasource (TrackerMinerFiles    *mf,
                                GFile                *file,
+                               const gchar          *urn,
                                TrackerSparqlBuilder *sparql)
 {
 	TrackerMinerFilesPrivate *priv;
@@ -1348,7 +1350,12 @@ miner_files_add_to_datasource (TrackerMinerFiles    *mf,
 		removable_device_urn = g_strdup (TRACKER_NON_REMOVABLE_MEDIA_DATASOURCE_URN);
 	}
 
-	tracker_sparql_builder_subject (sparql, "_:file");
+	if (urn) {
+		tracker_sparql_builder_subject_iri (sparql, urn);
+	} else {
+		tracker_sparql_builder_subject (sparql, "_:file");
+	}
+
 	tracker_sparql_builder_predicate (sparql, "a");
 	tracker_sparql_builder_object (sparql, "nfo:FileDataObject");
 
@@ -1369,6 +1376,7 @@ process_file_data_free (ProcessFileData *data)
 	g_object_unref (data->sparql);
 	g_object_unref (data->cancellable);
 	g_object_unref (data->file);
+	g_free (data->urn);
 	g_slice_free (ProcessFileData, data);
 }
 
@@ -1423,8 +1431,17 @@ extractor_get_embedded_metadata_cb (DBusGProxy *proxy,
 	}
 
 	if (sparql && *sparql) {
-		tracker_sparql_builder_append (data->sparql, "\n");
+		gchar *subject_str;
+
+		if (data->urn) {
+			subject_str = g_strdup_printf ("<%s> ", data->urn);
+		} else {
+			subject_str = g_strdup ("_:file ");
+		}
+
+		tracker_sparql_builder_append (data->sparql, subject_str);
 		tracker_sparql_builder_append (data->sparql, sparql);
+		g_free (subject_str);
 	}
 
 	tracker_sparql_builder_insert_close (data->sparql);
@@ -1549,6 +1566,7 @@ process_file_cb (GObject      *object,
 	GFile *file, *parent;
 	gchar *uri;
 	GError *error = NULL;
+	const gchar *urn;
 
 	data = user_data;
 	file = G_FILE (object);
@@ -1567,9 +1585,23 @@ process_file_cb (GObject      *object,
 	uri = g_file_get_uri (file);
 	mime_type = g_file_info_get_content_type (file_info);
 
+	urn = tracker_miner_fs_get_urn (TRACKER_MINER_FS (data->miner), file);
+
+	if (urn) {
+		data->urn = g_strdup (urn);
+	} else {
+		data->urn = NULL;
+	}
+
 	tracker_sparql_builder_insert_open (sparql, uri);
 
-	tracker_sparql_builder_subject (sparql, "_:file");
+	if (data->urn) {
+		/* Item already exists and has an URN */
+		tracker_sparql_builder_subject_iri (sparql, data->urn);
+	} else {
+		/* No URN assigned, create one */
+		tracker_sparql_builder_subject (sparql, "_:file");
+	}
 
 	tracker_sparql_builder_predicate (sparql, "a");
 	tracker_sparql_builder_object (sparql, "nfo:FileDataObject");
@@ -1606,7 +1638,11 @@ process_file_cb (GObject      *object,
 
 	/* Laying the link between the IE and the DO. We use IE = DO */
 	tracker_sparql_builder_predicate (sparql, "nie:isStoredAs");
-	tracker_sparql_builder_object (sparql, "_:file");
+	if (data->urn) {
+		tracker_sparql_builder_object_iri (sparql, data->urn);
+	} else {
+		tracker_sparql_builder_object (sparql, "_:file");
+	}
 
 	/* The URL of the DataObject (because IE = DO, this is correct) */
 	tracker_sparql_builder_predicate (sparql, "nie:url");
@@ -1615,7 +1651,7 @@ process_file_cb (GObject      *object,
 	tracker_sparql_builder_predicate (sparql, "nie:mimeType");
 	tracker_sparql_builder_object_string (sparql, mime_type);
 
-	miner_files_add_to_datasource (data->miner, file, sparql);
+	miner_files_add_to_datasource (data->miner, file, data->urn, sparql);
 
 	/* Next step, getting embedded metadata */
 	extractor_get_embedded_metadata (data, uri, mime_type);



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