tracker r2879 - in trunk: . data/db src/libtracker-data src/tracker-indexer



Author: carlosg
Date: Thu Feb  5 12:07:03 2009
New Revision: 2879
URL: http://svn.gnome.org/viewvc/tracker?rev=2879&view=rev

Log:
2009-02-05  Carlos Garnacho  <carlos imendio com>

        Let the indexer perform recursive move operations, so all files inside
        get the path changed in the index. This also makes the whole move
        operation asynchronous, so tracker-indexer can be paused in between.

        * data/db/sqlite-stored-procs.sql (GetFileChilden): new stored
        procedure to get the immediate children for a given path.

        * src/libtracker-data/tracker-data-query.[ch]
        (tracker_data_query_service_children): New function to wrap that
        stored procedure.

        * src/libtracker-data/tracker-data-update.c
        (tracker_data_update_move_service): Do not move service children,
        this is done now by the indexer itself.

        * src/tracker-indexer/tracker-indexer.c
        (filter_invalid_after_move_properties): Code legibility improvements.
        (update_moved_item_thumbnail) (update_moved_item_removable_device)
        (update_moved_item_index): Refactored out from item_move().
        (item_move): Append move operations for all children in the indexer
        queue.

Modified:
   trunk/ChangeLog
   trunk/data/db/sqlite-stored-procs.sql
   trunk/src/libtracker-data/tracker-data-query.c
   trunk/src/libtracker-data/tracker-data-query.h
   trunk/src/libtracker-data/tracker-data-update.c
   trunk/src/tracker-indexer/tracker-indexer.c

Modified: trunk/data/db/sqlite-stored-procs.sql
==============================================================================
--- trunk/data/db/sqlite-stored-procs.sql	(original)
+++ trunk/data/db/sqlite-stored-procs.sql	Thu Feb  5 12:07:03 2009
@@ -13,7 +13,7 @@
 GetFileByID2                   SELECT (S.Path || '/' || S.Name) AS uri, GetServiceName (ServiceTypeID), S.Mime FROM Services AS S WHERE S.ID = ? AND S.Enabled = 1 AND (S.AuxilaryID = 0 OR S.AuxilaryID IN (SELECT VolumeID FROM Volumes WHERE Enabled = 1));
 GetFileMTime                   SELECT M.MetaDataValue FROM Services AS S INNER JOIN ServiceNumericMetaData M ON S.ID = M.ServiceID WHERE S.Path = ? AND S.Name = ? AND M.MetaDataID = (SELECT ID FROM MetaDataTypes WHERE MetaName ='File:Modified');
 GetServices                    SELECT TypeName, Description, Parent FROM ServiceTypes ORDER BY TypeID;
-
+GetFileChildren                SELECT ID, Name FROM Services WHERE Path = ?;
 
 /*
  * Live search queries

Modified: trunk/src/libtracker-data/tracker-data-query.c
==============================================================================
--- trunk/src/libtracker-data/tracker-data-query.c	(original)
+++ trunk/src/libtracker-data/tracker-data-query.c	Thu Feb  5 12:07:03 2009
@@ -379,6 +379,52 @@
 	return service_type_id;
 }
 
+GHashTable *
+tracker_data_query_service_children (TrackerService *service,
+				     const gchar    *dirname)
+{
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	gboolean valid = TRUE;
+	GHashTable *children;
+
+	iface = tracker_db_manager_get_db_interface_by_type (tracker_service_get_name (service),
+							     TRACKER_DB_CONTENT_TYPE_METADATA);
+
+	result_set = tracker_db_interface_execute_procedure (iface, NULL,
+							     "GetFileChildren",
+							     dirname,
+							     dirname,
+							     NULL);
+
+	if (!result_set) {
+		return NULL;
+	}
+
+	children = g_hash_table_new_full (g_direct_hash,
+					  g_direct_equal,
+					  NULL,
+					  (GDestroyNotify) g_free);
+
+	while (valid) {
+		guint32 id;
+		gchar *child_path;
+
+		tracker_db_result_set_get (result_set,
+					   0, &id,
+					   1, &child_path,
+					   -1);
+
+		g_hash_table_insert (children, GUINT_TO_POINTER (id), child_path);
+
+		valid = tracker_db_result_set_iter_next (result_set);
+	}
+
+	g_object_unref (result_set);
+
+	return children;
+}
+
 /*
  * Result set with (metadataID, value) per row
  */

Modified: trunk/src/libtracker-data/tracker-data-query.h
==============================================================================
--- trunk/src/libtracker-data/tracker-data-query.h	(original)
+++ trunk/src/libtracker-data/tracker-data-query.h	Thu Feb  5 12:07:03 2009
@@ -70,6 +70,8 @@
 							       time_t              *mtime);
 guint                tracker_data_query_service_type_id       (const gchar         *dirname,
 							       const gchar         *basename);
+GHashTable *         tracker_data_query_service_children      (TrackerService      *service,
+							       const gchar         *dirname);
 
 /* Service API */
 G_CONST_RETURN gchar *

Modified: trunk/src/libtracker-data/tracker-data-update.c
==============================================================================
--- trunk/src/libtracker-data/tracker-data-update.c	(original)
+++ trunk/src/libtracker-data/tracker-data-update.c	Thu Feb  5 12:07:03 2009
@@ -306,22 +306,6 @@
 		g_warning ("%s", error->message);
 		g_error_free (error);
 		retval = FALSE;
-	} else {
-		if (strcmp (tracker_service_get_name (service), "Folders") == 0) {
-			tracker_db_interface_execute_procedure (iface,
-								&error,
-								"MoveServiceChildren",
-								from,
-								to,
-								from,
-								from,
-								NULL);
-
-			if (error) {
-				g_warning ("%s", error->message);
-				g_error_free (error);
-			}
-		}
 	}
 
 	g_free (to_dirname);

Modified: trunk/src/tracker-indexer/tracker-indexer.c
==============================================================================
--- trunk/src/tracker-indexer/tracker-indexer.c	(original)
+++ trunk/src/tracker-indexer/tracker-indexer.c	Thu Feb  5 12:07:03 2009
@@ -1568,10 +1568,136 @@
 				      gpointer value,
 				      gpointer user_data) 
 {
-	return g_strcmp0 (tracker_field_get_name (field), METADATA_FILE_NAME_DELIMITED) 
-		&& g_strcmp0 (tracker_field_get_name (field), METADATA_FILE_NAME)
-		&& g_strcmp0 (tracker_field_get_name (field), METADATA_FILE_PATH)
-		&& g_strcmp0 (tracker_field_get_name (field), METADATA_FILE_EXT);
+	const gchar *name;
+
+	name = tracker_field_get_name (field);
+
+	if (g_strcmp0 (name, METADATA_FILE_NAME_DELIMITED) == 0 ||
+	    g_strcmp0 (name, METADATA_FILE_NAME) == 0 ||
+	    g_strcmp0 (name, METADATA_FILE_PATH) == 0 ||
+	    g_strcmp0 (name, METADATA_FILE_EXT) == 0) {
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+static void
+update_moved_item_thumbnail (TrackerIndexer      *indexer,
+			     TrackerDataMetadata *old_metadata,
+			     GFile               *file,
+			     GFile               *source_file)
+{
+	gchar *uri, *source_uri;
+	const gchar *mime_type;
+
+	if (!old_metadata) {
+		gchar *path;
+
+		path = g_file_get_path (file);
+		g_message ("Could not get mime type to remove thumbnail for:'%s'", path);
+		g_free (path);
+
+		return;
+	}
+
+	/* TODO URI branch: this is a URI conversion */
+	uri = g_file_get_uri (file);
+	source_uri = g_file_get_uri (source_file);
+
+	mime_type = tracker_data_metadata_lookup (old_metadata, "File:Mime");
+	tracker_thumbnailer_move (source_uri, mime_type, uri);
+
+	g_free (source_uri);
+	g_free (uri);
+}
+
+static void
+update_moved_item_removable_device (TrackerIndexer *indexer,
+				    TrackerService *service,
+				    GFile          *file,
+				    GFile          *source_file)
+{
+	const gchar *service_name;
+	gchar *path, *source_path;
+	gchar *mount_point = NULL;
+
+	service_name = tracker_service_get_name (service);
+	path = g_file_get_path (file);
+	source_path = g_file_get_path (source_file);
+
+	if (tracker_hal_path_is_on_removable_device (indexer->private->hal,
+						     source_path,
+						     &mount_point,
+						     NULL) ) {
+
+		if (tracker_hal_path_is_on_removable_device (indexer->private->hal,
+						     path,
+						     NULL,
+						     NULL) ) {
+
+			tracker_removable_device_add_move (indexer,
+							   mount_point,
+							   source_path,
+							   path,
+							   service_name);
+
+		} else {
+			tracker_removable_device_add_removal (indexer,
+							      mount_point,
+							      source_path,
+							      service_name);
+		}
+	}
+
+	g_free (mount_point);
+	g_free (source_path);
+	g_free (path);
+}
+
+static void
+update_moved_item_index (TrackerIndexer      *indexer,
+			 TrackerService      *service,
+			 TrackerDataMetadata *old_metadata,
+			 guint32              service_id,
+			 GFile               *file,
+			 GFile               *source_file)
+{
+	TrackerModuleMetadata *new_metadata;
+	gchar *path, *new_path, *new_name;
+	const gchar *ext;
+
+	path = g_file_get_path (file);
+
+	/*
+	 *  Update what changes in move event (Path related properties)
+	 */
+	tracker_data_metadata_foreach_remove (old_metadata,
+					      filter_invalid_after_move_properties,
+					      NULL);
+
+	unindex_metadata (indexer, service_id, service, old_metadata);
+
+	new_metadata = tracker_module_metadata_new ();
+
+	tracker_file_get_path_and_name (path, &new_path, &new_name);
+
+	tracker_module_metadata_add_string (new_metadata, METADATA_FILE_PATH, new_path);
+	tracker_module_metadata_add_string (new_metadata, METADATA_FILE_NAME, new_name);
+	tracker_module_metadata_add_string (new_metadata, METADATA_FILE_NAME_DELIMITED, path);
+
+	ext = strrchr (path, '.');
+	if (ext) {
+		ext++;
+		tracker_module_metadata_add_string (new_metadata, METADATA_FILE_EXT, ext);
+	}
+
+	index_metadata (indexer, service_id, service, new_metadata);
+
+	g_object_unref (new_metadata);
+	g_free (new_path);
+	g_free (new_name);
+	g_free (path);
 }
 
 static void
@@ -1582,12 +1708,9 @@
 {
 	TrackerService *service;
 	TrackerDataMetadata *old_metadata;
-	TrackerModuleMetadata *new_metadata;
-	gchar *new_path, *new_name, *ext;
 	gchar *path, *source_path;
-	gchar *source_uri, *uri;
 	guint32 service_id;
-	gchar *mount_point = NULL;
+	GHashTable *children = NULL;
 
 	service = get_service_for_file (info->module_file, info->module);
 
@@ -1627,6 +1750,10 @@
 		return;
 	}
 
+	if (strcmp (tracker_service_get_name (service), "Folders") == 0) {
+		children = tracker_data_query_service_children (service, source_path);
+	}
+
 	/* Get mime type in order to move thumbnail from thumbnailerd */
 	old_metadata = tracker_data_query_metadata (service, service_id, TRUE);
 
@@ -1659,82 +1786,44 @@
 		}
 	}
 
-	if (old_metadata) {
-		const gchar *mime_type;
+	/* Update item being moved */
+	update_moved_item_thumbnail (indexer, old_metadata, info->file, info->source_file);
+	update_moved_item_removable_device (indexer, service, info->file, info->source_file);
+	update_moved_item_index (indexer, service, old_metadata, service_id, info->file, info->source_file);
 
-		/* TODO URI branch: this is a URI conversion */
-		uri = g_file_get_uri (info->file);
-		source_uri = g_file_get_uri (info->source_file);
+	if (children) {
+		GHashTableIter iter;
+		gpointer key, value;
 
-		mime_type = tracker_data_metadata_lookup (old_metadata, "File:Mime");
-		tracker_thumbnailer_move (source_uri, mime_type, uri);
+		g_hash_table_iter_init (&iter, children);
 
-		g_free (source_uri);
-		g_free (uri);
-	} else {
-		g_message ("Could not get mime type to remove thumbnail for:'%s'",
-			   path);
-	}
+		/* Queue children to be moved */
+		while (g_hash_table_iter_next (&iter, &key, &value)) {
+			PathInfo *child_info;
+			const gchar *child_name;
+			GFile *child_file, *child_source_file;
 
-	if (tracker_hal_path_is_on_removable_device (indexer->private->hal,
-						     source_path,
-						     &mount_point,
-						     NULL) ) {
+			child_name = (const gchar *) value;
 
-		if (tracker_hal_path_is_on_removable_device (indexer->private->hal,
-						     path,
-						     NULL,
-						     NULL) ) {
+			child_file = g_file_get_child (info->file, child_name);
+			child_source_file = g_file_get_child (info->source_file, child_name);
 
-			tracker_removable_device_add_move (indexer, 
-							   mount_point, 
-							   source_path,
-							   path,
-							   tracker_service_get_name (service));
+			child_info = path_info_new (info->module, child_file, child_source_file);
+			add_file (indexer, child_info);
 
-		} else {
-			tracker_removable_device_add_removal (indexer, 
-							      mount_point, 
-							      source_path,
-							      tracker_service_get_name (service));
+			g_object_unref (child_file);
+			g_object_unref (child_source_file);
 		}
-	}
-
-	g_free (mount_point);
-
-	/*
-	 *  Updating what changes in move event (Path related properties)
-	 */
-	tracker_data_metadata_foreach_remove (old_metadata,
-					      filter_invalid_after_move_properties,
-					      NULL);
 
-	unindex_metadata (indexer, service_id, service, old_metadata);
-
-	new_metadata = tracker_module_metadata_new ();
-
-	tracker_file_get_path_and_name (path, &new_path, &new_name);
-
-	tracker_module_metadata_add_string (new_metadata, METADATA_FILE_PATH, new_path);
-	tracker_module_metadata_add_string (new_metadata, METADATA_FILE_NAME, new_name);
-	tracker_module_metadata_add_string (new_metadata, METADATA_FILE_NAME_DELIMITED, path);
-
-	g_free (new_path);
-	g_free (new_name);
-
-	ext = strrchr (path, '.');
-	if (ext) {
-		ext++;
-		tracker_module_metadata_add_string (new_metadata, METADATA_FILE_EXT, ext);
+		g_hash_table_destroy (children);
 	}
 
-	index_metadata (indexer, service_id, service, new_metadata);
-
-	tracker_data_metadata_free (old_metadata);
-	g_object_unref (new_metadata);
+	if (old_metadata) {
+		tracker_data_metadata_free (old_metadata);
+	}
 
-	g_free (path);
 	g_free (source_path);
+	g_free (path);
 }
 
 



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