This is the latest merge-patch for Turtle to Trunk.

Please review

-- 
Philip Van Hoof, freelance software developer
home: me at pvanhoof dot be 
gnome: pvanhoof at gnome dot org 
http://pvanhoof.be/blog
http://codeminded.be

Index: src/tracker-indexer/tracker-main.c
===================================================================
--- src/tracker-indexer/tracker-main.c	(revision 2649)
+++ src/tracker-indexer/tracker-main.c	(working copy)
@@ -43,7 +43,9 @@
 #include <libtracker-db/tracker-db-index-manager.h>
 
 #include <libtracker-data/tracker-data-update.h>
+#include <libtracker-data/tracker-turtle.h>
 
+
 #include "tracker-dbus.h"
 #include "tracker-indexer.h"
 
@@ -370,13 +372,18 @@
                 tracker_indexer_process_modules (indexer, modules);
         }
 
+	tracker_turtle_init ();
+
 	g_message ("Starting...");
 
+
 	main_loop = g_main_loop_new (NULL, FALSE);
 	g_main_loop_run (main_loop);
 
 	g_message ("Shutdown started");
 
+	tracker_turtle_shutdown ();
+
 	if (quit_timeout_id) {
 		g_source_remove (quit_timeout_id);
 	}
Index: src/tracker-indexer/tracker-indexer.c
===================================================================
--- src/tracker-indexer/tracker-indexer.c	(revision 2649)
+++ src/tracker-indexer/tracker-indexer.c	(working copy)
@@ -71,10 +71,12 @@
 
 #include <libtracker-data/tracker-data-query.h>
 #include <libtracker-data/tracker-data-update.h>
+#include <libtracker-data/tracker-turtle.h>
 
 #include "tracker-indexer.h"
 #include "tracker-indexer-module.h"
 #include "tracker-marshal.h"
+#include "tracker-removable-device.h"
 
 #define TRACKER_INDEXER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRACKER_TYPE_INDEXER, TrackerIndexerPrivate))
 
@@ -84,9 +86,6 @@
 #define LOW_DISK_CHECK_FREQUENCY    10
 #define SIGNAL_STATUS_FREQUENCY     10
 
-/* Transaction every 'x' items */
-#define TRANSACTION_MAX		    2000
-
 /* Throttle defaults */
 #define THROTTLE_DEFAULT	    0
 #define THROTTLE_DEFAULT_ON_BATTERY 5
@@ -384,6 +383,22 @@
 							    indexer);
 }
 
+
+void 
+tracker_indexer_commit_transaction (TrackerIndexer *indexer)
+{
+	stop_transaction (indexer);
+	tracker_indexer_set_running (indexer, TRUE);
+
+}
+
+void
+tracker_indexer_open_transaction   (TrackerIndexer *indexer)
+{
+	tracker_indexer_set_running (indexer, FALSE);
+	start_transaction (indexer);
+}
+
 #ifdef HAVE_HAL
 
 static void
@@ -1376,6 +1391,8 @@
 	TrackerService *service;
 	gchar *text;
 	guint32 id;
+	gchar *mount_point = NULL;
+	gchar *service_path;
 
 	service = get_service_for_file (info->module_file, info->module);
 
@@ -1413,6 +1430,29 @@
 
 		index_metadata (indexer, id, service, metadata);
 
+		/* TODO: URI branch path -> uri */
+
+		service_path = g_build_path (G_DIR_SEPARATOR_S, 
+					     dirname, 
+					     basename, 
+					     NULL);
+
+		if (tracker_hal_path_is_on_removable_device (indexer->private->hal,
+							     service_path, 
+							     &mount_point,
+							     NULL)) {
+
+			tracker_removable_device_add_metadata (indexer, 
+							       mount_point, 
+							       service_path, 
+							       tracker_service_get_name (service),
+							       metadata);
+		}
+
+		g_free (mount_point);
+		mount_point = NULL;
+		g_free (service_path);
+
 		/* Take the old text -> the new one, calculate
 		 * difference and add the words.
 		 */
@@ -1446,6 +1486,29 @@
 
 	index_metadata (indexer, id, service, metadata);
 
+	/* TODO: URI branch path -> uri */
+
+	service_path = g_build_path (G_DIR_SEPARATOR_S, 
+				     dirname, 
+				     basename, 
+				     NULL);
+
+	if (tracker_hal_path_is_on_removable_device (indexer->private->hal,
+						     service_path, 
+						     &mount_point,
+						     NULL)) {
+
+		tracker_removable_device_add_metadata (indexer, 
+						       mount_point, 
+						       service_path,
+						       tracker_service_get_name (service),
+						       metadata);
+	}
+
+	g_free (mount_point);
+	mount_point = NULL;
+	g_free (service_path);
+
 	text = tracker_module_file_get_text (info->module_file);
 
 	if (text) {
@@ -1486,6 +1549,7 @@
 	GFile *file, *other_file;
 	gchar *path, *other_path;
 	gchar *uri, *other_uri, *mime_type;
+	gchar *mount_point = NULL;
 	guint32 id;
 
 	service = get_service_for_file (info->other_module_file, info->module);
@@ -1528,6 +1592,32 @@
 
 	tracker_data_update_move_service (service, path, other_path);
 
+	if (tracker_hal_path_is_on_removable_device (indexer->private->hal,
+						     path, 
+						     &mount_point,
+						     NULL) ) {
+
+		if (tracker_hal_path_is_on_removable_device (indexer->private->hal,
+						     other_path, 
+						     NULL,
+						     NULL) ) {
+
+			tracker_removable_device_add_move (indexer, 
+							   mount_point, 
+							   path, 
+							   other_path,
+							   tracker_service_get_name (service));
+
+		} else {
+			tracker_removable_device_add_removal (indexer, 
+							      mount_point, 
+							      path,
+							      tracker_service_get_name (service));
+		}
+	}
+
+	g_free (mount_point);
+
 	/*
 	 *  Updating what changes in move event (Path related properties)
 	 */
@@ -1581,6 +1671,7 @@
 	gchar *service_path;
 	const gchar *service_type;
 	guint service_id, service_type_id;
+	gchar *mount_point = NULL;
 
 	service_type = tracker_module_config_get_index_service (info->module->name);
 
@@ -1675,6 +1766,9 @@
 	g_free (metadata);
 
 	/* Delete service */
+
+	/* TODO: URI branch path -> uri */
+
 	service_path = g_build_path (G_DIR_SEPARATOR_S, 
 				     dirname, 
 				     basename, 
@@ -1686,6 +1780,18 @@
 		tracker_data_update_delete_service_recursively (service, service_path);
 	}
 
+	if (tracker_hal_path_is_on_removable_device (indexer->private->hal,
+						     service_path, 
+						     &mount_point,
+						     NULL)) {
+
+		tracker_removable_device_add_removal (indexer, mount_point, 
+						      service_path,
+						      tracker_service_get_name (service));
+	}
+
+	g_free (mount_point);
+
 	tracker_data_update_decrement_stats (indexer->private->common, service);
 
 	g_free (service_path);
@@ -2385,7 +2491,7 @@
 			/* Signal stopped and clean up */
 			check_stopped (indexer, FALSE);
 			check_disk_space_stop (indexer);
-
+			
 			return FALSE;
 		}
 
@@ -2840,6 +2946,13 @@
 
 	dbus_g_method_return (context);
 	tracker_dbus_request_success (request_id);
+
+	/* tracker_turtle_process_ttl will be spinning the mainloop, therefore
+	   we can already return the DBus method */
+
+	if (enabled) {
+		tracker_removable_device_load (indexer, path);
+	}
 }
 
 void
@@ -2933,7 +3046,59 @@
 	tracker_dbus_request_success (request_id);
 }
 
+static void
+restore_backup_triple (void *user_data, const stmt *triple) {
+
+	gchar          *values[2];
+	TrackerIndexer *indexer = user_data;
+	GError         *error = NULL;
+
+	g_return_if_fail (TRACKER_IS_INDEXER (indexer));
+
+	g_debug ("Turtle loading <%s, %s, %s>",
+                 (gchar *)triple->subject, 
+                 (gchar *)triple->predicate, 
+                 (gchar *)triple->object);
+	
+	values[0] = g_strdup (triple->object);
+	values[1] = NULL;
+
+	handle_metadata_add (indexer, "Files", triple->subject, triple->predicate, values, &error);
+
+	if (error) {
+		g_warning ("Restoring backup: %s", error->message);
+		g_error_free (error);
+	}
+
+	g_free (values[0]);
+}
+
 void
+tracker_indexer_restore_backup (TrackerIndexer         *indexer,
+				const gchar            *backup_file,
+				DBusGMethodInvocation  *context,
+				GError                **error)
+{
+	guint request_id;
+
+	tracker_dbus_async_return_if_fail (TRACKER_IS_INDEXER (indexer), context);
+
+	request_id = tracker_dbus_get_next_request_id ();
+	tracker_dbus_request_new (request_id,
+				  "DBus request to restore backup data from '%s'",
+				  backup_file);
+	
+	tracker_turtle_process (backup_file, 
+				"/", 
+				(TurtleTripleCallback) restore_backup_triple, 
+				indexer);
+
+	dbus_g_method_return (context);
+	tracker_dbus_request_success (request_id);
+}
+
+
+void
 tracker_indexer_shutdown (TrackerIndexer	 *indexer,
 			  DBusGMethodInvocation  *context,
 			  GError		**error)
Index: src/tracker-indexer/Makefile.am
===================================================================
--- src/tracker-indexer/Makefile.am	(revision 2649)
+++ src/tracker-indexer/Makefile.am	(working copy)
@@ -13,6 +13,7 @@
 	-I$(top_srcdir)/src						\
 	$(DBUS_CFLAGS)							\
 	$(PANGO_CFLAGS)							\
+	$(RAPTOR_CFLAGS)						\
 	$(GMODULE_CFLAGS)
 
 libtracker_indexerdir = $(libdir)/tracker
@@ -39,7 +40,8 @@
 	tracker-indexer-module.c					\
 	tracker-indexer-module.h					\
 	tracker-main.c							\
-	tracker-marshal-main.c						
+	tracker-marshal-main.c						\
+	tracker-removable-device.c					
 
 tracker_indexer_LDADD =							\
 	libtracker-indexer.la						\
@@ -54,6 +56,7 @@
 	$(PANGO_LIBS)							\
 	$(GIO_LIBS)							\
 	$(GLIB2_LIBS)							\
+	$(RAPTOR_LIBS)							\
 	-lz								\
 	-lm
 
Index: src/tracker-indexer/tracker-indexer.h
===================================================================
--- src/tracker-indexer/tracker-indexer.h	(revision 2649)
+++ src/tracker-indexer/tracker-indexer.h	(working copy)
@@ -30,6 +30,9 @@
 #define TRACKER_INDEXER_PATH	     "/org/freedesktop/Tracker/Indexer"
 #define TRACKER_INDEXER_INTERFACE    "org.freedesktop.Tracker.Indexer"
 
+/* Transaction every 'x' items */
+#define TRANSACTION_MAX		    2000
+
 G_BEGIN_DECLS
 
 #define TRACKER_TYPE_INDEXER	     (tracker_indexer_get_type())
@@ -80,6 +83,8 @@
 void            tracker_indexer_process_all         (TrackerIndexer         *indexer);
 void            tracker_indexer_process_modules     (TrackerIndexer         *indexer,
 						     gchar                 **modules);
+void		tracker_indexer_commit_transaction  (TrackerIndexer         *indexer);
+void		tracker_indexer_open_transaction    (TrackerIndexer         *indexer);
 
 /* DBus methods */
 void            tracker_indexer_pause               (TrackerIndexer         *indexer,
@@ -136,6 +141,10 @@
 						     GStrv                   values,
 						     DBusGMethodInvocation  *context,
 						     GError                **error);
+void            tracker_indexer_restore_backup      (TrackerIndexer         *indexer,
+						     const gchar            *backup_file,
+						     DBusGMethodInvocation  *context,
+						     GError                **error);
 void            tracker_indexer_shutdown            (TrackerIndexer         *indexer,
 						     DBusGMethodInvocation  *context,
 						     GError                **error);
Index: src/libtracker-data/tracker-data-query.c
===================================================================
--- src/libtracker-data/tracker-data-query.c	(revision 2649)
+++ src/libtracker-data/tracker-data-query.c	(working copy)
@@ -386,6 +386,9 @@
 	return service_type_id;
 }
 
+/*
+ * Result set with (metadataID, value) per row
+ */
 static void
 result_set_to_metadata (TrackerDBResultSet  *result_set,
 			TrackerDataMetadata *metadata,
@@ -400,7 +403,7 @@
 		GValue transform = {0, };
 		GValue value = {0, };
 		gchar *str;
-		
+
 		g_value_init (&transform, G_TYPE_STRING);
 		tracker_db_result_set_get (result_set, 0, &metadata_id, -1);
 		_tracker_db_result_set_get_value (result_set, 1, &value);
@@ -492,6 +495,23 @@
 	return metadata;
 }
 
+TrackerDBResultSet *
+tracker_data_query_backup_metadata (TrackerService *service)
+{
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	GHashTable          *results;
+
+	g_return_val_if_fail (TRACKER_IS_SERVICE (service), NULL);
+
+	iface = tracker_db_manager_get_db_interface_by_service (tracker_service_get_name (service));
+
+	result_set = tracker_data_manager_exec_proc (iface,
+						     "GetEmbeddedMetadataBackup", 
+						     NULL);
+	return result_set;
+}
+
 static gchar *
 db_get_metadata (TrackerService *service,
 		 guint		 service_id,
Index: src/libtracker-data/tracker-data-query.h
===================================================================
--- src/libtracker-data/tracker-data-query.h	(revision 2649)
+++ src/libtracker-data/tracker-data-query.h	(working copy)
@@ -53,6 +53,7 @@
 TrackerDataMetadata *tracker_data_query_metadata              (TrackerService      *service,
 							       guint32              service_id,
 							       gboolean             embedded);
+TrackerDBResultSet  *tracker_data_query_backup_metadata       (TrackerService      *service);
 gchar *              tracker_data_query_parsed_metadata       (TrackerService      *service,
 							       guint32              service_id);
 gchar *              tracker_data_query_unparsed_metadata     (TrackerService      *service,
Index: src/libtracker-data/tracker-data-metadata.c
===================================================================
--- src/libtracker-data/tracker-data-metadata.c	(revision 2649)
+++ src/libtracker-data/tracker-data-metadata.c	(working copy)
@@ -106,6 +106,7 @@
 			      const gchar         *value)
 {
 	TrackerField *field;
+	gchar        *old_value;
 
 	g_return_if_fail (metadata != NULL);
 	g_return_if_fail (field_name != NULL);
@@ -114,14 +115,54 @@
 	field = tracker_ontology_get_field_by_name (field_name);
 
 	g_return_if_fail (TRACKER_IS_FIELD (field));
-        g_return_if_fail (tracker_field_get_multiple_values (field) == FALSE);
+	g_return_if_fail (tracker_field_get_multiple_values (field) == FALSE);
 
-	g_hash_table_insert (metadata->table,
-			     g_object_ref (field),
-			     g_strdup (value));
+	old_value = g_hash_table_lookup (metadata->table, field);
+	g_free (old_value);
+
+	g_hash_table_replace (metadata->table,
+			      g_object_ref (field),
+			      g_strdup (value));
+
 }
 
+
+
 /**
+ * tracker_data_metadata_append_to_list:
+ * @metadata: A #TrackerDataMetadata
+ * @field_name: Field name for the metadata to insert.
+ * @value: Value for the metadata to insert.
+ *
+ * Inserts a new metadata element into @metadata.
+ **/
+void
+tracker_data_metadata_append_to_list (TrackerDataMetadata *metadata,
+				      const gchar	  *field_name,
+				      gchar		  *value)
+{
+	TrackerField *field;
+	GList        *values;
+
+	field = tracker_ontology_get_field_by_name (field_name);
+
+	if (!field) {
+		g_warning ("Field name '%s' has isn't described in the ontology", field_name);
+		g_free (value);
+		return;
+	}
+
+	g_return_if_fail (tracker_field_get_multiple_values (field) == TRUE);
+
+	values = g_hash_table_lookup (metadata->table, field);
+
+	values = g_list_append (values, value);
+
+	g_hash_table_replace (metadata->table,
+			      g_object_ref (field),
+			      values);
+}
+/**
  * tracker_data_metadata_insert_values:
  * @metadata: A #TrackerDataMetadata
  * @field_name: Field name for the metadata to insert
@@ -140,6 +181,7 @@
 				     GList	         *list)
 {
 	TrackerField *field;
+	GList        *old_values;
 
 	g_return_if_fail (metadata != NULL);
 	g_return_if_fail (field_name != NULL);
@@ -150,7 +192,13 @@
 
 	field = tracker_ontology_get_field_by_name (field_name);
 
-	g_return_if_fail (TRACKER_IS_FIELD (field));
+	if (!field) {
+		g_warning ("Field name '%s' has isn't described in the ontology", field_name);
+		g_list_foreach (list, (GFunc) g_free, NULL);
+		g_list_free (list);
+		return;
+	}
+
 	g_return_if_fail (tracker_field_get_multiple_values (field) == TRUE);
 
 	g_hash_table_insert (metadata->table,
Index: src/libtracker-data/tracker-data-update.c
===================================================================
--- src/libtracker-data/tracker-data-update.c	(revision 2649)
+++ src/libtracker-data/tracker-data-update.c	(working copy)
@@ -26,6 +26,7 @@
 #include <libtracker-common/tracker-type-utils.h>
 #include <libtracker-common/tracker-file-utils.h>
 
+#include <libtracker-db/tracker-db-index-manager.h>
 #include <libtracker-db/tracker-db-manager.h>
 #include <libtracker-db/tracker-db-dbus.h>
 
@@ -571,7 +572,271 @@
 	tracker_data_manager_exec (iface, "DELETE FROM Events WHERE BeingHandled = 1");
 }
 
+/* TODO: URI branch path -> uri */
+
 void
+tracker_data_delete_service (const gchar         *path,
+			     const gchar         *rdf_type)
+{
+	TrackerService      *service;
+	const gchar         *service_type; 
+	guint32              service_id;
+
+	service = tracker_ontology_get_service_by_name (rdf_type);
+	service_type = tracker_service_get_name (service);
+	service_id =  tracker_data_query_file_id (service_type, path);
+
+	/* When merging from the decomposed branch to trunk then this function
+	 * wont exist in the decomposed branch. Create it based on this one. */
+
+	if (service_id != 0) {
+		tracker_data_update_delete_service (service, service_id);
+		tracker_data_update_delete_service_recursively (service, (gchar *) path);
+		tracker_data_update_delete_all_metadata (service, service_id);
+	}
+}
+
+/* TODO: URI branch path -> uri */
+
+typedef struct {
+	TrackerService *service;
+	guint32 iid_value;
+	TrackerLanguage *language;
+	TrackerConfig *config;
+} ForeachInMetadataInfo;
+
+
+static void
+set_metadata (TrackerField *field, gpointer value, ForeachInMetadataInfo *info)
+{
+	TrackerDBIndex *index;
+	gchar *parsed_value;
+	gchar **arr;
+	gint service_id;
+	gint i;
+	gint score;
+
+	/* TODO untested and unfinished port that came from the decomposed 
+	 * branch of Jürg. When merging from the decomposed branch to trunk
+	 * then pick the version in the decomposed branch for this function */
+
+	parsed_value = tracker_parser_text_to_string (value,
+						      info->language,
+						      tracker_config_get_max_word_length (info->config),
+						      tracker_config_get_min_word_length (info->config),
+						      tracker_field_get_filtered (field),
+						      tracker_field_get_filtered (field),
+						      tracker_field_get_delimited (field));
+
+	if (!parsed_value) {
+		return;
+	}
+
+	score = tracker_field_get_weight (field);
+
+	arr = g_strsplit (parsed_value, " ", -1);
+	service_id = tracker_service_get_id (info->service);
+	index = tracker_db_index_manager_get_index_by_service_id (service_id);
+
+	for (i = 0; arr[i]; i++) {
+		tracker_db_index_add_word (index,
+					   arr[i],
+					   info->iid_value,
+					   tracker_service_get_id (info->service),
+					   score);
+	}
+
+	tracker_data_update_set_metadata (info->service, info->iid_value, field, value, parsed_value);
+
+	g_free (parsed_value);
+	g_strfreev (arr);
+
+}
+
+static void
+foreach_in_metadata_set_metadata (TrackerField *field,
+				  gpointer      value,
+				  gpointer      user_data)
+{
+	ForeachInMetadataInfo *info = user_data;
+	gchar *parsed_value;
+	gint   throttle;
+
+	/* Throttle indexer, value 9 is from older code, why 9? */
+	throttle = tracker_config_get_throttle (info->config);
+	if (throttle > 9) {
+		tracker_throttle (info->config, throttle * 100);
+	}
+
+	if (!tracker_field_get_multiple_values (field)) {
+		set_metadata (field, value, user_data);
+	} else {
+		GList *list;
+
+		list = value;
+
+		while (list) {
+			set_metadata (field, list->data, user_data);
+			list = list->next;
+		}
+	}
+
+}
+
+static TrackerConfig *config = NULL;
+static TrackerLanguage *language = NULL;
+
+
+void
+tracker_data_start_turtle_import (void)
+{
+	if (!config)
+		config = tracker_config_new ();
+	if (!language)
+		language = tracker_language_new (config);
+}
+
+void
+tracker_data_stop_turtle_import (void)
+{
+	g_object_unref (language);
+	g_object_unref (config);
+	language = NULL;
+	config = NULL;
+}
+
+
+/* TODO: URI branch path -> uri */
+
+void 
+tracker_data_replace_service (const gchar         *path,
+			      const gchar         *rdf_type,
+			      TrackerDataMetadata *metadata)
+{
+	TrackerDBInterface  *iface;
+	TrackerDBResultSet  *result_set;
+	const gchar         *modified;
+	GError              *error = NULL;
+	TrackerService      *service;
+	gchar               *escaped_path;
+	gchar               *dirname;
+	const gchar         *basename;
+
+	/* When merging from the decomposed branch to trunk then pick the version
+	 * in the decomposed branch for this function. However, carefully 
+	 * compare the features, as this version is more recent and has 
+	 * implemented a few significant items, whereas the version in the
+	 * decomposed branch was a proof of concept implementation, and might
+	 * not have these needed features. */
+
+	if (!rdf_type)
+		return;
+
+	service = tracker_ontology_get_service_by_name (rdf_type);
+
+	iface = tracker_db_manager_get_db_interface_by_type (tracker_service_get_name (service),
+							     TRACKER_DB_CONTENT_TYPE_METADATA);
+
+	modified = tracker_data_metadata_lookup (metadata, "File:Modified");
+
+	if (!modified) {
+		return;
+	}
+
+	escaped_path = tracker_escape_string (path);
+
+	basename = g_basename (escaped_path);
+	dirname = g_dirname (escaped_path);
+
+	/* TODO Warning: comparing Modified against Accessed. Do we have a
+	 * better field for this? */
+
+	result_set = tracker_db_interface_execute_query (iface, &error,
+							 "SELECT ID, Accessed < '%s' FROM Services "
+							 "WHERE Path = '%s' AND "
+							 "Name = '%s'",
+							 modified,
+							 dirname, basename);
+
+	if (error) {
+		#ifdef TURTLE_DEBUG
+		g_print ("Q ERROR: %s\n", error->message);
+		#endif /* TURTLE_DEBUG */
+		g_error_free (error);
+	}
+
+	if (result_set) {
+		GValue         id_value = { 0, };
+		GValue         is_value = { 0, };
+		gint           iid_value, iis_value;
+
+		_tracker_db_result_set_get_value (result_set, 0, &id_value);
+		iid_value = g_value_get_int (&id_value);
+
+		_tracker_db_result_set_get_value (result_set, 1, &is_value);
+		iis_value = g_value_get_int (&is_value);
+
+		if (iis_value) {
+			ForeachInMetadataInfo *info = g_slice_new (ForeachInMetadataInfo);
+			info->service = service;
+			info->iid_value = iid_value;
+
+			info->config = config?g_object_ref (config):NULL;
+			info->language = language?g_object_ref (language):NULL;
+
+			tracker_data_metadata_foreach (metadata, 
+						       foreach_in_metadata_set_metadata,
+						       info);
+
+			if (info->language)
+				g_object_unref (info->language);
+			if (info->config)
+				g_object_unref (info->config);
+
+			g_slice_free (ForeachInMetadataInfo, info);
+		}
+
+		g_value_unset (&id_value);
+		g_value_unset (&is_value);
+
+		g_object_unref (result_set);
+
+	} else {
+		guint32        id;
+
+		id = tracker_data_update_get_new_service_id (iface);
+
+		if (tracker_data_update_create_service (service, id,
+						        dirname, basename,
+						        metadata)) {
+			ForeachInMetadataInfo *info;
+
+			info = g_slice_new (ForeachInMetadataInfo);
+
+			info->service = service;
+			info->iid_value = id;
+
+			info->config = config?g_object_ref (config):NULL;
+			info->language = language?g_object_ref (language):NULL;
+
+			tracker_data_metadata_foreach (metadata, 
+						       foreach_in_metadata_set_metadata,
+						       info);
+
+			if (info->language)
+				g_object_unref (info->language);
+			if (info->config)
+				g_object_unref (info->config);
+
+			g_slice_free (ForeachInMetadataInfo, info);
+		}
+	}
+
+	g_free (dirname);
+	g_free (escaped_path);
+}
+
+void
 tracker_data_update_enable_volume (const gchar *udi,
                                    const gchar *mount_path)
 {
Index: src/libtracker-data/tracker-data-metadata.h
===================================================================
--- src/libtracker-data/tracker-data-metadata.h	(revision 2649)
+++ src/libtracker-data/tracker-data-metadata.h	(working copy)
@@ -43,6 +43,9 @@
 void                  tracker_data_metadata_insert_values  (TrackerDataMetadata        *metadata,
 							    const gchar                *field_name,
 							    GList                      *list);
+void                  tracker_data_metadata_append_to_list (TrackerDataMetadata        *metadata,
+							    const gchar	               *field_name,
+							    gchar                      *value);
 G_CONST_RETURN gchar *tracker_data_metadata_lookup         (TrackerDataMetadata        *metadata,
 							    const gchar                *field_name);
 G_CONST_RETURN GList *tracker_data_metadata_lookup_values  (TrackerDataMetadata        *metadata,
Index: src/libtracker-data/tracker-data-update.h
===================================================================
--- src/libtracker-data/tracker-data-update.h	(revision 2649)
+++ src/libtracker-data/tracker-data-update.h	(working copy)
@@ -52,6 +52,15 @@
 							 const gchar         *from,
 							 const gchar         *to);
 
+/* Turtle importing */
+void     tracker_data_replace_service                   (const gchar         *path,
+							 const gchar         *rdf_type,
+							 TrackerDataMetadata *metadata);
+void     tracker_data_delete_service                    (const gchar         *path,
+							 const gchar         *rdf_type);
+void     tracker_data_start_turtle_import               (void);
+void     tracker_data_stop_turtle_import                (void);
+
 /* Metadata */
 void     tracker_data_update_set_metadata               (TrackerService      *service,
 							 guint32              service_id,
Index: src/libtracker-data/Makefile.am
===================================================================
--- src/libtracker-data/Makefile.am	(revision 2649)
+++ src/libtracker-data/Makefile.am	(working copy)
@@ -6,6 +6,7 @@
 	-DTRACKER_COMPILATION						\
 	-I$(top_srcdir)/src						\
 	$(DBUS_CFLAGS)							\
+	$(RAPTOR_CFLAGS)                                                \
 	$(GLIB2_CFLAGS)
 
 libtracker_datadir = $(libdir)/tracker
@@ -21,6 +22,7 @@
 	tracker-data-update.c						\
 	tracker-query-tree.c						\
 	tracker-rdf-query.c						\
+	tracker-turtle.c						\
 	tracker-xesam-query.c
 
 noinst_HEADERS =							\
@@ -33,6 +35,7 @@
 	tracker-data-update.h						\
 	tracker-query-tree.h						\
 	tracker-rdf-query.h						\
+	tracker-turtle.h						\
 	tracker-xesam-query.h
 
 libtracker_data_la_LDFLAGS = -version-info 0:0:0
@@ -41,4 +44,5 @@
 	$(top_builddir)/src/libtracker-db/libtracker-db.la		\
 	$(DBUS_LIBS)							\
 	$(GLIB2_LIBS)							\
+	$(RAPTOR_LIBS)							\
 	-lz
Index: src/trackerd/tracker-main.c
===================================================================
--- src/trackerd/tracker-main.c	(revision 2649)
+++ src/trackerd/tracker-main.c	(working copy)
@@ -61,6 +61,7 @@
 #include "tracker-status.h"
 #include "tracker-xesam-manager.h"
 #include "tracker-cleanup.h"
+#include "tracker-backup.h"
 
 #ifdef G_OS_WIN32
 #include <windows.h>
@@ -747,6 +748,52 @@
 	return FALSE;
 }
 
+static gchar *
+get_turtle_userdata_backup_filename () 
+{
+	TrackerMainPrivate *private;
+
+	private = g_static_private_get (&private_key);
+	
+	if (private) {
+		return g_build_filename (private->user_data_dir, 
+					 "tracker-userdata-backup.ttl",
+					 NULL);
+	} else {
+		g_critical ("Directories not initialized");
+		return NULL;
+	}
+}
+
+
+/*
+ * TODO: Ugly hack counting signals because the indexer is sending two "Finished" signals
+ *  and only the second really mean "finished processing modules".
+ */
+static void
+crawling_finished_cb (TrackerProcessor *processor, gpointer user_data)
+{
+	gulong *callback_id = (gulong *)user_data;
+	GError *error;
+	gchar  *turtle_file;
+	static gint counter = 0;
+	
+	counter += 1;
+
+	if (counter >= 2) {
+		g_debug ("Uninstalling initial crawling callback");
+		g_signal_handler_disconnect (processor, *callback_id);
+
+		turtle_file = get_turtle_userdata_backup_filename ();
+		org_freedesktop_Tracker_Indexer_restore_backup (tracker_dbus_indexer_get_proxy (), 
+								turtle_file,
+								&error);
+		g_free (turtle_file);
+	} else {
+		g_debug ("%d finished signal", counter);
+	}
+}
+
 gint
 main (gint argc, gchar *argv[])
 {
@@ -764,6 +811,7 @@
 	TrackerDBManagerFlags	    flags = 0;
 	TrackerDBIndexManagerFlags  index_flags = 0;
 	gboolean		    is_first_time_index;
+	gulong                      callback_id;
 
 	g_type_init ();
 
@@ -786,7 +834,7 @@
 
 	/* Set timezone info */
 	tzset ();
-
+	
 	/* Translators: this messagge will apper immediately after the
 	 * usage string - Usage: COMMAND <THIS_MESSAGE>
 	 */
@@ -913,12 +961,43 @@
 		return EXIT_FAILURE;
 	}
 
+	tracker_turtle_init ();
+
 	tracker_module_config_init ();
 
 	flags |= TRACKER_DB_MANAGER_REMOVE_CACHE;
 	index_flags |= TRACKER_DB_INDEX_MANAGER_READONLY;
 
 	if (force_reindex) {
+
+		gchar              *turtle_file;
+
+		turtle_file = get_turtle_userdata_backup_filename ();
+
+		g_message ("Saving metadata in %s", turtle_file);
+
+		/* Init the DB stack */
+		tracker_db_manager_init (0, &is_first_time_index, TRUE);
+
+		tracker_db_index_manager_init (0,
+					       tracker_config_get_min_bucket_count (config),
+					       tracker_config_get_max_bucket_count (config));
+		
+		file_index = tracker_db_index_manager_get_index (TRACKER_DB_INDEX_FILE);
+		email_index = tracker_db_index_manager_get_index (TRACKER_DB_INDEX_EMAIL);
+		
+		tracker_data_manager_init (config, language, file_index, email_index);
+		
+		tracker_backup_save (turtle_file);
+
+		/* Shutdown the DB stack */
+		tracker_data_manager_shutdown ();
+		
+		tracker_db_index_manager_shutdown ();
+		tracker_db_manager_shutdown ();
+
+		g_free (turtle_file);
+
 		flags |= TRACKER_DB_MANAGER_FORCE_REINDEX;
 		index_flags |= TRACKER_DB_INDEX_MANAGER_FORCE_REINDEX;
 	}
@@ -1035,6 +1114,13 @@
 		tracker_status_set_and_signal (TRACKER_STATUS_IDLE);
 	}
 
+	if (flags & TRACKER_DB_MANAGER_FORCE_REINDEX) {
+		g_debug ("Setting callback for crawling finish detection");
+		callback_id = g_signal_connect (private->processor, "finished", 
+						G_CALLBACK (crawling_finished_cb), 
+						&callback_id);
+	}
+
 	if (tracker_status_get_is_running ()) {
 		private->main_loop = g_main_loop_new (NULL, FALSE);
 		g_main_loop_run (private->main_loop);
@@ -1082,6 +1168,7 @@
 	tracker_module_config_shutdown ();
 	tracker_nfs_lock_shutdown ();
 	tracker_status_shutdown ();
+	tracker_turtle_shutdown ();
 	tracker_log_shutdown ();
 
 #ifdef HAVE_HAL
Index: src/trackerd/Makefile.am
===================================================================
--- src/trackerd/Makefile.am	(revision 2649)
+++ src/trackerd/Makefile.am	(working copy)
@@ -17,6 +17,7 @@
 	$(GIO_CFLAGS)							\
 	$(GMODULE_CFLAGS)						\
 	$(GTHREAD_CFLAGS)						\
+	$(RAPTOR_CFLAGS)						\
 	$(GLIB2_CFLAGS)
 
 if HAVE_INOTIFY
@@ -29,6 +30,8 @@
 libexec_PROGRAMS = trackerd
 
 trackerd_SOURCES =							\
+	tracker-backup.h						\
+	tracker-backup.c						\
 	tracker-crawler.c						\
 	tracker-crawler.h						\
 	tracker-daemon.c						\
@@ -85,6 +88,7 @@
 	$(GMODULE_LIBS)							\
 	$(GTHREAD_LIBS)							\
 	$(GLIB2_LIBS)							\
+	$(RAPTOR_LIBS)							\
 	$(trackerd_win_libs)						\
 	-lz								\
 	-lm
Index: src/libtracker-db/tracker-db-manager.c
===================================================================
--- src/libtracker-db/tracker-db-manager.c	(revision 2649)
+++ src/libtracker-db/tracker-db-manager.c	(working copy)
@@ -2726,12 +2726,20 @@
 	g_free (services_dir);
 	g_free (sql_dir);
 
-	if (file_iface)
+	if (file_iface) {
 		g_object_unref (file_iface);
-	if (email_iface)
+		file_iface = NULL;
+	}
+
+	if (email_iface) {
 		g_object_unref (email_iface);
-	if (xesam_iface)
+		email_iface = NULL;
+	}
+
+	if (xesam_iface) {
 		g_object_unref (xesam_iface);
+		xesam_iface = NULL;
+	}
 
 
 	/* Since we don't reference this enum anywhere, we do
Index: src/libtracker-common/tracker-hal.c
===================================================================
--- src/libtracker-common/tracker-hal.c	(revision 2649)
+++ src/libtracker-common/tracker-hal.c	(working copy)
@@ -1136,6 +1136,77 @@
 }
 
 /**
+ * tracker_hal_path_is_on_removable_device:
+ * @hal: A #TrackerHal
+ * @path: a path
+ * @mount_mount: (out): if @path is on a removable device, the mount point will
+ * be filled in here
+ * @available: (out): if @path is on a removable device, this will be set to 
+ * TRUE in case the file is available right now
+ *
+ * Returns Whether or not @path is on a known removable device
+ *
+ * Returns: Whether or not @path is on a known removable device
+ **/
+gboolean
+tracker_hal_path_is_on_removable_device (TrackerHal  *hal,
+					 const gchar *path,
+					 gchar      **mount_point,
+					 gboolean    *available)
+{
+	TrackerHalPriv *priv;
+	GHashTableIter  iter;
+	gboolean        found = FALSE;
+	gpointer        key, value;
+
+	g_return_val_if_fail (TRACKER_IS_HAL (hal), FALSE);
+
+	if (!path)
+		return FALSE;
+
+	priv = GET_PRIV (hal);
+
+	g_hash_table_iter_init (&iter, priv->removable_devices);
+
+	while (g_hash_table_iter_next (&iter, &key, &value)) {
+		LibHalVolume  *volume;
+		const gchar   *udi;
+		const gchar   *mp;
+
+		udi = (const gchar*) key;
+
+		volume = libhal_volume_from_udi (priv->context, udi);
+
+		if (!volume) {
+			g_message ("HAL device with udi:'%s' has no volume, "
+				   "should we delete?",
+				   udi);
+			continue;
+		}
+
+		mp = libhal_volume_get_mount_point (volume);
+
+		if (mp && strcmp (mp, path) != 0) {
+		  if (g_strrstr (path, mp)) {
+			found = TRUE;
+
+			if (mount_point)
+				*mount_point = g_strdup (mp);
+
+			if (available)
+				*available = libhal_volume_is_mounted (volume);
+			break;
+		  }
+		}
+
+		libhal_volume_free (volume);
+	}
+
+	return found;
+}
+
+
+/**
  * tracker_hal_get_removable_device_udis:
  * @hal: A #TrackerHal
  *
Index: src/libtracker-common/tracker-hal.h
===================================================================
--- src/libtracker-common/tracker-hal.h	(revision 2649)
+++ src/libtracker-common/tracker-hal.h	(working copy)
@@ -66,6 +66,10 @@
 						      const gchar *udi);
 gboolean     tracker_hal_udi_get_is_mounted          (TrackerHal  *hal,
 						      const gchar *udi);
+gboolean     tracker_hal_path_is_on_removable_device (TrackerHal  *hal,
+						      const gchar *path,
+						      gchar      **mount_point,
+						      gboolean    *available);
 
 #endif /* HAVE_HAL */
 
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 2649)
+++ ChangeLog	(working copy)
@@ -1,5 +1,19 @@
 2008-12-04  Ivan Frade  <[EMAIL PROTECTED]>
 
+	* src/tracker-indexer/tracker-removable-device.c:
+	Fixed compilation without libraptor.
+	
+2008-12-02  Ivan Frade  <[EMAIL PROTECTED]>
+
+	* src/trackerd/tracker-main.c
+	Init and shutdown of tracker_turtle in the main secuence.
+	Dynamic creation of backup turtle file.
+	
+	* src/trackerd/tracker-backup.[ch]:
+	Turtle filename as parameter to the module.
+
+2008-12-04  Ivan Frade  <[EMAIL PROTECTED]>
+
 	* src/tracker-indexer/tracker-indexer.c
 	(item_remove): Call recursively delete only when the uri is a
 	Folder. This speed up a lot the delete operation.
@@ -133,6 +147,60 @@
 
 	Fixes NB #93935.
 	
+2008-12-01  Ivan Frade  <[EMAIL PROTECTED]>
+
+	* src/trackerd/tracker-main.c: Readded static counter for
+	"Finished" signals and call to the "restore_backup" method in the
+	indexer.
+	
+	* src/trackerd/tracker-backup.[ch]: Removed "restore" method.
+
+2008-12-01  Ivan Frade  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-indexer.c:
+	Implemented restore metadata method. First version with "Files"
+	hardcoded.
+
+2008-12-01  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-indexer.c: The if-then-else here was just 
+	wrong. We were always writing something, even if the removed file was 
+	not on a removable device.
+
+2008-12-01  Ivan Frade  <[EMAIL PROTECTED]>
+
+	* data/db/sqlite-stored-procs.sql
+	* src/trackerd/tracker-backup.c
+	Retrieve also the service type of the file to backup. Needed to
+	set the rdf:type.
+	
+2008-12-01  Ivan Frade  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-indexer.[ch]
+	* data/dbus/tracker-indexer.xml:
+	Added new method "RestoreBackup" in the dbus API of the indexer.
+	
+2008-12-01  Ivan Frade  <[EMAIL PROTECTED]>
+
+	* src/libtracker-data/tracker-turtle.c:
+	(tracker_turtle_open): Check the module is initialized
+	
+2008-12-01  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-removable-device.c
+	* src/tracker-indexer/tracker-removable-device.h
+	* src/tracker-indexer/tracker-indexer.c: Added detecting the rdf-type
+	while writing out Turtle files to the metadata.ttl of a removable
+	device
+
+2008-12-01  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-removable-device.c
+	* src/libtracker-data/tracker-turtle.c
+	* src/libtracker-data/tracker-turtle.h
+	* src/trackerd/tracker-backup.c: Cleaning up code, fixed an #ifdef/#endif
+	placement in case you don't have raptor
+
 2008-12-01  Martyn Russell  <[EMAIL PROTECTED]>
 
 	* src/tracker-indexer/modules/dummy.c: Small code clean up.
@@ -158,11 +226,117 @@
 	directories to ignore and "*.rcore.lzo" to the list of files to
 	ignore. 
 
+2008-11-28  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-removable-device.c
+	* src/libtracker-data/tracker-turtle.c
+	* src/libtracker-data/tracker-data-update.c: Making removals work
+
+2008-11-28  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/libtracker-data/tracker-data-update.c
+	* src/libtracker-data/tracker-data-update.h
+	* src/tracker-indexer/tracker-removable-device.c: Making it actually work
+	* src/trackerd/tracker-backup.c: Fixed API of tracker_turtle_process, 
+	base_uri
+	* src/libtracker-data/tracker-turtle.c
+	* src/libtracker-data/tracker-turtle.h
+	* src/libtracker-common/tracker-hal.c: Fixed that the dir of the mount-
+	point itself is not detected as "on the device"
+
+2008-11-28  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-removable-device.c
+	* src/libtracker-common/tracker-hal.c: Various bugfixes for the Turtle
+	support
+
+2008-11-28  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-removable-device.c
+	* src/tracker-indexer/tracker-indexer.c
+	* src/libtracker-data/tracker-turtle.c: Implementing add, remove, move
+	events for Turtle (untested)
+
 2008-11-27  Philip Van Hoof  <[EMAIL PROTECTED]>
 
 	* src/libtracker-common/tracker-thumbnailer.c: Replaced a non-critical
 	warning with a message
 
+2008-11-27  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-main.c: Added turtle-support's init
+
+	* src/libtracker-data/tracker-turtle.c:
+	* src/tracker-indexer/tracker-removable-device.c
+	* src/libtracker-data/tracker-turtle.h: Migrated the optimizer to
+	tracker-turtle.c, migrated the 'storer' to use tracker-turtle.c/h's
+	tracker_turtle_processor
+
+2008-11-27  Ivan Frade  <[EMAIL PROTECTED]>
+
+	* src/trackerd/tracker-backup.c:
+	Remove the previous file when saving.
+	Cleaning a little bit the crime scene.
+	
+2008-11-27  Ivan Frade  <[EMAIL PROTECTED]>
+
+	* src/libtracker-data/tracker-turtle.[ch]
+	(tracker_turtle_process): Added a wrapper to raptor parse method.
+	
+	* src/trackerd/tracker-backup.[ch]
+	Using the new wrapper method to print parsed triplets.
+	
+	* src/trackerd/Makefile.am: Added compilation flags for raptor.
+	
+2008-11-27  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/libtracker-data/tracker-data-update.c: Mimicking what(ever)
+	index_metadata_item is doing to store metadata (also to cope with
+	list values)
+
+2008-11-27  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/libtracker-data/tracker-data-update.c: Coping with list-value
+	values while storing predicates coming from Turtle
+
+2008-11-27  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* turtle/src/libtracker-data/tracker-data-metadata.c: Memory leaks
+	when overwriting predicates in TrackerDataMetadata
+
+2008-11-27  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-removable-device.c
+	* src/libtracker-data/tracker-data-metadata.c
+	* src/libtracker-data/tracker-data-metadata.h: Coping with list-value 
+	values in the Turtle file
+
+2008-11-27  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-indexer.c
+	* src/libtracker-data/tracker-data-update.c
+	* src/libtracker-common/tracker-hal.c
+	* src/libtracker-common/tracker-hal.h: Calling the (stub) functions
+	added in previous commit at the right moments (at item_remove and
+	item_add_or_update)
+
+2008-11-27  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-removable-device.c
+	* src/tracker-indexer/tracker-removable-device.h: Created stubs for
+	adding 'adding', 'moving', 'removing' triples about resources to the
+	Turtle file
+
+	* src/libtracker-data/tracker-data-update.c: Added some comments
+
+2008-11-27  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-removable-device.c
+	* src/libtracker-data/tracker-data-update.c
+	* src/libtracker-data/tracker-data-update.h: Implemented removing 
+	a resource. Backported storing a resource from the decomposed 
+	tables -branch.
+
 2008-11-27  Martyn Russell  <[EMAIL PROTECTED]>
 
 	* src/libinotify/inotify-handle.c: Disable warning causing breaks
@@ -193,6 +367,51 @@
 	* src/tracker-indexer/tracker-metadata-utils.c: Added support for
 	multivalued field extraction using '|' as the separator.	
 
+2008-11-26  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-removable-device.c
+	* src/tracker-indexer/tracker-indexer.c
+	* src/tracker-indexer/tracker-indexer.h: Respecting TRANSACTION_MAX
+	during the Turtle import
+
+2008-11-26  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-removable-device.c: Copying which 
+	predicates that we don't know about in our own ontology.
+
+2008-11-26  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-removable-device.c
+	* src/libtracker-data/tracker-turtle.c: Implemented Turtle optimizer
+
+2008-11-26  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-removable-device.c
+	* src/tracker-indexer/tracker-removable-device.h
+	* src/tracker-indexer/tracker-indexer.c
+	* src/tracker-indexer/Makefile.am
+	* src/tracker-indexer/tracker-indexer.h
+	* src/libtracker-data/tracker-data-update.c
+	* src/libtracker-data/tracker-data-update.h
+	* tests/tracker-indexer/Makefile.am
+	* configure.ac: Further merging with Jürg's git's Turtle branch.
+	Note for the person who'll merg Jürg's git with this work:
+	tracker-indexer/tracker-turtle.c is replaced with 
+	tracker-indexer/tracker-removable-device.c and with 
+	libtracker-data/tracker-turtle.c (the code is split over the two
+	files). The function tracker_data_replace_service in 
+	libtracker-data/tracker-data-update.c was replaced with an empty
+	body implementation. Of course should the version in Jürg's git
+	branch be taken for the decomposed data model (instead of the empty
+	body implementation).
+
+2008-11-26  Philip Van Hoof  <[EMAIL PROTECTED]>
+
+	* src/tracker-indexer/tracker-removable-device.c
+	* src/libtracker-data/tracker-turtle.c
+	* src/libtracker-data/tracker-turtle.h: Various fixes for the Turtle
+	writer. Added turtle writers for metadata fields
+
 2008-11-26  Martyn Russell  <[EMAIL PROTECTED]>
 
 	* src/trackerd/tracker-cleanup.[ch]: Committed the changes I made
@@ -250,6 +469,27 @@
 	
 	This patch was written by Philip and reviewed/updated by Martyn.
 
+2008-11-25  Ivan Frade  <[EMAIL PROTECTED]>
+
+	* src/libtracker-data/tracker-data-query.[ch]
+	* data/db/sqlite-stored-procs.sql:
+	Added code and procedures to retrieve metadata for backup.
+	
+	* src/trackerd/tracker-main.c
+	* src/trackerd/Makefile.am
+	* src/trackerd/tracker-backup.[ch]
+	Logic in main to save data on --reindex
+	
+	* src/libtracker-db/tracker-db-manager.c:
+	Set pointers to NULL after unref to shutdown db manager cleanly.
+	
+	* configure.ac
+	* src/tracker-indexer/Makefile.am	
+	* src/libtracker-data/Makefile.am
+	* src/tracker-indexer/tracker-removable-device.[ch]
+	* src/libtracker-data/tracker-turtle.[ch]
+	Import and split of turtle code from Juergs branch.
+
 2008-11-24  Philip Van Hoof  <[EMAIL PROTECTED]>
 
 	* src/tracker-extract/tracker-albumart.c: Requesting thumbnails of 
Index: tests/tracker-indexer/Makefile.am
===================================================================
--- tests/tracker-indexer/Makefile.am	(revision 2649)
+++ tests/tracker-indexer/Makefile.am	(working copy)
@@ -18,6 +18,7 @@
 	$(PANGO_CFLAGS)							\
 	$(GMODULE_CFLAGS)						\
 	$(GTHREAD_CFLAGS)						\
+	$(RAPTOR_CFLAGS)						\
 	$(GLIB2_CFLAGS)
 
 tracker_metadata_utils_SOURCES = 					\
@@ -34,7 +35,9 @@
 	tracker-module-file.c						\
 	tracker-module-file.h						\
 	tracker-module-iteratable.c					\
-	tracker-module-iteratable.h					
+	tracker-module-iteratable.h					\
+	tracker-removable-device.c					\
+	tracker-removable-device.h
 
 tracker_metadata_utils_LDADD =	                                        \
 	$(top_builddir)/src/libtracker-data/libtracker-data.la 		\
@@ -46,6 +49,7 @@
 	$(GMODULE_LIBS)							\
 	$(GTHREAD_LIBS)							\
 	$(GIO_LIBS)							\
+	$(RAPTOR_LIBS)							\
 	$(GLIB2_LIBS)							
 
 #
Index: configure.ac
===================================================================
--- configure.ac	(revision 2649)
+++ configure.ac	(working copy)
@@ -170,6 +170,15 @@
 
 AM_CONDITIONAL(HAVE_GCONF, test "$have_gconf" = "yes")
 
+# Check for Raptor
+PKG_CHECK_MODULES(RAPTOR, [raptor], have_raptor=yes, have_raptor=no)
+AC_SUBST(RAPTOR_CFLAGS)
+AC_SUBST(RAPTOR_LIBS)
+
+if test x$have_raptor == "xyes"; then
+  AC_DEFINE(HAVE_RAPTOR, 1, [Raptor RDF parsers])
+fi
+
 # Check we have the DBUS binding tool we need
 AC_PATH_PROG(DBUSBINDINGTOOL, dbus-binding-tool)
 if test -z $DBUSBINDINGTOOL; then
@@ -1110,6 +1119,8 @@
                 tests/tracker-indexer/tracker-module-file.h:src/tracker-indexer/tracker-module-file.h
                 tests/tracker-indexer/tracker-module-iteratable.c:src/tracker-indexer/tracker-module-iteratable.c
                 tests/tracker-indexer/tracker-module-iteratable.h:src/tracker-indexer/tracker-module-iteratable.h
+		tests/tracker-indexer/tracker-removable-device.c:src/tracker-indexer/tracker-removable-device.c
+		tests/tracker-indexer/tracker-removable-device.h:src/tracker-indexer/tracker-removable-device.h
 )
 
 ##################################################################
Index: data/db/sqlite-stored-procs.sql
===================================================================
--- data/db/sqlite-stored-procs.sql	(revision 2649)
+++ data/db/sqlite-stored-procs.sql	(working copy)
@@ -63,6 +63,7 @@
 /*
  * Metadata/MIME queries
  */
+GetEmbeddedMetadataBackup      SELECT S.Path || '/' || S.Name, T.TypeName, F.MetadataID, F.MetadataDisplay From Services S, ServiceMetadata F, ServiceTypes T WHERE (S.ID == F.ServiceID) AND (S.ServiceTypeID == T.TypeID) AND (F.MetadataID IN (SELECT ID From MetadataTypes WHERE Embedded = 0)) UNION SELECT S.Path || '/' || S.Name, T.TypeName, F.MetadataID, upper(F.MetadataValue) From Services S, ServiceNumericMetadata F, ServiceTypes T WHERE (S.ID == F.ServiceID) AND (S.ServiceTypeID == T.TypeID) AND (F.MetadataID IN (SELECT ID From MetadataTypes WHERE Embedded = 0)) UNION SELECT S.Path || '/' || S.Name, T.Typename, F.MetadataID, F.MetadataValue From Services S, ServiceKeywordMetadata F, ServiceTypes T WHERE (S.ID == F.ServiceID) AND (S.ServiceTypeID == T.TypeID) AND (F.MetadataID IN (SELECT ID From MetadataTypes WHERE Embedded = 0));
 GetAllMetadata                 SELECT MetadataID, MetadataDisplay FROM ServiceMetadata WHERE ServiceID = ? UNION SELECT MetadataID, MetadataValue FROM ServiceKeywordMetadata WHERE ServiceID = ? UNION SELECT MetadataID, upper(MetadataValue) FROM ServiceNumericMetadata WHERE ServiceID = ?;
 GetMetadata                    SELECT MetaDataDisplay FROM ServiceMetaData WHERE ServiceID = ? AND MetaDataID = ?;
 GetMetadataAliases             SELECT DISTINCT M.MetaName, M.ID FROM MetaDataTypes AS M, MetaDataChildren AS C WHERE M.ID = C.ChildID AND C.MetaDataID = ?; 
Index: data/dbus/tracker-indexer.xml
===================================================================
--- data/dbus/tracker-indexer.xml	(revision 2649)
+++ data/dbus/tracker-indexer.xml	(working copy)
@@ -74,6 +74,11 @@
       <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
     </method>
 
+    <method name="RestoreBackup">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/>
+      <arg type="s" name="backup_file" direction="in" />
+    </method>
+
     <!-- Signals --> 
     <signal name="Status">
       <arg type="d" name="elapsed_time" />
_______________________________________________
tracker-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/tracker-list

Reply via email to