tracker r1930 - in branches/indexer-split: . src/libtracker-common src/libtracker-db src/tracker-indexer



Author: carlosg
Date: Thu Jul 24 16:02:40 2008
New Revision: 1930
URL: http://svn.gnome.org/viewvc/tracker?rev=1930&view=rev

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

        Store things in the correct DB based on the service type.

        * src/libtracker-common/tracker-ontology.c
        (tracker_ontology_get_db_for_service_type): Return
        TRACKER_DB_TYPE_FILES by default, as most of the services want to end
        up there.
        * src/libtracker-db/tracker-db-manager.[ch]
        (tracker_db_manager_get_db_interface_by_type): New function, returns a
        non-attached interface given the service type and the data content we
        want to deal with (contents/metadata).
        * src/tracker-indexer/tracker-indexer-db.[ch]: Pass the TrackerService
        instead of a TrackerDBInterface where it's relevant, so functions can
        guess the correct database based on it.
        * src/tracker-indexer/tracker-indexer.c: Adapt to API changes in
        tracker-indexer-db.[ch].


Modified:
   branches/indexer-split/ChangeLog
   branches/indexer-split/src/libtracker-common/tracker-ontology.c
   branches/indexer-split/src/libtracker-db/tracker-db-manager.c
   branches/indexer-split/src/libtracker-db/tracker-db-manager.h
   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/libtracker-common/tracker-ontology.c
==============================================================================
--- branches/indexer-split/src/libtracker-common/tracker-ontology.c	(original)
+++ branches/indexer-split/src/libtracker-common/tracker-ontology.c	Thu Jul 24 16:02:40 2008
@@ -334,11 +334,11 @@
 	TrackerDBType  type;
 	gchar         *str;
 
-	type = TRACKER_DB_TYPE_DATA;
+	type = TRACKER_DB_TYPE_FILES;
 	str = g_utf8_strdown (service_str, -1);
 
-	if (g_str_has_prefix (str, "emails") || 
-	    g_str_has_prefix (str, "attachments")) {
+	if (g_str_has_suffix (str, "emails") || 
+	    g_str_has_suffix (str, "attachments")) {
 		type = TRACKER_DB_TYPE_EMAIL;
 	} else if (g_str_has_prefix (str, "files")) {
 		type = TRACKER_DB_TYPE_FILES;

Modified: branches/indexer-split/src/libtracker-db/tracker-db-manager.c
==============================================================================
--- branches/indexer-split/src/libtracker-db/tracker-db-manager.c	(original)
+++ branches/indexer-split/src/libtracker-db/tracker-db-manager.c	Thu Jul 24 16:02:40 2008
@@ -2583,6 +2583,43 @@
 	return iface;
 }
 
+TrackerDBInterface *
+tracker_db_manager_get_db_interface_by_type (const gchar          *service,
+					     TrackerDBContentType  content_type)
+{
+	TrackerDBType type;
+	TrackerDB db;
+
+	g_return_val_if_fail (initialized != FALSE, NULL);
+	g_return_val_if_fail (service != NULL, NULL);
+
+	type = tracker_ontology_get_db_for_service_type (service);
+
+	switch (type) {
+	case TRACKER_DB_TYPE_EMAIL:
+		if (content_type == TRACKER_DB_CONTENT_TYPE_METADATA) {
+			db = TRACKER_DB_EMAIL_METADATA;
+		} else {
+			db = TRACKER_DB_EMAIL_CONTENTS;
+		}
+
+		break;
+	case TRACKER_DB_TYPE_FILES:
+		if (content_type == TRACKER_DB_CONTENT_TYPE_METADATA) {
+			db = TRACKER_DB_FILE_METADATA;
+		} else {
+			db = TRACKER_DB_FILE_CONTENTS;
+		}
+
+		break;
+	default:
+		g_warning ("Database type not supported");
+		return NULL;
+	}
+
+	return tracker_db_manager_get_db_interface (db);
+}
+
 gboolean     
 tracker_db_manager_are_db_too_big (void)
 {

Modified: branches/indexer-split/src/libtracker-db/tracker-db-manager.h
==============================================================================
--- branches/indexer-split/src/libtracker-db/tracker-db-manager.h	(original)
+++ branches/indexer-split/src/libtracker-db/tracker-db-manager.h	Thu Jul 24 16:02:40 2008
@@ -40,6 +40,11 @@
 } TrackerDB;
 
 typedef enum {
+	TRACKER_DB_CONTENT_TYPE_METADATA,
+	TRACKER_DB_CONTENT_TYPE_CONTENTS
+} TrackerDBContentType;
+
+typedef enum {
 	TRACKER_DB_MANAGER_FORCE_REINDEX    = 1 << 1,
 	TRACKER_DB_MANAGER_REMOVE_CACHE     = 1 << 2,
 	TRACKER_DB_MANAGER_LOW_MEMORY_MODE  = 1 << 3,
@@ -65,6 +70,9 @@
              tracker_db_manager_get_db_interfaces           (gint num, ...);
 TrackerDBInterface *
              tracker_db_manager_get_db_interface_by_service (const gchar           *service);
+TrackerDBInterface *
+             tracker_db_manager_get_db_interface_by_type    (const gchar           *service,
+							     TrackerDBContentType   content_type);
 gboolean     tracker_db_manager_are_db_too_big              (void);
 
 G_END_DECLS

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	Thu Jul 24 16:02:40 2008
@@ -130,22 +130,24 @@
 }
 
 guint
-tracker_db_check_service (TrackerDBInterface *iface,
-			  const gchar        *path,
-			  GHashTable         *metadata)
+tracker_db_check_service (TrackerService *service,
+			  const gchar    *path,
+			  GHashTable     *metadata)
 {
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
 	gchar *dirname, *basename;
 	guint id;
 
 	get_dirname_and_basename (path, metadata, &dirname, &basename);
+	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,
 							     "GetServiceID",
 							     dirname,
 							     basename,
 							     NULL);
-
 	g_free (dirname);
 	g_free (basename);
 
@@ -160,12 +162,12 @@
 }
 
 gboolean
-tracker_db_create_service (TrackerDBInterface *iface,
-			   guint32             id,
-			   TrackerService     *service,
-			   const gchar        *path,
-			   GHashTable         *metadata)
+tracker_db_create_service (TrackerService *service,
+			   guint32         id,
+			   const gchar    *path,
+			   GHashTable     *metadata)
 {
+	TrackerDBInterface *iface;
 	gchar *id_str, *service_type_id_str;
 	gchar *dirname, *basename;
 	gboolean is_dir, is_symlink, enabled;
@@ -175,6 +177,8 @@
 	}
 
 	get_dirname_and_basename (path, metadata, &dirname, &basename);
+	iface = tracker_db_manager_get_db_interface_by_type (tracker_service_get_name (service),
+							     TRACKER_DB_CONTENT_TYPE_METADATA);
 
 	id_str = tracker_guint32_to_string (id);
 	service_type_id_str = tracker_int_to_string (tracker_service_get_id (service));
@@ -216,15 +220,18 @@
 }
 
 void
-tracker_db_set_metadata (TrackerDBInterface *iface,
-			 guint32             id,
-			 TrackerField       *field,
-			 const gchar        *value,
-			 const gchar        *parsed_value)
+tracker_db_set_metadata (TrackerService *service,
+			 guint32         id,
+			 TrackerField   *field,
+			 const gchar    *value,
+			 const gchar    *parsed_value)
 {
+	TrackerDBInterface *iface;
 	gchar *id_str;
 
 	id_str = tracker_guint32_to_string (id);
+	iface = tracker_db_manager_get_db_interface_by_type (tracker_service_get_name (service),
+							     TRACKER_DB_CONTENT_TYPE_METADATA);
 
 	switch (tracker_field_get_data_type (field)) {
 	case TRACKER_FIELD_TYPE_KEYWORD:
@@ -256,10 +263,7 @@
 							NULL);
 		break;
 	case TRACKER_FIELD_TYPE_FULLTEXT:
-		/* FIXME: missing DB connection to contents here */
-		/*
-		  tracker_db_set_text (iface, id, value);
-		*/
+		tracker_db_set_text (service, id, value);
 		break;
 	case TRACKER_FIELD_TYPE_BLOB:
 	case TRACKER_FIELD_TYPE_STRUCT:
@@ -273,15 +277,18 @@
 }
 
 void
-tracker_db_set_text (TrackerDBInterface *iface,
-		     guint32             id,
-		     const gchar        *text)
+tracker_db_set_text (TrackerService *service,
+		     guint32         id,
+		     const gchar    *text)
 {
+	TrackerDBInterface *iface;
 	TrackerField *field;
 	gchar *id_str;
 
 	id_str = tracker_guint32_to_string (id);
 	field = tracker_ontology_get_field_def ("File:Contents");
+	iface = tracker_db_manager_get_db_interface_by_type (tracker_service_get_name (service),
+							     TRACKER_DB_CONTENT_TYPE_CONTENTS);
 
 	tracker_db_interface_execute_procedure (iface, NULL,
 						"SaveServiceContents",

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	Thu Jul 24 16:02:40 2008
@@ -31,20 +31,19 @@
 void     tracker_db_increment_stats    (TrackerDBInterface *iface,
                                         TrackerService     *service);
 
-guint    tracker_db_check_service      (TrackerDBInterface *iface,
+guint    tracker_db_check_service      (TrackerService     *service,
 					const gchar        *path,
 					GHashTable         *metadata);
-gboolean tracker_db_create_service     (TrackerDBInterface *iface,
+gboolean tracker_db_create_service     (TrackerService     *service,
                                         guint32             id,
-                                        TrackerService     *service,
                                         const gchar        *path,
                                         GHashTable         *metadata);
-void     tracker_db_set_metadata       (TrackerDBInterface *iface,
+void     tracker_db_set_metadata       (TrackerService     *service,
                                         guint32             id,
                                         TrackerField       *field,
                                         const gchar        *value,
 					const gchar        *parsed_value);
-void     tracker_db_set_text           (TrackerDBInterface *iface,
+void     tracker_db_set_text           (TrackerService     *service,
 					guint32             id,
 					const gchar        *text);
 void     tracker_db_create_event       (TrackerDBInterface *iface,

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	Thu Jul 24 16:02:40 2008
@@ -100,8 +100,10 @@
 
 	TrackerIndex *index;
 
-	TrackerDBInterface *metadata;
-	TrackerDBInterface *contents;
+	TrackerDBInterface *file_metadata;
+	TrackerDBInterface *file_contents;
+	TrackerDBInterface *email_metadata;
+	TrackerDBInterface *email_contents;
 	TrackerDBInterface *common;
 	TrackerDBInterface *cache;
 
@@ -133,7 +135,6 @@
 
 struct MetadataForeachData {
 	TrackerIndex *index;
-	TrackerDBInterface *db;
 
 	TrackerLanguage *language;
 	TrackerConfig *config;
@@ -192,8 +193,10 @@
 	indexer->private->in_transaction = TRUE;
 
 	tracker_db_interface_start_transaction (indexer->private->cache);
-	tracker_db_interface_start_transaction (indexer->private->contents);
-	tracker_db_interface_start_transaction (indexer->private->metadata);
+	tracker_db_interface_start_transaction (indexer->private->file_contents);
+	tracker_db_interface_start_transaction (indexer->private->email_contents);
+	tracker_db_interface_start_transaction (indexer->private->file_metadata);
+	tracker_db_interface_start_transaction (indexer->private->email_metadata);
 	tracker_db_interface_start_transaction (indexer->private->common);
 }
 
@@ -201,8 +204,10 @@
 stop_transaction (TrackerIndexer *indexer)
 {
 	tracker_db_interface_end_transaction (indexer->private->common);
-	tracker_db_interface_end_transaction (indexer->private->metadata);
-	tracker_db_interface_end_transaction (indexer->private->contents);
+	tracker_db_interface_end_transaction (indexer->private->email_metadata);
+	tracker_db_interface_end_transaction (indexer->private->file_metadata);
+	tracker_db_interface_end_transaction (indexer->private->email_contents);
+	tracker_db_interface_end_transaction (indexer->private->file_contents);
 	tracker_db_interface_end_transaction (indexer->private->cache);
 
 	indexer->private->files_indexed += indexer->private->files_processed;
@@ -634,11 +639,17 @@
 					 tracker_config_get_max_bucket_count (priv->config));
 	g_free (index_file);
 
-	/* Set up databases */
+	/* Set up databases, these pointers are mostly used to
+	 * start/stop transactions, since TrackerDBManager treats
+	 * interfaces as singletons, it's safe to just ask it
+	 * again for an interface.
+	 */
 	priv->cache = tracker_db_manager_get_db_interface (TRACKER_DB_CACHE);
 	priv->common = tracker_db_manager_get_db_interface (TRACKER_DB_COMMON);
-	priv->metadata = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
-	priv->contents = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_CONTENTS);
+	priv->file_metadata = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+	priv->file_contents = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_CONTENTS);
+	priv->email_metadata = tracker_db_manager_get_db_interface (TRACKER_DB_EMAIL_METADATA);
+	priv->email_contents = tracker_db_manager_get_db_interface (TRACKER_DB_EMAIL_CONTENTS);
 
 	/* Set up timer to know how long the process will take and took */
 	priv->timer = g_timer_new ();
@@ -729,7 +740,7 @@
 					tracker_field_get_weight (field));
 	}
 
-	tracker_db_set_metadata (data->db, data->id, field, (gchar *) value, parsed_value);
+	tracker_db_set_metadata (data->service, data->id, field, (gchar *) value, parsed_value);
 
 	g_free (parsed_value);
 	g_strfreev (arr);
@@ -744,7 +755,6 @@
 	MetadataForeachData data;
 
 	data.index = indexer->private->index;
-	data.db = indexer->private->metadata;
 	data.language = indexer->private->language;
 	data.config = indexer->private->config;
 	data.service = service;
@@ -775,20 +785,25 @@
 
 	if (metadata) {
 		TrackerService *service_def;
-		gchar *service_type, *mimetype, *text;
+		gchar *service_type, *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);
+		/* FIXME: We clearly need a better way to define the service type for a given item */
+		service_type = g_strdup (tracker_module_config_get_index_service (info->file->module_name));
 
+		if (!service_type || !service_type[0]) {
+			gchar *mimetype;
+
+			mimetype = tracker_file_get_mime_type (info->file->path);
+			service_type = tracker_ontology_get_service_type_for_mime (mimetype);
+			g_free (mimetype);
+		}
+
+		service_def = tracker_ontology_get_service_type_by_name (service_type);
 		g_free (service_type);
-		g_free (mimetype);
 
 		if (service_def) {
-			id = tracker_db_check_service (indexer->private->metadata,
-						       info->file->path,
-						       metadata);
+			id = tracker_db_check_service (service_def, info->file->path, metadata);
 
 			/* FIXME: should check mtime and reindex if necessary */
 
@@ -796,8 +811,8 @@
 				/* 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,
+				tracker_db_create_service (service_def,
+							   id,
 							   info->file->path,
 							   metadata);
 
@@ -809,7 +824,7 @@
 				text = tracker_indexer_module_file_get_text (info->module, info->file);
 
 				if (text) {
-					tracker_db_set_text (indexer->private->contents, id, text);
+					tracker_db_set_text (service_def, id, text);
 					g_free (text);
 				}
 			}
@@ -1259,4 +1274,3 @@
 		g_error_free (actual_error);
 	}
 }
-



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