tracker r1918 - in branches/indexer-split: . src/tracker-indexer



Author: carlosg
Date: Wed Jul 23 15:08:00 2008
New Revision: 1918
URL: http://svn.gnome.org/viewvc/tracker?rev=1918&view=rev

Log:
2008-07-23  Carlos Garnacho  <carlos imendio com>

        Check that a service exists before inserting it again in the database.

        * src/tracker-indexer/tracker-indexer-db.[ch]
        (get_dirname_and_basename): New helper function.
        (tracker_db_check_service): New function, returns the ID for the
        service (if any).
        * src/tracker-indexer/tracker-indexer.c (process_file): Check that the
        service doesn't exist before trying to index it.


Modified:
   branches/indexer-split/ChangeLog
   branches/indexer-split/src/tracker-indexer/tracker-indexer-db.c
   branches/indexer-split/src/tracker-indexer/tracker-indexer-db.h
   branches/indexer-split/src/tracker-indexer/tracker-indexer.c

Modified: branches/indexer-split/src/tracker-indexer/tracker-indexer-db.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-indexer-db.c	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-indexer-db.c	Wed Jul 23 15:08:00 2008
@@ -37,7 +37,7 @@
 	TrackerDBInterface *temp_iface;
 	static guint32      max = 0;
 
-	if (max != 0) {
+	if (G_LIKELY (max != 0)) {
 		return ++max;
 	}
 
@@ -92,7 +92,7 @@
 	}
 }
 
-gboolean
+void
 tracker_db_create_event (TrackerDBInterface *iface,
 			   guint32 service_id, 
 			   const gchar *type)
@@ -107,8 +107,56 @@
 						NULL);
 
 	g_free (service_id_str);
+}
 
-	return TRUE;
+static void
+get_dirname_and_basename (const gchar  *path,
+			  GHashTable   *metadata,
+			  gchar       **out_dirname,
+			  gchar       **out_basename)
+{
+	const gchar *dirname, *basename;
+
+	dirname = g_hash_table_lookup (metadata, "File:Path");
+	basename = g_hash_table_lookup (metadata, "File:Name");
+
+	if (dirname && basename) {
+		*out_dirname = g_strdup (dirname);
+		*out_basename = g_strdup (basename);
+	} else {
+		*out_dirname = g_path_get_dirname (path);
+		*out_basename = g_path_get_basename (path);
+	}
+}
+
+guint
+tracker_db_check_service (TrackerDBInterface *iface,
+			  const gchar        *path,
+			  GHashTable         *metadata)
+{
+	TrackerDBResultSet *result_set;
+	gchar *dirname, *basename;
+	guint id;
+
+	get_dirname_and_basename (path, metadata, &dirname, &basename);
+
+	result_set = tracker_db_interface_execute_procedure (iface, NULL,
+							     "GetServiceID",
+							     dirname,
+							     basename,
+							     NULL);
+
+	g_free (dirname);
+	g_free (basename);
+
+	if (!result_set) {
+		return 0;
+	}
+
+	tracker_db_result_set_get (result_set, 0, &id, -1);
+	g_object_unref (result_set);
+
+	return id;
 }
 
 gboolean
@@ -126,21 +174,11 @@
 		return FALSE;
 	}
 
+	get_dirname_and_basename (path, metadata, &dirname, &basename);
+
 	id_str = tracker_guint32_to_string (id);
 	service_type_id_str = tracker_int_to_string (tracker_service_get_id (service));
 
-	dirname = g_hash_table_lookup (metadata, "File:Path");
-	basename = g_hash_table_lookup (metadata, "File:Name");
-
-	if (dirname && basename) {
-		/* Keep a copy */
-		dirname = g_strdup (dirname);
-		basename = g_strdup (basename);
-	} else {
-		dirname = g_path_get_dirname (path);
-		basename = g_path_get_basename (path);
-	}
-
 	is_dir = g_file_test (path, G_FILE_TEST_IS_DIR);
 	is_symlink = g_file_test (path, G_FILE_TEST_IS_SYMLINK);
 

Modified: branches/indexer-split/src/tracker-indexer/tracker-indexer-db.h
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-indexer-db.h	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-indexer-db.h	Wed Jul 23 15:08:00 2008
@@ -30,6 +30,10 @@
 guint32  tracker_db_get_new_service_id (TrackerDBInterface *iface);
 void     tracker_db_increment_stats    (TrackerDBInterface *iface,
                                         TrackerService     *service);
+
+guint    tracker_db_check_service      (TrackerDBInterface *iface,
+					const gchar        *path,
+					GHashTable         *metadata);
 gboolean tracker_db_create_service     (TrackerDBInterface *iface,
                                         guint32             id,
                                         TrackerService     *service,
@@ -43,7 +47,7 @@
 void     tracker_db_set_text           (TrackerDBInterface *iface,
 					guint32             id,
 					const gchar        *text);
-gboolean tracker_db_create_event       (TrackerDBInterface *iface,
+void     tracker_db_create_event       (TrackerDBInterface *iface,
                                         guint32             service_id,
                                         const gchar        *type);
 

Modified: branches/indexer-split/src/tracker-indexer/tracker-indexer.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-indexer.c	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-indexer.c	Wed Jul 23 15:08:00 2008
@@ -736,9 +736,9 @@
 
 static void
 index_metadata (TrackerIndexer *indexer,
-		guint32 id,
+		guint32         id,
 		TrackerService *service,
-		GHashTable *metadata)
+		GHashTable     *metadata)
 {
 	MetadataForeachData data;
 
@@ -756,7 +756,7 @@
 
 static gboolean
 process_file (TrackerIndexer *indexer,
-	      PathInfo *info)
+	      PathInfo       *info)
 {
 	GHashTable *metadata;
 
@@ -774,40 +774,43 @@
 
 	if (metadata) {
 		TrackerService *service_def;
-		gchar *service_type, *mimetype;
-		gboolean created;
+		gchar *service_type, *mimetype, *text;
 		guint32 id;
 
 		mimetype = tracker_file_get_mime_type (info->file->path);
 		service_type = tracker_ontology_get_service_type_for_mime (mimetype);
 		service_def = tracker_ontology_get_service_type_by_name (service_type);
 
-		id = tracker_db_get_new_service_id (indexer->private->common);
-
-		created = tracker_db_create_service (indexer->private->metadata, 
-						     id, 
-						     service_def, 
-						     info->file->path, 
-						     metadata);
-
 		g_free (service_type);
 		g_free (mimetype);
-		
-		if (created) {
-			gchar *text;
 
-			created = tracker_db_create_event (indexer->private->cache, 
-							   id,
-							   "Create");
-			tracker_db_increment_stats (indexer->private->common, service_def);
+		if (service_def) {
+			id = tracker_db_check_service (indexer->private->metadata,
+						       info->file->path,
+						       metadata);
+
+			/* FIXME: should check mtime and reindex if necessary */
+
+			if (id == 0) {
+				/* Service wasn't previously indexed */
+				id = tracker_db_get_new_service_id (indexer->private->common);
+
+				tracker_db_create_service (indexer->private->metadata,
+							   id, service_def,
+							   info->file->path,
+							   metadata);
+
+				tracker_db_create_event (indexer->private->cache, id, "Create");
+				tracker_db_increment_stats (indexer->private->common, service_def);
 
-			index_metadata (indexer, id, service_def, metadata);
+				index_metadata (indexer, id, service_def, metadata);
 
-			text = tracker_indexer_module_file_get_text (info->module, info->file);
+				text = tracker_indexer_module_file_get_text (info->module, info->file);
 
-			if (text) {
-				tracker_db_set_text (indexer->private->contents, id, text);
-				g_free (text);
+				if (text) {
+					tracker_db_set_text (indexer->private->contents, id, text);
+					g_free (text);
+				}
 			}
 
 		}



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