tracker r1612 - in branches/xesam-support: . src/libtracker-common src/libtracker-db src/tracker-indexer src/trackerd



Author: pvanhoof
Date: Mon Jun  9 15:41:07 2008
New Revision: 1612
URL: http://svn.gnome.org/viewvc/tracker?rev=1612&view=rev

Log:
2008-06-09  Philip Van Hoof  <pvanhoof gnome org>

	* svn merge -r 1591:1608 ../indexer-split



Removed:
   branches/xesam-support/src/trackerd/tracker-db-sqlite.c
   branches/xesam-support/src/trackerd/tracker-db-sqlite.h
Modified:
   branches/xesam-support/ChangeLog
   branches/xesam-support/src/libtracker-common/tracker-type-utils.h
   branches/xesam-support/src/libtracker-common/tracker-utils.h
   branches/xesam-support/src/libtracker-db/tracker-db-interface-sqlite.h
   branches/xesam-support/src/libtracker-db/tracker-db-manager.c
   branches/xesam-support/src/libtracker-db/tracker-db-manager.h
   branches/xesam-support/src/tracker-indexer/tracker-main.c
   branches/xesam-support/src/trackerd/Makefile.am
   branches/xesam-support/src/trackerd/tracker-daemon.c
   branches/xesam-support/src/trackerd/tracker-daemon.h
   branches/xesam-support/src/trackerd/tracker-db-email.c
   branches/xesam-support/src/trackerd/tracker-db-email.h
   branches/xesam-support/src/trackerd/tracker-db.c
   branches/xesam-support/src/trackerd/tracker-db.h
   branches/xesam-support/src/trackerd/tracker-dbus.c
   branches/xesam-support/src/trackerd/tracker-email-evolution.c
   branches/xesam-support/src/trackerd/tracker-email-kmail.c
   branches/xesam-support/src/trackerd/tracker-email-modest.c
   branches/xesam-support/src/trackerd/tracker-email-plugin.h
   branches/xesam-support/src/trackerd/tracker-email-thunderbird.c
   branches/xesam-support/src/trackerd/tracker-email-utils.c
   branches/xesam-support/src/trackerd/tracker-email-utils.h
   branches/xesam-support/src/trackerd/tracker-email.c
   branches/xesam-support/src/trackerd/tracker-email.h
   branches/xesam-support/src/trackerd/tracker-files.c
   branches/xesam-support/src/trackerd/tracker-files.h
   branches/xesam-support/src/trackerd/tracker-indexer.c
   branches/xesam-support/src/trackerd/tracker-keywords.c
   branches/xesam-support/src/trackerd/tracker-keywords.h
   branches/xesam-support/src/trackerd/tracker-main.c
   branches/xesam-support/src/trackerd/tracker-main.h
   branches/xesam-support/src/trackerd/tracker-metadata.c
   branches/xesam-support/src/trackerd/tracker-metadata.h
   branches/xesam-support/src/trackerd/tracker-process-files.c
   branches/xesam-support/src/trackerd/tracker-rdf-query.c
   branches/xesam-support/src/trackerd/tracker-rdf-query.h
   branches/xesam-support/src/trackerd/tracker-search.c
   branches/xesam-support/src/trackerd/tracker-search.h
   branches/xesam-support/src/trackerd/tracker-utils.c
   branches/xesam-support/src/trackerd/tracker-watcher-fam.c
   branches/xesam-support/src/trackerd/tracker-watcher-inotify.c
   branches/xesam-support/src/trackerd/tracker-watcher.h
   branches/xesam-support/src/trackerd/tracker-xesam-live-search.c
   branches/xesam-support/src/trackerd/tracker-xesam-manager.c
   branches/xesam-support/src/trackerd/tracker-xesam-query.c
   branches/xesam-support/src/trackerd/tracker-xesam-query.h
   branches/xesam-support/src/trackerd/tracker-xesam.c
   branches/xesam-support/src/trackerd/tracker-xesam.h

Modified: branches/xesam-support/src/libtracker-common/tracker-type-utils.h
==============================================================================
--- branches/xesam-support/src/libtracker-common/tracker-type-utils.h	(original)
+++ branches/xesam-support/src/libtracker-common/tracker-type-utils.h	Mon Jun  9 15:41:07 2008
@@ -24,28 +24,24 @@
 
 #include <glib.h>
 
-gchar *  tracker_date_format                (const gchar  *time_string);
-time_t   tracker_string_to_date             (const gchar  *time_string);
-gchar *  tracker_date_to_string             (time_t        date_time);
-
-gchar *  tracker_long_to_string             (glong         i);
-gchar *  tracker_int_to_string              (gint          i);
-gchar *  tracker_uint_to_string             (guint         i);
-gchar *  tracker_gint32_to_string           (gint32        i);
-gchar *  tracker_guint32_to_string          (guint32       i);
-
-gboolean tracker_string_to_uint             (const gchar  *s,
-					     guint        *ret);
-gint     tracker_string_in_string_list      (const gchar  *str,
-					     gchar       **strv);
-gchar ** tracker_gslist_to_string_list      (GSList       *list);
-gchar *  tracker_string_list_to_string      (gchar       **strv,
-					     gint          length,
-					     gchar         sep);
+gchar *  tracker_date_format               (const gchar          *time_string);
+time_t   tracker_string_to_date            (const gchar          *time_string);
+gchar *  tracker_date_to_string            (time_t                date_time);
+gchar *  tracker_long_to_string            (glong                 i);
+gchar *  tracker_int_to_string             (gint                  i);
+gchar *  tracker_uint_to_string            (guint                 i);
+gchar *  tracker_gint32_to_string          (gint32                i);
+gchar *  tracker_guint32_to_string         (guint32               i);
+gboolean tracker_string_to_uint            (const gchar          *s,
+					    guint                *ret);
+gint     tracker_string_in_string_list     (const gchar          *str,
+					    gchar               **strv);
+gchar ** tracker_gslist_to_string_list     (GSList               *list);
+gchar *  tracker_string_list_to_string     (gchar               **strv,
+					    gint                  length,
+					    gchar                 sep);
 
 /* "true" -> "1"; "false" -> "0" */
-gchar *  tracker_boolean_as_text_to_number  (const gchar *value);
-
-
+gchar *  tracker_boolean_as_text_to_number (const gchar          *value);
 
 #endif /* __LIBTRACKER_COMMON_TYPE_UTILS_H__ */

Modified: branches/xesam-support/src/libtracker-common/tracker-utils.h
==============================================================================
--- branches/xesam-support/src/libtracker-common/tracker-utils.h	(original)
+++ branches/xesam-support/src/libtracker-common/tracker-utils.h	Mon Jun  9 15:41:07 2008
@@ -22,6 +22,8 @@
 #ifndef __LIBTRACKER_COMMON_UTILS_H__
 #define __LIBTRACKER_COMMON_UTILS_H__
 
+#include <glib.h>
+
 gboolean tracker_is_empty_string (const char  *str);
 gchar *  tracker_string_replace  (const gchar *haystack,
 				  gchar       *needle,

Modified: branches/xesam-support/src/libtracker-db/tracker-db-interface-sqlite.h
==============================================================================
--- branches/xesam-support/src/libtracker-db/tracker-db-interface-sqlite.h	(original)
+++ branches/xesam-support/src/libtracker-db/tracker-db-interface-sqlite.h	Mon Jun  9 15:41:07 2008
@@ -31,7 +31,7 @@
 #define TRACKER_IS_DB_INTERFACE_SQLITE_CLASS(c)  (G_TYPE_CHECK_CLASS_TYPE ((o),    TRACKER_TYPE_DB_INTERFACE_SQLITE))
 #define TRACKER_DB_INTERFACE_SQLITE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),  TRACKER_TYPE_DB_INTERFACE_SQLITE, TrackerDBInterfaceSqliteClass))
 
-typedef struct TrackerDBInterfaceSqlite TrackerDBInterfaceSqlite;
+typedef struct TrackerDBInterfaceSqlite      TrackerDBInterfaceSqlite;
 typedef struct TrackerDBInterfaceSqliteClass TrackerDBInterfaceSqliteClass;
 
 typedef gint (* TrackerDBCollationFunc) (gchar *str1,

Modified: branches/xesam-support/src/libtracker-db/tracker-db-manager.c
==============================================================================
--- branches/xesam-support/src/libtracker-db/tracker-db-manager.c	(original)
+++ branches/xesam-support/src/libtracker-db/tracker-db-manager.c	Mon Jun  9 15:41:07 2008
@@ -23,8 +23,10 @@
 #include <stdlib.h>
 #include <string.h>
 #include <regex.h>
+#include <zlib.h>
 
 #include <libtracker-common/tracker-field.h>
+#include <libtracker-common/tracker-nfs-lock.h>
 #include <libtracker-common/tracker-ontology.h>
 #include <libtracker-common/tracker-type-utils.h>
 #include <libtracker-common/tracker-utils.h>
@@ -32,6 +34,8 @@
 #include "tracker-db-manager.h"
 #include "tracker-db-interface-sqlite.h"
 
+#define ZLIBBUFSIZ 8192
+
 typedef enum {
         TRACKER_DB_LOCATION_DATA_DIR,
         TRACKER_DB_LOCATION_USER_DATA_DIR,
@@ -39,19 +43,21 @@
 } TrackerDBLocation;
 
 typedef struct {
-        TrackerDB          db;
-        TrackerDBLocation  location;
-        const gchar       *file;
-        const gchar       *name;
-        gchar             *abs_filename;
-        gint               cache_size;
-        gint               page_size;
-        gboolean           add_functions;
+        TrackerDB           db;
+        TrackerDBLocation   location;
+	TrackerDBInterface *iface;
+        const gchar        *file;
+        const gchar        *name;
+        gchar              *abs_filename;
+        gint                cache_size;
+        gint                page_size;
+        gboolean            add_functions;
 } TrackerDBDefinition;
 
 static TrackerDBDefinition dbs[] = {
         { TRACKER_DB_COMMON, 
           TRACKER_DB_LOCATION_USER_DATA_DIR, 
+	  NULL,
           "common.db",
           "common",
           NULL,
@@ -60,6 +66,7 @@
           FALSE },
         { TRACKER_DB_CACHE, 
           TRACKER_DB_LOCATION_SYS_TMP_ROOT_DIR,
+	  NULL,
           "cache.db",
           "cache",
           NULL, 
@@ -68,6 +75,7 @@
           FALSE },
         { TRACKER_DB_FILE_METADATA,
           TRACKER_DB_LOCATION_DATA_DIR,
+	  NULL,
           "file-meta.db",
           "file-meta",
           NULL,
@@ -76,6 +84,7 @@
           TRUE },
         { TRACKER_DB_FILE_CONTENTS,
           TRACKER_DB_LOCATION_DATA_DIR,
+	  NULL,
           "file-contents.db",
           "file-contents",
           NULL,
@@ -84,6 +93,7 @@
           FALSE },
         { TRACKER_DB_EMAIL_METADATA,
           TRACKER_DB_LOCATION_DATA_DIR,
+	  NULL,
           "email-meta.db",
           "email-meta",
           NULL,
@@ -92,6 +102,7 @@
           TRUE },
         { TRACKER_DB_EMAIL_CONTENTS,
           TRACKER_DB_LOCATION_DATA_DIR,
+	  NULL,
           "email-contents.db",
           "email-contents",
           NULL,
@@ -100,6 +111,7 @@
           FALSE },
         { TRACKER_DB_XESAM,
           TRACKER_DB_LOCATION_DATA_DIR,
+	  NULL,
           "xesam.db",
           "xesam",
           NULL,
@@ -108,10 +120,17 @@
           TRUE },
 };
 
-static gboolean    initialized;
-static gchar      *services_dir;
-static gchar      *sql_dir;
-static GHashTable *prepared_queries;
+static gboolean            db_exec_no_reply    (TrackerDBInterface *iface,
+						const gchar        *query,
+						...);
+static TrackerDBInterface *db_interface_create (TrackerDB           db,
+						gboolean            attach_all);
+
+static gboolean      initialized;
+static GHashTable   *prepared_queries;
+static gchar        *services_dir;
+static gchar        *sql_dir;
+static gpointer      db_type_enum_class_pointer;
 
 static const gchar * 
 location_to_directory (TrackerDBLocation  location,
@@ -132,13 +151,16 @@
 }
 
 void 
-configure_database_description (const gchar *data_dir,
-                                const gchar *user_data_dir,
-                                const gchar *sys_tmp_root_dir)
+set_up_databases (gboolean     attach_all,
+		  const gchar *data_dir,
+		  const gchar *user_data_dir,
+		  const gchar *sys_tmp_root_dir)
 {
         const gchar *dir;
         guint        i;
 
+	g_message ("Setting up all databases");
+
         for (i = 0; i < G_N_ELEMENTS (dbs); i++) {
                 /* Fill absolute path for the database */
                 dir = location_to_directory (dbs[i].location,
@@ -147,7 +169,10 @@
                                              sys_tmp_root_dir);
                 
                 dbs[i].abs_filename = g_build_filename (dir, dbs[i].file, NULL);
+		dbs[i].iface = db_interface_create (i, attach_all);
         }
+
+	g_message ("Setting up all databases completed");
 }
 
 static void
@@ -158,7 +183,7 @@
 	gchar *path, *content, **queries;
 	gint i;
 
-	path = tracker_db_manager_get_sql_file (file);
+	path = g_build_filename (sql_dir, file, NULL);
 
 	if (!delimiter) {
 		delimiter = ";";
@@ -176,7 +201,7 @@
 		tracker_db_interface_execute_query (iface, NULL, queries[i]);
 	}
 
-	g_message ("Loaded SQL file:'%s'", file);
+	g_message ("  Loaded SQL file:'%s'", file);
 
 	g_strfreev (queries);
 	g_free (content);
@@ -194,7 +219,7 @@
 	gint           id, i, j;
 
 	key_file = g_key_file_new ();
-	service_file = tracker_db_manager_get_service_file (filename);
+	service_file = g_build_filename (services_dir, filename, NULL);
 
 	if (!g_key_file_load_from_file (key_file, service_file, G_KEY_FILE_NONE, NULL)) {
 		g_free (service_file);
@@ -283,7 +308,7 @@
 	gchar          **groups, **keys;
 	gint             i, j, id;
 
-	service_file = tracker_db_manager_get_service_file (filename);
+	service_file = g_build_filename (services_dir, filename, NULL);
 
 	key_file = g_key_file_new ();
 
@@ -430,6 +455,300 @@
 	g_free (service_file);
 }
 
+static TrackerDBResultSet *
+db_exec_proc (TrackerDBInterface *iface, 
+	      const gchar        *procedure, 
+	      ...)
+{
+	TrackerDBResultSet *result_set;
+	va_list             args;
+
+	va_start (args, procedure);
+	result_set = tracker_db_interface_execute_vprocedure (iface, 
+							      NULL, 
+							      procedure, 
+							      args);
+	va_end (args);
+
+	return result_set;
+}
+
+static gboolean
+db_exec_no_reply (TrackerDBInterface *iface, 
+		  const gchar        *query, 
+		  ...)
+{
+	TrackerDBResultSet *result_set;
+	va_list             args;
+
+	tracker_nfs_lock_obtain ();
+
+	va_start (args, query);
+	result_set = tracker_db_interface_execute_vquery (iface, NULL, query, args);
+	va_end (args);
+
+	if (result_set) {
+		g_object_unref (result_set);
+	}
+
+	tracker_nfs_lock_release ();
+
+	return TRUE;
+}
+
+static void
+load_service_file_xesam_map (TrackerDBInterface *iface,
+			     const gchar        *db_proc,
+			     const gchar        *data_to_split,
+			     const gchar        *data_to_insert)
+{
+	gchar **mappings;
+	gchar **mapping;
+	
+	mappings = g_strsplit_set (data_to_split, ";", -1);
+	
+	if (!mappings) {
+		return;
+	}
+
+	for (mapping = mappings; *mapping; mapping++) {
+		gchar *esc_value;
+		
+		esc_value = tracker_escape_string (*mapping);
+		db_exec_proc (iface,
+			      db_proc,
+			      data_to_insert,
+			      esc_value, 
+			      NULL);
+		g_free (esc_value);
+	}
+
+	g_strfreev (mappings);
+}
+
+static void
+load_service_file_xesam_insert (TrackerDBInterface *iface,
+				const gchar        *sql_format,
+				const gchar        *data_to_split,
+				const gchar        *data_to_insert)
+{
+	gchar **parents;
+	gchar **parent;
+	
+	parents = g_strsplit_set (data_to_split, ";", -1);
+	
+	if (!parents) {
+		return;
+	}
+
+	for (parent = parents; *parent; parent++) {
+		gchar *sql;
+
+		sql = g_strdup_printf (sql_format, *parent, data_to_insert);
+		db_exec_no_reply (iface, sql);
+		g_free (sql);
+	}
+
+	g_strfreev (parents);
+}
+
+static void
+load_service_file_xesam_update (TrackerDBInterface *iface,
+				const gchar        *sql_format,
+				const gchar        *data_to_update,
+				const gchar        *data_key,
+				const gchar        *data_value)
+{
+	gchar *str;
+	gchar *sql;
+	
+	str = tracker_escape_string (data_key);
+	sql = g_strdup_printf (sql_format, 
+			       data_to_update, 
+			       str, 
+			       data_value);
+	db_exec_no_reply (iface, sql);
+	g_free (sql);
+	g_free (str);
+}
+
+static gboolean
+load_service_file_xesam (TrackerDBInterface *iface, 
+			 const gchar        *filename)
+{
+	GKeyFile 	     *key_file;
+	GError               *error = NULL;
+	const gchar * const  *language_names;
+	gchar               **groups;
+	gchar               **group;
+	gchar 		     *service_file;
+	gchar                *sql;
+	gboolean              is_metadata;
+	gboolean              is_service;
+	gboolean              is_metadata_mapping;
+	gboolean              is_service_mapping;
+	gint                  id; 
+
+	const gchar          *data_types[] = {
+		"string", 
+		"float", 
+		"integer", 
+		"boolean", 
+		"dateTime", 
+		"List of strings", 
+		"List of Uris", 
+		"List of Urls", 
+		NULL
+	};
+
+	key_file = g_key_file_new ();
+	service_file = g_build_filename (services_dir, filename, NULL);
+
+	if (!g_key_file_load_from_file (key_file, service_file, G_KEY_FILE_NONE, &error)) {
+		g_critical ("Couldn't load XESAM service file:'%s', %s",
+			    filename,
+			    error->message);
+		g_clear_error (&error);
+		g_free (service_file);
+		g_key_file_free (key_file);
+
+		return FALSE;
+	}
+
+	g_free (service_file);
+
+	is_metadata = FALSE;
+	is_service = FALSE;
+	is_metadata_mapping = FALSE;
+	is_service_mapping = FALSE;
+		
+	if (g_str_has_suffix (filename, ".metadata")) {
+		is_metadata = TRUE;
+	} else if (g_str_has_suffix (filename, ".service")) {
+		is_service = TRUE;
+	} else if (g_str_has_suffix (filename, ".mmapping")) {
+		is_metadata_mapping = TRUE;
+	} else if (g_str_has_suffix (filename, ".smapping")) {
+		is_service_mapping = TRUE;
+	} else {
+		g_warning ("XESAM Service file:'%s' does not a recognised suffix "
+			   "('.service', '.metadata', '.mmapping' or '.smapping')",
+			   filename);
+		g_key_file_free (key_file);
+		return FALSE;
+	} 
+
+	language_names = g_get_language_names ();
+		
+	groups = g_key_file_get_groups (key_file, NULL);
+	
+	for (group = groups; *group; group++) {
+		gchar  *str_id;
+		gchar **keys;
+		gchar **key;
+
+		if (is_metadata) {
+			db_exec_proc (iface, 
+				      "InsertXesamMetadataType", 
+				      *group, 
+				      NULL);
+			id = tracker_db_interface_sqlite_get_last_insert_id (TRACKER_DB_INTERFACE_SQLITE (iface));
+		} else if (is_service) {
+			db_exec_proc (iface, 
+				      "InsertXesamServiceType", 
+				      *group, 
+				      NULL);
+			id = tracker_db_interface_sqlite_get_last_insert_id (TRACKER_DB_INTERFACE_SQLITE (iface));
+		}
+		
+		/* Get inserted ID */
+		str_id = tracker_uint_to_string (id);
+		keys = g_key_file_get_keys (key_file, *group, NULL, NULL);
+		
+		for (key = keys; *key; key++) {
+			gchar *value;
+			
+			value = g_key_file_get_locale_string (key_file, 
+							      *group, 
+							      *key, 
+							      language_names[0],
+							      NULL);
+			
+			if (!value) {
+				continue;
+			}
+			
+			if (strcasecmp (value, "true") == 0) {
+				g_free (value);
+				value = g_strdup ("1");
+			} else if  (strcasecmp (value, "false") == 0) {
+				g_free (value);
+				value = g_strdup ("0");
+			}
+			
+			if (is_metadata) {
+				if (strcasecmp (*key, "Parents") == 0) {
+					load_service_file_xesam_insert (iface,
+									"INSERT INTO XesamMetadataChildren (Parent, Child) VALUES ('%s', '%s')",
+									value,
+									*group);
+				} else if (strcasecmp (*key, "ValueType") == 0) {
+					gint data_id;
+					
+					data_id = tracker_string_in_string_list (value, (gchar **) data_types);
+					
+					if (data_id != -1) {
+						sql = g_strdup_printf ("update XesamMetadataTypes set DataTypeID = %d where ID = %s", 
+								       data_id, 
+								       str_id);
+						db_exec_no_reply (iface, sql);
+						g_free (sql);
+					}
+				} else {
+					load_service_file_xesam_update (iface,
+									"update XesamMetadataTypes set  %s = '%s' where ID = %s",
+									*key, 
+									value, 
+									str_id);
+				}
+			} else 	if (is_service) {
+				if (strcasecmp (*key, "Parents") == 0) {
+					load_service_file_xesam_insert (iface,
+									"INSERT INTO XesamServiceChildren (Parent, Child) VALUES ('%s', '%s')",
+									value,
+									*group);
+				} else {
+					load_service_file_xesam_update (iface,
+									"update XesamServiceTypes set  %s = '%s' where typeID = %s",
+									*key, 
+									value, 
+									str_id);
+				}
+			} else 	if (is_metadata_mapping) {
+				load_service_file_xesam_map (iface,
+							     "InsertXesamMetaDataMapping", 
+							     value, 
+							     *group);
+			} else {
+				load_service_file_xesam_map (iface,
+							     "InsertXesamServiceMapping", 
+							     value, 
+							     *group);
+			}
+			
+			g_free (value);
+		}
+		
+		g_strfreev (keys);
+		g_free (str_id);
+	}
+	
+	g_strfreev (groups);
+	g_key_file_free (key_file);
+
+	return TRUE;
+}
+
 static gboolean
 load_prepared_queries (void)
 {
@@ -442,7 +761,7 @@
 
 	g_message ("Loading prepared queries...");
 
-	sql_filename = tracker_db_manager_get_sql_file ("sqlite-stored-procs.sql");
+	sql_filename = g_build_filename (sql_dir, "sqlite-stored-procs.sql", NULL);
 
 	t = g_timer_new ();
 
@@ -510,11 +829,11 @@
 }
 
 static TrackerField *
-db_manager_row_to_field_def (TrackerDBResultSet *result_set) 
+db_row_to_field_def (TrackerDBResultSet *result_set) 
 {
         TrackerField     *field_def;
 	TrackerFieldType  field_type;
-	gchar            *field_name, *name;
+	gchar            *id_str, *field_name, *name;
 	gint              weight, id;
 	gboolean          embedded, multiple_values, delimited, filtered, store_metadata;
 
@@ -533,7 +852,9 @@
 				   9, &store_metadata,
 				   -1);
 
-	tracker_field_set_id (field_def, tracker_int_to_string (id));
+	id_str = tracker_int_to_string (id);
+
+	tracker_field_set_id (field_def, id_str);
 	tracker_field_set_name (field_def, name);
 	tracker_field_set_data_type (field_def, field_type);
 	tracker_field_set_field_name (field_def, field_name);
@@ -544,6 +865,7 @@
 	tracker_field_set_filtered (field_def, filtered);
 	tracker_field_set_store_metadata (field_def, store_metadata);
 
+	g_free (id_str);
 	g_free (field_name);
 	g_free (name);
 
@@ -551,7 +873,7 @@
 }
 
 static TrackerService *
-db_manager_row_to_service (TrackerDBResultSet *result_set)
+db_row_to_service (TrackerDBResultSet *result_set)
 {
         TrackerService *service;
         GSList         *new_list = NULL;
@@ -586,25 +908,6 @@
         tracker_service_set_has_thumbs (service, has_thumbs);
 	tracker_service_set_content_metadata (service, content_metadata);
 
-#if 0
-        if (g_str_has_prefix (name, "Email") ||
-            g_str_has_suffix (name, "Emails")) {
-                tracker_service_set_db_type (service, TRACKER_DB_TYPE_EMAIL);
-
-                if (tracker->email_service_min == 0 || 
-                    id < tracker->email_service_min) {
-                        tracker->email_service_min = id;
-                }
-
-                if (tracker->email_service_max == 0 || 
-                    id > tracker->email_service_max) {
-                        tracker->email_service_max = id;
-                }
-        } else {
-                tracker_service_set_db_type (service, TRACKER_DB_TYPE_DATA);
-        }
-#endif
-
         tracker_service_set_show_service_files (service, show_service_files);
         tracker_service_set_show_service_directories (service, show_service_directories);
 
@@ -643,9 +946,9 @@
 }
 
 static GSList *
-db_manager_mime_query (TrackerDBInterface *iface,
-                       const gchar        *stored_proc,
-                       gint                service_id)
+db_mime_query (TrackerDBInterface *iface,
+	       const gchar        *stored_proc,
+	       gint                service_id)
 {
 	TrackerDBResultSet *result_set;
 	GSList             *result = NULL;
@@ -676,25 +979,25 @@
 }
 
 static GSList *
-db_manager_get_mimes_for_service_id (TrackerDBInterface *iface,
-                                     gint                service_id)
+db_get_mimes_for_service_id (TrackerDBInterface *iface,
+			     gint                service_id)
 {
-	return db_manager_mime_query (iface, "GetMimeForServiceId", service_id);
+	return db_mime_query (iface, "GetMimeForServiceId", service_id);
 }
 
 static GSList *
-db_manager_get_mime_prefixes_for_service_id (TrackerDBInterface *iface,
-                                             gint                service_id)
+db_get_mime_prefixes_for_service_id (TrackerDBInterface *iface,
+				     gint                service_id)
 {
-	return db_manager_mime_query (iface, "GetMimePrefixForServiceId", service_id);
+	return db_mime_query (iface, "GetMimePrefixForServiceId", service_id);
 }
 
 /* Sqlite utf-8 user defined collation sequence */
 static gint
-db_manager_utf8_collation_func (gchar *str1,
-                                gint   len1,
-                                gchar *str2,
-                                int    len2)
+utf8_collation_func (gchar *str1,
+		     gint   len1,
+		     gchar *str2,
+		     int    len2)
 {
 	gchar *word1, *word2;
 	gint   result;
@@ -806,11 +1109,126 @@
 	return result;
 }
 
+static gchar *
+function_uncompress_string (const gchar *ptr, 
+			    gint         size, 
+			    gint        *uncompressed_size)
+{
+	z_stream       zs;
+	gchar         *buf, *swap;
+	unsigned char  obuf[ZLIBBUFSIZ];
+	gint           rv, asiz, bsiz, osiz;
+
+	zs.zalloc = Z_NULL;
+	zs.zfree = Z_NULL;
+	zs.opaque = Z_NULL;
+
+	if (inflateInit2 (&zs, 15) != Z_OK) {
+		return NULL;
+	}
+
+	asiz = size * 2 + 16;
+
+	if (asiz < ZLIBBUFSIZ) {
+		asiz = ZLIBBUFSIZ;
+	}
+
+	if (!(buf = malloc (asiz))) {
+		inflateEnd (&zs);
+		return NULL;
+	}
+
+	bsiz = 0;
+	zs.next_in = (unsigned char *)ptr;
+	zs.avail_in = size;
+	zs.next_out = obuf;
+	zs.avail_out = ZLIBBUFSIZ;
+
+	while ((rv = inflate (&zs, Z_NO_FLUSH)) == Z_OK) {
+		osiz = ZLIBBUFSIZ - zs.avail_out;
+
+		if (bsiz + osiz >= asiz) {
+			asiz = asiz * 2 + osiz;
+
+			if (!(swap = realloc (buf, asiz))) {
+				free (buf);
+				inflateEnd (&zs);
+				return NULL;
+			}
+
+			buf = swap;
+		}
+
+		memcpy (buf + bsiz, obuf, osiz);
+		bsiz += osiz;
+		zs.next_out = obuf;
+		zs.avail_out = ZLIBBUFSIZ;
+	}
+
+	if (rv != Z_STREAM_END) {
+		free (buf);
+		inflateEnd (&zs);
+		return NULL;
+	}
+	osiz = ZLIBBUFSIZ - zs.avail_out;
+
+	if (bsiz + osiz >= asiz) {
+		asiz = asiz * 2 + osiz;
+
+		if (!(swap = realloc (buf, asiz))) {
+			free (buf);
+			inflateEnd (&zs);
+			return NULL;
+		}
+
+		buf = swap;
+	}
+
+	memcpy (buf + bsiz, obuf, osiz);
+	bsiz += osiz;
+	buf[bsiz] = '\0';
+	*uncompressed_size = bsiz;
+	inflateEnd (&zs);
+
+	return buf;
+}
+
+static GValue
+function_uncompress (TrackerDBInterface *interface,
+		     gint                argc,
+		     GValue              values[])
+{
+	GByteArray *array;
+	GValue      result = { 0, };
+	gchar      *output;
+	gint        len;
+
+	array = g_value_get_boxed (&values[0]);
+
+	if (!array) {
+		return result;
+	}
+
+	output = function_uncompress_string ((const gchar *) array->data, 
+					     array->len, 
+					     &len);
+
+	if (!output) {
+		g_warning ("Uncompress failed");
+		return result;
+	}
+
+	g_value_init (&result, G_TYPE_STRING);
+	g_value_take_string (&result, output);
+
+	return result;
+}
+
 static void
-db_manager_set_params (TrackerDBInterface *iface,
-		       gint                cache_size,
-		       gint                page_size,
-		       gboolean            add_functions)
+db_set_params (TrackerDBInterface *iface,
+	       gint                cache_size,
+	       gint                page_size,
+	       gboolean            add_functions)
 {
 	tracker_db_interface_execute_query (iface, NULL, "PRAGMA synchronous = NORMAL;");
 	tracker_db_interface_execute_query (iface, NULL, "PRAGMA count_changes = 0;");
@@ -819,15 +1237,19 @@
 	tracker_db_interface_execute_query (iface, NULL, "PRAGMA auto_vacuum = 0;");
 
 	if (page_size != TRACKER_DB_PAGE_SIZE_DONT_SET) {
+		g_message ("  Setting page size to %d", page_size);
 		tracker_db_interface_execute_query (iface, NULL, "PRAGMA page_size = %d", page_size);
 	}
 
 	tracker_db_interface_execute_query (iface, NULL, "PRAGMA cache_size = %d", cache_size);
+	g_message ("  Setting cache size to %d", cache_size);
 
 	if (add_functions) {
+		g_message ("  Adding functions (FormatDate, etc)");
+
 		if (!tracker_db_interface_sqlite_set_collation_function (TRACKER_DB_INTERFACE_SQLITE (iface),
 									 "UTF8", 
-									 db_manager_utf8_collation_func)) {
+									 utf8_collation_func)) {
 			g_critical ("Collation sequence failed");
 		}
 
@@ -856,7 +1278,7 @@
 }
 
 static void
-db_manager_get_static_data (TrackerDBInterface *iface)
+db_get_static_data (TrackerDBInterface *iface)
 {
 	TrackerDBResultSet *result_set;
 
@@ -875,7 +1297,7 @@
 			TrackerField       *def;
 			GSList             *child_ids = NULL;
 
-			def = db_manager_row_to_field_def (result_set);
+			def = db_row_to_field_def (result_set);
 
 			result_set2 = tracker_db_interface_execute_procedure (iface, 
 									      NULL,
@@ -921,11 +1343,11 @@
 
 		while (valid) {
 			TrackerService *service;
-			GSList          *mimes, *mime_prefixes;
-			const gchar     *name;
-			gint             id;
+			GSList         *mimes, *mime_prefixes;
+			const gchar    *name;
+			gint            id;
 
-                        service = db_manager_row_to_service (result_set);
+                        service = db_row_to_service (result_set);
 
                         if (!service) {
                                 continue;
@@ -934,8 +1356,8 @@
                         id = tracker_service_get_id (service);
                         name = tracker_service_get_name (service);
 
-                        mimes = db_manager_get_mimes_for_service_id (iface, id);
-                        mime_prefixes = db_manager_get_mime_prefixes_for_service_id (iface, id);
+                        mimes = db_get_mimes_for_service_id (iface, id);
+                        mime_prefixes = db_get_mime_prefixes_for_service_id (iface, id);
 
                         g_message ("Adding service:'%s' with id:%d and mimes:%d",
 				   name,
@@ -957,93 +1379,461 @@
 	}
 }
 
-TrackerDBInterface *
-db_manager_get_common (void)
+static const gchar *
+db_type_to_string (TrackerDB db)
 {
-	TrackerDBInterface *interface;
+        GType       type;
+        GEnumClass *enum_class;
+        GEnumValue *enum_value;
+
+        type = tracker_db_get_type ();
+        enum_class = G_ENUM_CLASS (g_type_class_peek (type));
+        enum_value = g_enum_get_value (enum_class, db);
+        
+        if (!enum_value) {
+                return "unknown";
+        }
+
+        return enum_value->value_nick;
+}
+
+static TrackerDBInterface *
+db_interface_get (TrackerDB  type,
+		  gboolean   attach_all,
+		  gboolean  *create)
+{
+	TrackerDBInterface *iface;
 	const gchar        *path;
-	gboolean            create = FALSE;
 
-	path = tracker_db_manager_get_file (TRACKER_DB_COMMON);
+	path = tracker_db_manager_get_file (type);
 
 	if (!g_file_test (path, G_FILE_TEST_EXISTS)) {
-		create = TRUE;
+		*create = TRUE;
+	} else {
+		*create = FALSE;
+	}
+
+	g_message ("%s database... '%s' (%s)", 
+		   *create ? "Creating" : "Loading",
+		   path,
+		   db_type_to_string (type));
+
+	iface = tracker_db_interface_sqlite_new (path);
+	tracker_db_interface_set_procedure_table (iface, prepared_queries);
+
+	/* FIXME: Shouldn't we do this for common/cache dbs too? */
+	if (type != TRACKER_DB_COMMON &&
+	    type != TRACKER_DB_CACHE) {
+		db_set_params (iface,
+			       dbs[type].cache_size,
+			       dbs[type].page_size,
+			       dbs[type].add_functions);
+	}
+
+	if (attach_all) {
+		g_message ("  Attaching to current DB connection");
+		db_exec_no_reply (iface, 
+				  "ATTACH '%s' as %s",
+				  dbs[type].abs_filename,
+				  dbs[type].name);
 	}
 
-	interface = tracker_db_interface_sqlite_new (path);
-	tracker_db_interface_set_procedure_table (interface, prepared_queries);
+	return iface;
+}
+
+static TrackerDBInterface *
+db_interface_get_common (gboolean attach_all)
+{
+	TrackerDBInterface *iface;
+	gboolean            create;
+
+	iface = db_interface_get (TRACKER_DB_COMMON, 
+				  attach_all, 
+				  &create);
 
 	if (create) {
 		/* Create tables */
-		load_sql_file (interface, "sqlite-tracker.sql", NULL);
-		load_sql_file (interface, "sqlite-metadata.sql", NULL);
-		load_sql_file (interface, "sqlite-service-types.sql", NULL);
+		load_sql_file (iface, "sqlite-tracker.sql", NULL);
+		load_sql_file (iface, "sqlite-metadata.sql", NULL);
+		load_sql_file (iface, "sqlite-service-types.sql", NULL);
 
 		/* Load services info */
-		load_service_file (interface, "default.service");
+		load_service_file (iface, "default.service");
 
 		/* Load metadata info */
-		load_metadata_file (interface, "default.metadata");
-		load_metadata_file (interface, "file.metadata");
-		load_metadata_file (interface, "audio.metadata");
-		load_metadata_file (interface, "application.metadata");
-		load_metadata_file (interface, "document.metadata");
-		load_metadata_file (interface, "email.metadata");
-		load_metadata_file (interface, "image.metadata");
-		load_metadata_file (interface, "video.metadata");
+		load_metadata_file (iface, "default.metadata");
+		load_metadata_file (iface, "file.metadata");
+		load_metadata_file (iface, "audio.metadata");
+		load_metadata_file (iface, "application.metadata");
+		load_metadata_file (iface, "document.metadata");
+		load_metadata_file (iface, "email.metadata");
+		load_metadata_file (iface, "image.metadata");
+		load_metadata_file (iface, "video.metadata");
+
+		db_exec_no_reply (iface, "ANALYZE");
 	}
 
 	/* Load static data into tracker ontology */
-	db_manager_get_static_data (interface);
+	db_get_static_data (iface);
 
-	return interface;
+	return iface;
 }
 
-TrackerDBInterface *
-db_manager_get_file_metadata (void)
+static TrackerDBInterface *
+db_interface_get_cache (gboolean attach_all)
 {
-	TrackerDBInterface *interface;
-	const gchar *path;
-	gboolean create = FALSE;
+	TrackerDBInterface *iface;
+	gboolean            create;
 
-	path = tracker_db_manager_get_file (TRACKER_DB_FILE_METADATA);
+	iface = db_interface_get (TRACKER_DB_CACHE, 
+				  attach_all, 
+				  &create);
 
-	if (!g_file_test (path, G_FILE_TEST_EXISTS)) {
-		create = TRUE;
+	if (create) {
+		load_sql_file (iface, "sqlite-cache.sql", NULL);
+
+		db_exec_no_reply (iface, "ANALYZE");
 	}
 
-	interface = tracker_db_interface_sqlite_new (path);
-	tracker_db_interface_set_procedure_table (interface, prepared_queries);
+	return iface;
+}
+
+static TrackerDBInterface *
+db_interface_get_file_metadata (gboolean attach_all)
+{
+	TrackerDBInterface *iface;
+	gboolean            create;
 
-	db_manager_set_params (interface,
-			       tracker_db_manager_get_cache_size (TRACKER_DB_FILE_METADATA),
-			       tracker_db_manager_get_page_size (TRACKER_DB_FILE_METADATA),
-			       tracker_db_manager_get_add_functions (TRACKER_DB_FILE_METADATA));
+	iface = db_interface_get (TRACKER_DB_FILE_METADATA, 
+				  attach_all, 
+				  &create);
 
 	if (create) {
-		load_sql_file (interface, "sqlite-service.sql", NULL);
-		load_sql_file (interface, "sqlite-service-triggers.sql", "!");
+		load_sql_file (iface, "sqlite-service.sql", NULL);
+		load_sql_file (iface, "sqlite-service-triggers.sql", "!");
+
+		db_exec_no_reply (iface, "ANALYZE");
 	}
 
-	return interface;
+	return iface;
 }
 
-const gchar *
-db_manager_db_type_to_string (TrackerDB db)
+static TrackerDBInterface *
+db_interface_get_file_contents (gboolean attach_all)
 {
-        GType       type;
-        GEnumClass *enum_class;
-        GEnumValue *enum_value;
+	TrackerDBInterface *iface;
+	gboolean            create;
 
-        type = tracker_db_get_type ();
-        enum_class = G_ENUM_CLASS (g_type_class_peek (type));
-        enum_value = g_enum_get_value (enum_class, db);
-        
-        if (!enum_value) {
-                return "unknown";
-        }
+	iface = db_interface_get (TRACKER_DB_FILE_CONTENTS, 
+				  attach_all, 
+				  &create);
 
-        return enum_value->value_nick;
+	if (create) {
+		load_sql_file (iface, "sqlite-contents.sql", NULL);
+
+		db_exec_no_reply (iface, "ANALYZE");
+	}
+
+	tracker_db_interface_sqlite_create_function (iface, 
+						     "uncompress", 
+						     function_uncompress, 
+						     1);
+
+	return iface;
+}
+
+static TrackerDBInterface *
+db_interface_get_email_metadata (gboolean attach_all)
+{
+	TrackerDBInterface *iface;
+	gboolean            create;
+
+	iface = db_interface_get (TRACKER_DB_EMAIL_METADATA, 
+				  attach_all, 
+				  &create);
+
+	if (create) {
+		load_sql_file (iface, "sqlite-service.sql", NULL);
+		load_sql_file (iface, "sqlite-email.sql", NULL);
+		load_sql_file (iface, "sqlite-service-triggers.sql", "!");
+
+		db_exec_no_reply (iface, "ANALYZE");
+	}
+
+	return iface;
+}
+
+static TrackerDBInterface *
+db_interface_get_email_contents (gboolean attach_all)
+{
+	TrackerDBInterface *iface;
+	gboolean            create;
+
+	iface = db_interface_get (TRACKER_DB_EMAIL_CONTENTS, 
+				  attach_all, 
+				  &create);
+
+	if (create) {
+		load_sql_file (iface, "sqlite-contents.sql", NULL);
+
+		db_exec_no_reply (iface, "ANALYZE");
+	}
+
+	tracker_db_interface_sqlite_create_function (iface, 
+						     "uncompress", 
+						     function_uncompress, 
+						     1);
+
+	return iface;
+}
+
+static gboolean
+db_xesam_get_service_mapping (TrackerDBInterface *iface, 
+			      const gchar        *type, 
+			      GList             **list)
+{
+	TrackerDBResultSet *result_set;
+	gboolean            valid = TRUE;
+
+	result_set = db_exec_proc (iface,
+				   "GetXesamServiceMappings",
+				   type, 
+				   NULL);
+
+	if (result_set) {
+		while (valid) {
+			gchar *st;
+			
+			tracker_db_result_set_get (result_set, 0, &st, -1);
+			if (strcmp (st, " ") != 0) {			
+				*list = g_list_prepend (*list, g_strdup (st));
+			}
+			
+			valid = tracker_db_result_set_iter_next (result_set);
+			g_free (st);
+		}
+		
+		*list = g_list_reverse (*list);
+		g_object_unref (result_set);
+	}
+
+	result_set = db_exec_proc (iface, 
+				   "GetXesamServiceChildren", 
+				   type, 
+				   NULL);
+	valid = TRUE;
+
+	if (result_set) {
+		while (valid) {
+			gchar *st;
+			
+			tracker_db_result_set_get (result_set, 0, &st, -1);
+			db_xesam_get_service_mapping (iface, st, list);
+			
+			valid = tracker_db_result_set_iter_next (result_set);
+			g_free (st);
+		}
+		
+		g_object_unref (result_set);
+	}
+
+	return TRUE;
+}
+
+static gboolean
+db_xesam_get_metadata_mapping (TrackerDBInterface  *iface, 
+			       const gchar         *type, 
+			       GList              **list)
+{
+	TrackerDBResultSet *result_set;
+	gboolean            valid = TRUE;
+
+	result_set = db_exec_proc (iface, 
+				   "GetXesamMetaDataMappings", 
+				   type, 
+				   NULL);
+
+	if (result_set) {
+		while (valid) {
+			gchar *st;
+			
+			tracker_db_result_set_get (result_set, 0, &st, -1);
+
+			if (strcmp(st, " ") != 0) {			
+				*list = g_list_prepend (*list, g_strdup (st));
+			}
+			
+			valid = tracker_db_result_set_iter_next (result_set);
+			g_free (st);
+		}
+
+		*list = g_list_reverse (*list);
+		g_object_unref (result_set);
+	}
+
+	result_set = db_exec_proc (iface, 
+				   "GetXesamMetaDataChildren", 
+				   type, 
+				   NULL);
+	valid = TRUE;
+
+	if (result_set) {
+		while (valid) {
+			gchar *st;
+			
+			tracker_db_result_set_get (result_set, 0, &st, -1);
+			db_xesam_get_service_mapping (iface, st ,list);
+			
+			valid = tracker_db_result_set_iter_next (result_set);
+			g_free (st);
+		}
+		
+		g_object_unref (result_set);
+	}
+
+	return TRUE;
+}
+
+static gboolean
+db_xesam_create_lookup (TrackerDBInterface *iface)
+{
+	TrackerDBResultSet *result_set;
+	gboolean            valid;
+	
+	valid = TRUE;
+
+	result_set = db_exec_proc (iface, 
+				   "GetXesamServiceTypes", 
+				   NULL);
+	
+	if (result_set) {
+		while (valid) {
+			GList *list = NULL;
+			GList *iter = NULL;
+			gchar *st;
+			
+			tracker_db_result_set_get (result_set, 0, &st, -1);
+			db_xesam_get_service_mapping (iface, st, &list);
+			
+			iter = g_list_first (list);
+
+			while (iter) {
+				db_exec_proc (iface,
+					      "InsertXesamServiceLookup", 
+					      st, 
+					      iter->data, 
+					      NULL);
+				g_free (iter->data);
+				iter = g_list_next (iter);
+			}			
+			
+			g_list_free (list);
+			
+			valid = tracker_db_result_set_iter_next (result_set);	
+		g_free (st);
+		}
+	}
+	
+	g_object_unref (result_set);	
+	
+	valid = TRUE;
+	result_set = db_exec_proc (iface, 
+				   "GetXesamMetaDataTypes", 
+				   NULL);
+	
+	if (result_set) {
+		while (valid) {
+			GList *list = NULL;
+			GList *iter = NULL;	
+			gchar *st;
+			
+			tracker_db_result_set_get (result_set, 0, &st, -1);
+			db_xesam_get_metadata_mapping (iface, st, &list);
+			
+			iter = g_list_first (list);
+			while (iter) {
+				db_exec_proc (iface, 
+					      "InsertXesamMetaDataLookup", 
+					      st, 
+					      iter->data, 
+					      NULL);
+				g_free (iter->data);
+				iter = g_list_next (iter);
+			}			
+			
+			g_list_free (list);
+			
+			valid = tracker_db_result_set_iter_next (result_set);
+			g_free (st);
+		}
+	}
+	
+	g_object_unref (result_set);	
+
+	return TRUE;
+}
+
+static TrackerDBInterface *
+db_interface_get_xesam (gboolean attach_all)
+{
+	TrackerDBInterface *iface;
+	gboolean            create;
+
+	iface = db_interface_get (TRACKER_DB_XESAM, 
+				  attach_all, 
+				  &create);
+
+	if (create) {
+		load_sql_file (iface, "sqlite-xesam.sql", NULL);
+		
+		load_service_file_xesam (iface, "xesam.metadata");
+		load_service_file_xesam (iface, "xesam-convenience.metadata");
+		load_service_file_xesam (iface, "xesam-virtual.metadata");
+		load_service_file_xesam (iface, "xesam.service");
+		load_service_file_xesam (iface, "xesam-convenience.service");
+		load_service_file_xesam (iface, "xesam-service.smapping");
+		load_service_file_xesam (iface, "xesam-metadata.mmapping");
+		
+		db_xesam_create_lookup (iface);
+
+		db_exec_no_reply (iface, "ANALYZE");
+	}
+
+	return iface;
+}
+
+static TrackerDBInterface *
+db_interface_create (TrackerDB db, 
+		     gboolean  attach_all)
+{
+	switch (db) {
+        case TRACKER_DB_COMMON:
+		return db_interface_get_common (attach_all);
+
+        case TRACKER_DB_CACHE:
+		return db_interface_get_cache (attach_all);
+
+        case TRACKER_DB_FILE_METADATA:
+		return db_interface_get_file_metadata (attach_all);
+
+        case TRACKER_DB_FILE_CONTENTS:
+		return db_interface_get_file_contents (attach_all);
+
+        case TRACKER_DB_EMAIL_METADATA:
+		return db_interface_get_email_metadata (attach_all);
+
+        case TRACKER_DB_EMAIL_CONTENTS:
+		return db_interface_get_email_contents (attach_all);
+
+	case TRACKER_DB_XESAM:
+		return db_interface_get_xesam (attach_all);
+	}
+
+	g_critical ("This TrackerDB type:%d->'%s' has no interface set up yet!!",
+		    db,
+		    db_type_to_string (db));
+
+	return NULL;
 }
 
 GType
@@ -1061,33 +1851,36 @@
 			  "cache" },
 			{ TRACKER_DB_FILE_METADATA, 
 			  "TRACKER_DB_FILE_METADATA", 
-			  "file-meta" },
+			  "file metadata" },
 			{ TRACKER_DB_FILE_CONTENTS, 
 			  "TRACKER_DB_FILE_CONTENTS", 
-			  "file-contents" },
+			  "file contents" },
 			{ TRACKER_DB_EMAIL_METADATA, 
 			  "TRACKER_DB_EMAIL_METADATA", 
-			  "email-meta" },
+			  "email metadata" },
 			{ TRACKER_DB_EMAIL_CONTENTS, 
 			  "TRACKER_DB_EMAIL_CONTENTS", 
-			  "email-contents" },
+			  "email contents" },
 			{ TRACKER_DB_XESAM, 
 			  "TRACKER_DB_XESAM", 
 			  "xesam" },
 			{ 0, NULL, NULL }
 		};
 
-		etype = g_enum_register_static ("TrackerDBType", values);
+		etype = g_enum_register_static ("TrackerDB", values);
 	}
 
 	return etype;
 }
 
 void
-tracker_db_manager_init (const gchar *data_dir, 
+tracker_db_manager_init (gboolean     attach_all_dbs,
+			 const gchar *data_dir, 
                          const gchar *user_data_dir,
                          const gchar *sys_tmp_dir) 
 {
+	GType etype;
+
         g_return_if_fail (data_dir != NULL);
         g_return_if_fail (user_data_dir != NULL);
         g_return_if_fail (sys_tmp_dir != NULL);
@@ -1096,6 +1889,20 @@
 		return;
 	}
 
+
+	/* Since we don't reference this enum anywhere, we do
+	 * it here to make sure it exists when we call
+	 * g_type_class_peek(). This wouldn't be necessary if
+	 * it was a param in a GObject for example.
+	 * 
+	 * This does mean that we are leaking by 1 reference
+	 * here and should clean it up, but it doesn't grow so
+	 * this is acceptable. 
+	 */
+	etype = tracker_db_get_type ();
+	db_type_enum_class_pointer = g_type_class_ref (etype);
+
+	/* Set up locations */
 	services_dir = g_build_filename (SHAREDIR, 
 					 "tracker", 
 					 "services", 
@@ -1103,18 +1910,22 @@
 	sql_dir = g_build_filename (SHAREDIR, 
 				    "tracker", 
 				    NULL);
-	
-	configure_database_description (data_dir, 
-					user_data_dir, 
-					sys_tmp_dir);
-	
+
+	/* Add prepared queries */
 	prepared_queries = g_hash_table_new_full (g_str_hash,
 						  g_str_equal,
 						  g_free,
 						  g_free);
-	
+
 	load_prepared_queries ();
-	
+
+	/* Configure database locations and interfaces */
+	set_up_databases (attach_all_dbs, 
+			  data_dir, 
+			  user_data_dir, 
+			  sys_tmp_dir);
+
+
 	initialized = TRUE;
 }
 
@@ -1127,18 +1938,34 @@
                 return;
         }
 
-	g_hash_table_unref (prepared_queries);
-	prepared_queries = NULL;
-
         for (i = 0; i < G_N_ELEMENTS (dbs); i++) {
                 if (dbs[i].abs_filename) {
                         g_free (dbs[i].abs_filename);
+			dbs[i].abs_filename = NULL;
+
+			g_object_unref (dbs[i].iface);
+			dbs[i].iface = NULL;
                 }
         }
 
+	g_hash_table_unref (prepared_queries);
+	prepared_queries = NULL;
+
         g_free (services_dir);
         g_free (sql_dir);
 
+	/* Since we don't reference this enum anywhere, we do
+	 * it here to make sure it exists when we call
+	 * g_type_class_peek(). This wouldn't be necessary if
+	 * it was a param in a GObject for example.
+	 * 
+	 * This does mean that we are leaking by 1 reference
+	 * here and should clean it up, but it doesn't grow so
+	 * this is acceptable. 
+	 */
+	g_type_class_unref (db_type_enum_class_pointer);
+	db_type_enum_class_pointer = NULL;
+
         initialized = FALSE;
 }
 
@@ -1148,72 +1975,62 @@
         return dbs[db].abs_filename;
 }
 
-gboolean
-tracker_db_manager_file_exists (TrackerDB db) 
-{
-        return g_file_test (dbs[db].abs_filename, G_FILE_TEST_IS_REGULAR);
-}
-
-gchar *
-tracker_db_manager_get_service_file (const gchar *service_file)
+TrackerDBInterface *
+tracker_db_manager_get_db_interface (TrackerDB db)
 {
-        g_return_val_if_fail (service_file != NULL, NULL);
-
-        return g_build_filename (services_dir, service_file, NULL);
+	return dbs[db].iface;
 }
 
-gchar *
-tracker_db_manager_get_sql_file (const gchar *sql_file) 
+TrackerDBInterface *
+tracker_db_manager_get_db_interface_by_service (const gchar *service, 
+						gboolean     content)
 {
-        g_return_val_if_fail (sql_file != NULL, NULL);
+	TrackerDBType type;
+	TrackerDB     db;
 
-        return g_build_filename (sql_dir, sql_file, NULL);
-}
+	g_return_val_if_fail (service != NULL, NULL);
 
-gint         
-tracker_db_manager_get_cache_size (TrackerDB db)
-{
-        return dbs[db].cache_size;
-}
+	type = tracker_ontology_get_db_for_service_type (service);
 
-gint         
-tracker_db_manager_get_page_size (TrackerDB db)
-{
-        return dbs[db].page_size;
-}
+	switch (type) {
+	case TRACKER_DB_TYPE_EMAIL:
+		if (G_UNLIKELY (content)) {
+			db = TRACKER_DB_EMAIL_CONTENTS;
+		} else {
+			db = TRACKER_DB_EMAIL_METADATA;
+		}
+		break;
 
-gboolean     
-tracker_db_manager_get_add_functions (TrackerDB db)
-{
-        return dbs[db].add_functions;
-}
+	default:
+		if (G_UNLIKELY (content)) {
+			db = TRACKER_DB_FILE_CONTENTS;
+		} else {
+			db = TRACKER_DB_FILE_METADATA;
+		}
+		break;
+	}
 
-const gchar *
-tracker_db_manager_get_name (TrackerDB db)
-{
-        return dbs[db].name;
+	return tracker_db_manager_get_db_interface (db);
 }
 
 TrackerDBInterface *
-tracker_db_manager_get_db_interface (TrackerDB db)
+tracker_db_manager_get_db_interface_content (TrackerDBInterface *iface)
 {
-	switch (db) {
-        case TRACKER_DB_COMMON:
-		return db_manager_get_common ();
+	guint i;
 
-        case TRACKER_DB_CACHE:
-        case TRACKER_DB_FILE_METADATA:
-		return db_manager_get_file_metadata ();
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
 
-        case TRACKER_DB_FILE_CONTENTS:
-        case TRACKER_DB_EMAIL_METADATA:
-        case TRACKER_DB_EMAIL_CONTENTS:
-	case TRACKER_DB_XESAM:
-		g_critical ("This TrackerDB type:%d->'%s' has no interface set up yet!!",
-			    db,
-			    db_manager_db_type_to_string (db));
-		break;
-	}
+        for (i = 0; i < G_N_ELEMENTS (dbs); i++) {
+		if (dbs[i].iface != iface) {
+			continue;
+		}
+
+		if (i == TRACKER_DB_FILE_METADATA) { 
+			return dbs[TRACKER_DB_FILE_CONTENTS].iface;
+		} else if (i == TRACKER_DB_EMAIL_METADATA) { 
+			return dbs[TRACKER_DB_EMAIL_CONTENTS].iface;
+		}
+	}	
 
 	return NULL;
 }

Modified: branches/xesam-support/src/libtracker-db/tracker-db-manager.h
==============================================================================
--- branches/xesam-support/src/libtracker-db/tracker-db-manager.h	(original)
+++ branches/xesam-support/src/libtracker-db/tracker-db-manager.h	Mon Jun  9 15:41:07 2008
@@ -42,24 +42,22 @@
 	TRACKER_DB_XESAM,
 } TrackerDB;
 
-GType        tracker_db_get_type                  (void) G_GNUC_CONST;
+GType        tracker_db_get_type                            (void) G_GNUC_CONST;
 
-void         tracker_db_manager_init              (const gchar *data_dir,
-                                                   const gchar *user_data_dir,
-                                                   const gchar *sys_tmp_root_dir);
-void         tracker_db_manager_shutdown          (void);
-
-const gchar *tracker_db_manager_get_file          (TrackerDB    db);
-gboolean     tracker_db_manager_file_exists       (TrackerDB    db);
-gchar *      tracker_db_manager_get_service_file  (const gchar *service_file);
-gchar *      tracker_db_manager_get_sql_file      (const gchar *sql_file);
-gint         tracker_db_manager_get_cache_size    (TrackerDB    db);
-gint         tracker_db_manager_get_page_size     (TrackerDB    db);
-gboolean     tracker_db_manager_get_add_functions (TrackerDB    db);
-const gchar *tracker_db_manager_get_name          (TrackerDB    db);
+void         tracker_db_manager_init                        (gboolean            attach_all_dbs,
+							     const gchar        *data_dir,
+							     const gchar        *user_data_dir,
+							     const gchar        *sys_tmp_root_dir);
+void         tracker_db_manager_shutdown                    (void);
 
+const gchar *tracker_db_manager_get_file                    (TrackerDB           db);
+TrackerDBInterface *
+             tracker_db_manager_get_db_interface            (TrackerDB           db);
+TrackerDBInterface *
+             tracker_db_manager_get_db_interface_by_service (const gchar        *service, 
+							     gboolean            content);
 TrackerDBInterface *
-             tracker_db_manager_get_db_interface  (TrackerDB    db);
+             tracker_db_manager_get_db_interface_content    (TrackerDBInterface *iface);
 
 G_END_DECLS
 

Modified: branches/xesam-support/src/tracker-indexer/tracker-main.c
==============================================================================
--- branches/xesam-support/src/tracker-indexer/tracker-main.c	(original)
+++ branches/xesam-support/src/tracker-indexer/tracker-main.c	Mon Jun  9 15:41:07 2008
@@ -163,7 +163,7 @@
 	sys_tmp_dir = g_build_filename (g_get_tmp_dir (), filename, NULL);
 	g_free (filename);
 
-	tracker_db_manager_init (data_dir, user_data_dir, sys_tmp_dir);
+	tracker_db_manager_init (FALSE, data_dir, user_data_dir, sys_tmp_dir);
 
 	g_free (data_dir);
 	g_free (user_data_dir);

Modified: branches/xesam-support/src/trackerd/Makefile.am
==============================================================================
--- branches/xesam-support/src/trackerd/Makefile.am	(original)
+++ branches/xesam-support/src/trackerd/Makefile.am	Mon Jun  9 15:41:07 2008
@@ -78,8 +78,6 @@
 	tracker-db.h							\
 	tracker-db-email.c						\
 	tracker-db-email.h						\
-	tracker-db-sqlite.c						\
-	tracker-db-sqlite.h						\
 	tracker-dbus.c							\
 	tracker-dbus.h							\
 	tracker-email.c							\

Modified: branches/xesam-support/src/trackerd/tracker-daemon.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-daemon.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-daemon.c	Mon Jun  9 15:41:07 2008
@@ -29,6 +29,7 @@
 #include <libtracker-common/tracker-dbus.h>
 
 #include <libtracker-db/tracker-db-dbus.h>
+#include <libtracker-db/tracker-db-manager.h>
 
 #include "tracker-dbus.h"
 #include "tracker-daemon.h"
@@ -40,14 +41,12 @@
 
 typedef struct {
 	DBusGProxy    *fd_proxy;
-	DBConnection  *db_con;
 	TrackerConfig *config;
 	Tracker       *tracker;
 } TrackerDaemonPriv;
 
 enum {
 	PROP_0,
-	PROP_DB_CONNECTION,
 	PROP_CONFIG,
 	PROP_TRACKER
 };
@@ -80,12 +79,6 @@
 	object_class->set_property = daemon_set_property;
 
 	g_object_class_install_property (object_class,
-					 PROP_DB_CONNECTION,
-					 g_param_spec_pointer ("db-connection",
-							       "DB connection",
-							       "DBConnection object use for transactions",
-							       G_PARAM_WRITABLE));
-	g_object_class_install_property (object_class,
 					 PROP_CONFIG,
 					 g_param_spec_object ("config",
 							      "Config",
@@ -177,10 +170,6 @@
 	priv = GET_PRIV (object);
 
 	switch (param_id) {
-	case PROP_DB_CONNECTION:
-		tracker_daemon_set_db_connection (TRACKER_DAEMON (object),
-						  g_value_get_pointer (value));
-		break;
 	case PROP_CONFIG:
 		tracker_daemon_set_config (TRACKER_DAEMON (object),
 					   g_value_get_object (value));
@@ -197,17 +186,14 @@
 }
 
 TrackerDaemon *
-tracker_daemon_new (DBConnection  *db_con,
-		    TrackerConfig *config,
+tracker_daemon_new (TrackerConfig *config,
 		    Tracker       *tracker)
 {
 	TrackerDaemon *object;
 
-	g_return_val_if_fail (db_con != NULL, NULL);
 	g_return_val_if_fail (TRACKER_IS_CONFIG (config), NULL);
 
 	object = g_object_new (TRACKER_TYPE_DAEMON, 
-			       "db-connection", db_con,
 			       "config", config,
 			       "tracker", tracker,
 			       NULL);
@@ -216,22 +202,6 @@
 }
 
 void
-tracker_daemon_set_db_connection (TrackerDaemon *object,
-				  DBConnection  *db_con)
-{
-	TrackerDaemonPriv *priv;
-
-	g_return_if_fail (TRACKER_IS_DAEMON (object));
-	g_return_if_fail (db_con != NULL);
-
-	priv = GET_PRIV (object);
-
-	priv->db_con = db_con;
-	
-	g_object_notify (G_OBJECT (object), "db-connection");
-}
-
-void
 tracker_daemon_set_config (TrackerDaemon *object,
 			   TrackerConfig *config)
 {
@@ -314,7 +284,7 @@
 			   GError        **error)
 {
 	TrackerDaemonPriv *priv;
-	guint                  request_id;
+	guint              request_id;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -338,10 +308,9 @@
 			     GHashTable    **values,
 			     GError        **error)
 {
-	TrackerDaemonPriv *priv;
-	TrackerDBResultSet    *result_set;
-	guint                  request_id;
-	DBConnection          *db_con;
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	guint               request_id;
 
 	/* FIXME: Note, the main_services_only variable is redundant */
 
@@ -349,14 +318,11 @@
 
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-
         tracker_dbus_request_new (request_id,
 				  "DBus request to get daemon services");
 
-	result_set = tracker_exec_proc (db_con, "GetServices", 0);
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+	result_set = tracker_db_exec_proc (iface, "GetServices", 0);
 	*values = tracker_dbus_query_result_to_hash_table (result_set);
 
 	if (result_set) {
@@ -373,23 +339,20 @@
 			  GPtrArray     **values,
 			  GError        **error)
 {
-	TrackerDaemonPriv *priv;
-	TrackerDBResultSet    *result_set;
-	guint                  request_id;
-	DBConnection          *db_con;
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	guint               request_id;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-
         tracker_dbus_request_new (request_id,
 				  "DBus request to get daemon service stats");
 
-	result_set = tracker_exec_proc (db_con, "GetStats", 0);
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
+	result_set = tracker_db_exec_proc (iface, "GetStats", 0);
         *values = tracker_dbus_query_result_to_ptr_array (result_set);
 
 	if (result_set) {
@@ -408,8 +371,8 @@
 				GError        **error)
 {
 	TrackerDaemonPriv *priv;
-	guint                  request_id;
-	gboolean               signal_state_change = FALSE;
+	guint              request_id;
+	gboolean           signal_state_change = FALSE;
 
 	/* FIXME: Shouldn't we just make the TrackerConfig module a
 	 * DBus object instead so values can be tweaked in real time
@@ -483,10 +446,6 @@
 				       tracker_config_get_enable_indexing (priv->config));
 	}
 
-	tracker_notify_file_data_available ();
-
-	tracker_dbus_request_success (request_id);
-
 	return TRUE;
 }
 
@@ -497,7 +456,7 @@
 			       GError        **error)
 {
 	TrackerDaemonPriv *priv;
-	guint                  request_id;
+	guint              request_id;
 
 	/* FIXME: Shouldn't we just make the TrackerConfig module a
 	 * DBus object instead so values can be tweaked in real time
@@ -527,8 +486,6 @@
 		g_message ("Maxinum number of unique words set to %d", value);
 	} 
 
-	tracker_notify_file_data_available ();
-
 	tracker_dbus_request_success (request_id);
 
 	return TRUE;
@@ -540,7 +497,7 @@
 			 GError        **error)
 {
 	TrackerDaemonPriv *priv;
-	guint                  request_id;
+	guint              request_id;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -567,7 +524,7 @@
 				     GError        **error)
 {
 	TrackerDaemonPriv *priv;
-	guint                  request_id;
+	guint              request_id;
 
 	request_id = tracker_dbus_get_next_request_id ();
 

Modified: branches/xesam-support/src/trackerd/tracker-daemon.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-daemon.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-daemon.h	Mon Jun  9 15:41:07 2008
@@ -26,7 +26,6 @@
 
 #include <libtracker-common/tracker-config.h>
 
-#include "tracker-db-sqlite.h"
 #include "tracker-main.h"
 
 #define TRACKER_DAEMON_SERVICE         "org.freedesktop.Tracker"
@@ -54,11 +53,8 @@
 };
 
 GType          tracker_daemon_get_type             (void);
-TrackerDaemon *tracker_daemon_new                  (DBConnection   *db_con,
-						    TrackerConfig  *config,
+TrackerDaemon *tracker_daemon_new                  (TrackerConfig  *config,
 						    Tracker        *tracker);
-void           tracker_daemon_set_db_connection    (TrackerDaemon  *object,
-						    DBConnection   *db_con);
 void           tracker_daemon_set_config           (TrackerDaemon  *object,
 						    TrackerConfig  *config);
 void           tracker_daemon_set_tracker          (TrackerDaemon  *object,

Modified: branches/xesam-support/src/trackerd/tracker-db-email.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-db-email.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-db-email.c	Mon Jun  9 15:41:07 2008
@@ -28,17 +28,19 @@
 #include <libtracker-common/tracker-parser.h>
 #include <libtracker-common/tracker-type-utils.h>
 
+#include <libtracker-db/tracker-db-manager.h>
+
 #include "tracker-db-email.h"
 
 #define MAX_ADDRESSES 255
 
 static gint
-tracker_db_email_get_mbox_offset (DBConnection *db_con, const gchar *mbox_uri)
+tracker_db_email_get_mbox_offset (TrackerDBInterface *iface, const gchar *mbox_uri)
 {
 	TrackerDBResultSet *result_set;
 	gint  offset;
 
-	result_set = tracker_exec_proc (db_con, "GetMBoxDetails", mbox_uri, NULL);
+	result_set = tracker_db_exec_proc (iface, "GetMBoxDetails", mbox_uri, NULL);
 
 	if (!result_set) {
 		return -1;
@@ -52,7 +54,7 @@
 
 
 void
-tracker_db_email_register_mbox (DBConnection    *db_con,
+tracker_db_email_register_mbox (TrackerDBInterface    *iface,
                                 MailApplication mail_app,
                                 MailType        mail_type,
                                 const gchar     *path,
@@ -64,7 +66,7 @@
 	gchar *str_mail_app = tracker_int_to_string (mail_app);
 	gchar *str_mail_type = tracker_int_to_string (mail_type);
 
-	tracker_exec_proc (db_con, "InsertMboxDetails", str_mail_app, str_mail_type, filename, path, uri_prefix, NULL);
+	tracker_db_exec_proc (iface, "InsertMboxDetails", str_mail_app, str_mail_type, filename, path, uri_prefix, NULL);
 
 	g_message ("Registered email store %s of type %s", filename, types[mail_type]);
 
@@ -74,30 +76,30 @@
 
 
 void
-tracker_db_email_flag_mbox_junk (DBConnection *db_con, const gchar *mbox_uri)
+tracker_db_email_flag_mbox_junk (TrackerDBInterface *iface, const gchar *mbox_uri)
 {
-	tracker_exec_proc (db_con, "SetJunkMbox", "1", mbox_uri, NULL);
+	tracker_db_exec_proc (iface, "SetJunkMbox", "1", mbox_uri, NULL);
 }
 
 
 void
-tracker_db_email_reset_mbox_junk (DBConnection *db_con, const gchar *mbox_uri)
+tracker_db_email_reset_mbox_junk (TrackerDBInterface *iface, const gchar *mbox_uri)
 {
-	tracker_exec_proc (db_con, "SetJunkMbox", "0", mbox_uri, NULL);
+	tracker_db_exec_proc (iface, "SetJunkMbox", "0", mbox_uri, NULL);
 }
 
 
 TrackerDBResultSet *
-tracker_db_email_get_mboxes (DBConnection *db_con)
+tracker_db_email_get_mboxes (TrackerDBInterface *iface)
 {
-	return tracker_exec_proc (db_con, "GetMboxes", NULL);
+	return tracker_db_exec_proc (iface, "GetMboxes", NULL);
 }
 
 
 void
-tracker_db_email_insert_junk (DBConnection *db_con, const gchar *mbox_uri, guint32 uid)
+tracker_db_email_insert_junk (TrackerDBInterface *iface, const gchar *mbox_uri, guint32 uid)
 {
-	gint mbox_id = tracker_db_email_get_mbox_id (db_con, mbox_uri);
+	gint mbox_id = tracker_db_email_get_mbox_id (iface, mbox_uri);
 		
 	if (mbox_id == -1) {
 		return;
@@ -106,9 +108,9 @@
 	gchar *str_mbox_id = tracker_int_to_string (mbox_id);
 	gchar *str_uid = tracker_uint_to_string (uid);
 
-	if (!tracker_db_email_lookup_junk (db_con, str_mbox_id, uid)) {
+	if (!tracker_db_email_lookup_junk (iface, str_mbox_id, uid)) {
 
-		tracker_exec_proc (db_con, "InsertJunk", str_uid, str_mbox_id, NULL);
+		tracker_db_exec_proc (iface, "InsertJunk", str_uid, str_mbox_id, NULL);
 	}
 
 	g_free (str_uid);	
@@ -117,12 +119,12 @@
 
 
 MailStore *
-tracker_db_email_get_mbox_details (DBConnection *db_con, const gchar *mbox_uri)
+tracker_db_email_get_mbox_details (TrackerDBInterface *iface, const gchar *mbox_uri)
 {
 	TrackerDBResultSet *result_set;
         MailStore *mail_store;
 
-        result_set = tracker_exec_proc (db_con, "GetMBoxDetails", mbox_uri, NULL);
+        result_set = tracker_db_exec_proc (iface, "GetMBoxDetails", mbox_uri, NULL);
 
         if (!result_set) {
                 return NULL;
@@ -157,12 +159,12 @@
 
 
 gint
-tracker_db_email_get_mbox_id (DBConnection *db_con, const gchar *mbox_uri)
+tracker_db_email_get_mbox_id (TrackerDBInterface *iface, const gchar *mbox_uri)
 {
 	TrackerDBResultSet *result_set;
 	gint  id;
 
-	result_set = tracker_exec_proc (db_con, "GetMboxID", mbox_uri, NULL);
+	result_set = tracker_db_exec_proc (iface, "GetMboxID", mbox_uri, NULL);
 
 	if (!result_set) {
 		return -1;
@@ -176,12 +178,12 @@
 
 
 gchar *
-tracker_db_email_get_mbox_uri_prefix (DBConnection *db_con, const gchar *mbox_uri)
+tracker_db_email_get_mbox_uri_prefix (TrackerDBInterface *iface, const gchar *mbox_uri)
 {
 	TrackerDBResultSet *result_set;
 	gchar *uri;
 
-	result_set = tracker_exec_proc (db_con, "GetMBoxDetails", mbox_uri, NULL);
+	result_set = tracker_db_exec_proc (iface, "GetMBoxDetails", mbox_uri, NULL);
 
 	if (!result_set) {
 		return NULL;
@@ -195,12 +197,12 @@
 
 
 gchar *
-tracker_db_email_get_mbox_path (DBConnection *db_con, const gchar *filename)
+tracker_db_email_get_mbox_path (TrackerDBInterface *iface, const gchar *filename)
 {
 	TrackerDBResultSet *result_set;
 	gchar *path;
 
-	result_set = tracker_exec_proc (db_con, "GetMBoxPath", filename, NULL);
+	result_set = tracker_db_exec_proc (iface, "GetMBoxPath", filename, NULL);
 
 	if (!result_set) {
 		return NULL;
@@ -214,7 +216,7 @@
 
 
 void
-tracker_db_email_get_message_counts (DBConnection *db_con,
+tracker_db_email_get_message_counts (TrackerDBInterface *iface,
                                      const gchar  *mbox_file_path,
                                      gint         *mail_count,
                                      gint         *junk_count,
@@ -226,7 +228,7 @@
 	*junk_count = 0;
 	*delete_count = 0;
 
-	result_set = tracker_exec_proc (db_con, "GetMBoxDetails", mbox_file_path, NULL);
+	result_set = tracker_db_exec_proc (iface, "GetMBoxDetails", mbox_file_path, NULL);
 
 	if (!result_set) {
 		return;
@@ -243,24 +245,24 @@
 
 
 void
-tracker_db_email_set_message_counts (DBConnection *db_con,
+tracker_db_email_set_message_counts (TrackerDBInterface *iface,
                                      const gchar  *dir_path,
                                      gint         mail_count,
                                      gint         junk_count,
                                      gint         delete_count)
 {
-	g_return_if_fail (db_con);
+	g_return_if_fail (iface);
 	g_return_if_fail (dir_path);
 	
 	/* make sure dir_path is registered in DB before doing an update */
-	if (tracker_db_email_get_mbox_offset (db_con, dir_path) != -1) {
+	if (tracker_db_email_get_mbox_offset (iface, dir_path) != -1) {
 		gchar *str_mail_count, *str_junk_count, *str_delete_count;
 
 		str_mail_count = tracker_uint_to_string (mail_count);
 		str_junk_count = tracker_uint_to_string (junk_count);
 		str_delete_count = tracker_uint_to_string (delete_count);
 
-		tracker_exec_proc (db_con, "UpdateMboxCounts", str_mail_count, str_junk_count, str_delete_count, dir_path, NULL);
+		tracker_db_exec_proc (iface, "UpdateMboxCounts", str_mail_count, str_junk_count, str_delete_count, dir_path, NULL);
 
 		g_free (str_mail_count);
 		g_free (str_junk_count);
@@ -273,14 +275,14 @@
 
 
 off_t
-tracker_db_email_get_last_mbox_offset (DBConnection *db_con, const gchar *mbox_file_path)
+tracker_db_email_get_last_mbox_offset (TrackerDBInterface *iface, const gchar *mbox_file_path)
 {
 	off_t offset;
 
-	g_return_val_if_fail (db_con, 0);
+	g_return_val_if_fail (iface, 0);
 	g_return_val_if_fail (mbox_file_path, 0);
 
-	offset = tracker_db_email_get_mbox_offset (db_con, mbox_file_path);
+	offset = tracker_db_email_get_mbox_offset (iface, mbox_file_path);
 
 	if (offset == -1) {
 		/* we need to add this mbox */
@@ -292,9 +294,9 @@
 
 
 void
-tracker_db_email_update_mbox_offset (DBConnection *db_con, MailFile *mf)
+tracker_db_email_update_mbox_offset (TrackerDBInterface *iface, MailFile *mf)
 {
-	g_return_if_fail (db_con);
+	g_return_if_fail (iface);
 	g_return_if_fail (mf);
 
 	if (!mf->path) {
@@ -303,11 +305,11 @@
 	}
 
 	/* make sure mbox is registered in DB before doing an update */
-	if (tracker_db_email_get_mbox_offset (db_con, mf->path) != -1) {
+	if (tracker_db_email_get_mbox_offset (iface, mf->path) != -1) {
 		gchar *str_offset;
 
 		str_offset = tracker_uint_to_string (mf->next_email_offset);
-		tracker_exec_proc (db_con, "UpdateMboxOffset", str_offset, mf->path, NULL);
+		tracker_db_exec_proc (iface, "UpdateMboxOffset", str_offset, mf->path, NULL);
 
 		g_free (str_offset);
 
@@ -398,9 +400,17 @@
 
 
 gboolean
-tracker_db_email_is_up_to_date (DBConnection *db_con, const gchar *uri, guint32 *id)
+tracker_db_email_is_up_to_date (const gchar *uri, 
+                                guint32     *id)
 {
-        return tracker_db_is_file_up_to_date (db_con->emails, uri, id);
+        TrackerDBInterface *iface;
+        
+        g_return_val_if_fail (uri != NULL, FALSE);
+        g_return_val_if_fail (id != NULL, FALSE);
+
+        iface = tracker_db_manager_get_db_interface (TRACKER_DB_EMAIL_METADATA);
+        
+        return tracker_db_file_is_up_to_date (iface, uri, id);
 }
 
 
@@ -418,13 +428,13 @@
 
 
 gboolean
-tracker_db_email_save_email (DBConnection *db_con, MailMessage *mm, MailApplication mail_app)
+tracker_db_email_save_email (TrackerDBInterface *iface, MailMessage *mm, MailApplication mail_app)
 {
        	gint  mbox_id, type_id, id, len;
 	gchar *service, *attachment_service, *mime;
 	gchar *array[MAX_ADDRESSES];
 
-     	g_return_val_if_fail (db_con, FALSE);
+     	g_return_val_if_fail (iface, FALSE);
 	g_return_val_if_fail (mm, FALSE);
 
 	if (!mm->uri) {
@@ -450,7 +460,7 @@
 
 	if (mm->deleted || mm->junk) {
 		if (mm->parent_mail_file) {
-			tracker_db_email_insert_junk (db_con, mm->parent_mail_file->path, mm->id);
+			tracker_db_email_insert_junk (iface, mm->parent_mail_file->path, mm->id);
 		}
 
 		if (mm->store) {
@@ -470,7 +480,7 @@
 
 	if (mm->parent_mail_file) {
 		if (mm->is_mbox) {
-			mbox_id = tracker_db_email_get_mbox_id (db_con, mm->parent_mail_file->path);
+			mbox_id = tracker_db_email_get_mbox_id (iface, mm->parent_mail_file->path);
 			if (mbox_id == -1) {
 				g_critical ("no mbox is registered for email %s", mm->uri);
 				return TRUE;
@@ -504,7 +514,7 @@
 	info->aux_id = mbox_id;
         info->mtime = mm->mtime;
 
-	id = tracker_db_create_service (db_con, service, info);
+	id = tracker_db_service_create (iface, service, info);
 
 	tracker_db_file_info_free (info);
 
@@ -524,20 +534,20 @@
 			gchar *value = get_utf8 (mm->body);
 
 			if (value) {
-				tracker_db_insert_single_embedded_metadata (db_con, service, str_id, "Email:Body", value, index_table);
+				tracker_db_metadata_insert_single_embedded (iface, service, str_id, "Email:Body", value, index_table);
 				g_free (value);
 			}			
 		}
 
 		if (str_date) {
-			tracker_db_insert_single_embedded_metadata (db_con, service, str_id, "Email:Date", str_date, index_table);
+			tracker_db_metadata_insert_single_embedded (iface, service, str_id, "Email:Date", str_date, index_table);
 		}
 
 		if (mm->from) {
 			gchar *value = get_utf8 (mm->from);
 			
 			if (value) {
-				tracker_db_insert_single_embedded_metadata (db_con, service, str_id, "Email:Sender", value, index_table);
+				tracker_db_metadata_insert_single_embedded (iface, service, str_id, "Email:Sender", value, index_table);
 				g_free (value);
 			}
 		}
@@ -546,7 +556,7 @@
 			gchar *value = get_utf8 (mm->subject);
 
 			if (value) {
-				tracker_db_insert_single_embedded_metadata (db_con, service, str_id, "Email:Subject", value, index_table);
+				tracker_db_metadata_insert_single_embedded (iface, service, str_id, "Email:Subject", value, index_table);
 				g_free (value);
 			}
 		}
@@ -587,12 +597,15 @@
 			}
 
 			if (i > 0) {
-				tracker_db_insert_embedded_metadata (db_con, service, str_id, "Email:SentTo", array, i, index_table);
+				tracker_db_metadata_insert_embedded (iface, 
+                                                                     service, 
+                                                                     str_id,
+                                                                     "Email:SentTo", 
+                                                                     array, 
+                                                                     index_table);
 			}
 
-			for (i--; i>-1; i--) {
-				g_free (array[i]);
-			}
+                        g_strfreev (array);
 		}
 
 		len = g_slist_length (mm->cc);
@@ -627,12 +640,15 @@
 			}
 
 			if (i > 0) {
-				tracker_db_insert_embedded_metadata (db_con, service, str_id, "Email:CC", array, i, index_table);
+				tracker_db_metadata_insert_embedded (iface, 
+                                                                     service, 
+                                                                     str_id,
+                                                                     "Email:CC", 
+                                                                     array,
+                                                                     index_table);
 			}
 
-			for (i--; i > -1; i--) {
-				g_free (array[i]);
-			}		
+                        g_strfreev (array);
 		}
 
 		len = g_slist_length (mm->attachments);
@@ -657,12 +673,15 @@
 			}
 
 			if (i > 0) {
-				tracker_db_insert_embedded_metadata (db_con, service, str_id, "Email:Attachments", array, i, index_table);
+				tracker_db_metadata_insert_embedded (iface, 
+                                                                     service, 
+                                                                     str_id,
+                                                                     "Email:Attachments", 
+                                                                     array, 
+                                                                     index_table);
 			}
 
-			for (i--; i > -1; i--) {
-				g_free (array[i]);
-			}
+                        g_strfreev (array);
 		}
 
 		tracker_parser_text_free (index_table);
@@ -692,7 +711,7 @@
                                 uri = g_strconcat (mm->uri, "/", ma->attachment_name, NULL);
                                 g_message ("Indexing attachment with uri:'%s' and mime:'%s'",
                                            uri, attachment_info->mime);
-                                /* tracker_db_index_file (db_con, attachment_info, uri, attachment_service); */
+                                /* tracker_db_index_file (iface, attachment_info, uri, attachment_service); */
                                 g_free (uri);
 
                                 tracker_db_file_info_unref (attachment_info);
@@ -720,19 +739,19 @@
 
 
 gboolean
-tracker_db_email_is_saved_email_file (DBConnection *db_con, const gchar *uri)
+tracker_db_email_is_saved_email_file (TrackerDBInterface *iface, const gchar *uri)
 {
-        g_return_val_if_fail (db_con, FALSE);
+        g_return_val_if_fail (iface, FALSE);
         g_return_val_if_fail (uri, FALSE);
 
-        return tracker_db_get_file_id (db_con, uri) != 0 ;
+        return tracker_db_file_get_id (iface, uri) != 0 ;
 }
 
 
 void
-tracker_db_email_update_email (DBConnection *db_con, MailMessage *mm)
+tracker_db_email_update_email (TrackerDBInterface *iface, MailMessage *mm)
 {
-	g_return_if_fail (db_con);
+	g_return_if_fail (iface);
 	g_return_if_fail (mm);
 
 	g_message ("update email with uri \"%s\" and subject \"%s\" from \"%s\"", mm->uri, mm->subject, mm->from);
@@ -742,9 +761,9 @@
 
 
 gboolean
-tracker_db_email_delete_emails_of_mbox (DBConnection *db_con, const gchar *mbox_file_path)
+tracker_db_email_delete_emails_of_mbox (TrackerDBInterface *iface, const gchar *mbox_file_path)
 {
-        g_return_val_if_fail (db_con, FALSE);
+        g_return_val_if_fail (iface, FALSE);
         g_return_val_if_fail (mbox_file_path, FALSE);
 
 	/* FIXME: add code... */
@@ -753,12 +772,14 @@
 
 
 gboolean
-tracker_db_email_delete_email (DBConnection *db_con, const gchar *uri)
+tracker_db_email_delete_email (TrackerDBInterface *iface, const gchar *uri)
 {
-        g_return_val_if_fail (db_con, FALSE);
+        gchar *id;
+        
+        g_return_val_if_fail (iface, FALSE);
         g_return_val_if_fail (uri, FALSE);
 
-	gchar *id = tracker_db_get_id (db_con, "Emails", uri);
+	id = tracker_db_file_get_id_as_string (iface, "Emails", uri);
 
 	if (!id) {
 		return FALSE;
@@ -766,7 +787,7 @@
 
 	g_message ("Deleting email:'%s'", uri);
 
-	tracker_db_delete_directory (db_con, atoi (id), uri);
+	tracker_db_directory_delete (iface, atoi (id), uri);
 
 	g_free (id);
 
@@ -775,7 +796,7 @@
 
 
 gboolean
-tracker_db_email_lookup_junk (DBConnection *db_con, const gchar *mbox_id, gint uid)
+tracker_db_email_lookup_junk (TrackerDBInterface *iface, const gchar *mbox_id, gint uid)
 {
 	TrackerDBResultSet *result_set;
         gchar *str_uid;
@@ -783,7 +804,7 @@
 
 	str_uid = tracker_uint_to_string (uid);
 
-	result_set = tracker_exec_proc (db_con, "LookupJunk", str_uid, mbox_id, NULL);
+	result_set = tracker_db_exec_proc (iface, "LookupJunk", str_uid, mbox_id, NULL);
 
 	g_free (str_uid);
 

Modified: branches/xesam-support/src/trackerd/tracker-db-email.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-db-email.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-db-email.h	Mon Jun  9 15:41:07 2008
@@ -24,62 +24,61 @@
 #include "tracker-db.h"
 #include "tracker-email-utils.h"
 
-off_t               tracker_db_email_get_last_mbox_offset  (DBConnection    *db_con,
-                                                            const gchar     *mail_file_path);
-void                tracker_db_email_update_mbox_offset    (DBConnection    *db_con,
-                                                            MailFile        *mf);
-gboolean            tracker_db_email_is_up_to_date         (DBConnection    *db_con,
-                                                            const gchar     *uri,
-                                                            guint32         *id);
-gboolean            tracker_db_email_save_email            (DBConnection    *db_con,
-                                                            MailMessage     *mm,
-                                                            MailApplication  mail_app);
-gboolean            tracker_db_email_is_saved_email_file   (DBConnection    *db_con,
-                                                            const gchar     *uri);
-void                tracker_db_email_update_email          (DBConnection    *db_con,
-                                                            MailMessage     *mm);
-gboolean            tracker_db_email_delete_email_file     (DBConnection    *db_con,
-                                                            const gchar     *uri);
-gboolean            tracker_db_email_delete_emails_of_mbox (DBConnection    *db_con,
-                                                            const gchar     *mbox_file_path);
-gboolean            tracker_db_email_delete_email          (DBConnection    *db_con,
-                                                            const gchar     *uri);
-gint                tracker_db_email_get_mbox_id           (DBConnection    *db_con,
-                                                            const gchar     *mbox_uri);
-void                tracker_db_email_insert_junk           (DBConnection    *db_con,
-                                                            const gchar     *mbox_uri,
-                                                            guint32          uid);
-void                tracker_db_email_reset_mbox_junk       (DBConnection    *db_con,
-                                                            const gchar     *mbox_uri);
-void                tracker_db_email_flag_mbox_junk        (DBConnection    *db_con,
-                                                            const gchar     *mbox_uri);
-void                tracker_db_email_register_mbox         (DBConnection    *db_con,
-                                                            MailApplication  mail_app,
-                                                            MailType         mail_type,
-                                                            const gchar     *path,
-                                                            const gchar     *filename,
-                                                            const gchar     *uri_prefix);
-gchar *             tracker_db_email_get_mbox_path         (DBConnection    *db_con,
-                                                            const gchar     *filename);
-void                tracker_db_email_set_message_counts    (DBConnection    *db_con,
-                                                            const gchar     *dir_path,
-                                                            gint             mail_count,
-                                                            gint             junk_count,
-                                                            gint             delete_count);
-void                tracker_db_email_get_message_counts    (DBConnection    *db_con,
-                                                            const gchar     *mbox_file_path,
-                                                            gint            *mail_count,
-                                                            gint            *junk_count,
-                                                            gint            *delete_count);
-gchar *             tracker_db_email_get_mbox_uri_prefix   (DBConnection    *db_con,
-                                                            const gchar     *mbox_uri);
-gboolean            tracker_db_email_lookup_junk           (DBConnection    *db_con,
-                                                            const gchar     *mbox_id,
-                                                            gint             uid);
-void                tracker_db_email_free_mail_store       (MailStore       *store);
-MailStore *         tracker_db_email_get_mbox_details      (DBConnection    *db_con,
-                                                            const gchar     *mbox_uri);
-TrackerDBResultSet *tracker_db_email_get_mboxes            (DBConnection    *db_con);
+off_t               tracker_db_email_get_last_mbox_offset  (TrackerDBInterface *iface,
+							    const gchar        *mail_file_path);
+void                tracker_db_email_update_mbox_offset    (TrackerDBInterface *iface,
+							    MailFile           *mf);
+gboolean            tracker_db_email_is_up_to_date         (const gchar        *uri,
+							    guint32            *id);
+gboolean            tracker_db_email_save_email            (TrackerDBInterface *iface,
+							    MailMessage        *mm,
+							    MailApplication     mail_app);
+gboolean            tracker_db_email_is_saved_email_file   (TrackerDBInterface *iface,
+							    const gchar        *uri);
+void                tracker_db_email_update_email          (TrackerDBInterface *iface,
+							    MailMessage        *mm);
+gboolean            tracker_db_email_delete_email_file     (TrackerDBInterface *iface,
+							    const gchar        *uri);
+gboolean            tracker_db_email_delete_emails_of_mbox (TrackerDBInterface *iface,
+							    const gchar        *mbox_file_path);
+gboolean            tracker_db_email_delete_email          (TrackerDBInterface *iface,
+							    const gchar        *uri);
+gint                tracker_db_email_get_mbox_id           (TrackerDBInterface *iface,
+							    const gchar        *mbox_uri);
+void                tracker_db_email_insert_junk           (TrackerDBInterface *iface,
+							    const gchar        *mbox_uri,
+							    guint32             uid);
+void                tracker_db_email_reset_mbox_junk       (TrackerDBInterface *iface,
+							    const gchar        *mbox_uri);
+void                tracker_db_email_flag_mbox_junk        (TrackerDBInterface *iface,
+							    const gchar        *mbox_uri);
+void                tracker_db_email_register_mbox         (TrackerDBInterface *iface,
+							    MailApplication     mail_app,
+							    MailType            mail_type,
+							    const gchar        *path,
+							    const gchar        *filename,
+							    const gchar        *uri_prefix);
+gchar *             tracker_db_email_get_mbox_path         (TrackerDBInterface *iface,
+							    const gchar        *filename);
+void                tracker_db_email_set_message_counts    (TrackerDBInterface *iface,
+							    const gchar        *dir_path,
+							    gint                mail_count,
+							    gint                junk_count,
+							    gint                delete_count);
+void                tracker_db_email_get_message_counts    (TrackerDBInterface *iface,
+							    const gchar        *mbox_file_path,
+							    gint               *mail_count,
+							    gint               *junk_count,
+							    gint               *delete_count);
+gchar *             tracker_db_email_get_mbox_uri_prefix   (TrackerDBInterface *iface,
+							    const gchar        *mbox_uri);
+gboolean            tracker_db_email_lookup_junk           (TrackerDBInterface *iface,
+							    const gchar        *mbox_id,
+							    gint                uid);
+void                tracker_db_email_free_mail_store       (MailStore          *store);
+MailStore *         tracker_db_email_get_mbox_details      (TrackerDBInterface *iface,
+							    const gchar        *mbox_uri);
+TrackerDBResultSet *tracker_db_email_get_mboxes            (TrackerDBInterface *iface);
 
 
 #endif /* __TRACKERD_DB_EMAIL_BASE_H__ */

Modified: branches/xesam-support/src/trackerd/tracker-db.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-db.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-db.c	Mon Jun  9 15:41:07 2008
@@ -3,6 +3,7 @@
  * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc gnome org)
  * Copyright (C) 2007, Jason Kivlighn (jkivlighn gmail com)
  * Copyright (C) 2007, Creative Commons (http://creativecommons.org) 
+ * Copyright (C) 2008, Nokia
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public
@@ -22,177 +23,589 @@
 
 #include "config.h"
 
-#include <libtracker-common/tracker-file-utils.h>
-#include <libtracker-common/tracker-os-dependant.h>
+#include <string.h>
+#include <fcntl.h>
+#include <zlib.h>
+
+#include <glib/gstdio.h>
+
+#include <libtracker-common/tracker-file-utils.h> 
+#include <libtracker-common/tracker-nfs-lock.h>
+#include <libtracker-common/tracker-type-utils.h>
+#include <libtracker-common/tracker-utils.h>
+
+#include <libtracker-db/tracker-db-interface-sqlite.h>
+#include <libtracker-db/tracker-db-manager.h>
 
 #include "tracker-db.h"
 #include "tracker-process-files.h"
-
-gboolean
-tracker_db_is_file_up_to_date (DBConnection *db_con, 
-			       const gchar  *uri, 
-			       guint32      *id)
+#include "tracker-query-tree.h"
+#include "tracker-watcher.h"
+#include "tracker-xesam-manager.h"
+
+#define ZLIBBUFSIZ            8192
+
+extern Tracker *tracker;
+
+static gchar *
+compress_string (const gchar *ptr, 
+		 gint         size, 
+		 gint        *compressed_size)
 {
-	TrackerDBResultSet *result_set;
-	gchar              *path, *name;
-	gint32              index_time;
+	z_stream       zs;
+	gchar         *buf, *swap;
+	unsigned char  obuf[ZLIBBUFSIZ];
+	gint           rv, asiz, bsiz, osiz;
 
-	g_return_val_if_fail (db_con != NULL, FALSE);
-	g_return_val_if_fail (uri != NULL, FALSE);
-	g_return_val_if_fail (id != NULL, FALSE);
+	if (size < 0) { 
+		size = strlen (ptr);
+	}
 
-	if (uri[0] == G_DIR_SEPARATOR) {
-		name = g_path_get_basename (uri);
-		path = g_path_get_dirname (uri);
-	} else {
-		name = tracker_file_get_vfs_name (uri);
-		path = tracker_file_get_vfs_path (uri);
+	zs.zalloc = Z_NULL;
+	zs.zfree = Z_NULL;
+	zs.opaque = Z_NULL;
+
+	if (deflateInit2 (&zs, 6, Z_DEFLATED, 15, 6, Z_DEFAULT_STRATEGY) != Z_OK) {
+		return NULL;
 	}
 
-	result_set = tracker_exec_proc (db_con, "GetServiceID", path, name, NULL);
+	asiz = size + 16;
 
-	g_free (path);
-	g_free (name);
+	if (asiz < ZLIBBUFSIZ) {
+		asiz = ZLIBBUFSIZ;
+	}
 
-	index_time = 0;
-	*id = 0;
+	if (!(buf = malloc (asiz))) {
+		deflateEnd (&zs);
+		return NULL;
+	}
 
-	if (result_set) {
-		tracker_db_result_set_get (result_set,
-					   0, id,
-					   1, &index_time,
-					   -1);
+	bsiz = 0;
+	zs.next_in = (unsigned char *)ptr;
+	zs.avail_in = size;
+	zs.next_out = obuf;
+	zs.avail_out = ZLIBBUFSIZ;
+
+	while ((rv = deflate (&zs, Z_FINISH)) == Z_OK) {
+		osiz = ZLIBBUFSIZ - zs.avail_out;
+
+		if (bsiz + osiz > asiz) {
+			asiz = asiz * 2 + osiz;
+
+			if (!(swap = realloc (buf, asiz))) {
+				free (buf);
+				deflateEnd (&zs);
+				return NULL;
+			}
 
-		g_object_unref (result_set);
-	} else {
-		return FALSE;
+			buf = swap;
+		}
+
+		memcpy (buf + bsiz, obuf, osiz);
+		bsiz += osiz;
+		zs.next_out = obuf;
+		zs.avail_out = ZLIBBUFSIZ;
 	}
 
-	if (index_time < tracker_file_get_mtime (uri)) {
-		return FALSE;
+	if (rv != Z_STREAM_END) {
+		free (buf);
+		deflateEnd (&zs);
+		return NULL;
 	}
 
-	return TRUE;
+	osiz = ZLIBBUFSIZ - zs.avail_out;
+
+	if (bsiz + osiz + 1 > asiz) {
+		asiz = asiz * 2 + osiz;
+
+		if (!(swap = realloc (buf, asiz))) {
+			free (buf);
+			deflateEnd (&zs);
+			return NULL;
+		}
+
+		buf = swap;
+	}
+
+	memcpy (buf + bsiz, obuf, osiz);
+	bsiz += osiz;
+	buf[bsiz] = '\0';
+
+	*compressed_size = bsiz;
+
+	deflateEnd (&zs);
+
+	return buf;
 }
 
-guint32
-tracker_db_get_file_id (DBConnection *db_con, 
-			const gchar  *uri)
+static gboolean
+db_exec_proc_no_reply (TrackerDBInterface *iface, 
+		       const gchar        *procedure, 
+		       ...)
 {
 	TrackerDBResultSet *result_set;
-	char	*path, *name;
-	guint32	id;
+	va_list args;
 
-	g_return_val_if_fail (db_con != NULL, 0);
-	g_return_val_if_fail (uri != NULL, 0);
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), FALSE);
+	g_return_val_if_fail (procedure != NULL, FALSE);
 
-	if (uri[0] == G_DIR_SEPARATOR) {
-		name = g_path_get_basename (uri);
-		path = g_path_get_dirname (uri);
+	va_start (args, procedure);
+	result_set = tracker_db_interface_execute_vprocedure (iface, 
+							      NULL, 
+							      procedure, 
+							      args);
+	va_end (args);
+
+	if (result_set) {
+		g_object_unref (result_set);
+	}
+
+	return TRUE;
+}
+
+static void
+db_save_full_text (TrackerDBInterface *iface,
+		   const gchar        *str_file_id, 
+		   const gchar        *text, 
+		   gint                length)
+{
+	gchar       *compressed, *value = NULL;
+	gint         bytes_compressed;
+	const gchar *field_id;
+
+	compressed = compress_string (text, length, &bytes_compressed);
+
+	if (compressed) {
+		g_debug ("Compressed full text size of %d to %d", 
+			 length, bytes_compressed);
+		value = compressed;
 	} else {
-		name = tracker_file_get_vfs_name (uri);
-		path = tracker_file_get_vfs_path (uri);
+		g_warning ("Could not compress text'%*s...', length:%d", 
+			   16, text, length);
+		value = g_strdup (text);
+		bytes_compressed = length;
 	}
 
-	result_set = tracker_exec_proc (db_con, "GetServiceID", path, name, NULL);
+	field_id = tracker_ontology_get_field_id ("File:Contents");
 
-	g_free (path);
-	g_free (name);
+	if (!field_id) {
+		g_warning ("Metadata not found for type:'File:Contents'");
+		g_free (value);
+		return;
+	}
 
-	id = 0;
+	tracker_db_interface_execute_procedure_len (iface,
+						    NULL,
+						    "SaveServiceContents",
+						    str_file_id, 
+						    -1,
+						    field_id,
+						    -1,
+						    value, 
+						    bytes_compressed,
+						    NULL);
+	g_free (value);
+}
+
+static void
+update_metadata_index (const gchar  *id, 
+		       const gchar  *service, 
+		       TrackerField *def, 
+		       const gchar  *old_value, 
+		       const gchar  *new_value) 
+{
+	GHashTable *old_table;
+	GHashTable *new_table;
+	gint        sid;
+
+	g_return_if_fail (TRACKER_IS_FIELD (def));
+
+	old_table = NULL;
+	new_table = NULL;
+
+	if (old_value) {
+		old_table = tracker_parser_text (old_table, 
+						 old_value, 
+						 tracker_field_get_weight (def), 
+						 tracker->language, 
+ 						 tracker_config_get_max_words_to_index (tracker->config),
+ 						 tracker_config_get_max_word_length (tracker->config),
+ 						 tracker_config_get_min_word_length (tracker->config),
+						 tracker_field_get_filtered (def), 
+						 tracker_field_get_delimited (def));
+	}
+
+	/* Parse new metadata value */
+	if (new_value) {
+		new_table = tracker_parser_text (new_table, 
+						 new_value, 
+						 tracker_field_get_weight (def), 
+						 tracker->language, 
+ 						 tracker_config_get_max_words_to_index (tracker->config),
+ 						 tracker_config_get_max_word_length (tracker->config),
+ 						 tracker_config_get_min_word_length (tracker->config),
+						 tracker_field_get_filtered (def), 
+						 tracker_field_get_delimited (def));
+	}
+
+	/* We only do differential updates so only changed words scores are updated */
+	sid = tracker_ontology_get_id_for_service_type (service);
+#if 0
+	tracker_db_update_differential_index (old_table, new_table, id, sid);
+#endif
+
+	tracker_parser_text_free (old_table);
+	tracker_parser_text_free (new_table);
+}
+
+static gchar *
+format_date (const gchar *avalue)
+{
+	gchar *dvalue;
+
+	dvalue = tracker_date_format (avalue);
+
+	if (dvalue) {
+		time_t time;
+
+		time = tracker_string_to_date (dvalue);
+		g_free (dvalue);
+
+		if (time != -1) {
+			return tracker_int_to_string (time);
+		} 
+	}
+
+	return NULL;
+}
+
+static gchar *
+get_backup_id (TrackerDBInterface *iface,
+	       const gchar        *id)
+{
+	TrackerDBResultSet *result_set;
+	gchar              *backup_id = NULL;
+
+	result_set = tracker_db_exec_proc (iface, 
+					   "GetBackupServiceByID", 
+					   id, 
+					   NULL);
 
 	if (result_set) {
-		tracker_db_result_set_get (result_set, 0, &id, -1);
+		tracker_db_result_set_get (result_set, 0, &backup_id, -1);
 		g_object_unref (result_set);
 	}
 
-	return id;
+	if (!backup_id) {
+		gint64 id;
+
+		tracker_db_exec_proc (iface, 
+				      "InsertBackupService", 
+				      id, 
+				      NULL);
+		id = tracker_db_interface_sqlite_get_last_insert_id (TRACKER_DB_INTERFACE_SQLITE (iface));
+		backup_id = tracker_int_to_string (id);
+	}
+
+	return backup_id;
 }
 
-TrackerDBFileInfo *
-tracker_db_get_file_info (DBConnection      *db_con, 
-			  TrackerDBFileInfo *info)
+static inline void
+backup_non_embedded_metadata (TrackerDBInterface *iface, 
+			      const gchar        *id, 
+			      const gchar        *key_id, 
+			      const gchar        *value)
 {
-	TrackerDBResultSet *result_set;
-	gchar              *path, *name;
+	gchar *backup_id;
+	
+	backup_id = get_backup_id (iface, id);
+
+	if (backup_id) {
+		tracker_db_exec_proc (tracker_db_manager_get_db_interface (TRACKER_DB_COMMON), 
+				      "SetBackupMetadata", 
+				      backup_id, 
+				      key_id, 
+				      value, 
+				      NULL);
+		g_free (backup_id);
+	}
+}
 
-	g_return_val_if_fail (db_con != NULL, info);
-	g_return_val_if_fail (info != NULL, info);
+static inline void
+backup_delete_non_embedded_metadata_value (TrackerDBInterface *iface, 
+					   const gchar        *id, 
+					   const gchar        *key_id, 
+					   const gchar        *value)
+{
+	gchar *backup_id;
 
-	if (!tracker_db_file_info_is_valid (info)) {
+	backup_id = get_backup_id (iface, id);
+
+	if (backup_id) {
+		tracker_db_exec_proc (tracker_db_manager_get_db_interface (TRACKER_DB_COMMON), 
+				      "DeleteBackupMetadataValue", 
+				      backup_id, 
+				      key_id, 
+				      value, 
+				      NULL);
+		g_free (backup_id);
+	}
+}
+
+static inline void
+backup_delete_non_embedded_metadata (TrackerDBInterface *iface,
+				     const gchar        *id, 
+				     const gchar        *key_id)
+{
+	gchar *backup_id;
+
+	backup_id = get_backup_id (iface, id);
+
+	if (backup_id) {
+		tracker_db_exec_proc (tracker_db_manager_get_db_interface (TRACKER_DB_COMMON), 
+				      "DeleteBackupMetadata", 
+				      backup_id, 
+				      key_id, 
+				      NULL);
+		g_free (backup_id);
+	}
+}
+
+static gchar *
+remove_value (const gchar *str, 
+	      const gchar *del_str) 
+{
+	GString  *s = NULL;
+	gchar   **p;
+	gchar   **strv;
+
+	strv = g_strsplit (str, "|", -1);
+
+	for (p = strv; *p; p++) {
+		if (tracker_is_empty_string (*p)) {
+			continue;
+		}
+
+		if (strcmp (del_str, *p) != 0) {
+			if (!s) {
+				s = g_string_new (*p);
+			} else {
+				g_string_append_printf (s, "%s%s", "|", *p);
+			}
+		}
+	}
+
+	g_strfreev (strv);
+
+	if (!s) {
 		return NULL;
 	}
 
-	name = g_path_get_basename (info->uri);
-	path = g_path_get_dirname (info->uri);
+	return g_string_free (s, FALSE);
+}
 
-	result_set = tracker_exec_proc (db_con, "GetServiceID", path, name, NULL);
+/* Deprecated */
+static guint32
+db_create_event (TrackerDBInterface *iface, 
+		 const gchar        *service_id_str, 
+		 const gchar        *type)
+{
+	TrackerDBResultSet *result_set;
+	gchar	           *eid;
+	gint	            i;
+	guint32	            id = 0;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), 0);
+
+	result_set = tracker_db_exec_proc (iface, 
+					   "GetNewEventID", 
+					   NULL);
+
+	if (!result_set) {
+		g_critical ("Could not create event, GetNewEventID failed");
+		return 0;
+	}
 
-	g_free (name);
-	g_free (path);
+	tracker_db_result_set_get (result_set, 0, &eid, -1);
+	i = atoi (eid);
+	g_free (eid);
+
+	i++;
+	eid = tracker_int_to_string (i);
+
+	result_set = tracker_db_exec_proc (iface,
+					   "UpdateNewEventID", 
+					   eid, 
+					   NULL);
+	if (result_set)
+		g_object_unref (result_set);
+
+	/* Uses the Events table */
+	result_set = tracker_db_exec_proc (iface, 
+					   "CreateEvent", 
+					   eid, 
+					   service_id_str, 
+					   type, 
+					   NULL);
+
+	id = tracker_db_interface_sqlite_get_last_insert_id (TRACKER_DB_INTERFACE_SQLITE (iface));
 
 	if (result_set) {
-		gint     id, indextime, service_type_id;
-		gboolean is_directory;
+		g_object_unref (result_set);
+	}
 
-		tracker_db_result_set_get (result_set,
-					   0, &id,
-					   1, &indextime,
-					   2, &is_directory,
-					   3, &service_type_id,
-					   -1);
+	g_free (eid);
 
-		if (id > 0) {
-			info->file_id = id;
-			info->is_new = FALSE;
-		}
+	tracker_xesam_manager_wakeup (NULL);
 
-		info->indextime = indextime;
-		info->is_directory = is_directory;
-		info->service_type_id = service_type_id;
+	return id;
+}
 
-		g_object_unref (result_set);
+static void
+delete_index_for_service (TrackerDBInterface *iface, 
+			  guint32             id)
+{
+	gchar *str_file_id;
+
+	str_file_id = tracker_uint_to_string (id);
+
+	tracker_db_exec_proc (tracker_db_manager_get_db_interface_content (iface), 
+			      "DeleteAllContents",
+			      str_file_id, 
+			      NULL);
+
+	g_free (str_file_id);
+}
+
+static void
+dec_stat (gint id)
+{
+	TrackerDBInterface *iface;
+	gchar              *service;
+	gchar              *parent;
+        
+        service = tracker_ontology_get_service_type_by_id (id);
+
+	if (!service) {
+		return;
 	}
 
-	return info;
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_COMMON);
+
+	tracker_db_exec_proc (iface, "DecStat", service, NULL);
+	
+	parent = tracker_ontology_get_parent_service (service);
+	
+	if (parent) {
+		tracker_db_exec_proc (iface, "DecStat", parent, NULL);
+		g_free (parent);
+	}
+	
+	g_free (service);
 }
 
-gchar **
-tracker_db_get_files_in_folder (DBConnection *db_con, 
-				const gchar  *uri)
+/* Update all non-dirs in a dir for a file move */
+static void
+directory_move_files (TrackerDBInterface *iface, 
+		      const gchar        *moved_from_uri, 
+		      const gchar        *moved_to_uri)
 {
 	TrackerDBResultSet *result_set;
-	GPtrArray          *array;
 
-	g_return_val_if_fail (db_con != NULL, NULL);
-	g_return_val_if_fail (uri != NULL, NULL);
-
-	result_set = tracker_exec_proc (db_con, "SelectFileChild", uri, NULL);
-	array = g_ptr_array_new ();
+	/* Get all sub files (excluding folders) that were moved and add watches */
+	result_set = tracker_db_exec_proc (iface,
+					   "SelectFileChildWithoutDirs", 
+					   moved_from_uri, 
+					   NULL);
 
 	if (result_set) {
-		gchar    *name, *prefix;
+		gchar    *prefix;
+		gchar    *name;
+		gchar    *file_name;
+		gchar    *moved_file_name;
 		gboolean  valid = TRUE;
 
 		while (valid) {
 			tracker_db_result_set_get (result_set,
-						   1, &prefix,
-						   2, &name,
+						   0, &prefix,
+						   1, &name,
 						   -1);
 
-			g_ptr_array_add (array, g_build_filename (prefix, name, NULL));
+			if (prefix && name) {
+				file_name = g_build_filename (prefix, name, NULL);
+				moved_file_name = g_build_filename (moved_to_uri, name, NULL);
+
+				tracker_db_file_move (iface, file_name, moved_file_name);
+
+				g_free (moved_file_name);
+				g_free (file_name);
+				g_free (prefix);
+				g_free (name);
+			}
 
-			g_free (prefix);
-			g_free (name);
 			valid = tracker_db_result_set_iter_next (result_set);
 		}
 
 		g_object_unref (result_set);
 	}
+}
 
-	g_ptr_array_add (array, NULL);
+static inline void
+directory_move (TrackerDBInterface *iface, 
+		const gchar        *moved_from_uri, 
+		const gchar        *moved_to_uri)
+{
+	/* Stop watching old dir, start watching new dir */
+	tracker_watcher_remove_dir (moved_from_uri, TRUE, iface);
+		
+	tracker_db_file_move (iface, moved_from_uri, moved_to_uri);
+	directory_move_files (iface, moved_from_uri, moved_to_uri);
 
-	return (gchar**) g_ptr_array_free (array, FALSE);
+	tracker_watcher_add_dir (moved_to_uri, iface);
+}
+
+static gint 
+get_memory_usage (void)
+{
+#if defined(__linux__)
+	gint    fd, length, mem = 0;
+	gchar   buffer[8192];
+	gchar  *stat_file;
+	gchar **terms;
+
+	stat_file = g_strdup_printf ("/proc/%d/stat", tracker->pid);
+	fd = g_open (stat_file, O_RDONLY); 
+	g_free (stat_file);
+
+	if (fd ==-1) {
+		return 0;
+	}
+	
+	length = read (fd, buffer, 8192);
+	buffer[length] = 0;
+	close (fd);
+
+	terms = g_strsplit (buffer, " ", -1);
+
+	if (terms) {
+		gint i;
+
+		for (i = 0; i < 24; i++) {
+			if (!terms[i]) {
+				break;
+			}		
+
+			if (i == 23) {
+				mem = 4 * atoi (terms[23]);
+			}
+		}
+	}
+
+	g_strfreev (terms);
+
+	return mem;	
+#endif
+	return 0;
 }
 
 void
@@ -206,3 +619,2852 @@
 {
 	/* Nothing to do? */
 }
+
+void
+tracker_db_close (TrackerDBInterface *iface)
+{
+	if (iface) {
+		g_object_unref (iface);
+	}
+	
+	g_message ("Closed database");
+}
+
+void
+tracker_db_refresh_all (TrackerDBInterface *iface)
+{
+#if 0
+	gboolean cache_trans = FALSE;
+	DBConnection *cache = db_con->cache;
+	DBConnection *emails = db_con->emails;
+
+	if (cache && tracker_db_interface_end_transaction (cache->db)) {
+		cache_trans = TRUE;
+	}
+
+	/* close and reopen all databases */	
+	tracker_db_close (db_con->db);	
+	tracker_db_close (db_con->blob->db);
+
+	tracker_db_close (emails->blob->db);
+	tracker_db_close (emails->common->db);
+	tracker_db_close (emails->db);
+
+	db_con->db = open_db_interface (TRACKER_DB_FILE_METADATA);
+
+	emails->common->db = open_db_interface (TRACKER_DB_COMMON);
+
+	open_email_db (emails);
+		
+	if (cache_trans) {
+		tracker_db_interface_start_transaction (cache->db);
+	}
+
+#endif
+}
+
+gboolean
+tracker_db_exec_no_reply (TrackerDBInterface *iface, 
+			  const gchar        *query, 
+			  ...)
+{
+	TrackerDBResultSet *result_set;
+	va_list             args;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), FALSE);
+	g_return_val_if_fail (query != NULL, FALSE);
+
+	tracker_nfs_lock_obtain ();
+
+	va_start (args, query);
+	result_set = tracker_db_interface_execute_vquery (iface, NULL, query, args);
+	va_end (args);
+
+	if (result_set) {
+		g_object_unref (result_set);
+	}
+
+	tracker_nfs_lock_release ();
+
+	return TRUE;
+}
+
+TrackerDBResultSet *
+tracker_db_exec (TrackerDBInterface *iface, 
+		 const gchar        *query,
+		 ...)
+{
+	TrackerDBResultSet *result_set;
+	va_list             args;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (query != NULL, NULL);
+
+	tracker_nfs_lock_obtain ();
+
+	va_start (args, query);
+	result_set = tracker_db_interface_execute_vquery (iface, 
+							  NULL, 
+							  query, 
+							  args);
+	va_end (args);
+
+	tracker_nfs_lock_release ();
+
+	return result_set;
+}
+
+TrackerDBResultSet *
+tracker_db_exec_proc (TrackerDBInterface *iface, 
+		      const gchar        *procedure,
+		      ...)
+{
+	TrackerDBResultSet *result_set;
+	va_list             args;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (procedure != NULL, NULL);
+
+	va_start (args, procedure);
+	result_set = tracker_db_interface_execute_vprocedure (iface,
+							      NULL, 
+							      procedure, 
+							      args);
+	va_end (args);
+
+	return result_set;
+}
+
+gchar *
+tracker_db_get_field_name (const gchar *service, 
+			   const gchar *meta_name)
+{
+	gint key_field;
+
+	/* Replace with tracker_ontology_get_field_column_in_services */
+	key_field = tracker_ontology_metadata_key_in_service (service, meta_name);
+
+	if (key_field > 0) {
+		return g_strdup_printf ("KeyMetadata%d", key_field);
+	} 
+
+	if (strcasecmp (meta_name, "File:Path") == 0)     return g_strdup ("Path");
+	if (strcasecmp (meta_name, "File:Name") == 0)     return g_strdup ("Name");
+	if (strcasecmp (meta_name, "File:Mime") == 0)     return g_strdup ("Mime");
+	if (strcasecmp (meta_name, "File:Size") == 0)     return g_strdup ("Size");
+	if (strcasecmp (meta_name, "File:Rank") == 0)     return g_strdup ("Rank");
+	if (strcasecmp (meta_name, "File:Modified") == 0) return g_strdup ("IndexTime");
+
+	return NULL;
+}
+
+TrackerDBResultSet *
+tracker_db_search_text (TrackerDBInterface *iface, 
+			const gchar        *service, 
+			const gchar        *search_string, 
+			gint                offset, 
+			gint                limit, 
+			gboolean            save_results, 
+			gboolean            detailed)
+{
+	TrackerQueryTree    *tree;
+	TrackerDBResultSet  *result_set, *result;
+	gchar 		   **array;
+	GArray              *hits;
+	gint 		     count;
+	gboolean	     detailed_emails = FALSE, detailed_apps = FALSE;
+	gint		     service_array[255];
+	const gchar         *procedure;
+	GArray              *services = NULL;
+	GSList              *duds = NULL;
+	guint                i = 0;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (service != NULL, NULL);
+	g_return_val_if_fail (search_string != NULL, NULL);
+	g_return_val_if_fail (offset >= 0, NULL);
+
+	array = tracker_parser_text_into_array (search_string,
+						tracker->language,
+						tracker_config_get_max_word_length (tracker->config),
+						tracker_config_get_min_word_length (tracker->config));
+
+	result_set = tracker_db_exec_proc (iface, 
+					   "GetRelatedServiceIDs", 
+					   service, 
+					   service, 
+					   NULL);
+
+	if (result_set) {
+		gboolean valid = TRUE;
+		gint     type_id;
+
+		while (valid) {
+			tracker_db_result_set_get (result_set, 0, &type_id, -1);
+			service_array[i] = type_id;
+			i++;
+
+			valid = tracker_db_result_set_iter_next (result_set);
+		}
+
+		service_array[i] = 0;
+		services = g_array_new (TRUE, TRUE, sizeof (gint));
+		g_array_append_vals (services, service_array, i);
+		g_object_unref (result_set);
+	}
+
+	tree = tracker_query_tree_new (search_string, 
+				       tracker->file_index, 
+				       tracker->config,
+				       tracker->language,
+				       services);
+	hits = tracker_query_tree_get_hits (tree, offset, limit);
+	result = NULL;
+
+	if (save_results) {
+		tracker_db_interface_start_transaction (iface);
+		tracker_db_exec_proc (iface, 
+				      "DeleteSearchResults1", 
+				      NULL);
+	}
+
+	count = 0;
+
+	for (i = 0; i < hits->len; i++) {
+		TrackerSearchHit hit;
+		char	  *str_id;
+
+		if (count >= limit) {
+			break;
+		}
+
+		hit = g_array_index (hits, TrackerSearchHit, i);
+		str_id = tracker_uint_to_string (hit.service_id);
+
+		/* We save results into SearchResults table instead of
+		 * returing an array of array of strings 
+		 */
+		if (save_results) {
+			gchar *str_score;
+
+			str_score = tracker_int_to_string (hit.score);
+			tracker_db_exec_proc (iface, 
+					      "InsertSearchResult1", 
+					      str_id, 
+					      str_score, 
+					      NULL);
+			g_free (str_id);
+			g_free (str_score);
+
+			continue;
+		}
+
+		if (detailed) {
+			if (strcmp (service, "Emails") == 0) {
+				detailed_emails = TRUE;
+				procedure = "GetEmailByID";
+			} else if (strcmp (service, "Applications") == 0) {
+				detailed_apps = TRUE;
+				procedure = "GetApplicationByID";
+			} else {
+				procedure = "GetFileByID2";
+			}
+		} else {
+			procedure = "GetFileByID";
+		}
+
+		result_set = tracker_db_exec_proc (iface,
+						   procedure, 
+						   str_id, 
+						   NULL);
+		g_free (str_id);
+
+		if (result_set) {
+			gchar *path;
+
+			tracker_db_result_set_get (result_set, 0, &path, -1);
+
+			if (!detailed || detailed_emails || detailed_apps ||
+			    (detailed && g_file_test (path, G_FILE_TEST_EXISTS))) {
+				guint columns, i;
+
+				columns = tracker_db_result_set_get_n_columns (result_set);
+
+				if (G_UNLIKELY (!result)) {
+					guint columns;
+
+					columns = tracker_db_result_set_get_n_columns (result_set);
+					result = _tracker_db_result_set_new (columns);
+				}
+
+				_tracker_db_result_set_append (result);
+
+				for (i = 0; i < columns; i++) {
+					GValue value = { 0, };
+
+					_tracker_db_result_set_get_value (result_set, i, &value);
+					_tracker_db_result_set_set_value (result, i, &value);
+					g_value_unset (&value);
+				}
+			}
+
+			g_free (path);
+			g_object_unref (result_set);
+		} else {
+			g_warning ("Dud hit for search detected");
+			duds = g_slist_prepend (duds, &hit);
+		}
+	}
+
+	if (save_results) {
+		tracker_db_interface_end_transaction (iface);
+	}
+
+	/* Delete duds */
+	if (duds) {
+		GSList  *words, *w;
+		Indexer *indexer;
+
+		words = tracker_query_tree_get_words (tree);
+		indexer = tracker_query_tree_get_indexer (tree);
+
+		for (w = words; w; w = w->next) {
+			tracker_remove_dud_hits (indexer, (const gchar *) w->data, duds);
+		}
+
+		g_slist_free (words);
+	}
+
+	g_object_unref (tree);
+	g_array_free (hits, TRUE);
+	g_array_free (services, TRUE);
+
+	if (!result) {
+		return NULL;
+	}
+
+	if (tracker_db_result_set_get_n_rows (result) == 0) {
+		g_object_unref (result);
+		return NULL;
+	}
+
+	tracker_db_result_set_rewind (result);
+
+	return result;
+}
+
+TrackerDBResultSet *
+tracker_db_metadata_get (TrackerDBInterface *iface, 
+			 const gchar        *id, 
+			 const gchar        *key)
+{
+	TrackerField *def;
+	const gchar  *proc = NULL;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (id, NULL);
+	g_return_val_if_fail (key, NULL);
+
+	def = tracker_ontology_get_field_def (key);
+
+	if (!def) {
+		g_warning ("Metadata not found for id:'%s' and type:'%s'", id, key);
+		return NULL;
+	}
+
+	switch (tracker_field_get_data_type (def)) {
+	case TRACKER_FIELD_TYPE_INDEX:
+	case TRACKER_FIELD_TYPE_STRING:
+	case TRACKER_FIELD_TYPE_DOUBLE:
+		proc = "GetMetadata";
+		break;
+
+	case TRACKER_FIELD_TYPE_INTEGER:
+	case TRACKER_FIELD_TYPE_DATE:
+		proc = "GetMetadataNumeric";
+		break;
+
+	case TRACKER_FIELD_TYPE_FULLTEXT:
+		proc = "GetContents";
+		break;
+
+	case TRACKER_FIELD_TYPE_KEYWORD:
+		proc = "GetMetadataKeyword";
+		break;
+		
+	default:
+		g_warning ("Metadata could not be retrieved as type:%d is not supported", 
+			   tracker_field_get_data_type (def)); 
+		return NULL;
+	}
+
+	return tracker_db_exec_proc (iface, 
+				     proc, 
+				     id, 
+				     tracker_field_get_id (def),
+				     NULL);
+}
+
+/* Gets specified metadata value as a single row (multple values for a
+ * metadata type are returned delimited by  "|" )
+ */
+gchar *	
+tracker_db_metadata_get_delimited (TrackerDBInterface *iface, 
+				   const gchar        *id, 
+				   const gchar        *key)
+{
+	TrackerDBResultSet *result_set;
+	GString            *s = NULL;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (id != NULL, NULL);
+	g_return_val_if_fail (key != NULL, NULL);
+
+	result_set = tracker_db_metadata_get (iface, id, key);
+
+	if (result_set) {
+		gchar    *str;
+		gboolean  valid = TRUE;
+
+		while (valid) {
+			tracker_db_result_set_get (result_set, 0, &str, -1);
+
+			if (s) {
+				g_string_append_printf (s, "|%s", str);
+			} else {
+				s = g_string_new (str);
+			}
+
+			g_free (str);
+			valid = tracker_db_result_set_iter_next (result_set);
+		}
+
+		g_object_unref (result_set);
+	}
+
+	if (s) {
+		return g_string_free (s, FALSE);
+	} else {
+		return NULL;
+	}
+}
+
+gchar *
+tracker_db_metadata_get_related_names (TrackerDBInterface *iface,
+				       const gchar        *name)
+{
+	TrackerDBResultSet *result_set;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (name != NULL, NULL);
+
+	result_set = tracker_db_exec_proc (iface,
+					   "GetMetadataAliasesForName", 
+					   name, 
+					   name, 
+					   NULL);
+
+	if (result_set) {
+		GString  *s = NULL;
+		gboolean  valid = TRUE;
+		gint      id;
+
+		while (valid) {
+			tracker_db_result_set_get (result_set, 1, &id, -1);
+
+			if (s) {
+				g_string_append_printf (s, ", %d", id);
+			} else {
+				s = g_string_new ("");
+				g_string_append_printf (s, "%d", id);
+			}
+
+			valid = tracker_db_result_set_iter_next (result_set);
+		}
+
+		g_object_unref (result_set);
+
+		return g_string_free (s, FALSE);
+	}
+
+	return NULL;
+}
+
+TrackerDBResultSet *
+tracker_db_xesam_get_metadata_names (TrackerDBInterface *iface, 
+				     const gchar        *name)
+{
+	TrackerDBResultSet *result_set;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (name != NULL, NULL);
+	
+	result_set = tracker_db_exec_proc (iface,
+					   "GetXesamMetaDataLookups", 
+					   name, 
+					   NULL);
+
+	return result_set;
+}
+
+TrackerDBResultSet *
+tracker_db_xesam_get_service_names (TrackerDBInterface *iface, 
+				    const gchar        *name)
+{
+	TrackerDBResultSet *result_set;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (name != NULL, NULL);
+
+	result_set = tracker_db_exec_proc (iface, 
+					   "GetXesamServiceLookups", 
+					   name, 
+					   NULL);
+
+	return result_set;
+}
+
+const gchar *
+tracker_db_metadata_get_table (TrackerFieldType type)
+{
+	switch (type) {
+	case TRACKER_FIELD_TYPE_INDEX:
+	case TRACKER_FIELD_TYPE_STRING:
+	case TRACKER_FIELD_TYPE_DOUBLE:
+		return "ServiceMetaData";
+		
+	case TRACKER_FIELD_TYPE_INTEGER:
+	case TRACKER_FIELD_TYPE_DATE:
+		return "ServiceNumericMetaData";
+		
+	case TRACKER_FIELD_TYPE_BLOB: 
+		return "ServiceBlobMetaData";
+		
+	case TRACKER_FIELD_TYPE_KEYWORD: 
+		return "ServiceKeywordMetaData";
+		
+	default: 
+		break;
+	}
+	
+	return NULL;
+}
+
+/* Fast insert of embedded metadata. Table parameter is used to build
+ * up a unique word list of indexable contents.
+ */ 
+void
+tracker_db_metadata_insert_single_embedded (TrackerDBInterface *iface, 
+					    const gchar        *service, 
+					    const gchar        *id, 
+					    const gchar        *key, 
+					    const gchar        *value, 
+					    GHashTable         *hash_table)
+{
+	gchar *array[1];
+
+	g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface));
+	g_return_if_fail (service != NULL);
+	g_return_if_fail (id != NULL);
+	g_return_if_fail (key != NULL);
+	g_return_if_fail (value != NULL);
+	g_return_if_fail (hash_table != NULL);
+
+	array[0] = (gchar*) value;
+		
+	tracker_db_metadata_insert_embedded (iface, service, id, key, array, hash_table);
+}
+
+void
+tracker_db_metadata_insert_embedded (TrackerDBInterface  *iface, 
+				     const gchar         *service, 
+				     const gchar         *id, 
+				     const gchar         *key, 
+				     gchar              **values, 
+				     GHashTable          *hash_table)
+{
+	TrackerField *def;
+	gint          key_field = 0;
+	guint         i;
+
+	g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface));
+	g_return_if_fail (service != NULL);
+	g_return_if_fail (id != NULL);
+	g_return_if_fail (key != NULL);
+	g_return_if_fail (values != NULL);
+	g_return_if_fail (hash_table != NULL);
+
+	def = tracker_ontology_get_field_def (key);
+
+	if (!def) {
+		g_warning ("Metadata with key:'%s' not found", key);
+		return;
+	}
+
+	g_return_if_fail (tracker_field_get_embedded (def));
+
+        key_field = tracker_ontology_metadata_key_in_service (service, key);
+
+	switch (tracker_field_get_data_type (def)) {
+	case TRACKER_FIELD_TYPE_KEYWORD: 
+		for (i = 0; i < g_strv_length (values); i++) {
+			if (!values[i] || !values[i][0]) {
+				continue;
+			}
+			
+			if (hash_table) {
+				gchar *mvalue;
+				
+				mvalue = tracker_parser_text_to_string (values[i],
+									tracker->language,
+									tracker_config_get_max_word_length (tracker->config),
+									tracker_config_get_min_word_length (tracker->config),
+									FALSE, 
+									FALSE, 
+									FALSE);
+
+				hash_table = tracker_parser_text_fast (hash_table, 
+								       mvalue, 
+								       tracker_field_get_weight (def));
+			
+				g_free (mvalue);
+			}
+			
+			tracker_db_exec_proc (iface, 
+					      "SetMetadataKeyword", 
+					      id, 
+					      tracker_field_get_id (def), 
+					      values[i], 
+					      NULL);
+		}
+		break;
+
+	case TRACKER_FIELD_TYPE_INDEX:
+		for (i = 0; i < g_strv_length (values); i++) {
+			gchar *mvalue;
+			
+			if (!values[i] || !values[i][0]) {
+				continue;
+			}
+			
+			mvalue = tracker_parser_text_to_string (values[i], 
+								tracker->language,
+								tracker_config_get_max_word_length (tracker->config),
+								tracker_config_get_min_word_length (tracker->config),
+								tracker_field_get_filtered (def), 
+								tracker_field_get_filtered (def), 
+								tracker_field_get_delimited (def));
+			
+			hash_table = tracker_parser_text_fast (hash_table, 
+							       mvalue, 
+							       tracker_field_get_weight (def));
+			
+			tracker_db_exec_proc (iface,
+					      "SetMetadata", 
+					      id, 
+					      tracker_field_get_id (def), 
+					      mvalue, 
+					      values[i], 
+					      NULL);
+			
+			g_free (mvalue);
+		}
+		break;
+
+	case TRACKER_FIELD_TYPE_FULLTEXT: 
+		for (i = 0; i < g_strv_length (values); i++) {
+			if (!values[i] || !values[i][0]) {
+				continue;
+			}
+			
+			if (hash_table) {
+				hash_table = tracker_parser_text (hash_table, 
+								  values[i], 
+								  tracker_field_get_weight (def), 
+								  tracker->language, 
+								  tracker_config_get_max_words_to_index (tracker->config),
+								  tracker_config_get_max_word_length (tracker->config),
+								  tracker_config_get_min_word_length (tracker->config),
+								  tracker_field_get_filtered (def), 
+								  tracker_field_get_delimited (def));
+			}
+			
+			db_save_full_text (tracker_db_manager_get_db_interface_content (iface), 
+					   id, 
+					   values[i],
+					   strlen (values[i]));
+		}
+		break;
+		
+	case TRACKER_FIELD_TYPE_DOUBLE: 
+		for (i = 0; i < g_strv_length (values); i++) {
+			if (!values[i]) {
+				continue;
+			}
+			
+			tracker_db_exec_proc (iface,
+					      "SetMetadata", 
+					      id, 
+					      tracker_field_get_id (def),
+					      " ", 
+					      values[i], 
+					      NULL);
+		}
+		break;
+
+	case TRACKER_FIELD_TYPE_STRING: 
+		for (i = 0; i < g_strv_length (values); i++) {
+			gchar *mvalue;
+			
+			if (!values[i]) {
+				continue;
+			}
+			
+			mvalue = tracker_parser_text_to_string (values[i], 
+								tracker->language,
+								tracker_config_get_max_word_length (tracker->config),
+								tracker_config_get_min_word_length (tracker->config),
+								tracker_field_get_filtered (def),  
+								tracker_field_get_filtered (def), 
+								tracker_field_get_delimited (def));
+			tracker_db_exec_proc (iface, 
+					      "SetMetadata", 
+					      id, 
+					      tracker_field_get_id (def), 
+					      mvalue, 
+					      values[i], 
+					      NULL);
+			
+			g_free (mvalue);
+		}
+		break;
+ 
+	case TRACKER_FIELD_TYPE_INTEGER: 
+		for (i = 0; i < g_strv_length (values); i++) {
+			if (!values[i]) {
+				continue;
+			}
+			
+			tracker_db_exec_proc (iface, 
+					      "SetMetadataNumeric", 
+					      id, 
+					      tracker_field_get_id (def), 
+					      values[i], 
+					      NULL);
+		}
+		break;
+
+	case TRACKER_FIELD_TYPE_DATE: 
+		for (i = 0; i < g_strv_length (values); i++) {
+			gchar *mvalue;
+
+			if (!values[i]) {
+				continue;
+			}
+			
+			mvalue = format_date (values[i]);
+			
+			if (!mvalue) {
+				g_warning ("Could not format date:'%s'", values[i]);
+				continue;
+			}
+			
+			tracker_db_exec_proc (iface,
+					      "SetMetadataNumeric", 
+					      id, 
+					      tracker_field_get_id (def), 
+					      mvalue, 
+					      NULL);
+			
+			g_free (mvalue);
+		}
+		break;
+
+	default: 
+		g_warning ("Metadata could not be set as type:%d for "
+			   "metadata:'%s' is not supported",
+			   tracker_field_get_data_type (def),
+			   key);
+		break;
+	}
+
+	if (key_field > 0 && values[0]) {
+		gchar *esc_value = NULL;
+		
+		if (tracker_field_get_data_type (def) == TRACKER_FIELD_TYPE_DATE) {
+			esc_value = format_date (values[0]);
+		} else {
+			gchar *str;
+			
+			str = tracker_string_list_to_string (values, g_strv_length (values), '|');
+			esc_value = tracker_escape_string (str);
+			g_free (str);
+		}
+
+		if (esc_value) {
+			tracker_db_exec_no_reply (iface,
+						  "update Services set KeyMetadata%d = '%s' where id = %s",
+						  key_field, 
+						  esc_value, 
+						  id);
+		
+			g_free (esc_value);
+		}
+	}
+}
+
+void
+tracker_db_metadata_set_single (TrackerDBInterface *iface, 
+				const gchar        *service, 
+				const gchar        *id, 
+				const gchar        *key, 
+				const gchar        *value, 
+				gboolean            do_backup)
+{
+	gchar *array[1];
+
+	g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface));
+	g_return_if_fail (service != NULL);
+	g_return_if_fail (id != NULL);
+	g_return_if_fail (key != NULL);
+	g_return_if_fail (value != NULL);
+
+	array[0] = (gchar*) value;
+
+	tracker_db_metadata_set (iface, service, id, key, array, do_backup);
+}
+
+gchar *
+tracker_db_metadata_set (TrackerDBInterface  *iface, 
+			 const gchar         *service, 
+			 const gchar         *id, 
+			 const gchar         *key, 
+			 gchar              **values, 
+			 gboolean             do_backup)
+{
+	TrackerField *def;
+	gchar 	     *old_value = NULL;
+	gchar        *new_value = NULL;
+	gchar        *res_service;
+	gboolean      update_index;
+	gint	      key_field = 0;
+	guint         i;
+	guint         length;
+	GString      *str = NULL;
+	
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (service != NULL, NULL);
+	g_return_val_if_fail (id != NULL, NULL);
+	g_return_val_if_fail (key != NULL, NULL);
+	g_return_val_if_fail (values != NULL, NULL);
+
+	if (strcmp (id, "0") == 0) {
+		return NULL;
+	}
+
+	def = tracker_ontology_get_field_def (key);
+
+	if (!def) {
+		g_warning ("Metadata type:'%s' not found", key);
+		return NULL;
+	}
+	
+	res_service = tracker_db_service_get_by_entity (iface, id);
+
+	if (!res_service) {
+		g_warning ("Service not found for id:'%s'", id);
+		return NULL;
+	}
+	
+	length = g_strv_length (values);
+
+	if (tracker_field_get_multiple_values (def) && length > 1) {
+		str = g_string_new ("");
+	}
+
+	key_field = tracker_ontology_metadata_key_in_service (res_service, key);
+
+	update_index = 
+		tracker_field_get_data_type (def) == TRACKER_FIELD_TYPE_INDEX ||
+		tracker_field_get_data_type (def) == TRACKER_FIELD_TYPE_KEYWORD ||
+		tracker_field_get_data_type (def) == TRACKER_FIELD_TYPE_FULLTEXT;
+
+	if (update_index) {
+		old_value = tracker_db_metadata_get_delimited (iface, id, key);
+	}
+
+	/* delete old value if metadata does not support multiple values */
+	if (!tracker_field_get_multiple_values (def)) {
+		tracker_db_metadata_delete (iface, service, id, key, FALSE);
+	}
+
+	switch (tracker_field_get_data_type (def)) {
+	case TRACKER_FIELD_TYPE_KEYWORD:
+		for (i = 0; i < length; i++) {
+			if (!values[i] || !values[i][0]) {
+				continue;
+			}
+			
+			tracker_db_exec_proc (iface, 
+					      "SetMetadataKeyword", 
+					      id, 
+					      tracker_field_get_id (def), 
+					      values[i], 
+					      NULL);
+
+			/* Backup non-embedded data for embedded services */
+			if (do_backup && 
+			    !tracker_field_get_embedded (def) && 
+			    tracker_ontology_service_type_has_embedded (service)) {
+				backup_non_embedded_metadata (iface, 
+							      id, 
+							      tracker_field_get_id (def), 
+							      values[i]);
+			}
+
+			if (str) {
+				g_string_append_printf (str, " %s ", values[i]);
+			} else {
+				new_value = values[i];					
+			}
+
+			g_message ("Saving keyword:'%s'", values[i]);
+		}
+		break;
+		
+	case TRACKER_FIELD_TYPE_INDEX:
+		for (i = 0; i < length; i++) {
+			gchar *mvalue;
+			
+			if (!values[i] || !values[i][0]) {
+				continue;
+			}
+			
+			if (str) {
+				g_string_append_printf (str, " %s ", values[i]);
+			} else {
+				new_value = values[i];					
+			}
+			
+			/* Backup non-embedded data for embedded services */
+			if (do_backup &&
+			    !tracker_field_get_embedded (def) && 
+			    tracker_ontology_service_type_has_embedded (service)) {
+				backup_non_embedded_metadata (iface, id, tracker_field_get_id (def), values[i]);
+			}
+
+			mvalue = tracker_parser_text_to_string (values[i], 
+								tracker->language,
+								tracker_config_get_max_word_length (tracker->config),
+								tracker_config_get_min_word_length (tracker->config),
+								tracker_field_get_filtered (def),  
+								tracker_field_get_filtered (def), 
+								tracker_field_get_delimited (def));
+			tracker_db_exec_proc (iface, 
+					      "SetMetadata", 
+					      id, 
+					      tracker_field_get_id (def), 
+					      mvalue, 
+					      values[i], 
+					      NULL);
+			g_free (mvalue);
+		}
+		break;
+
+	case TRACKER_FIELD_TYPE_FULLTEXT:
+		/* We do not support multiple values for fulltext clobs */
+		if (values[0]) {
+			/* FIXME: is the blog the metadata blob/email
+			 * blob or something else? 
+			 */
+			db_save_full_text (tracker_db_manager_get_db_interface_content (iface),
+					   id, 
+					   values[0], 
+					   strlen (values[0]));
+			new_value = values[0];
+		}
+		break;
+		
+	case TRACKER_FIELD_TYPE_STRING:
+		for (i = 0; i < length; i++) {
+			gchar *mvalue;
+			
+			if (!values[i] || !values[i][0]) {
+				continue;
+			}
+			
+			/* Backup non-embedded data for embedded services */
+			if (do_backup && 
+			    !tracker_field_get_embedded (def) && 
+			    tracker_ontology_service_type_has_embedded (service)) {
+				backup_non_embedded_metadata (iface, 
+							      id, 
+							      tracker_field_get_id (def), 
+							      values[i]);
+			}
+
+			mvalue = tracker_parser_text_to_string (values[i], 
+								tracker->language,
+								tracker_config_get_max_word_length (tracker->config),
+								tracker_config_get_min_word_length (tracker->config),
+								tracker_field_get_filtered (def),  
+								tracker_field_get_filtered (def), 
+								tracker_field_get_delimited (def));
+			tracker_db_exec_proc (iface, 
+					      "SetMetadata", 
+					      id, 
+					      tracker_field_get_id (def), 
+					      mvalue, 
+					      values[i], 
+					      NULL);
+			g_free (mvalue);
+		}
+		break;
+		
+	case TRACKER_FIELD_TYPE_DOUBLE:
+		for (i = 0; i < length; i++) {
+			if (!values[i] || !values[i][0]) {
+				continue;
+			}
+
+			/* Backup non-embedded data for embedded services */
+			if (do_backup && 
+			    !tracker_field_get_embedded (def) && 
+			    tracker_ontology_service_type_has_embedded (service)) {
+				backup_non_embedded_metadata (iface, 
+							      id, 
+							      tracker_field_get_id (def), 
+							      values[i]);
+			}
+
+			tracker_db_exec_proc (iface,
+					      "SetMetadata", 
+					      id, 
+					      tracker_field_get_id (def), 
+					      " ", 
+					      values[i], 
+					      NULL);
+		}
+		break;
+
+	case TRACKER_FIELD_TYPE_INTEGER:
+		for (i = 0; i < length; i++) {
+			if (!values[i] || !values[i][0]) {
+				continue;
+			}
+
+			/* Backup non-embedded data for embedded services */
+			if (do_backup && 
+			    !tracker_field_get_embedded (def) && 
+			    tracker_ontology_service_type_has_embedded (service)) {
+				backup_non_embedded_metadata (iface, 
+							      id, 
+							      tracker_field_get_id (def), 
+							      values[i]);
+			}
+
+			tracker_db_exec_proc (iface,
+					      "SetMetadataNumeric", 
+					      id, 
+					      tracker_field_get_id (def), 
+					      values[i], 
+					      NULL);
+		}
+		break;
+
+	case TRACKER_FIELD_TYPE_DATE:
+		for (i = 0; i < length; i++) {
+			gchar *mvalue;
+
+			if (!values[i] || !values[i][0]) {
+				continue;
+			}
+
+			mvalue = format_date (values[i]);
+
+			if (!mvalue) {
+				g_warning ("Could not format date:'%s'", values[i]);
+				continue;
+			}
+
+			tracker_db_exec_proc (iface, 
+					      "SetMetadataNumeric", 
+					      id, 
+					      tracker_field_get_id (def), 
+					      mvalue, 
+					      NULL);
+
+			/* backup non-embedded data for embedded services */
+			if (do_backup && 
+			    !tracker_field_get_embedded (def) && 
+			    tracker_ontology_service_type_has_embedded (service)) {
+				backup_non_embedded_metadata (iface,
+							      id, 
+							      tracker_field_get_id (def), 
+							      mvalue);
+			}
+			
+			
+			g_free (mvalue);
+		}
+		break;
+
+	default:
+		g_warning ("Metadata could not be set as type:%d for "
+			   "metadata:'%s' is not supported", 
+			   tracker_field_get_data_type (def), 
+			   key);
+		break;
+	}
+
+	if (key_field > 0) {
+		if (values[0]) {
+			gchar *esc_value = NULL;
+
+			if (tracker_field_get_data_type (def) == TRACKER_FIELD_TYPE_DATE) {
+				esc_value = format_date (values[0]);
+
+				if (!esc_value) {
+					return NULL;
+				}
+			} else {
+				gchar *str;
+
+				str = tracker_string_list_to_string (values, length, '|');
+				esc_value = tracker_escape_string (str);
+				g_free (str);
+			}
+
+			tracker_db_exec_no_reply (iface,
+						  "update Services set KeyMetadata%d = '%s' where id = %s",
+						  key_field, 
+						  esc_value, 
+						  id);
+
+			g_free (esc_value);
+		}
+
+	}
+
+	/* Update fulltext index differentially with current and new
+	 * values.
+	 */
+	if (update_index) {
+		if (str) {
+			update_metadata_index (id, res_service, def, old_value, str->str);
+			g_string_free (str, TRUE);
+		} else {
+			update_metadata_index (id, res_service, def, old_value, new_value);	
+		}
+	}
+
+	g_free (old_value);
+	g_free (res_service);
+
+	return NULL;
+}
+
+void 
+tracker_db_metadata_delete_value (TrackerDBInterface *iface, 
+				  const gchar        *service, 
+				  const gchar        *id, 
+				  const gchar        *key, 
+				  const gchar        *value) 
+{
+	TrackerField *def;
+	gchar        *old_value = NULL;
+	gchar        *new_value = NULL;
+	gchar        *mvalue;
+	gchar        *res_service;
+	gboolean      update_index;
+	gint          key_field;
+
+	g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface));
+	g_return_if_fail (service != NULL);
+	g_return_if_fail (id != NULL);
+	g_return_if_fail (key != NULL);
+
+	/* Get type details */
+	def = tracker_ontology_get_field_def (key);
+
+	if (!def) {
+		return;
+	}
+
+	if (!tracker_field_get_embedded (def) && 
+            tracker_ontology_service_type_has_embedded (service)) {
+		backup_delete_non_embedded_metadata_value (iface, 
+							   id, 
+							   tracker_field_get_id (def), 
+							   value);
+	}
+
+	res_service = tracker_db_service_get_by_entity (iface, id);
+
+	if (!res_service) {
+		g_warning ("Entity not found");
+		return;
+	}
+
+	key_field = tracker_ontology_metadata_key_in_service (res_service, key);
+
+	update_index = 
+		tracker_field_get_data_type (def) == TRACKER_FIELD_TYPE_INDEX ||
+		tracker_field_get_data_type (def) == TRACKER_FIELD_TYPE_KEYWORD;
+	
+	if (update_index) {
+		/* Get current value and claculate the new value */	
+		old_value = tracker_db_metadata_get_delimited (iface, id, key);
+	
+		if (old_value) {
+			new_value = remove_value (old_value, value);
+		} else {
+			g_free (res_service);
+			return;
+		}
+	}
+
+	/* Perform deletion */
+	switch (tracker_field_get_data_type (def)) {
+	case TRACKER_FIELD_TYPE_INDEX:
+	case TRACKER_FIELD_TYPE_STRING:
+		mvalue = tracker_parser_text_to_string (value, 
+							tracker->language,
+							tracker_config_get_max_word_length (tracker->config),
+							tracker_config_get_min_word_length (tracker->config),
+							tracker_field_get_filtered (def),  
+							tracker_field_get_filtered (def), 
+							tracker_field_get_delimited (def));
+		tracker_db_exec_proc (iface, 
+				      "DeleteMetadataValue", 
+				      id, 
+				      tracker_field_get_id (def), 
+				      mvalue, 
+				      NULL);
+		g_free (mvalue);
+		break;
+
+	case TRACKER_FIELD_TYPE_DOUBLE:
+		tracker_db_exec_proc (iface, 
+				      "DeleteMetadataValue", 
+				      id, 
+				      tracker_field_get_id (def), 
+				      value, 
+				      NULL);
+		break;
+		
+	case TRACKER_FIELD_TYPE_INTEGER:
+	case TRACKER_FIELD_TYPE_DATE:
+		tracker_db_exec_proc (iface,
+				      "DeleteMetadataNumericValue", 
+				      id, 
+				      tracker_field_get_id (def), 
+				      value, 
+				      NULL);
+		break;
+		
+	case TRACKER_FIELD_TYPE_KEYWORD:
+		tracker_db_exec_proc (iface, 
+				      "DeleteMetadataKeywordValue", 
+				      id, 
+				      tracker_field_get_id (def), 
+				      value, 
+				      NULL);
+		break;
+		
+	default:	
+		g_warning ("Metadata could not be deleted as type:%d for "
+			   "metadata:'%s' is not supported", 
+			   tracker_field_get_data_type (def), 
+			   key);
+		break;
+	}
+
+	if (key_field > 0) {
+		TrackerDBResultSet *result_set;
+		gchar              *value;
+
+		result_set = tracker_db_metadata_get (iface, id, key);
+
+		if (result_set) {
+			tracker_db_result_set_get (result_set, 0, &value, -1);
+
+			if (value) {
+				gchar *esc_value;
+
+				esc_value = tracker_escape_string (value);
+				tracker_db_exec_no_reply (iface,
+							 "update Services set KeyMetadata%d = '%s' where id = %s",
+							  key_field, 
+							  esc_value, 
+							  id);
+
+				g_free (esc_value);
+				g_free (value);
+			} else {
+				tracker_db_exec_no_reply (iface,
+							  "update Services set KeyMetadata%d = NULL where id = %s",
+							  key_field, 
+							  id);
+			}
+
+			g_object_unref (result_set);
+		} else {
+			tracker_db_exec_no_reply (iface,
+						  "update Services set KeyMetadata%d = NULL where id = %s",
+						  key_field, 
+						  id);
+		}
+	}
+
+	/* Update fulltext index differentially with old and new values */
+	if (update_index) {
+		update_metadata_index (id, 
+				       service, 
+				       def, 
+				       old_value, 
+				       new_value);
+	}
+
+	g_free (new_value);
+	g_free (old_value);
+	g_free (res_service);
+}
+
+void 
+tracker_db_metadata_delete (TrackerDBInterface *iface,
+			    const gchar        *service, 
+			    const gchar        *id, 
+			    const gchar        *key, 
+			    gboolean            update_indexes) 
+{
+	TrackerField *def;
+	gchar        *old_value = NULL;
+	gchar        *res_service;
+	gboolean      update_index;
+	gint          key_field;
+
+	g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface));
+	g_return_if_fail (service != NULL);
+	g_return_if_fail (id != NULL);
+	g_return_if_fail (key != NULL);
+
+	/* Get type details */
+	def = tracker_ontology_get_field_def(key);
+
+	if (!def) {
+		return;
+	}
+	
+	if (!tracker_field_get_embedded (def) && 
+            tracker_ontology_service_type_has_embedded (service)) {
+		backup_delete_non_embedded_metadata (iface,
+						     id, 
+						     tracker_field_get_id (def));
+	}
+
+	res_service = tracker_db_service_get_by_entity (iface, id);
+
+	if (!res_service) {
+		g_warning ("Entity not found");
+		return;
+	}
+
+	key_field = tracker_ontology_metadata_key_in_service (res_service, key);
+
+	update_index = 
+		update_indexes && 
+		(tracker_field_get_data_type (def) == TRACKER_FIELD_TYPE_INDEX || 
+		 tracker_field_get_data_type (def) == TRACKER_FIELD_TYPE_KEYWORD);
+
+	if (update_index) {
+		/* Get current value */	
+		old_value = tracker_db_metadata_get_delimited (iface, id, key);
+	}
+
+	if (key_field > 0) {
+		tracker_db_exec_no_reply (iface,
+					  "update Services set KeyMetadata%d = NULL where id = %s",
+					  key_field, id);
+	}
+		
+	/* Perform deletion */
+	switch (tracker_field_get_data_type (def)) {
+	case TRACKER_FIELD_TYPE_INDEX:
+	case TRACKER_FIELD_TYPE_STRING:
+	case TRACKER_FIELD_TYPE_DOUBLE:
+		tracker_db_exec_proc (iface, 
+				      "DeleteMetadata", 
+				      id, 
+				      tracker_field_get_id (def), 
+				      NULL);
+		break;
+		
+	case TRACKER_FIELD_TYPE_INTEGER:
+	case TRACKER_FIELD_TYPE_DATE:
+		tracker_db_exec_proc (iface,
+				      "DeleteMetadataNumeric", 
+				      id, 
+				      tracker_field_get_id (def), 
+				      NULL);
+		break;
+		
+	case TRACKER_FIELD_TYPE_KEYWORD:
+		tracker_db_exec_proc (iface,
+				      "DeleteMetadataKeyword", 
+				      id, 
+				      tracker_field_get_id (def), 
+				      NULL);
+		break;
+		
+	case TRACKER_FIELD_TYPE_FULLTEXT:
+		tracker_db_exec_proc (iface, 
+				      "DeleteContent", 
+				      id, 
+				      tracker_field_get_id (def), 
+				      NULL);
+		break;
+		
+	default:
+		g_warning ("Metadata could not be deleted as this "
+			   "operation is not supported by type:%d "
+			   "for metadata:'%s'", 
+			   tracker_field_get_data_type (def),
+			   key);
+		break;
+	}
+
+	
+	/* Update fulltext index differentially with old values and NULL */
+	if (update_index && old_value) {
+		update_metadata_index (id, service, def, old_value, " ");
+	}
+	
+	g_free (old_value);
+	g_free (res_service);
+}
+
+TrackerDBResultSet * 
+tracker_db_live_search_get_hit_count (TrackerDBInterface *iface, 
+				      const gchar        *search_id)
+{
+	/* SELECT count(*) 
+	 * FROM LiveSearches 
+	 * WHERE SearchID = ? */
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (search_id != NULL, NULL);
+
+	return tracker_db_exec_proc (iface,
+				     "GetLiveSearchHitCount", 
+				     search_id, 
+				     NULL);
+}
+
+void
+tracker_db_live_search_start (TrackerDBInterface *iface, 
+			      const gchar        *from_query, 
+			      const gchar        *join_query, 
+			      const gchar        *where_query, 
+			      const gchar        *search_id)
+{
+	/* INSERT
+	 * INTO LiveSearches
+	 * SELECT ID, SEARCH_ID FROM_QUERY WHERE_QUERY */
+
+	g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface));
+	g_return_if_fail (from_query != NULL);
+	g_return_if_fail (join_query != NULL);
+	g_return_if_fail (where_query != NULL);
+	g_return_if_fail (search_id != NULL);
+
+	tracker_db_exec_no_reply (iface,
+				  "INSERT INTO LiveSearches SELECT S.ID, '%s' %s %s %s",
+				  search_id, 
+				  from_query, 
+				  join_query, 
+				  where_query);
+}
+
+void
+tracker_db_live_search_stop (TrackerDBInterface *iface,
+			     const gchar        *search_id)
+{
+	/* DELETE 
+	 * FROM LiveSearches as X 
+	 * WHERE E.SearchID = ? */
+
+	g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface));
+	g_return_if_fail (search_id != NULL);
+
+	db_exec_proc_no_reply (iface, 
+			       "LiveSearchStopSearch", 
+			       search_id, 
+			       NULL);
+}
+
+TrackerDBResultSet * 
+tracker_db_live_search_get_all_ids (TrackerDBInterface *iface, 
+				    const gchar        *search_id)
+{
+	/* Contract, in @result:
+	 * ServiceID is #1 */
+
+	/*
+	 * SELECT X.ServiceID
+	 * FROM LiveSearches as X
+	 * WHERE X.SearchID = SEARCH_ID
+	 */
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (search_id != NULL, NULL);
+
+	return tracker_db_exec_proc (iface, 
+				     "GetLiveSearchAllIDs", 
+				     search_id, 
+				     NULL);
+}
+
+TrackerDBResultSet * 
+tracker_db_live_search_get_new_ids (TrackerDBInterface *iface,
+				    const gchar        *search_id, 
+				    const gchar        *from_query, 
+				    const gchar        *query_joins, 
+				    const gchar        *where_query)
+{
+	TrackerDBResultSet *result_set;
+	
+	/* Contract, in @result:
+	 * ServiceID is #1
+	 * EventType is #2 */
+
+	/*
+	 * SELECT E.ServiceID, E.EventType
+	 * FROM_QUERY, LiveSearches as X, Events as E
+	 * QUERY_JOINS
+	 * WHERE_QUERY
+	 * AND X.ServiceID = E.ServiceID
+	 * AND X.SearchID = 'SEARCH_ID'
+	 * AND E.EventType = 'Update'
+	 * UNION
+	 * SELECT E.ServiceID, E.EventType
+	 * FROM_QUERY, Events as E
+	 * QUERY_JOINS
+	 * WHERE_QUERY
+	 * AND E.ServiceID = S.ID
+	 * AND E.EventType = 'Create'
+	 */
+
+	/*
+	 * INSERT INTO LiveSearches 
+	 * SELECT E.ServiceID, 'SEARCH_ID' 
+	 * FROM_QUERY, Events as E
+	 * QUERY_JOINS
+	 * WHERE_QUERY
+	 * AND E.ServiceID = S.ID
+	 * AND E.EventType = 'Create'
+	 */
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (search_id != NULL, NULL);
+	g_return_val_if_fail (from_query != NULL, NULL);
+	g_return_val_if_fail (query_joins != NULL, NULL);
+	g_return_val_if_fail (where_query != NULL, NULL);
+
+	result_set = tracker_db_exec (iface,
+				      "SELECT E.ServiceID, E.EventType "
+				      "%s%s LiveSearches as X, Events as E " /* FROM   A1 */
+				       "%s"                                  /* JOINS  A2 */
+				       "%s"                                  /* WHERE  A3 */
+				      "%sX.ServiceID = E.ServiceID "
+				      "AND X.SearchID = '%s' "               /*        A4 */
+				      "AND E.EventType = 'Update' "
+				      "UNION "
+				      "SELECT E.ServiceID, E.EventType "
+				      "%s%s Events as E "                    /* FROM   B1 */ 
+				      "%s"                                   /* JOINS  B2 */ 
+				      "%s"                                   /* WHERE  B3 */ 
+				      "%sE.ServiceID = S.ID "
+				      "AND E.EventType = 'Create' ",
+				      from_query ? from_query : "FROM",      /*        A1 */
+				      from_query ? "," : "",                 /*        A1 */
+				      query_joins,                           /*        A2 */
+				      where_query ? where_query : "WHERE",   /*        A3 */ 
+				      where_query ? "AND " : "",             /*        A3 */
+				      search_id,                             /*        A4 */ 
+				      from_query ? from_query : "FROM",      /*        B1 */ 
+				      from_query ? "," : "",                 /*        B1 */ 
+				      query_joins,                           /*        B2 */ 
+				      where_query ? where_query : "WHERE",   /*        B3 */ 
+				      where_query ? "AND " : "");            /*        B3 */ 
+	
+	tracker_db_exec_no_reply (iface,
+				  "INSERT INTO LiveSearches "
+				   "SELECT E.ServiceID, '%s' "               /*        B0 */
+				  "%s%s Events as E "                        /* FROM   B1 */ 
+				  "%s"                                       /* JOINS  B2 */ 
+				   "%s"                                      /* WHERE  B3 */
+				  "%sE.ServiceID = S.ID"
+				  "AND E.EventType = 'Create' ",
+				  search_id,                                 /*        B0 */ 
+				  from_query ? from_query : "FROM",          /*        B1 */ 
+				  from_query ? "," : "",                     /*        B1 */ 
+				  query_joins,                               /*        B2 */
+				  where_query ? where_query : "WHERE",       /*        B3 */
+				  where_query ? "AND " : "");                /*        B3 */
+	
+	return result_set;
+}
+
+TrackerDBResultSet* 
+tracker_db_live_search_get_deleted_ids (TrackerDBInterface *iface, 
+					const gchar        *search_id)
+{
+	/* SELECT E.ServiceID 
+	 * FROM Events as E, LiveSearches as X 
+	 * WHERE E.ServiceID = X.ServiceID 
+	 * AND X.SearchID = ? 
+	 * AND E.EventType IS 'Delete' */
+
+	/* DELETE FROM LiveSearches AS Y WHERE Y.ServiceID IN
+	 * SELECT ServiceID FROM Events as E, LiveSearches as X 
+	 * WHERE E.ServiceID = X.ServiceID 
+	 * AND X.SearchID = ? 
+	 * AND E.EventType IS 'Delete' */
+
+	TrackerDBResultSet *result_set;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (search_id != NULL, NULL);
+
+	result_set = tracker_db_exec_proc (iface, 
+					   "GetLiveSearchDeletedIDs", 
+					   search_id, 
+					   NULL);
+
+	db_exec_proc_no_reply (iface,
+			       "DeleteLiveSearchDeletedIDs", 
+			       search_id, 
+			       NULL);
+	return result_set;
+}
+
+TrackerDBResultSet *
+tracker_db_live_search_get_hit_data (TrackerDBInterface *iface, 
+				     const gchar        *search_id,
+				     GStrv               fields)
+{
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (search_id != NULL, NULL);
+
+	return tracker_db_exec (iface, 
+				"SELECT * FROM LiveSearches as X "
+				"WHERE X.SearchID = '%s'", 
+				search_id);
+}
+
+void 
+tracker_db_xesam_delete_handled_events (TrackerDBInterface *iface)
+{
+	g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface));
+
+	db_exec_proc_no_reply (iface, 
+			       "DeleteHandledEvents", 
+			       NULL);
+}
+
+/* Deprecated */
+guint32
+tracker_db_service_create (TrackerDBInterface *iface, 
+			   const gchar        *service,
+			   TrackerDBFileInfo  *info)
+{
+	TrackerDBResultSet *result_set;
+	TrackerDBResultSet *result_set_proc;
+	TrackerDBInterface *iface_common;
+	gint	            i;
+	guint32	            id = 0;
+	gchar	           *sid;
+	gchar	           *str_mtime;
+	const gchar        *str_is_dir;
+	const gchar        *str_is_link;
+	gchar	           *str_filesize;
+	gchar              *str_offset;
+	gchar              *str_aux;
+	gint	            service_type_id;
+	gchar	           *str_service_type_id;
+	gchar              *path;
+	gchar              *name;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), 0);
+	g_return_val_if_fail (info, 0);
+	g_return_val_if_fail (info->uri, 0);
+	g_return_val_if_fail (info->uri[0], 0);
+	g_return_val_if_fail (service, 0);
+
+	if (info->uri[0] == G_DIR_SEPARATOR) {
+		name = g_path_get_basename (info->uri);
+		path = g_path_get_dirname (info->uri);
+	} else {
+		name = tracker_file_get_vfs_name (info->uri);
+		path = tracker_file_get_vfs_path (info->uri);
+	}
+
+	iface_common = tracker_db_manager_get_db_interface (TRACKER_DB_COMMON);
+
+	/* Get a new unique ID for the service - use mutex to prevent race conditions */
+	result_set = tracker_db_exec_proc (iface_common, "GetNewID", NULL);
+
+	if (!result_set) {
+		g_critical ("Could not create service, GetNewID failed");
+		return 0;
+	}
+
+	tracker_db_result_set_get (result_set, 0, &sid, -1);
+	i = atoi (sid);
+	g_free (sid);
+	i++;
+
+	sid = tracker_int_to_string (i);
+	result_set_proc = tracker_db_exec_proc (iface_common, "UpdateNewID", sid, NULL);
+
+	if (result_set_proc) {
+		g_object_unref (result_set_proc);
+	}
+
+	if (result_set) {
+		g_object_unref (result_set);
+	}
+
+	if (info->is_directory) {
+		str_is_dir = "1";
+	} else {
+		str_is_dir = "0";
+	}
+
+	if (info->is_link) {
+		str_is_link = "1";
+	} else {
+		str_is_link = "0";
+	}
+
+	str_filesize = tracker_guint32_to_string (info->file_size);
+	str_mtime = tracker_gint32_to_string (info->mtime);
+	str_offset = tracker_gint32_to_string (info->offset);
+
+	service_type_id = tracker_ontology_get_id_for_service_type (service);
+
+	if (info->mime) {
+		g_debug ("service id for %s is %d and sid is %s with mime %s", 
+			 service, service_type_id, sid, info->mime);
+	} else {
+		g_debug ("service id for %s is %d and sid is %s", 
+			 service, service_type_id, sid);
+        }
+
+	str_service_type_id = tracker_int_to_string (service_type_id);
+
+	str_aux = tracker_int_to_string (info->aux_id);
+
+	if (service_type_id != -1) {
+		gchar *parent;
+
+		result_set_proc = tracker_db_exec_proc (iface,
+							"CreateService", 
+							sid,
+							path,
+							name,
+							str_service_type_id, 
+							info->mime, 
+							str_filesize,
+							str_is_dir, 
+							str_is_link, 
+							str_offset, 
+							str_mtime, 
+							str_aux, 
+							NULL);
+		
+		if (result_set_proc) {
+			g_object_unref (result_set_proc);
+		} 
+
+		/*
+		  Undetectable error
+			tracker_error ("ERROR: CreateService uri is %s/%s", path, name);
+			g_free (name);
+			g_free (path);
+			g_free (str_aux);
+			g_free (str_service_type_id);
+			g_free (sid);
+			g_free (str_filesize);
+			g_free (str_mtime);
+			g_free (str_offset);
+			g_static_rec_mutex_unlock (&events_table_lock);
+			return 0;
+		*/
+
+		id = tracker_db_interface_sqlite_get_last_insert_id (TRACKER_DB_INTERFACE_SQLITE (iface));
+
+		if (info->is_hidden) {
+			tracker_db_exec_no_reply (iface,
+						  "Update services set Enabled = 0 where ID = %d",
+						  (int) id);
+		}
+
+		result_set_proc = tracker_db_exec_proc (iface_common,
+							"IncStat", 
+							service, 
+							NULL);
+
+		if (result_set_proc) {
+			g_object_unref (result_set_proc);
+		}
+
+                parent = tracker_ontology_get_parent_service (service);
+		
+		if (parent) {
+			result_set_proc = tracker_db_exec_proc (iface_common, 
+								"IncStat", 
+								parent, 
+								NULL);
+			if (result_set_proc) {
+				g_object_unref (result_set_proc);
+			}
+
+			g_free (parent);
+		}
+
+		if (tracker_config_get_enable_xesam (tracker->config)) {
+			/* FIXME: Shouldn't this be the common interface? */
+			db_create_event (iface, sid, "Create");
+		}
+	}
+
+	g_free (name);
+	g_free (path);
+	g_free (str_aux);
+	g_free (str_service_type_id);
+	g_free (sid);
+	g_free (str_filesize);
+	g_free (str_mtime);
+	g_free (str_offset);
+
+	return id;
+}
+
+gchar *
+tracker_db_service_get_by_entity (TrackerDBInterface *iface, 
+				  const gchar        *id)
+{
+	TrackerDBResultSet *result_set;
+	gchar              *result = NULL;
+	
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (id != NULL, NULL);
+
+	result_set = tracker_db_exec_proc (iface,
+					   "GetFileByID2", 
+					   id,
+					   NULL);
+
+	if (result_set) {
+		tracker_db_result_set_get (result_set, 1, &result, -1);
+		g_object_unref (result_set);
+	}
+
+	return result;
+}
+
+guint32
+tracker_db_file_get_id (TrackerDBInterface *iface, 
+			const gchar        *uri)
+{
+	TrackerDBResultSet *result_set;
+	gchar              *path, *name;
+	guint32	            id;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), 0);
+	g_return_val_if_fail (uri != NULL, 0);
+
+	if (uri[0] == G_DIR_SEPARATOR) {
+		name = g_path_get_basename (uri);
+		path = g_path_get_dirname (uri);
+	} else {
+		name = tracker_file_get_vfs_name (uri);
+		path = tracker_file_get_vfs_path (uri);
+	}
+
+	result_set = tracker_db_exec_proc (iface,
+					   "GetServiceID", 
+					   path, 
+					   name, 
+					   NULL);
+
+	g_free (path);
+	g_free (name);
+
+	id = 0;
+
+	if (result_set) {
+		tracker_db_result_set_get (result_set, 0, &id, -1);
+		g_object_unref (result_set);
+	}
+
+	return id;
+}
+
+gchar *
+tracker_db_file_get_id_as_string (TrackerDBInterface *iface, 
+				  const gchar        *service, 
+				  const gchar        *uri)
+{
+	gint    service_id;
+	guint32	id;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (service != NULL, NULL);
+
+	/* Do we really need service here? */
+	service_id = tracker_ontology_get_id_for_service_type (service);
+
+	if (service_id == -1) {
+		return NULL;
+	}
+
+	id = tracker_db_file_get_id (iface, uri);
+
+	if (id > 0) {
+		return tracker_uint_to_string (id);
+	}
+
+	return NULL;
+}
+
+TrackerDBFileInfo *
+tracker_db_file_get_info (TrackerDBInterface *iface, 
+			  TrackerDBFileInfo  *info)
+{
+	TrackerDBResultSet *result_set;
+	gchar              *path, *name;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), info);
+	g_return_val_if_fail (info != NULL, info);
+
+	if (!tracker_db_file_info_is_valid (info)) {
+		return NULL;
+	}
+
+	name = g_path_get_basename (info->uri);
+	path = g_path_get_dirname (info->uri);
+
+	result_set = tracker_db_exec_proc (iface, 
+					   "GetServiceID", 
+					   path, 
+					   name, 
+					   NULL);
+
+	g_free (name);
+	g_free (path);
+
+	if (result_set) {
+		gint     id, indextime, service_type_id;
+		gboolean is_directory;
+
+		tracker_db_result_set_get (result_set,
+					   0, &id,
+					   1, &indextime,
+					   2, &is_directory,
+					   3, &service_type_id,
+					   -1);
+
+		if (id > 0) {
+			info->file_id = id;
+			info->is_new = FALSE;
+		}
+
+		info->indextime = indextime;
+		info->is_directory = is_directory;
+		info->service_type_id = service_type_id;
+
+		g_object_unref (result_set);
+	}
+
+	return info;
+}
+
+gboolean
+tracker_db_file_is_up_to_date (TrackerDBInterface *iface, 
+			       const gchar        *uri, 
+			       guint32            *id)
+{
+	TrackerDBResultSet *result_set;
+	gchar              *path, *name;
+	gint32              index_time;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), FALSE);
+	g_return_val_if_fail (uri != NULL, FALSE);
+	g_return_val_if_fail (id != NULL, FALSE);
+
+	if (uri[0] == G_DIR_SEPARATOR) {
+		name = g_path_get_basename (uri);
+		path = g_path_get_dirname (uri);
+	} else {
+		name = tracker_file_get_vfs_name (uri);
+		path = tracker_file_get_vfs_path (uri);
+	}
+
+	result_set = tracker_db_exec_proc (iface,
+					   "GetServiceID", 
+					   path, 
+					   name, 
+					   NULL);
+
+	g_free (path);
+	g_free (name);
+
+	index_time = 0;
+	*id = 0;
+
+	if (result_set) {
+		tracker_db_result_set_get (result_set,
+					   0, id,
+					   1, &index_time,
+					   -1);
+
+		g_object_unref (result_set);
+	} else {
+		return FALSE;
+	}
+
+	if (index_time < tracker_file_get_mtime (uri)) {
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+void
+tracker_db_file_delete (TrackerDBInterface *iface,
+			guint32             file_id)
+{
+	TrackerDBResultSet *result_set;
+ 	TrackerDBInterface *iface_common;
+	gchar              *str_file_id;
+	gchar              *name = NULL;
+	gchar              *path;
+	gint                id;
+
+	iface_common = tracker_db_manager_get_db_interface (TRACKER_DB_COMMON);
+
+	g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface));
+	g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface_common));
+
+	delete_index_for_service (iface, file_id);
+
+	str_file_id = tracker_uint_to_string (file_id);
+
+	result_set = tracker_db_exec_proc (iface, "GetFileByID3", str_file_id, NULL);
+
+	if (result_set) {
+		tracker_db_result_set_get (result_set,
+					   0, &name,
+					   1, &path,
+					   3, &id,
+					   -1);
+
+		if (name && path) {
+			dec_stat (id);
+
+			tracker_db_exec_proc (iface, "DeleteService1", str_file_id, NULL);
+			tracker_db_exec_proc (iface_common, "DeleteService6", path, name, NULL);
+			tracker_db_exec_proc (iface_common, "DeleteService7", path, name, NULL);
+			tracker_db_exec_proc (iface_common, "DeleteService9", path, name, NULL);
+
+			db_create_event (iface_common, str_file_id, "Delete");
+
+			g_free (name);
+			g_free (path);
+		}
+
+		g_object_unref (result_set);
+	}
+
+	g_free (str_file_id);
+}
+
+void
+tracker_db_directory_delete (TrackerDBInterface *iface,
+			     guint32             file_id, 
+			     const gchar        *uri)
+{
+	TrackerDBResultSet *result_set;
+	gchar              *str_file_id;
+	gchar              *uri_prefix;
+
+	g_return_if_fail (TRACKER_DB_INTERFACE (iface));
+	g_return_if_fail (uri != NULL);
+
+	str_file_id = tracker_uint_to_string (file_id);
+	uri_prefix = g_strconcat (uri, G_DIR_SEPARATOR_S, "*", NULL);
+	delete_index_for_service (iface, file_id);
+
+	/* Get all file id's for all files recursively under directory amd delete them */
+	result_set = tracker_db_exec_proc (iface, 
+					   "SelectSubFileIDs", 
+					   uri, 
+					   uri_prefix, 
+					   NULL);
+
+	if (result_set) {
+		gboolean valid = TRUE;
+		gint     id;
+
+		while (valid) {
+			tracker_db_result_set_get (result_set, 0, &id, -1);
+			tracker_db_file_delete (iface, id);
+
+			valid = tracker_db_result_set_iter_next (result_set);
+		}
+
+		g_object_unref (result_set);
+	}
+
+	/* Delete directory */
+	tracker_db_file_delete (iface, file_id);
+
+	g_free (uri_prefix);
+	g_free (str_file_id);
+}
+
+void
+tracker_db_uri_insert_pending (const gchar *id, 
+			       const gchar *action, 
+			       const gchar *counter, 
+			       const gchar *uri, 
+			       const gchar *mime, 
+			       gboolean     is_dir, 
+			       gboolean     is_new, 
+			       gint         service_type_id)
+{
+	TrackerDBInterface *iface;
+	const gchar        *str_new;
+	gchar	           *str_service_type_id;
+	gchar 	           *time_str;
+	time_t              time_now;
+	gint	            i;
+
+	g_return_if_fail (id != NULL);
+	g_return_if_fail (action != NULL);
+	g_return_if_fail (counter != NULL);
+	g_return_if_fail (uri != NULL);
+	g_return_if_fail (mime != NULL);
+
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_CACHE);
+
+	time (&time_now);
+
+	i = atoi (counter);
+
+	if (i == 0) {
+		time_str = tracker_int_to_string (i);
+	} else {
+		time_str = tracker_int_to_string (time_now + i);
+	}
+
+	if (is_new) {
+		str_new = "1";
+	} else {
+		str_new = "0";
+	}
+
+	str_service_type_id = tracker_int_to_string (service_type_id);
+
+	tracker_db_exec_proc (iface, 
+			      "InsertPendingFile", 
+			      id, 
+			      action, 
+			      time_str, 
+			      uri, 
+			      mime, 
+			      is_dir ? "1" : "0", 
+			      str_new, 
+			      "1", 
+			      "1", 
+			      str_service_type_id, 
+			      NULL);
+
+	g_free (str_service_type_id);
+	g_free (time_str);
+}
+
+void
+tracker_db_uri_update_pending (const gchar *counter, 
+			       const gchar *action, 
+			       const gchar *uri)
+{
+	TrackerDBInterface *iface;
+	gchar              *time_str;
+	time_t              time_now;
+	gint                i;
+
+	g_return_if_fail (counter != NULL);
+	g_return_if_fail (action != NULL);
+	g_return_if_fail (uri != NULL);
+
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_CACHE);
+	
+	time (&time_now);
+
+	i = atoi (counter);
+
+	time_str = tracker_int_to_string (time_now + i);
+
+	tracker_db_exec_proc (iface, 
+			      "UpdatePendingFile", 
+			      time_str, 
+			      action, 
+			      uri, 
+			      NULL);
+
+	g_free (time_str);
+}
+
+gchar **
+tracker_db_files_get (TrackerDBInterface *iface, 
+		      const gchar        *uri)
+{
+	TrackerDBResultSet *result_set;
+	GPtrArray          *array;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (uri != NULL, NULL);
+
+	result_set = tracker_db_exec_proc (iface,
+					   "SelectFileChild", 
+					   uri, 
+					   NULL);
+	array = g_ptr_array_new ();
+
+	if (result_set) {
+		gchar    *name, *prefix;
+		gboolean  valid = TRUE;
+
+		while (valid) {
+			tracker_db_result_set_get (result_set,
+						   1, &prefix,
+						   2, &name,
+						   -1);
+
+			g_ptr_array_add (array, g_build_filename (prefix, name, NULL));
+
+			g_free (prefix);
+			g_free (name);
+			valid = tracker_db_result_set_iter_next (result_set);
+		}
+
+		g_object_unref (result_set);
+	}
+
+	g_ptr_array_add (array, NULL);
+
+	return (gchar**) g_ptr_array_free (array, FALSE);
+}
+
+TrackerDBResultSet *
+tracker_db_files_get_by_service (TrackerDBInterface *iface, 
+				 const gchar        *service, 
+				 gint                offset, 
+				 gint                limit)
+{
+	TrackerDBResultSet *result_set;
+	gchar              *str_limit;
+	gchar              *str_offset;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (service != NULL, NULL);
+
+	str_limit = tracker_int_to_string (limit);
+	str_offset = tracker_int_to_string (offset);
+
+	result_set = tracker_db_exec_proc (iface,
+					   "GetByServiceType", 
+					   service, 
+					   service, 
+					   str_offset, 
+					   str_limit, 
+					   NULL);
+
+	g_free (str_offset);
+	g_free (str_limit);
+
+	return result_set;
+}
+
+TrackerDBResultSet *
+tracker_db_files_get_by_mime (TrackerDBInterface  *iface, 
+			      gchar              **mimes, 
+			      gint                 n,
+			      gint                 offset, 
+			      gint                 limit, 
+			      gboolean             vfs)
+{
+	TrackerDBResultSet *result_set;
+	gint	            i;
+	gchar              *service;
+	gchar	           *query;
+	GString	           *str;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (mimes != NULL, NULL);
+	g_return_val_if_fail (offset >= 0, NULL);
+
+	if (vfs) {
+		service = "VFS";
+	} else {
+		service = "Files";
+	}
+
+	str = g_string_new ("SELECT  DISTINCT F.Path || '/' || F.Name AS uri FROM Services F INNER JOIN ServiceKeywordMetaData M ON F.ID = M.ServiceID WHERE M.MetaDataID = (SELECT ID FROM MetaDataTypes WHERE MetaName ='File:Mime') AND (M.MetaDataValue IN ");
+
+	g_string_append_printf (str, "('%s'", mimes[0]);
+
+	for (i = 1; i < n; i++) {
+		g_string_append_printf (str, ", '%s'", mimes[i]);
+	}
+
+	g_string_append_printf (str,
+				")) AND (F.ServiceTypeID in (select TypeId from ServiceTypes where TypeName = '%s' or Parent = '%s')) LIMIT %d,%d",
+				service, 
+				service, 
+				offset, 
+				limit);
+
+	query = g_string_free (str, FALSE);
+	result_set = tracker_db_interface_execute_query (iface, NULL, query);
+	g_free (query);
+
+	return result_set;
+}
+
+TrackerDBResultSet *
+tracker_db_metadata_get_types (TrackerDBInterface *iface,
+			       const gchar        *class, 
+			       gboolean            writeable)
+{
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (class != NULL, NULL);
+
+	if (strcmp (class, "*") == 0) {
+		if (writeable) {
+			return tracker_db_exec_proc (iface,
+						     "GetWriteableMetadataTypes", 
+						     NULL);
+		} else {
+			return tracker_db_exec_proc (iface,
+						     "GetMetadataTypes", 
+						     NULL);
+		}
+	} else {
+		if (writeable) {
+			return tracker_db_exec_proc (iface, 
+						     "GetWriteableMetadataTypesLike",
+						     class,
+						     NULL);
+		} else {
+			return tracker_db_exec_proc (iface, 
+						     "GetMetadataTypesLike", 
+						     class, 
+						     NULL);
+		}
+	}
+}
+
+TrackerDBResultSet *
+tracker_db_uri_sub_watches_get (const gchar *dir)
+{
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	gchar              *folder;
+
+	g_return_val_if_fail (dir != NULL, NULL);
+
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_CACHE);
+
+	folder = g_build_filename (dir, "*", NULL);
+	result_set = tracker_db_exec_proc (iface, 
+					   "GetSubWatches", 
+					   folder, 
+					   NULL);
+	g_free (folder);
+
+	return result_set;
+}
+
+TrackerDBResultSet *
+tracker_db_uri_sub_watches_delete (const gchar *dir)
+{
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	gchar              *folder;
+
+	g_return_val_if_fail (dir != NULL, NULL);
+
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_CACHE);
+
+	folder = g_build_filename (dir, "*", NULL);
+	result_set = tracker_db_exec_proc (iface, 
+					   "DeleteSubWatches", 
+					   folder, 
+					   NULL);
+
+	g_free (folder);
+
+	return result_set;
+}
+
+void
+tracker_db_file_move (TrackerDBInterface *iface, 
+		      const gchar        *moved_from_uri, 
+		      const gchar        *moved_to_uri)
+{
+	TrackerDBInterface *iface_common;
+	gchar              *str_file_id;
+	gchar              *name;
+	gchar              *path;
+	gchar              *old_name;
+	gchar              *old_path;
+	gchar              *ext;
+	guint32             id;
+
+	g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface));
+	g_return_if_fail (moved_from_uri != NULL);
+	g_return_if_fail (moved_to_uri != NULL);
+
+	g_message ("Moving file:'%s' to:'%s'", 
+		   moved_from_uri, 
+		   moved_to_uri);
+
+	/* If orig file not in DB, treat it asa create action */
+	id = tracker_db_file_get_id (iface, moved_from_uri);
+
+	if (id == 0) {
+		g_warning ("Original file:'%s' not found in database", 
+			   moved_from_uri);
+		tracker_db_interface_end_transaction (iface);
+		return;
+	}
+
+	str_file_id = tracker_uint_to_string (id);
+	name = g_path_get_basename (moved_to_uri);
+	path = g_path_get_dirname (moved_to_uri);
+	old_name = g_path_get_basename (moved_from_uri);
+	old_path = g_path_get_dirname (moved_from_uri);
+
+	/* Update db so that fileID reflects new uri */
+	tracker_db_exec_proc (iface, 
+			      "UpdateFileMove", 
+			      path, 
+			      name, 
+			      str_file_id, 
+			      NULL);
+
+	iface_common = tracker_db_manager_get_db_interface (TRACKER_DB_COMMON);
+	db_create_event (iface_common, str_file_id, "Update");
+
+	/* update File:Path and File:Filename metadata */
+	tracker_db_metadata_set_single (iface,
+					"Files", str_file_id, 
+					"File:Path", path,
+					FALSE);
+	tracker_db_metadata_set_single (iface, 
+					"Files", str_file_id,
+					"File:Name", name, 
+					FALSE);
+
+	ext = strrchr (moved_to_uri, '.');
+	if (ext) {
+		ext++;
+		tracker_db_metadata_set_single (iface, 
+						"Files", str_file_id, 
+						"File:Ext", ext, 
+						FALSE);
+	}
+
+	/* Update backup service if necessary */
+	tracker_db_exec_proc (iface_common, 
+			      "UpdateBackupService", 
+			      path, 
+			      name, 
+			      old_path, 
+			      old_name, 
+			      NULL);
+
+	g_free (str_file_id);
+	g_free (name);
+	g_free (path);
+	g_free (old_name);
+	g_free (old_path);
+}
+
+void
+tracker_db_directory_move (TrackerDBInterface *iface, 
+			   const gchar        *moved_from_uri, 
+			   const gchar        *moved_to_uri)
+{
+	TrackerDBResultSet *result_set;
+	gchar              *old_path;
+
+	g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface));
+ 	g_return_if_fail (moved_from_uri != NULL);
+ 	g_return_if_fail (moved_to_uri != NULL);
+
+	old_path = g_strconcat (moved_from_uri, G_DIR_SEPARATOR_S, NULL);
+
+	/* Get all sub folders that were moved and add watches */
+	result_set = tracker_db_uri_get_subfolders (iface, moved_from_uri);
+
+	if (result_set) {
+		gboolean valid = TRUE;
+
+		while (valid) {
+			gchar *prefix, *name;
+			gchar *dir_name, *sep, *new_path;
+
+			tracker_db_result_set_get (result_set,
+						   1, &prefix,
+						   2, &name,
+						   -1);
+
+			dir_name = g_build_filename (prefix, name, NULL);
+
+			/* Get string after prefix */
+			if (!old_path) {
+				sep = g_strdup (dir_name);
+			} else { 
+				gchar *prefix_start;
+
+				prefix_start = strstr (dir_name, old_path);
+				
+				if (!prefix_start) {
+					sep = NULL;
+				} else {
+					gchar *str;
+
+					str = prefix_start + strlen (old_path);
+					sep = g_strdup (str);
+				}
+			}
+			
+			if (!sep) {
+				g_free (dir_name);
+				continue;
+			}
+
+			new_path = g_build_filename (moved_to_uri, sep, NULL);
+			g_free (sep);
+
+			g_message ("Moving subfolder:'%s' to:'%s'", 
+				   dir_name, 
+				   new_path);
+
+			directory_move (iface, dir_name, new_path);
+
+			/* FIXME: Why? */
+			g_usleep (1000);
+
+			g_free (prefix);
+			g_free (name);
+			g_free (new_path);
+			g_free (dir_name);
+
+			valid = tracker_db_result_set_iter_next (result_set);
+		}
+
+		g_object_unref (result_set);
+	}
+
+	directory_move (iface, moved_from_uri, moved_to_uri);
+
+	g_free (old_path);
+}
+
+TrackerDBResultSet *
+tracker_db_uri_get_subfolders (TrackerDBInterface *iface, 
+			       const gchar        *uri)
+{
+	TrackerDBResultSet *result_set;
+	gchar              *folder;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+ 	g_return_val_if_fail (uri != NULL, NULL);
+
+	folder = g_strconcat (uri, G_DIR_SEPARATOR_S, "*", NULL);
+	result_set = tracker_db_exec_proc (iface, 
+					   "SelectFileSubFolders", 
+					   uri, 
+					   folder, 
+					   NULL);
+	g_free (folder);
+
+	return result_set;
+}
+
+TrackerDBResultSet *
+tracker_db_keywords_get_list (TrackerDBInterface *iface, 
+			      const gchar        *service)
+{
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+ 	g_return_val_if_fail (service != NULL, NULL);
+
+	return tracker_db_exec_proc (iface, 
+				     "GetKeywordList", 
+				     service, 
+				     service, 
+				     NULL);
+}
+
+GSList *
+tracker_db_mime_query (TrackerDBInterface *iface, 
+                       const gchar        *stored_proc, 
+                       gint                service_id)
+{
+	TrackerDBResultSet *result_set;
+	GSList             *result = NULL;
+	gchar              *service_id_str;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+ 	g_return_val_if_fail (stored_proc != NULL, NULL);
+
+	service_id_str = g_strdup_printf ("%d", service_id);
+	result_set = tracker_db_exec_proc (iface, stored_proc, service_id_str, NULL);
+	g_free (service_id_str);
+
+	if (result_set) {
+		gchar    *str;
+		gboolean  valid = TRUE;
+
+		while (valid) {
+			tracker_db_result_set_get (result_set, 0, &str, -1);
+			result = g_slist_prepend (result, str);
+			valid = tracker_db_result_set_iter_next (result_set);
+		}
+
+		g_object_unref (result_set);
+	}
+
+	return result;
+}
+
+GSList *
+tracker_db_get_mimes_for_service_id (TrackerDBInterface *iface, 
+                                     gint                service_id) 
+{
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+
+	return tracker_db_mime_query (iface,
+				      "GetMimeForServiceId", 
+				      service_id);
+}
+
+GSList *
+tracker_db_get_mime_prefixes_for_service_id (TrackerDBInterface *iface,
+                                             gint          service_id) 
+{
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+
+	return tracker_db_mime_query (iface, 
+				      "GetMimePrefixForServiceId", 
+				      service_id);
+}
+
+TrackerFieldData *
+tracker_db_get_metadata_field (TrackerDBInterface *iface,
+			       const gchar        *service, 
+			       const gchar        *field_name, 
+			       gint                field_count, 
+			       gboolean            is_select, 
+			       gboolean            is_condition)
+{
+	TrackerFieldData *field_data = NULL;
+	TrackerField     *def;
+
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+	g_return_val_if_fail (service != NULL, NULL);
+	g_return_val_if_fail (field_name != NULL, NULL);
+
+	def = tracker_ontology_get_field_def (field_name);
+
+	if (def) {
+		gchar       *alias;
+		const gchar *table_name;
+		gchar       *this_field_name;
+		gchar       *where_field;
+
+		field_data = g_object_new (TRACKER_TYPE_FIELD_DATA, 
+					   "is-select", is_select,
+					   "is-condition", is_condition,
+					   "field-name", field_name,
+					   NULL);
+
+		alias = g_strdup_printf ("M%d", field_count);
+		table_name = tracker_db_metadata_get_table (tracker_field_get_data_type (def));
+
+		g_debug ("Field_name: %s :table_name is: %s for data_type: %i", 
+			 field_name, 
+			 table_name, 
+			 tracker_field_get_data_type(def));
+
+		tracker_field_data_set_alias (field_data, alias);
+		tracker_field_data_set_table_name (field_data, table_name);
+		tracker_field_data_set_id_field (field_data, tracker_field_get_id (def));
+		tracker_field_data_set_data_type (field_data, tracker_field_get_data_type (def));
+		tracker_field_data_set_multiple_values (field_data, tracker_field_get_multiple_values (def));
+			
+		this_field_name = tracker_db_get_field_name (service, field_name);
+
+		if (this_field_name) {
+			gchar *str;
+
+			str = g_strdup_printf (" S.%s ", this_field_name);
+			tracker_field_data_set_select_field (field_data, str);
+			tracker_field_data_set_needs_join (field_data, FALSE);
+			g_free (str);
+			g_free (this_field_name);
+		} else {
+			gchar *str;
+			gchar *display_field;
+
+			display_field = tracker_ontology_get_display_field (def);
+			str = g_strdup_printf ("M%d.%s", field_count, display_field);
+			tracker_field_data_set_select_field (field_data, str);
+			tracker_field_data_set_needs_join (field_data, TRUE);
+			g_free (str);
+			g_free (display_field);
+		}
+			
+		if (tracker_field_get_data_type (def) == TRACKER_FIELD_TYPE_DOUBLE) {
+			where_field = g_strdup_printf ("M%d.MetaDataDisplay", field_count);
+		} else {
+			where_field = g_strdup_printf ("M%d.MetaDataValue", field_count);
+		}
+
+		tracker_field_data_set_where_field (field_data, where_field);
+		g_free (where_field);
+	}
+
+	return field_data;
+}
+
+gchar *
+tracker_db_get_option_string (const gchar *option)
+{
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	gchar              *value = NULL;
+
+	g_return_val_if_fail (option != NULL, NULL);
+
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_COMMON);
+	result_set = tracker_db_exec_proc (iface, "GetOption", option, NULL);
+
+	if (result_set) {
+		tracker_db_result_set_get (result_set, 0, &value, -1);
+		g_object_unref (result_set);
+	}
+
+	return value;
+}
+
+void
+tracker_db_set_option_string (const gchar *option, 
+			      const gchar *value)
+{
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+
+	g_return_if_fail (option != NULL);
+	g_return_if_fail (value != NULL);
+
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_COMMON);
+	result_set = tracker_db_exec_proc (iface, "SetOption", value, option, NULL);
+	
+	if (result_set) {
+		g_object_unref (result_set);
+	}
+}
+
+gint
+tracker_db_get_option_int (const gchar *option)
+{
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	gchar              *str;
+	gint                value = 0;
+
+	g_return_val_if_fail (option != NULL, 0);
+
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_COMMON);
+	result_set = tracker_db_exec_proc (iface, "GetOption", option, NULL);
+
+	if (result_set) {
+		tracker_db_result_set_get (result_set, 0, &str, -1);
+
+		if (str) {
+			value = atoi (str);
+			g_free (str);
+		}
+
+		g_object_unref (result_set);
+	}
+
+	return value;
+}
+
+void
+tracker_db_set_option_int (const gchar *option, 
+			   gint         value)
+{
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	gchar              *str;
+
+	g_return_if_fail (option != NULL);
+
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_COMMON);
+	
+	str = tracker_int_to_string (value);
+	result_set = tracker_db_exec_proc (iface, "SetOption", str, option, NULL);
+	g_free (str);
+	
+	if (result_set) {
+		g_object_unref (result_set);
+	}
+}
+
+gboolean
+tracker_db_regulate_transactions (TrackerDBInterface *iface, 
+				  gint                interval)
+{
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), FALSE);
+
+	tracker->index_count++;
+	
+	if ((tracker->index_count == 1 ||
+	     tracker->index_count == interval  || 
+	     (tracker->index_count >= interval && 
+	      tracker->index_count % interval == 0))) {
+		if (tracker->index_count > 1) {
+			tracker_db_interface_end_transaction (iface);
+			tracker_db_interface_start_transaction (iface);
+
+			g_message ("Current memory usage is %d, word count %d and hits %d", 
+				   get_memory_usage (), 
+				   0,  /* was tracker->word_count, */
+				   0); /* was tracker->word_detail_count */
+		}
+
+		return TRUE;
+	}
+
+	return FALSE;
+}

Modified: branches/xesam-support/src/trackerd/tracker-db.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-db.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-db.h	Mon Jun  9 15:41:07 2008
@@ -1,6 +1,9 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 /*
  * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc gnome org)
+ * Copyright (C) 2007, Jason Kivlighn (jkivlighn gmail com)
+ * Copyright (C) 2007, Creative Commons (http://creativecommons.org) 
+ * Copyright (C) 2008, Nokia
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public
@@ -23,24 +26,209 @@
 
 #include <glib.h>
 
+#include <libtracker-common/tracker-field.h>
+#include <libtracker-common/tracker-field-data.h>
+#include <libtracker-common/tracker-ontology.h>
+
+#include <libtracker-db/tracker-db-interface.h>
 #include <libtracker-db/tracker-db-file-info.h>
 
-#include "tracker-db-sqlite.h"
+#include "tracker-indexer.h"
+#include "tracker-utils.h"
 
 G_BEGIN_DECLS
 
-void               tracker_db_init                (void);
-void               tracker_db_shutdown            (void);
-gboolean           tracker_db_is_file_up_to_date  (DBConnection      *db_con,
-						   const gchar       *uri,
-						   guint32           *id);
-TrackerDBFileInfo *tracker_db_get_file_info       (DBConnection      *db_con,
-						   TrackerDBFileInfo *info);
-gchar *            tracker_db_get_id              (DBConnection      *db_con,
-						   const gchar       *service,
-						   const gchar       *uri);
-gchar **           tracker_db_get_files_in_folder (DBConnection      *db_con,
-						   const gchar       *folder_uri);
+void                tracker_db_init                            (void);
+void                tracker_db_shutdown                        (void);
+void                tracker_db_refresh_all                     (TrackerDBInterface  *iface);
+
+
+/* Operations for TrackerDBInterface */
+void                tracker_db_close                           (TrackerDBInterface  *iface);
+TrackerDBResultSet *tracker_db_exec_proc                       (TrackerDBInterface  *iface,
+								const gchar         *procedure,
+								...);
+gboolean            tracker_db_exec_no_reply                   (TrackerDBInterface  *iface,
+								const gchar         *query,
+								...);
+TrackerDBResultSet *tracker_db_exec                            (TrackerDBInterface  *iface,
+								const char          *query,
+								...);
+gchar *             tracker_db_get_option_string               (const gchar         *option);
+void                tracker_db_set_option_string               (const gchar         *option,
+								const gchar         *value);
+gint                tracker_db_get_option_int                  (const gchar         *option);
+void                tracker_db_set_option_int                  (const gchar         *option,
+								gint                 value);
+
+/* High level transactions things */
+gboolean            tracker_db_regulate_transactions           (TrackerDBInterface  *iface,
+								gint                 interval);
+
+/* Metadata API */
+gchar *             tracker_db_metadata_get_related_names      (TrackerDBInterface  *iface,
+								const gchar         *name);
+const gchar *       tracker_db_metadata_get_table              (TrackerFieldType     type);
+TrackerDBResultSet *tracker_db_metadata_get                    (TrackerDBInterface  *iface,
+								const gchar         *id,
+								const gchar         *key);
+gchar *             tracker_db_metadata_get_delimited          (TrackerDBInterface  *iface,
+								const gchar         *id,
+								const gchar         *key);
+gchar *             tracker_db_metadata_set                    (TrackerDBInterface  *iface,
+								const gchar         *service,
+								const gchar         *id,
+								const gchar         *key,
+								gchar              **values,
+								gboolean             do_backup);
+void                tracker_db_metadata_set_single             (TrackerDBInterface  *iface,
+								const gchar         *service,
+								const gchar         *id,
+								const gchar         *key,
+								const gchar         *value,
+								gboolean             do_backup);
+void                tracker_db_metadata_insert_embedded        (TrackerDBInterface  *iface,
+								const gchar         *service,
+								const gchar         *id,
+								const gchar         *key,
+								gchar              **values,
+								GHashTable          *table);
+void                tracker_db_metadata_insert_single_embedded (TrackerDBInterface  *iface,
+								const gchar         *service,
+								const gchar         *id,
+								const gchar         *key,
+								const gchar         *value,
+								GHashTable          *table);
+void                tracker_db_metadata_delete_value           (TrackerDBInterface  *iface,
+								const gchar         *service,
+								const gchar         *id,
+								const gchar         *key,
+								const gchar         *value);
+void                tracker_db_metadata_delete                 (TrackerDBInterface  *iface,
+								const gchar         *service,
+								const gchar         *id,
+								const gchar         *key,
+								gboolean             update_indexes);
+TrackerDBResultSet *tracker_db_metadata_get_types              (TrackerDBInterface  *iface,
+								const gchar         *class,
+								gboolean             writeable);
+
+/* Search API */
+TrackerDBResultSet *tracker_db_search_text                     (TrackerDBInterface  *iface,
+								const gchar         *service,
+								const gchar         *search_string,
+								gint                 offset,
+								gint                 limit,
+								gboolean             save_results,
+								gboolean             detailed);
+
+/* Service API */
+guint32             tracker_db_service_create                  (TrackerDBInterface  *iface,
+								const gchar         *service,
+								TrackerDBFileInfo   *info);
+gchar *             tracker_db_service_get_by_entity           (TrackerDBInterface  *iface,
+								const gchar         *id);
+
+/* Files API */
+gchar **            tracker_db_files_get                       (TrackerDBInterface  *iface,
+								const gchar         *folder_uri);
+TrackerDBResultSet *tracker_db_files_get_by_service            (TrackerDBInterface  *iface,
+								const gchar         *service,
+								gint                 offset,
+								gint                 limit);
+TrackerDBResultSet *tracker_db_files_get_by_mime               (TrackerDBInterface  *iface,
+								gchar              **mimes,
+								gint                 n,
+								gint                 offset,
+								gint                 limit,
+								gboolean             vfs);
+guint32             tracker_db_file_get_id                     (TrackerDBInterface  *iface,
+								const gchar         *uri);
+gchar *             tracker_db_file_get_id_as_string           (TrackerDBInterface  *iface,
+								const gchar         *service,
+								const gchar         *uri);
+TrackerDBFileInfo * tracker_db_file_get_info                   (TrackerDBInterface  *iface,
+								TrackerDBFileInfo   *info);
+gboolean            tracker_db_file_is_up_to_date              (TrackerDBInterface  *iface,
+								const gchar         *uri,
+								guint32             *id);
+void                tracker_db_file_delete                     (TrackerDBInterface  *iface,
+								guint32              file_id);
+void                tracker_db_file_move                       (TrackerDBInterface  *iface,
+								const gchar         *moved_from_uri,
+								const gchar         *moved_to_uri);
+void                tracker_db_directory_delete                (TrackerDBInterface  *iface,
+								guint32              file_id,
+								const gchar         *uri);
+void                tracker_db_directory_move                  (TrackerDBInterface  *iface,
+								const gchar         *moved_from_uri,
+								const gchar         *moved_to_uri);
+void                tracker_db_uri_insert_pending              (const gchar         *id,
+								const gchar         *action,
+								const gchar         *counter,
+								const gchar         *uri,
+								const gchar         *mime,
+								gboolean             is_dir,
+								gboolean             is_new,
+								gint                 service_type_id);
+void                tracker_db_uri_update_pending              (const gchar         *counter,
+								const gchar         *action,
+								const gchar         *uri);
+TrackerDBResultSet *tracker_db_uri_get_subfolders              (TrackerDBInterface  *iface,
+								const gchar         *uri);
+TrackerDBResultSet *tracker_db_uri_sub_watches_get             (const gchar         *dir);
+TrackerDBResultSet *tracker_db_uri_sub_watches_delete          (const gchar         *dir);
+
+/* Keywords API */
+TrackerDBResultSet *tracker_db_keywords_get_list               (TrackerDBInterface  *iface,
+								const gchar         *service);
+
+/* Miscellaneous API */
+GHashTable *        tracker_db_get_file_contents_words         (TrackerDBInterface  *iface,
+								guint32              id,
+								GHashTable          *old_table);
+GHashTable *        tracker_db_get_indexable_content_words     (TrackerDBInterface  *iface,
+								guint32              id,
+								GHashTable          *table,
+								gboolean             embedded_only);
+gchar *             tracker_db_get_field_name                  (const gchar         *service,
+								const gchar         *meta_name);
+TrackerFieldData *  tracker_db_get_metadata_field              (TrackerDBInterface  *iface,
+								const gchar         *service,
+								const gchar         *field_name,
+								gint                 field_count,
+								gboolean             is_select,
+								gboolean             is_condition);
+
+/* Live Search API */
+void                tracker_db_live_search_start               (TrackerDBInterface  *iface,
+								const gchar         *from_query,
+								const gchar         *join_query,
+								const gchar         *where_query,
+								const gchar         *search_id);
+void                tracker_db_live_search_stop                (TrackerDBInterface  *iface,
+								const gchar         *search_id);
+TrackerDBResultSet *tracker_db_live_search_get_all_ids         (TrackerDBInterface  *iface,
+								const gchar         *search_id);
+TrackerDBResultSet *tracker_db_live_search_get_new_ids         (TrackerDBInterface  *iface,
+								const gchar         *search_id,
+								const gchar         *from_query,
+								const gchar         *query_joins,
+								const gchar         *where_query);
+TrackerDBResultSet *tracker_db_live_search_get_deleted_ids     (TrackerDBInterface  *iface,
+								const gchar         *search_id);
+TrackerDBResultSet *tracker_db_live_search_get_hit_data        (TrackerDBInterface  *iface,
+								const gchar         *search_id,
+								GStrv                fields);
+TrackerDBResultSet *tracker_db_live_search_get_hit_count       (TrackerDBInterface  *iface,
+								const gchar         *search_id);
+
+/* XESAM API */
+void                tracker_db_xesam_delete_handled_events     (TrackerDBInterface  *iface);
+TrackerDBResultSet *tracker_db_xesam_get_metadata_names        (TrackerDBInterface  *iface,
+								const char          *name);
+TrackerDBResultSet *tracker_db_xesam_get_service_names         (TrackerDBInterface  *iface,
+								const char          *name);
 
 G_END_DECLS
 

Modified: branches/xesam-support/src/trackerd/tracker-dbus.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-dbus.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-dbus.c	Mon Jun  9 15:41:07 2008
@@ -23,7 +23,9 @@
 #include <libtracker-common/tracker-config.h>
 #include <libtracker-common/tracker-utils.h>
 
-#include "tracker-db-sqlite.h"
+#include <libtracker-db/tracker-db-manager.h>
+
+#include "tracker-db.h"
 #include "tracker-dbus.h"
 #include "tracker-daemon.h"
 #include "tracker-daemon-glue.h"
@@ -197,8 +199,7 @@
 gboolean
 tracker_dbus_register_objects (Tracker *tracker)
 {
-        GObject      *object;
-	DBConnection *db_connection;
+        GObject *object;
 
 	g_return_val_if_fail (tracker != NULL, FALSE);
 
@@ -216,9 +217,6 @@
                 return FALSE;
         }
 
-        db_connection = tracker_db_connect_all ();
-
-        g_object_set (object, "db-connection", db_connection, NULL);
         g_object_set (object, "config", tracker->config, NULL);
         g_object_set (object, "tracker", tracker, NULL);
         objects = g_slist_prepend (objects, object);
@@ -232,7 +230,6 @@
                 return FALSE;
         }
 
-        g_object_set (object, "db-connection", db_connection, NULL);
         objects = g_slist_prepend (objects, object);
 
         /* Add org.freedesktop.Tracker.Keywords */
@@ -244,7 +241,6 @@
                 return FALSE;
         }
 
-        g_object_set (object, "db-connection", db_connection, NULL);
         objects = g_slist_prepend (objects, object);
 
         /* Add org.freedesktop.Tracker.Metadata */
@@ -256,7 +252,6 @@
                 return FALSE;
         }
 
-        g_object_set (object, "db-connection", db_connection, NULL);
         objects = g_slist_prepend (objects, object);
 
         /* Add org.freedesktop.Tracker.Search */
@@ -268,7 +263,6 @@
                 return FALSE;
         }
 
-	g_object_set (object, "db-connection", db_connection, NULL);
 	g_object_set (object, "config", tracker->config, NULL);
 	g_object_set (object, "language", tracker->language, NULL);
 	g_object_set (object, "file-index", tracker->file_index, NULL);
@@ -286,9 +280,6 @@
 			return FALSE;
 		}
 		
-		db_connection = tracker_db_connect_xesam ();
-		g_object_set (object, "db-connection", db_connection, NULL);
-		
 		dbus_g_proxy_add_signal (proxy, "NameOwnerChanged",
 					 G_TYPE_STRING, G_TYPE_STRING,
 					 G_TYPE_STRING, G_TYPE_INVALID);

Modified: branches/xesam-support/src/trackerd/tracker-email-evolution.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-email-evolution.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-email-evolution.c	Mon Jun  9 15:41:07 2008
@@ -163,9 +163,9 @@
 typedef gboolean (* LoadSummaryFileMetaHeaderFct) (SummaryFile *summary, SummaryFileHeader *header);
 typedef gboolean (* LoadMailMessageFct) (SummaryFile *summary, MailMessage **mail_msg);
 typedef gboolean (* SkipMailMessageFct) (SummaryFile *summary);
-typedef gboolean (* SaveOnDiskMailMessageFct) (DBConnection *db_con, MailMessage *msg);
+typedef gboolean (* SaveOnDiskMailMessageFct) (TrackerDBInterface *iface, MailMessage *msg);
 
-static void	index_mail_messages_by_summary_file	(DBConnection *db_con, MailType mail_type,
+static void	index_mail_messages_by_summary_file	(TrackerDBInterface *iface, MailType mail_type,
 							 const gchar *summary_file_path,
 							 LoadSummaryFileMetaHeaderFct load_meta_header,
 							 LoadMailMessageFct load_mail,
@@ -200,11 +200,11 @@
 static gboolean	skip_loading_content_info		(SummaryFile *summary);
 static gboolean	do_skip_loading_content_info		(SummaryFile *summary);
 
-static gboolean	save_ondisk_email_message_for_imap	(DBConnection *db_con, MailMessage *mail_msg);
-static gboolean	save_ondisk_email_message_for_imap4	(DBConnection *db_con, MailMessage *mail_msg);
-static gboolean	do_save_ondisk_email_message_for_imap	(DBConnection *db_con, MailMessage *mail_msg);
-static gboolean	do_save_ondisk_email_message		(DBConnection *db_con, MailMessage *mail_msg);
-static gboolean	index_mail_parts			(DBConnection *db_con, MailMessage *mail_msg, const gchar *mail_part_radix);
+static gboolean	save_ondisk_email_message_for_imap	(TrackerDBInterface *iface, MailMessage *mail_msg);
+static gboolean	save_ondisk_email_message_for_imap4	(TrackerDBInterface *iface, MailMessage *mail_msg);
+static gboolean	do_save_ondisk_email_message_for_imap	(TrackerDBInterface *iface, MailMessage *mail_msg);
+static gboolean	do_save_ondisk_email_message		(TrackerDBInterface *iface, MailMessage *mail_msg);
+static gboolean	index_mail_parts			(TrackerDBInterface *iface, MailMessage *mail_msg, const gchar *mail_part_radix);
 
 static GSList *	add_persons_from_internet_address_list_string_parsing	(GSList *list, const gchar *s);
 
@@ -223,7 +223,7 @@
 static inline gboolean	skip_token_decoding	(FILE *f);
 
 static gchar * g_unescape_uri_string (const gchar *escaped, const gchar *illegal_characters);
-static void  check_summary_file (DBConnection *db_con, const gchar *filename, MailStore *store);
+static void  check_summary_file (TrackerDBInterface *iface, const gchar *filename, MailStore *store);
 
 static gboolean
 evolution_module_is_running (void)
@@ -269,20 +269,20 @@
 
 
 void
-tracker_email_plugin_watch_emails (DBConnection *db_con)
+tracker_email_plugin_watch_emails (TrackerDBInterface *iface)
 {
 	TrackerDBResultSet *result_set;
 
 	/* if initial indexing has not finished reset mtime on all email stuff so they are rechecked */
-	if (tracker_db_get_option_int (db_con->common, "InitialIndex") == 1) {
+	if (tracker_db_get_option_int ("InitialIndex") == 1) {
 		char *sql = g_strdup_printf ("update Services set mtime = 0 where path like '%s/.evolution/%s'", g_get_home_dir (), "%");
 
-		tracker_db_interface_execute_query (db_con->db, NULL, sql);
+		tracker_db_interface_execute_query (iface, NULL, sql);
 		g_free (sql);
 	}
 
 	/* check all registered mbox/paths for deletions */
-	result_set = tracker_db_email_get_mboxes (db_con);
+	result_set = tracker_db_email_get_mboxes (iface);
 
 	if (result_set) {
 		gboolean valid = TRUE;
@@ -295,10 +295,10 @@
 						   3, &path,
 						   -1);
 
-			store = tracker_db_email_get_mbox_details (db_con, path);
+			store = tracker_db_email_get_mbox_details (iface, path);
 
 			if (store) {
-				check_summary_file (db_con, filename, store);
+				check_summary_file (iface, filename, store);
 				tracker_db_email_free_mail_store (store);
 			}
 
@@ -373,11 +373,11 @@
 
 
 gboolean
-tracker_email_plugin_index_file (DBConnection *db_con, TrackerDBFileInfo *info)
+tracker_email_plugin_index_file (TrackerDBInterface *iface, TrackerDBFileInfo *info)
 {
 	gchar *file_name;
 
-	g_return_val_if_fail (db_con, FALSE);
+	g_return_val_if_fail (iface, FALSE);
 	g_return_val_if_fail (info, FALSE);
 
 	if (!tracker_email_plugin_file_is_interesting (info))
@@ -402,7 +402,7 @@
 		g_debug ("summary %s is an mbox", info->uri);
 
 		/* check mbox is registered */
-		if (tracker_db_email_get_mbox_id (db_con, mbox_file) == -1) {
+		if (tracker_db_email_get_mbox_id (iface, mbox_file) == -1) {
 			gchar *uri_prefix, *mail_path1, *mail_path2;
 
 			gchar *mbox_dir = g_strconcat (evolution_config->dir_local, "/", NULL);
@@ -417,13 +417,13 @@
 			g_free (mail_path1);
 			g_free (mail_path2);
 
-			tracker_db_email_register_mbox (db_con, MAIL_APP_EVOLUTION, MAIL_TYPE_MBOX ,mbox_file, info->uri, uri_prefix);
+			tracker_db_email_register_mbox (iface, MAIL_APP_EVOLUTION, MAIL_TYPE_MBOX ,mbox_file, info->uri, uri_prefix);
 
 			g_free (uri_prefix);
 
 		}
 
-		MailStore *store = tracker_db_email_get_mbox_details (db_con, mbox_file);
+		MailStore *store = tracker_db_email_get_mbox_details (iface, mbox_file);
 
 		summary = NULL;
 
@@ -446,15 +446,15 @@
 			}
 
 
-			if (!email_parse_mail_file_and_save_new_emails (db_con, MAIL_APP_EVOLUTION, mbox_file,
+			if (!email_parse_mail_file_and_save_new_emails (iface, MAIL_APP_EVOLUTION, mbox_file,
                                                                         load_uri_and_status_of_mbox_mail_message, NULL,
                                                                         NULL, NULL,
                                                                         store)) {
 				g_message ("Setting junk status on email file:'%s'",
 					   mbox_file);
-				tracker_db_email_flag_mbox_junk (db_con, mbox_file);
+				tracker_db_email_flag_mbox_junk (iface, mbox_file);
 			} else {
-				tracker_db_email_set_message_counts (db_con, mbox_file, store->mail_count, store->junk_count, store->delete_count);
+				tracker_db_email_set_message_counts (iface, mbox_file, store->mail_count, store->junk_count, store->delete_count);
 				g_debug ("Number of existing messages in %s are %d, %d junk, %d deleted and header totals are %d, %d, %d", mbox_file,
 					store->mail_count, store->junk_count, store->delete_count, header->saved_count, header->junk_count, header->deleted_count);
 			}
@@ -477,13 +477,13 @@
 		if (strcmp (file_name, "summary") == 0) {
 
 			if (is_in_dir_imap4 (info->uri)) {
-				index_mail_messages_by_summary_file (db_con, MAIL_TYPE_IMAP4, info->uri,
+				index_mail_messages_by_summary_file (iface, MAIL_TYPE_IMAP4, info->uri,
 								     load_summary_file_meta_header_for_imap,
 								     load_mail_message_for_imap4,
 								     skip_mail_message_for_imap4,
 								     save_ondisk_email_message_for_imap4);
 			} else {
-				index_mail_messages_by_summary_file (db_con, MAIL_TYPE_IMAP, info->uri,
+				index_mail_messages_by_summary_file (iface, MAIL_TYPE_IMAP, info->uri,
 								     load_summary_file_meta_header_for_imap,
 								     load_mail_message_for_imap,
 								     skip_mail_message_for_imap,
@@ -500,7 +500,7 @@
 
 		ondisk_msg = email_parse_mail_message_by_path (MAIL_APP_EVOLUTION, info->uri, NULL);
 		if (ondisk_msg) {
-			tracker_db_email_update_email (db_con, ondisk_msg);
+			tracker_db_email_update_email (iface, ondisk_msg);
 			email_free_mail_message (ondisk_msg);
 		}
 
@@ -508,7 +508,7 @@
 	} else if (is_in_dir_maildir (info->uri)) {
 
 		if (g_str_has_suffix (info->uri, ".ev-summary")) {
-			index_mail_messages_by_summary_file (db_con, info->uri, MAIL_TYPE_MAILDIR,
+			index_mail_messages_by_summary_file (iface, info->uri, MAIL_TYPE_MAILDIR,
 							     load_summary_file_meta_header_for_maildir,
 							     load_mail_message_for_maildir,
 							     skip_mail_message_for_maildir);
@@ -518,7 +518,7 @@
 
 			ondisk_msg = email_parse_mail_message_by_path (MAIL_APP_EVOLUTION, info->uri, NULL);
 			if (ondisk_msg) {
-				tracker_db_email_update_email (db_con, ondisk_msg);
+				tracker_db_email_update_email (iface, ondisk_msg);
 				email_free_mail_message (ondisk_msg);
 			}
 		}
@@ -528,7 +528,7 @@
 
 		if (email_mh_is_in_a_mh_dir (info->uri)) {
 
-			try_to_save_ondisk_email_message (db_con, info->uri, NULL);
+			try_to_save_ondisk_email_message (iface, info->uri, NULL);
 
 		}
 */
@@ -628,7 +628,7 @@
 
 
 static void
-check_summary_file (DBConnection *db_con, const gchar *filename, MailStore *store)
+check_summary_file (TrackerDBInterface *iface, const gchar *filename, MailStore *store)
 {
 	SummaryFile *summary = NULL;
 
@@ -672,11 +672,11 @@
 
 		}
 
-		path = tracker_db_email_get_mbox_path (db_con, filename);
+		path = tracker_db_email_get_mbox_path (iface, filename);
 
 		if ((header->junk_count > store->junk_count) || (header->deleted_count > store->delete_count)) {
 
-			gchar *mbox_id = tracker_int_to_string (tracker_db_email_get_mbox_id (db_con, path));
+			gchar *mbox_id = tracker_int_to_string (tracker_db_email_get_mbox_id (iface, path));
 			gint i;
 
 			for (i = 0; i < header->saved_count ; i++) {
@@ -688,11 +688,11 @@
 
 						str_uid = tracker_uint_to_string (uid);
 
-						tracker_db_email_insert_junk (db_con, path, uid);
+						tracker_db_email_insert_junk (iface, path, uid);
 
 						uri = g_strconcat (store->uri_prefix, str_uid, NULL);
 
-						tracker_db_email_delete_email (db_con, uri);
+						tracker_db_email_delete_email (iface, uri);
 
 						g_free (uri);
 						g_free (str_uid);
@@ -706,8 +706,8 @@
 			}
 			g_free (mbox_id);
 		}
-		tracker_db_email_reset_mbox_junk (db_con, path);
-		tracker_db_email_set_message_counts (db_con, path, store->mail_count, header->junk_count, header->deleted_count);
+		tracker_db_email_reset_mbox_junk (iface, path);
+		tracker_db_email_set_message_counts (iface, path, store->mail_count, header->junk_count, header->deleted_count);
 
 		g_free (path);
 
@@ -1266,7 +1266,7 @@
 
 
 static void
-index_mail_messages_by_summary_file (DBConnection                 *db_con,
+index_mail_messages_by_summary_file (TrackerDBInterface                 *iface,
                                      MailType                     mail_type,
 				     const gchar                  *summary_file_path,
 				     LoadSummaryFileMetaHeaderFct load_meta_header,
@@ -1308,7 +1308,7 @@
 		dir = g_path_get_dirname (summary->path);
 
 		/* check summary file is registered */
-		if (tracker_db_email_get_mbox_id (db_con, dir) == -1) {
+		if (tracker_db_email_get_mbox_id (iface, dir) == -1) {
 			const gchar *pos_folders = strstr (dir, G_DIR_SEPARATOR_S "folders" G_DIR_SEPARATOR_S);
 
 			if (pos_folders) {
@@ -1344,14 +1344,14 @@
 
 					g_free (uri_dir);
 
-					tracker_db_email_register_mbox (db_con, MAIL_APP_EVOLUTION, mail_type, dir, summary_file_path, uri_prefix);
+					tracker_db_email_register_mbox (iface, MAIL_APP_EVOLUTION, mail_type, dir, summary_file_path, uri_prefix);
 
 					g_free (uri_prefix);
 				}
 			}
 		}
 
-		MailStore *store = tracker_db_email_get_mbox_details (db_con, dir);
+		MailStore *store = tracker_db_email_get_mbox_details (iface, dir);
 
                 if (!store) {
 			g_critical ("could not retrieve store for file %s", dir);
@@ -1425,10 +1425,10 @@
 
 				mail_msg->store = store;
 
-				if (!(*save_ondisk_mail) (db_con, mail_msg)) {
+				if (!(*save_ondisk_mail) (iface, mail_msg)) {
 					g_message ("WARNING: Message, or message parts, could not be found locally - if you are using IMAP make sure you have selected the \"copy folder content locally for offline operation\" option in Evolution");
 					/* we do not have all infos but we still save them */
-					if (!tracker_db_email_save_email (db_con, mail_msg, MAIL_APP_EVOLUTION)) {
+					if (!tracker_db_email_save_email (iface, mail_msg, MAIL_APP_EVOLUTION)) {
 						g_message ("Failed to save email");
 					}
 				}
@@ -1445,7 +1445,7 @@
 				email_free_mail_message (mail_msg);
 
 #if 0
-				if (!tracker_cache_process_events (db_con->data, TRUE)) {
+				if (!tracker_cache_process_events (iface->data, TRUE)) {
 					tracker->shutdown = TRUE;
                                         tracker_status_set_and_signal (TRACKER_STATUS_SHUTDOWN,
                                                                        tracker->first_time_index,
@@ -1458,15 +1458,15 @@
 				}
 #endif
 
-				if (tracker_db_regulate_transactions (db_con->data, 500)) {
+				if (tracker_db_regulate_transactions (iface, 500)) {
                                         if (tracker_config_get_verbosity (tracker->config) == 1) {
 						g_message ("indexing #%d - Emails in %s", tracker->index_count, dir);
 					}
 
 					if (tracker->index_count % 1000 == 0) {
-						tracker_db_end_index_transaction (db_con->data);
-						tracker_db_refresh_all (db_con->data);
-						tracker_db_start_index_transaction (db_con->data);
+						tracker_db_interface_end_transaction (iface);
+						tracker_db_refresh_all (iface);
+						tracker_db_interface_start_transaction (iface);
 					}
 					
                                         /* Signal progress */
@@ -1484,11 +1484,11 @@
 
 			g_message ("No. of new emails indexed in summary file %s is %d, %d junk, %d deleted", dir, mail_count, junk_count, delete_count);
 
-			tracker_db_email_set_message_counts (db_con, dir, store->mail_count, store->junk_count, store->delete_count);
+			tracker_db_email_set_message_counts (iface, dir, store->mail_count, store->junk_count, store->delete_count);
 
 		} else {
 			/* schedule check for junk */
-			tracker_db_email_flag_mbox_junk (db_con, dir);
+			tracker_db_email_flag_mbox_junk (iface, dir);
 		}
 
 		tracker->mbox_processed++;
@@ -2305,28 +2305,28 @@
 
 
 static gboolean
-save_ondisk_email_message_for_imap (DBConnection *db_con, MailMessage *mail_msg)
+save_ondisk_email_message_for_imap (TrackerDBInterface *iface, MailMessage *mail_msg)
 {
-	return do_save_ondisk_email_message_for_imap (db_con, mail_msg);
+	return do_save_ondisk_email_message_for_imap (iface, mail_msg);
 }
 
 
 static gboolean
-save_ondisk_email_message_for_imap4 (DBConnection *db_con, MailMessage *mail_msg)
+save_ondisk_email_message_for_imap4 (TrackerDBInterface *iface, MailMessage *mail_msg)
 {
-	return do_save_ondisk_email_message_for_imap (db_con, mail_msg);
+	return do_save_ondisk_email_message_for_imap (iface, mail_msg);
 }
 
 
 static gboolean
-do_save_ondisk_email_message_for_imap (DBConnection *db_con, MailMessage *mail_msg)
+do_save_ondisk_email_message_for_imap (TrackerDBInterface *iface, MailMessage *mail_msg)
 {
-	g_return_val_if_fail (db_con, FALSE);
+	g_return_val_if_fail (iface, FALSE);
 	g_return_val_if_fail (mail_msg, FALSE);
 
 	g_message ("Trying to index mail \"%s\"", mail_msg->uri);
 
-	if (!do_save_ondisk_email_message (db_con, mail_msg)) {
+	if (!do_save_ondisk_email_message (iface, mail_msg)) {
 		/* Mail not found... So two cases:
 		 * 1/ mail naming uses this schema:
 		 *    - id.HEADER
@@ -2351,11 +2351,11 @@
 		if (tracker_file_is_indexable (header_file)) {
 			/* email is on disk */
 			g_message ("... Indexing mail parts of email \"%s\"", mail_msg->uri);
-			ret = index_mail_parts (db_con, mail_msg, mail_msg->path);
+			ret = index_mail_parts (iface, mail_msg, mail_msg->path);
 			g_message ("... Treatment of mail parts of \"%s\" finished", mail_msg->uri);
 
 			if (ret) {
-				tracker_db_email_save_email (db_con, mail_msg, MAIL_APP_EVOLUTION);
+				tracker_db_email_save_email (iface, mail_msg, MAIL_APP_EVOLUTION);
 			}
 		} else {
                         g_message ("...Indexing of mail parts failed");
@@ -2373,9 +2373,9 @@
 
 
 static gboolean
-do_save_ondisk_email_message (DBConnection *db_con, MailMessage *mail_msg)
+do_save_ondisk_email_message (TrackerDBInterface *iface, MailMessage *mail_msg)
 {
-	g_return_val_if_fail (db_con, FALSE);
+	g_return_val_if_fail (iface, FALSE);
 	g_return_val_if_fail (mail_msg, FALSE);
 	g_return_val_if_fail (mail_msg->path, FALSE);
 
@@ -2392,7 +2392,7 @@
 			mail_msg_on_disk->uri = g_strdup (mail_msg->uri);
 			mail_msg_on_disk->store = mail_msg->store;
 
-			tracker_db_email_save_email (db_con, mail_msg_on_disk, MAIL_APP_EVOLUTION);
+			tracker_db_email_save_email (iface, mail_msg_on_disk, MAIL_APP_EVOLUTION);
 
 			email_free_mail_file (mail_msg_on_disk->parent_mail_file);
 			email_free_mail_message (mail_msg_on_disk);
@@ -2406,7 +2406,7 @@
 
 
 static gboolean
-index_mail_parts (DBConnection *db_con, MailMessage *mail_msg, const gchar *mail_part_radix)
+index_mail_parts (TrackerDBInterface *iface, MailMessage *mail_msg, const gchar *mail_part_radix)
 {
 	GQueue *mail_parts;
 	gint   i, num_parts;
@@ -2423,7 +2423,7 @@
 		email_free_mime_infos (x->mime_infos);	\
 		g_slice_free (MailPart, x);
 
-	g_return_val_if_fail (db_con, FALSE);
+	g_return_val_if_fail (iface, FALSE);
 	g_return_val_if_fail (mail_msg, FALSE);
 	g_return_val_if_fail (mail_part_radix, FALSE);
 

Modified: branches/xesam-support/src/trackerd/tracker-email-kmail.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-email-kmail.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-email-kmail.c	Mon Jun  9 15:41:07 2008
@@ -79,12 +79,12 @@
 static FileAndImapPaths ** find_dir_and_imap_path_pairs (GKeyFile *key_file, gchar **groups, const gchar *imap_id);
 static void             free_file_and_imap_path_pair    (FileAndImapPaths *pair);
 static void             free_kmail_account              (KMailAccount *account);
-static GSList *         get_dirs_to_watch               (DBConnection *db_con, const gchar *dir_path, gboolean in_imap_dir);
+static GSList *         get_dirs_to_watch               (TrackerDBInterface *iface, const gchar *dir_path, gboolean in_imap_dir);
 static gboolean         ignore_email                    (const gchar *uri);
 static KMailMailProtocol find_mail_protocol             (const gchar *mail_path);
-static gboolean         index_mail_file_in_maildir_dir  (DBConnection *db_con, const gchar *dir, TrackerDBFileInfo *info, MailType mail_type);
-//static void           watch_imap_cache                (DBConnection *db_con, const gchar *imap_dir_path);
-//static void           watch_local_maildir_dir         (DBConnection *db_con, const gchar *dir_path);
+static gboolean         index_mail_file_in_maildir_dir  (TrackerDBInterface *iface, const gchar *dir, TrackerDBFileInfo *info, MailType mail_type);
+//static void           watch_imap_cache                (TrackerDBInterface *iface, const gchar *imap_dir_path);
+//static void           watch_local_maildir_dir         (TrackerDBInterface *iface, const gchar *dir_path);
 
 static void             load_uri_of_mbox_mail_message   (GMimeMessage *g_m_message, MailMessage *mail_msg, gpointer user_data);
 static gchar *          forward_uri_for_mbox_email      (MailMessage *mail_msg, gpointer user_data);
@@ -139,13 +139,13 @@
 
 
 void
-tracker_email_plugin_watch_emails (DBConnection *db_con)
+tracker_email_plugin_watch_emails (TrackerDBInterface *iface)
 {
         g_return_if_fail (kmail_config);
 
         #define WATCH_DIRS(root_dir, in_imap_dir)                                       \
         {                                                                               \
-                GSList *dirs = get_dirs_to_watch (db_con, root_dir, in_imap_dir);       \
+                GSList *dirs = get_dirs_to_watch (iface, root_dir, in_imap_dir);       \
                 email_watch_directories (dirs, "KMailEmails");                          \
                 g_slist_foreach (dirs, (GFunc) g_free, NULL);                           \
                 g_slist_free (dirs);                                                    \
@@ -186,11 +186,11 @@
 
 
 gboolean
-tracker_email_plugin_index_file (DBConnection *db_con, TrackerDBFileInfo *info)
+tracker_email_plugin_index_file (TrackerDBInterface *iface, TrackerDBFileInfo *info)
 {
         KMailMailProtocol mail_protocol;
 
-        g_return_val_if_fail (db_con, FALSE);
+        g_return_val_if_fail (iface, FALSE);
         g_return_val_if_fail (info, FALSE);
 
 	if (!tracker_email_plugin_file_is_interesting (info))
@@ -204,7 +204,7 @@
                         if (email_is_in_a_maildir_dir (info->uri)) {
                                 /* check directory is registered */
                                 gchar *dir = g_path_get_dirname (info->uri);
-                                index_mail_file_in_maildir_dir (db_con, dir, info,
+                                index_mail_file_in_maildir_dir (iface, dir, info,
                                                                 (mail_protocol == KMAIL_MAIL_PROTOCOL_MBOX ? MAIL_TYPE_MBOX : MAIL_TYPE_IMAP));
                                 g_free (dir);
 
@@ -220,11 +220,11 @@
                                 }
 
                                 /* check mbox is registered */
-                                if (tracker_db_email_get_mbox_id (db_con, info->uri) == -1) {
+                                if (tracker_db_email_get_mbox_id (iface, info->uri) == -1) {
                                         gchar *mbox_name = g_path_get_basename (info->uri);
                                         gchar *uri_prefix = g_path_get_dirname (info->uri);
 
-                                        tracker_db_email_register_mbox (db_con, MAIL_APP_KMAIL,
+                                        tracker_db_email_register_mbox (iface, MAIL_APP_KMAIL,
                                                                         (mail_protocol == KMAIL_MAIL_PROTOCOL_MBOX ? MAIL_TYPE_MBOX : MAIL_TYPE_IMAP),
                                                                         info->uri, mbox_name, uri_prefix);
 
@@ -232,19 +232,19 @@
                                         g_free (uri_prefix);
                                 }
 
-                                MailStore *store = tracker_db_email_get_mbox_details (db_con, info->uri);
+                                MailStore *store = tracker_db_email_get_mbox_details (iface, info->uri);
                                 if (!store) {
                                         g_critical ("Could not retrieve store for file:'%s'", info->uri);
                                         return FALSE;
                                 }
 
                                 if (mail_protocol == KMAIL_MAIL_PROTOCOL_MBOX) {
-                                        email_parse_mail_file_and_save_new_emails (db_con, MAIL_APP_KMAIL, info->uri,
+                                        email_parse_mail_file_and_save_new_emails (iface, MAIL_APP_KMAIL, info->uri,
                                                                                    load_uri_of_mbox_mail_message, NULL,
                                                                                    forward_uri_for_mbox_email, NULL,
                                                                                    store);
                                 } else {
-                                        email_parse_mail_file_and_save_new_emails (db_con, MAIL_APP_KMAIL, info->uri,
+                                        email_parse_mail_file_and_save_new_emails (iface, MAIL_APP_KMAIL, info->uri,
                                                                                    fill_uri_with_uid_for_imap, NULL,
                                                                                    make_imap_email_uri, kmail_config->accounts,
                                                                                    store);
@@ -256,8 +256,8 @@
                 }
                 case KMAIL_MAIL_PROTOCOL_CACHED_IMAP: {
                         gchar *dir = g_path_get_dirname (info->uri) ;
-                        //tracker_db_index_file (db_con, info, NULL, NULL);
-                        index_mail_file_in_maildir_dir (db_con, dir, info, MAIL_TYPE_IMAP);
+                        //tracker_db_index_file (iface, info, NULL, NULL);
+                        index_mail_file_in_maildir_dir (iface, dir, info, MAIL_TYPE_IMAP);
                         g_free (dir);
                         break;
                 }
@@ -638,12 +638,12 @@
 
 
 static GSList *
-get_dirs_to_watch (DBConnection *db_con, const gchar *dir_path, gboolean in_imap_dir)
+get_dirs_to_watch (TrackerDBInterface *iface, const gchar *dir_path, gboolean in_imap_dir)
 {
         GSList       *tmp_dirs, *dirs;
         const GSList *dir;
 
-        g_return_val_if_fail (db_con, NULL);
+        g_return_val_if_fail (iface, NULL);
         g_return_val_if_fail (dir_path, NULL);
 
         if (!tracker_process_files_should_be_watched (tracker->config, dir_path)) {
@@ -663,7 +663,7 @@
                     (( in_imap_dir && dir_name[0] == '.' && g_str_has_suffix (dir_name, ".directory")) ||
                       !in_imap_dir )
                     ) {
-                        if (!tracker_watcher_is_dir_watched (dir_path, db_con)) {
+                        if (!tracker_watcher_is_dir_watched (dir_path, iface)) {
                                 /* if we are in a maildir directory, we will only index emails in directory "cur" */
                                 gchar *dir_cur = g_build_filename (dir_path, "cur", NULL);
 
@@ -704,21 +704,21 @@
 
 
 static gboolean
-index_mail_file_in_maildir_dir (DBConnection *db_con, const gchar *dir, TrackerDBFileInfo *info, MailType mail_type)
+index_mail_file_in_maildir_dir (TrackerDBInterface *iface, const gchar *dir, TrackerDBFileInfo *info, MailType mail_type)
 {
         MailStore *store;
 
-        if (tracker_db_email_get_mbox_id (db_con, dir) == -1) {
+        if (tracker_db_email_get_mbox_id (iface, dir) == -1) {
                 gchar *filename = g_path_get_basename (info->uri);
                 gchar *uri_prefix = g_path_get_dirname (info->uri);
 
-                tracker_db_email_register_mbox (db_con, MAIL_APP_KMAIL, mail_type, dir, filename, uri_prefix);
+                tracker_db_email_register_mbox (iface, MAIL_APP_KMAIL, mail_type, dir, filename, uri_prefix);
 
                 g_free (filename);
                 g_free (uri_prefix);
         }
 
-        store = tracker_db_email_get_mbox_details (db_con, dir);
+        store = tracker_db_email_get_mbox_details (iface, dir);
         if (!store) {
                 g_warning ("Could not retrieve store for directory:'%s'", dir);
                 return FALSE;
@@ -726,7 +726,7 @@
 
         g_message ("Looking for email file:'%s'", info->uri);
 
-        if (!tracker_db_email_is_saved_email_file (db_con, info->uri)) {
+        if (!tracker_db_email_is_saved_email_file (iface, info->uri)) {
                 MailMessage *mail_msg = email_parse_mail_message_by_path (MAIL_APP_KMAIL, info->uri, NULL, NULL, NULL);
 
                 if (!mail_msg) {
@@ -742,7 +742,7 @@
                 mail_msg->uri = g_strdup (mail_msg->path);
                 mail_msg->store = store;
                 mail_msg->mtime = tracker_file_get_mtime (mail_msg->path);
-                tracker_db_email_save_email (db_con, mail_msg, MAIL_APP_KMAIL);
+                tracker_db_email_save_email (iface, mail_msg, MAIL_APP_KMAIL);
 
                 email_free_mail_file (mail_msg->parent_mail_file);
                 email_free_mail_message (mail_msg);
@@ -765,19 +765,19 @@
 /*
 
 static void
-watch_local_maildir_dir (DBConnection *db_con, const gchar *dir_path)
+watch_local_maildir_dir (TrackerDBInterface *iface, const gchar *dir_path)
 {
         gchar *dir_names[] = {"inbox", "sent-mail", "drafts", NULL};
         gchar **dir_name;
 
-        g_return_if_fail (db_con);
+        g_return_if_fail (iface);
         g_return_if_fail (dir_path);
 
         for (dir_name = dir_names; *dir_name; dir_name++) {
                 gchar *dir_path = g_build_filename (dir_path, *dir_name, NULL);
 
                 if (tracker_is_directory (dir_path)) {
-                        email_maildir_watch_mail_messages (db_con, dir_path);
+                        email_maildir_watch_mail_messages (iface, dir_path);
                 }
 
                 g_free (dir_path);

Modified: branches/xesam-support/src/trackerd/tracker-email-modest.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-email-modest.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-email-modest.c	Mon Jun  9 15:41:07 2008
@@ -107,9 +107,9 @@
 typedef gboolean (* LoadSummaryFileMetaHeaderFct) (SummaryFile *summary, SummaryFileHeader *header);
 typedef gboolean (* LoadMailMessageFct) (SummaryFile *summary, MailMessage **mail_msg);
 typedef gboolean (* SkipMailMessageFct) (SummaryFile *summary);
-typedef gboolean (* SaveOnDiskMailMessageFct) (DBConnection *db_con, MailMessage *msg);
+typedef gboolean (* SaveOnDiskMailMessageFct) (TrackerDBInterface *iface, MailMessage *msg);
 
-static void	index_mail_messages_by_summary_file	(DBConnection *db_con, MailType mail_type,
+static void	index_mail_messages_by_summary_file	(TrackerDBInterface *iface, MailType mail_type,
 							 const gchar *summary_file_path,
 							 LoadSummaryFileMetaHeaderFct load_meta_header,
 							 LoadMailMessageFct load_mail,
@@ -147,11 +147,11 @@
 static gboolean	skip_loading_content_info		(SummaryFile *summary);
 static gboolean	do_skip_loading_content_info		(SummaryFile *summary);
 
-static gboolean	save_ondisk_email_message_for_imap	(DBConnection *db_con, MailMessage *mail_msg);
-static gboolean	save_ondisk_email_message_for_pop	(DBConnection *db_con, MailMessage *mail_msg);
-static gboolean	save_ondisk_email_message_for_maildir	(DBConnection *db_con, MailMessage *mail_msg);
-static gboolean	do_save_ondisk_email_message_generic	(DBConnection *db_con, MailMessage *mail_msg);
-static gboolean	do_save_ondisk_email_message		(DBConnection *db_con, MailMessage *mail_msg);
+static gboolean	save_ondisk_email_message_for_imap	(TrackerDBInterface *iface, MailMessage *mail_msg);
+static gboolean	save_ondisk_email_message_for_pop	(TrackerDBInterface *iface, MailMessage *mail_msg);
+static gboolean	save_ondisk_email_message_for_maildir	(TrackerDBInterface *iface, MailMessage *mail_msg);
+static gboolean	do_save_ondisk_email_message_generic	(TrackerDBInterface *iface, MailMessage *mail_msg);
+static gboolean	do_save_ondisk_email_message		(TrackerDBInterface *iface, MailMessage *mail_msg);
 
 static GSList *	add_persons_from_internet_address_list_string_parsing	(GSList *list, const gchar *s);
 
@@ -167,7 +167,7 @@
 static inline gboolean	skip_string_decoding	(FILE *f);
 static inline gboolean	skip_token_decoding	(FILE *f);
 
-static void  check_summary_file (DBConnection *db_con, const gchar *filename, MailStore *store);
+static void  check_summary_file (TrackerDBInterface *iface, const gchar *filename, MailStore *store);
 
 static void
 load_current_dynamic_folders (ModestConfig *modest_config)
@@ -217,7 +217,7 @@
 *********************************************************************************************/
 
 gboolean
-tracker_email_plugin_init (void)
+tracker_email_plugin_init (TrackerConfig *config)
 {
 	ModestConfig *conf;
 
@@ -272,20 +272,20 @@
 }
 
 void
-tracker_email_plugin_watch_emails (DBConnection *db_con)
+tracker_email_plugin_watch_emails (TrackerDBInterface *iface)
 {
 	TrackerDBResultSet *result_set;
 
 	/* if initial indexing has not finished reset mtime on all email stuff so they are rechecked */
-	if (tracker_db_get_option_int (db_con->common, "InitialIndex") == 1) {
+	if (tracker_db_get_option_int ("InitialIndex") == 1) {
 		char *sql = g_strdup_printf ("update Services set mtime = 0 where path like '%s/.modest/%s'", g_get_home_dir (), "%");
 
-		tracker_db_interface_execute_query (db_con->db, NULL, sql);
+		tracker_db_interface_execute_query (iface, NULL, sql);
 		g_free (sql);
 	}
 
 	/* check all registered mbox/paths for deletions */
-	result_set = tracker_db_email_get_mboxes (db_con);
+	result_set = tracker_db_email_get_mboxes (iface);
 
 	if (result_set) {
 		gboolean valid = TRUE;
@@ -298,10 +298,10 @@
 						   3, &path,
 						   -1);
 
-			store = tracker_db_email_get_mbox_details (db_con, path);
+			store = tracker_db_email_get_mbox_details (iface, path);
 
 			if (store) {
-				check_summary_file (db_con, filename, store);
+				check_summary_file (iface, filename, store);
 				tracker_db_email_free_mail_store (store);
 			}
 
@@ -335,11 +335,11 @@
 
 
 gboolean
-tracker_email_plugin_index_file (DBConnection *db_con, TrackerDBFileInfo *info)
+tracker_email_plugin_index_file (TrackerDBInterface *iface, TrackerDBFileInfo *info)
 {
 	gchar *file_name;
 
-	g_return_val_if_fail (db_con, FALSE);
+	g_return_val_if_fail (iface, FALSE);
 	g_return_val_if_fail (info, FALSE);
 
 	if (!tracker_email_plugin_file_is_interesting (info))
@@ -351,7 +351,7 @@
 
 	if (is_in_dir_imap (info->uri)) {
 		if (strcmp (file_name, "summary.mmap") == 0) {
-			index_mail_messages_by_summary_file (db_con, MAIL_TYPE_IMAP, info->uri,
+			index_mail_messages_by_summary_file (iface, MAIL_TYPE_IMAP, info->uri,
 							     load_summary_file_meta_header_for_imap,
 							     load_mail_message_for_imap,
 							     skip_mail_message_for_imap,
@@ -361,7 +361,7 @@
 
 	if (is_in_dir_pop (info->uri)) {
 		if (strcmp (file_name, "summary.mmap") == 0) {
-			index_mail_messages_by_summary_file (db_con, MAIL_TYPE_POP, info->uri,
+			index_mail_messages_by_summary_file (iface, MAIL_TYPE_POP, info->uri,
 							     load_summary_file_meta_header_for_pop,
 							     load_mail_message_for_pop,
 							     skip_mail_message_for_pop,
@@ -371,7 +371,7 @@
 
 	if (is_in_dir_maildir (info->uri)) {
 		if (strcmp (file_name, "summary.mmap") || g_str_has_suffix (info->uri, "summary.mmap")) {
-			index_mail_messages_by_summary_file (db_con, MAIL_TYPE_MAILDIR, info->uri,
+			index_mail_messages_by_summary_file (iface, MAIL_TYPE_MAILDIR, info->uri,
 							     load_summary_file_meta_header_for_maildir,
 							     load_mail_message_for_maildir,
 							     skip_mail_message_for_maildir,
@@ -397,7 +397,7 @@
 
 
 static void
-check_summary_file (DBConnection *db_con, const gchar *filename, MailStore *store)
+check_summary_file (TrackerDBInterface *iface, const gchar *filename, MailStore *store)
 {
 	SummaryFile *summary = NULL;
 
@@ -448,8 +448,8 @@
 
 		}
 
-		path = tracker_db_email_get_mbox_path (db_con, filename);
-		tracker_db_email_set_message_counts (db_con, path, store->mail_count, header->junk_count, header->deleted_count);
+		path = tracker_db_email_get_mbox_path (iface, filename);
+		tracker_db_email_set_message_counts (iface, path, store->mail_count, header->junk_count, header->deleted_count);
 		g_free (path);
 
 		free_summary_file_header (header);
@@ -694,7 +694,7 @@
 }
 
 static void
-index_mail_messages_by_summary_file (DBConnection                 *db_con,
+index_mail_messages_by_summary_file (TrackerDBInterface                 *iface,
 				     MailType                     mail_type,
 				     const gchar                  *summary_file_path,
 				     LoadSummaryFileMetaHeaderFct load_meta_header,
@@ -751,7 +751,7 @@
 		}
 
 		/* check summary file is registered */
-		if (tracker_db_email_get_mbox_id (db_con, dir) == -1) {
+		if (tracker_db_email_get_mbox_id (iface, dir) == -1) {
 			char *uri_prefix = NULL;
 
 			if (mail_type == MAIL_TYPE_IMAP || mail_type == MAIL_TYPE_POP) {
@@ -822,12 +822,12 @@
 			else 
 				uri_prefix = g_strdup ("unknown://location/");
 
-			tracker_db_email_register_mbox (db_con, MAIL_APP_MODEST, mail_type, dir, summary_file_path, uri_prefix);
+			tracker_db_email_register_mbox (iface, MAIL_APP_MODEST, mail_type, dir, summary_file_path, uri_prefix);
 			g_free (uri_prefix);
 		}
 
 
-		MailStore *store = tracker_db_email_get_mbox_details (db_con, dir);
+		MailStore *store = tracker_db_email_get_mbox_details (iface, dir);
 
 		if (!store) {
 			g_critical ("could not retrieve store for file %s", dir);
@@ -910,10 +910,10 @@
 
 				mail_msg->store = store;
 
-				if (!(*save_ondisk_mail) (db_con, mail_msg)) {
+				if (!(*save_ondisk_mail) (iface, mail_msg)) {
 					g_message ("WARNING: Message, or message parts, could not be found locally - if you are using IMAP make sure you have selected the \"copy folder content locally for offline operation\" option in Modest");
 					/* we do not have all infos but we still save them */
-					if (!tracker_db_email_save_email (db_con, mail_msg, MAIL_APP_MODEST)) {
+					if (!tracker_db_email_save_email (iface, mail_msg, MAIL_APP_MODEST)) {
 						g_message ("Failed to save email");
 					}
 				}
@@ -938,7 +938,7 @@
                                  *
                                  * -Martyn
                                  */ 
-				if (!tracker_cache_process_events (db_con->data, TRUE)) {
+				if (!tracker_cache_process_events (iface->data, TRUE)) {
 					tracker->shutdown = TRUE;
                                         tracker_status_set_and_signal (TRACKER_STATUS_SHUTDOWN,
                                                                        tracker->first_time_index,
@@ -951,12 +951,12 @@
 				}
 #endif
 
-				if (tracker_db_regulate_transactions (db_con->data, 500)) {
+				if (tracker_db_regulate_transactions (iface, 500)) {
 
 					if (tracker->index_count % 1000 == 0) {
-						tracker_db_end_index_transaction (db_con->data);
-						tracker_db_refresh_all (db_con->data);
-						tracker_db_start_index_transaction (db_con->data);
+						tracker_db_interface_end_transaction (iface);
+						tracker_db_refresh_all (iface);
+						tracker_db_interface_start_transaction (iface);
 					}
 					
                                         /* Signal progress */
@@ -974,11 +974,11 @@
 
 			g_message ("No. of new emails indexed in summary file %s is %d, %d junk, %d deleted", dir, mail_count, junk_count, delete_count);
 
-			tracker_db_email_set_message_counts (db_con, dir, store->mail_count, store->junk_count, store->delete_count);
+			tracker_db_email_set_message_counts (iface, dir, store->mail_count, store->junk_count, store->delete_count);
 
 		} else {
 			/* schedule check for junk */
-			tracker_db_email_flag_mbox_junk (db_con, dir);
+			tracker_db_email_flag_mbox_junk (iface, dir);
 		}
 
 		tracker->mbox_processed++;
@@ -1710,35 +1710,35 @@
 
 
 static gboolean
-save_ondisk_email_message_for_imap (DBConnection *db_con, MailMessage *mail_msg)
+save_ondisk_email_message_for_imap (TrackerDBInterface *iface, MailMessage *mail_msg)
 {
-	return do_save_ondisk_email_message_generic (db_con, mail_msg);
+	return do_save_ondisk_email_message_generic (iface, mail_msg);
 }
 
 
 static gboolean
-save_ondisk_email_message_for_pop (DBConnection *db_con, MailMessage *mail_msg)
+save_ondisk_email_message_for_pop (TrackerDBInterface *iface, MailMessage *mail_msg)
 {
-	return do_save_ondisk_email_message_generic (db_con, mail_msg);
+	return do_save_ondisk_email_message_generic (iface, mail_msg);
 }
 
 static gboolean
-save_ondisk_email_message_for_maildir (DBConnection *db_con, MailMessage *mail_msg)
+save_ondisk_email_message_for_maildir (TrackerDBInterface *iface, MailMessage *mail_msg)
 {
-	return do_save_ondisk_email_message_generic (db_con, mail_msg);
+	return do_save_ondisk_email_message_generic (iface, mail_msg);
 }
 
 static gboolean
-do_save_ondisk_email_message_generic (DBConnection *db_con, MailMessage *mail_msg)
+do_save_ondisk_email_message_generic (TrackerDBInterface *iface, MailMessage *mail_msg)
 {
-	g_return_val_if_fail (db_con, FALSE);
+	g_return_val_if_fail (iface, FALSE);
 	g_return_val_if_fail (mail_msg, FALSE);
 
 	g_message ("Trying to index mail \"%s\"", mail_msg->uri);
 
-	if (!do_save_ondisk_email_message (db_con, mail_msg)) {
+	if (!do_save_ondisk_email_message (iface, mail_msg)) {
 		g_message ("Indexing mail without body nor attachment parsing \"%s\"", mail_msg->uri);
-		tracker_db_email_save_email (db_con, mail_msg, MAIL_APP_MODEST);
+		tracker_db_email_save_email (iface, mail_msg, MAIL_APP_MODEST);
 	} else {
 		g_message ("Simple index of mail \"%s\" finished", mail_msg->uri);
 	}
@@ -1756,9 +1756,9 @@
 }
 
 static gboolean
-do_save_ondisk_email_message (DBConnection *db_con, MailMessage *mail_msg)
+do_save_ondisk_email_message (TrackerDBInterface *iface, MailMessage *mail_msg)
 {
-	g_return_val_if_fail (db_con, FALSE);
+	g_return_val_if_fail (iface, FALSE);
 	g_return_val_if_fail (mail_msg, FALSE);
 
 	if (mail_msg->path && g_file_test (mail_msg->path, G_FILE_TEST_EXISTS) && tracker_file_is_indexable (mail_msg->path)) {
@@ -1777,7 +1777,7 @@
 			mail_msg_on_disk->uri = g_strdup (mail_msg->uri);
 			mail_msg_on_disk->store = mail_msg->store;
 
-			tracker_db_email_save_email (db_con, mail_msg_on_disk, MAIL_APP_MODEST);
+			tracker_db_email_save_email (iface, mail_msg_on_disk, MAIL_APP_MODEST);
 
 			email_free_mail_file (mail_msg_on_disk->parent_mail_file);
 			email_free_mail_message (mail_msg_on_disk);

Modified: branches/xesam-support/src/trackerd/tracker-email-plugin.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-email-plugin.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-email-plugin.h	Mon Jun  9 15:41:07 2008
@@ -1,17 +1,20 @@
 #ifndef __TRACKER_EMAIL_PLUGIN_H__
 #define __TRACKER_EMAIL_PLUGIN_H__
 
-#include "tracker-db-sqlite.h"
+#include <libtracker-common/tracker-config.h>
+
+#include <libtracker-db/tracker-db-interface.h>
+#include <libtracker-db/tracker-db-file-info.h>
 
 G_BEGIN_DECLS
 
 gboolean     tracker_email_plugin_init                (void);
 gboolean     tracker_email_plugin_finalize            (void);
 const gchar *tracker_email_plugin_get_name            (void);
-void         tracker_email_plugin_watch_emails        (DBConnection      *db_con);
-gboolean     tracker_email_plugin_index_file          (DBConnection      *db_con,
-                                                       TrackerDBFileInfo *info);
-gboolean     tracker_email_plugin_file_is_interesting (TrackerDBFileInfo *info);
+void         tracker_email_plugin_watch_emails        (TrackerDBInterface *iface);
+gboolean     tracker_email_plugin_index_file          (TrackerDBInterface *iface,
+                                                       TrackerDBFileInfo  *info);
+gboolean     tracker_email_plugin_file_is_interesting (TrackerDBFileInfo  *info);
 
 G_END_DECLS
 

Modified: branches/xesam-support/src/trackerd/tracker-email-thunderbird.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-email-thunderbird.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-email-thunderbird.c	Mon Jun  9 15:41:07 2008
@@ -70,7 +70,7 @@
 
 
 static GSList *	add_persons_from_internet_address_list_string_parsing   (GSList *list, const gchar *s);
-static gboolean email_parse_mail_tms_file_and_save_new_emails   (DBConnection *db_con, MailApplication mail_app,
+static gboolean email_parse_mail_tms_file_and_save_new_emails   (TrackerDBInterface *iface, MailApplication mail_app,
                                                                  const gchar *path);
 static MailMessage *  email_parse_mail_tms_file_by_path         (MailApplication mail_app, const gchar *path);
 static void     text_handler                    (GMarkupParseContext *context, const gchar *text,
@@ -125,7 +125,7 @@
 
 
 void
-tracker_email_plugin_watch_emails (DBConnection *db_con)
+tracker_email_plugin_watch_emails (TrackerDBInterface *iface)
 {
         if( thunderbird_mail_dir != NULL ) {
             g_message ("Thunderbird directory lookup: \"%s\"", thunderbird_mail_dir);
@@ -135,16 +135,16 @@
 
 
 gboolean
-tracker_email_plugin_index_file (DBConnection *db_con, TrackerDBFileInfo *info)
+tracker_email_plugin_index_file (TrackerDBInterface *iface, TrackerDBFileInfo *info)
 {
-	g_return_val_if_fail (db_con, FALSE);
+	g_return_val_if_fail (iface, FALSE);
 	g_return_val_if_fail (info, FALSE);
 
 	if (!tracker_email_plugin_file_is_interesting (info))
 		return FALSE;
 
         g_message ("Thunderbird file being index:'%s'",info->uri);
-        if (email_parse_mail_tms_file_and_save_new_emails (db_con, MAIL_APP_THUNDERBIRD, info->uri)) {
+        if (email_parse_mail_tms_file_and_save_new_emails (iface, MAIL_APP_THUNDERBIRD, info->uri)) {
                 unlink(info->uri);
         }
 
@@ -162,11 +162,11 @@
 *********************************************************************************************/
 
 static gboolean
-email_parse_mail_tms_file_and_save_new_emails (DBConnection *db_con, MailApplication mail_app, const gchar *path)
+email_parse_mail_tms_file_and_save_new_emails (TrackerDBInterface *iface, MailApplication mail_app, const gchar *path)
 {
 	MailMessage *mail_msg;
 
-        g_return_val_if_fail (db_con, FALSE);
+        g_return_val_if_fail (iface, FALSE);
         g_return_val_if_fail (path, FALSE);
 
 	mail_msg = email_parse_mail_tms_file_by_path (mail_app, path);
@@ -178,7 +178,7 @@
             
         if (mail_msg->parent_mail_file->mail_app == MAIL_APP_THUNDERBIRD ) {
 //           || mail_msg->parent_mail_file->mail_app == MAIL_APP_THUNDERBIRD_FEED) {
-                tracker_db_email_save_email (db_con, mail_msg, mail_app);
+                tracker_db_email_save_email (iface, mail_msg, mail_app);
                 email_free_mail_file(mail_msg->parent_mail_file);
                 email_free_mail_message (mail_msg);
                 return TRUE;

Modified: branches/xesam-support/src/trackerd/tracker-email-utils.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-email-utils.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-email-utils.c	Mon Jun  9 15:41:07 2008
@@ -81,12 +81,15 @@
 
 
 gboolean
-email_parse_and_save_mail_message (DBConnection *db_con, MailApplication mail_app, const char *path,
-                                   ReadMailHelperFct read_mail_helper, gpointer read_mail_user_data)
+email_parse_and_save_mail_message (TrackerDBInterface *iface,
+                                   MailApplication mail_app, 
+                                   const char *path,
+                                   ReadMailHelperFct read_mail_helper, 
+                                   gpointer read_mail_user_data)
 {
 	MailMessage *mail_msg;
 
-	g_return_val_if_fail (db_con, FALSE);
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), FALSE);
 	g_return_val_if_fail (path, FALSE);
 
 	mail_msg = email_parse_mail_message_by_path (mail_app, path,
@@ -96,7 +99,7 @@
 		return FALSE;
 	}
 
-	tracker_db_email_save_email (db_con, mail_msg, mail_app);
+	tracker_db_email_save_email (iface, mail_msg, mail_app);
 
 	email_free_mail_message (mail_msg);
 
@@ -105,9 +108,13 @@
 
 
 gboolean
-email_parse_mail_file_and_save_new_emails (DBConnection *db_con, MailApplication mail_app, const char *path,
-                                           ReadMailHelperFct read_mail_helper, gpointer read_mail_user_data,
-                                           MakeURIHelperFct uri_helper, gpointer make_uri_user_data,
+email_parse_mail_file_and_save_new_emails (TrackerDBInterface *iface,
+                                           MailApplication mail_app,
+                                           const char *path,
+                                           ReadMailHelperFct read_mail_helper, 
+                                           gpointer read_mail_user_data,
+                                           MakeURIHelperFct uri_helper, 
+                                           gpointer make_uri_user_data,
                                            MailStore *store)
 {
         GObject     *object;
@@ -115,11 +122,7 @@
 	MailMessage *mail_msg;
 	gint        indexed = 0, junk = 0, deleted = 0;
 
-	if (!tracker->is_running) {
-                return FALSE;
-        }
-
-	g_return_val_if_fail (db_con, FALSE);
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), FALSE);
 	g_return_val_if_fail (path, FALSE);
 	g_return_val_if_fail (store, FALSE);
 
@@ -168,8 +171,8 @@
 			deleted++;
 		}
 
-		tracker_db_email_save_email (db_con, mail_msg, mail_app);
-		tracker_db_email_update_mbox_offset (db_con, mf);
+		tracker_db_email_save_email (iface, mail_msg, mail_app);
+		tracker_db_email_update_mbox_offset (iface, mf);
 
 		email_free_mail_message (mail_msg);
 
@@ -181,13 +184,13 @@
                  *
                  * -Martyn
                  */ 
-		if (!tracker_cache_process_events (db_con->data, TRUE) ) {
+		if (!tracker_cache_process_events (iface, TRUE) ) {
 			tracker->shutdown = TRUE;
 			return FALSE;	
 		}
 #endif
 
-		if (tracker_db_regulate_transactions (db_con->data, 500)) {
+		if (tracker_db_regulate_transactions (iface, 500)) {
                         GObject *object;
 
 			if (tracker_config_get_verbosity (tracker->config) == 1) {
@@ -195,9 +198,9 @@
 			}
 
 			if (tracker->index_count % 2500 == 0) {
-				tracker_db_end_index_transaction (db_con->data);
-				tracker_db_refresh_all (db_con->data);
-				tracker_db_start_index_transaction (db_con->data);
+				tracker_db_interface_end_transaction (iface);
+				tracker_db_refresh_all (iface);
+				tracker_db_interface_start_transaction (iface);
 			}
 			
                         /* Signal progress */
@@ -251,12 +254,12 @@
 
 
 /* void */
-/* email_mh_watch_mail_messages (DBConnection *db_con, const gchar *path) */
+/* email_mh_watch_mail_messages (DBConnection *iface, const gchar *path) */
 /* { */
 /* 	gchar *mail_dirs[] = {"inbox", "sent", "trash", NULL}; */
 /* 	gchar **dir_name; */
 
-/* 	g_return_if_fail (db_con); */
+/* 	g_return_if_fail (iface); */
 /* 	g_return_if_fail (path); */
 
 /* 	if (tracker_file_is_no_watched (path)) { */
@@ -267,7 +270,7 @@
 /* 		gchar *dir_path = g_build_filename (path, *dir_name, NULL); */
 
 /* 		if (tracker_is_directory (dir_path)) { */
-/* 			mh_watch_mail_messages_in_dir (db_con, dir_path); */
+/* 			mh_watch_mail_messages_in_dir (iface, dir_path); */
 /* 		} */
 
 /* 		g_free (dir_path); */
@@ -287,11 +290,11 @@
 
 
 /* void */
-/* email_maildir_watch_mail_messages (DBConnection *db_con, const gchar *path) */
+/* email_maildir_watch_mail_messages (DBConnection *iface, const gchar *path) */
 /* { */
 /* 	gchar *dir_cur; */
 
-/* 	g_return_if_fail (db_con); */
+/* 	g_return_if_fail (iface); */
 /* 	g_return_if_fail (path); */
 
 /* 	if (tracker_file_is_no_watched (path)) { */
@@ -305,8 +308,8 @@
 /* 		const GSList *file; */
 /* 		GPatternSpec *pattern; */
 
-/* 		if (!tracker_is_directory_watched (dir_cur, db_con)) { */
-/* 			tracker_add_watch_dir (dir_cur, db_con); */
+/* 		if (!tracker_is_directory_watched (dir_cur, iface)) { */
+/* 			tracker_add_watch_dir (dir_cur, iface); */
 /* 		} */
 
 /* 		files = tracker_get_files (dir_cur, FALSE); */
@@ -318,7 +321,7 @@
 /* 			const gchar *file_path = file->data; */
 
 /* 			if (g_pattern_match_string (pattern, file_path)) { */
-/* 				tracker_db_insert_pending_file (db_con, 0, file_path, NULL, 0, TRACKER_ACTION_CHECK, FALSE, FALSE, -1); */
+/* 				tracker_db_insert_pending_file (iface, 0, file_path, NULL, 0, TRACKER_ACTION_CHECK, FALSE, FALSE, -1); */
 /* 			} */
 /* 		} */
 
@@ -882,20 +885,20 @@
 *********************************************************************************************/
 
 /* static void */
-/* mh_watch_mail_messages_in_dir (DBConnection *db_con, const gchar *dir_path) */
+/* mh_watch_mail_messages_in_dir (DBConnection *iface, const gchar *dir_path) */
 /* { */
 /* 	GSList       *files; */
 /* 	const GSList *file; */
 
-/* 	g_return_if_fail (db_con); */
+/* 	g_return_if_fail (iface); */
 /* 	g_return_if_fail (dir_path); */
 
 /* 	if (tracker_file_is_no_watched (dir_path)) { */
 /* 		return; */
 /* 	} */
 
-/* 	if (!tracker_is_directory_watched (dir_path, db_con)) { */
-/* 		tracker_add_watch_dir (dir_path, db_con); */
+/* 	if (!tracker_is_directory_watched (dir_path, iface)) { */
+/* 		tracker_add_watch_dir (dir_path, iface); */
 /* 	} */
 
 /* 	files = tracker_get_files (dir_path, FALSE); */
@@ -915,7 +918,7 @@
 /* 				} */
 /* 			} */
 
-/* 			tracker_db_insert_pending_file (db_con, 0, file_path, NULL, 0, TRACKER_ACTION_CHECK, FALSE, FALSE, -1); */
+/* 			tracker_db_insert_pending_file (iface, 0, file_path, NULL, 0, TRACKER_ACTION_CHECK, FALSE, FALSE, -1); */
 
 /* 		end: */
 /* 			g_free (file_name); */

Modified: branches/xesam-support/src/trackerd/tracker-email-utils.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-email-utils.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-email-utils.h	Mon Jun  9 15:41:07 2008
@@ -23,7 +23,7 @@
 
 #include <gmime/gmime.h>
 
-#include "tracker-db-sqlite.h"
+#include "tracker-db.h"
 
 G_BEGIN_DECLS
 
@@ -131,12 +131,12 @@
                                                                  const gchar              *service);
 void            email_watch_directories                         (const GSList             *dirs,
                                                                  const gchar              *service);
-gboolean        email_parse_and_save_mail_message               (DBConnection             *db_con,
+gboolean        email_parse_and_save_mail_message               (TrackerDBInterface       *iface,
                                                                  MailApplication           mail_app,
                                                                  const char               *path,
                                                                  ReadMailHelperFct         read_mail_helper,
                                                                  gpointer                  read_mail_user_data);
-gboolean        email_parse_mail_file_and_save_new_emails       (DBConnection             *db_con,
+gboolean        email_parse_mail_file_and_save_new_emails       (TrackerDBInterface       *iface,
                                                                  MailApplication           mail_app,
                                                                  const char               *path,
                                                                  ReadMailHelperFct         read_mail_helper,
@@ -145,7 +145,7 @@
                                                                  gpointer                  make_uri_user_data,
                                                                  MailStore                *store);
 gboolean        email_is_in_a_maildir_dir                       (const gchar              *path);
-void            email_maildir_watch_mail_messages               (DBConnection             *db_con,
+void            email_maildir_watch_mail_messages               (TrackerDBInterface       *iface,
                                                                  const gchar              *path);
 MailPerson *    email_allocate_mail_person                      (void);
 void            email_free_mail_person                          (MailPerson               *mp);

Modified: branches/xesam-support/src/trackerd/tracker-email.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-email.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-email.c	Mon Jun  9 15:41:07 2008
@@ -25,23 +25,14 @@
 
 #include "tracker-email.h"
 
-typedef gboolean      (* TrackerMailInit)          (void);
-typedef void          (* TrackerMailFinalize)      (void);
-typedef void          (* TrackerMailWatchEmails)   (DBConnection      *db_con);
-typedef gboolean      (* TrackerMailIndexFile)     (DBConnection      *db_con,
-						    TrackerDBFileInfo *info);
-typedef gboolean      (* TrackerMailFileIsInteresting) (TrackerDBFileInfo *info);
-typedef const gchar * (* TrackerMailGetName)       (void);
-
 static GModule *module = NULL;
 
-
 gboolean
 tracker_email_start_email_watching (const gchar *email_client)
 {
-	TrackerMailInit func;
-	gchar *module_name, *module_path;
-	gboolean result = FALSE;
+	TrackerMailInit    func;
+	gchar             *module_name, *module_path;
+	gboolean           result = FALSE;
 
 	if (module)
 		return result;
@@ -98,7 +89,7 @@
 
 /* Must be called before any work on files containing mails */
 void
-tracker_email_add_service_directories (DBConnection *db_con)
+tracker_email_add_service_directories (TrackerDBInterface *iface)
 {
 	TrackerMailWatchEmails func;
 
@@ -106,7 +97,7 @@
 		return;
 
 	if (g_module_symbol (module, "tracker_email_plugin_watch_emails", (gpointer *) &func)) {
-		(func) (db_con);
+		(func) (iface);
         }
 }
 
@@ -130,11 +121,12 @@
 }
 
 gboolean
-tracker_email_index_file (DBConnection *db_con, TrackerDBFileInfo *info)
+tracker_email_index_file (TrackerDBInterface *iface,
+			  TrackerDBFileInfo  *info)
 {
 	TrackerMailIndexFile func;
 
-	g_return_val_if_fail (db_con, FALSE);
+	g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), FALSE);
 	g_return_val_if_fail (info, FALSE);
 
 	if (!module)
@@ -143,7 +135,7 @@
 	if (!g_module_symbol (module, "tracker_email_plugin_index_file", (gpointer *) &func))
 		return FALSE;
 
-	return (func) (db_con, info);
+	return (func) (iface, info);
 }
 
 

Modified: branches/xesam-support/src/trackerd/tracker-email.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-email.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-email.h	Mon Jun  9 15:41:07 2008
@@ -23,20 +23,30 @@
 
 #include "config.h"
 
-#include <libtracker-db/tracker-db-file-info.h>
+#include <libtracker-common/tracker-config.h>
 
-#include "tracker-db-sqlite.h"
+#include <libtracker-db/tracker-db-interface.h>
+#include <libtracker-db/tracker-db-file-info.h>
 
 G_BEGIN_DECLS
 
-gboolean     tracker_email_start_email_watching    (const gchar *email_client);
-void         tracker_email_end_email_watching      (void);
-
-void         tracker_email_add_service_directories (DBConnection      *db_con);
-gboolean     tracker_email_file_is_interesting     (TrackerDBFileInfo *info);
-gboolean     tracker_email_index_file              (DBConnection      *db_con,
-						    TrackerDBFileInfo *info);
+typedef gboolean      (* TrackerMailInit)              (void);
+typedef void          (* TrackerMailFinalize)          (void);
+typedef void          (* TrackerMailWatchEmails)       (TrackerDBInterface *iface);
+typedef gboolean      (* TrackerMailIndexFile)         (TrackerDBInterface *iface,
+						        TrackerDBFileInfo  *info);
+typedef const gchar * (* TrackerMailGetName)           (void);
+typedef const gchar * (* TrackerMailFileIsInteresting) (TrackerDBFileInfo  *info);
+
+gboolean     tracker_email_init                    (TrackerConfig      *config);
+void         tracker_email_shutdown                (void);
+void         tracker_email_add_service_directories (TrackerDBInterface *iface);
+gboolean     tracker_email_file_is_interesting     (TrackerDBFileInfo  *info);
+gboolean     tracker_email_index_file              (TrackerDBInterface *iface,
+						    TrackerDBFileInfo  *info);
 const gchar *tracker_email_get_name                (void);
+gboolean     tracker_email_start_email_watching    (const gchar        *email_client);
+void         tracker_email_end_email_watching      (void);
 
 G_END_DECLS
 

Modified: branches/xesam-support/src/trackerd/tracker-files.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-files.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-files.c	Mon Jun  9 15:41:07 2008
@@ -31,49 +31,18 @@
 #include <libtracker-common/tracker-type-utils.h>
 
 #include <libtracker-db/tracker-db-dbus.h>
+#include <libtracker-db/tracker-db-manager.h>
 
 #include "tracker-dbus.h"
 #include "tracker-files.h"
 #include "tracker-db.h"
 #include "tracker-marshal.h"
 
-#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_FILES, TrackerFilesPriv))
-
-typedef struct {
-	DBConnection *db_con;
-} TrackerFilesPriv;
-
-enum {
-	PROP_0,
-	PROP_DB_CONNECTION
-};
-
-static void files_finalize     (GObject      *object);
-static void files_set_property (GObject      *object,
-				guint         param_id,
-				const GValue *value,
-				GParamSpec   *pspec);
-
 G_DEFINE_TYPE(TrackerFiles, tracker_files, G_TYPE_OBJECT)
 
 static void
 tracker_files_class_init (TrackerFilesClass *klass)
 {
-	GObjectClass *object_class;
-
-	object_class = G_OBJECT_CLASS (klass);
-
-	object_class->finalize = files_finalize;
-	object_class->set_property = files_set_property;
-
-	g_object_class_install_property (object_class,
-					 PROP_DB_CONNECTION,
-					 g_param_spec_pointer ("db-connection",
-							       "DB connection",
-							       "Database connection to use in transactions",
-							       G_PARAM_WRITABLE));
-
-	g_type_class_add_private (object_class, sizeof (TrackerFilesPriv));
 }
 
 static void
@@ -81,64 +50,10 @@
 {
 }
 
-static void
-files_finalize (GObject *object)
-{
-	TrackerFilesPriv *priv;
-	
-	priv = GET_PRIV (object);
-
-	G_OBJECT_CLASS (tracker_files_parent_class)->finalize (object);
-}
-
-static void
-files_set_property (GObject      *object,
-		    guint         param_id,
-		    const GValue *value,
-		    GParamSpec   *pspec)
-{
-	TrackerFilesPriv *priv;
-
-	priv = GET_PRIV (object);
-
-	switch (param_id) {
-	case PROP_DB_CONNECTION:
-		tracker_files_set_db_connection (TRACKER_FILES (object),
-						 g_value_get_pointer (value));
-		break;
-
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
-		break;
-	};
-}
-
 TrackerFiles *
-tracker_files_new (DBConnection *db_con)
-{
-	TrackerFiles *object;
-
-	object = g_object_new (TRACKER_TYPE_FILES, 
-			       "db-connection", db_con,
-			       NULL);
-	
-	return object;
-}
-
-void
-tracker_files_set_db_connection (TrackerFiles *object,
-				 DBConnection *db_con)
+tracker_files_new (void)
 {
-	TrackerFilesPriv *priv;
-
-	g_return_if_fail (TRACKER_IS_FILES (object));
-	g_return_if_fail (db_con != NULL);
-
-	priv = GET_PRIV (object);
-
-	priv->db_con = db_con;
-	
-	g_object_notify (G_OBJECT (object), "db-connection");
+	return g_object_new (TRACKER_TYPE_FILES, NULL);
 }
 
 /*
@@ -146,38 +61,35 @@
  */
 gboolean
 tracker_files_exist (TrackerFiles  *object,
-		     const gchar       *uri,
-		     gboolean           auto_create,
-		     gboolean          *value,
-		     GError           **error)
-{
-	TrackerFilesPriv *priv;
-	guint                 request_id;
-	DBConnection         *db_con;
-	guint32               file_id;
-	gboolean              exists;
+		     const gchar   *uri,
+		     gboolean       auto_create,
+		     gboolean      *value,
+		     GError       **error)
+{
+	TrackerDBInterface *iface;
+	guint               request_id;
+	guint32             file_id;
+	gboolean            exists;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
 	tracker_dbus_return_val_if_fail (uri != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (value != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to see if files exist, "
                                   "uri:'%s'",
 				  uri);
+	
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
 
-	file_id = tracker_db_get_file_id (db_con, uri);
+	file_id = tracker_db_file_get_id (iface, uri);
 	exists = file_id > 0;
 
 	if (!exists && auto_create) {
 		TrackerDBFileInfo *info;
-		gchar    *service;
-		
+		gchar             *service;
+		    
 		info = tracker_db_file_info_new (uri, 1, 0, 0);
 		
 		if (!tracker_file_is_valid (uri)) {
@@ -189,7 +101,7 @@
 			info = tracker_db_file_info_get (info);
 		}
 		
-		tracker_db_create_service (db_con, "Files", info);
+		tracker_db_service_create (iface, "Files", info);
 		tracker_db_file_info_free (info);
 		g_free (service);
 	}
@@ -210,15 +122,14 @@
 		      gint           mtime,
 		      GError       **error)
 {
-	TrackerFilesPriv  *priv;
-	guint              request_id;
-	DBConnection      *db_con;
-	TrackerDBFileInfo *info;
-	gchar             *name;
-	gchar             *path;
-	gchar             *service;
-	guint32            file_id;
-	gboolean           created;
+	TrackerDBInterface *iface;
+	TrackerDBFileInfo  *info;
+	guint               request_id;
+	gchar              *name;
+	gchar              *path;
+	gchar              *service;
+	guint32             file_id;
+	gboolean            created;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -227,10 +138,6 @@
 	tracker_dbus_return_val_if_fail (size >= 0, FALSE, error);
 	tracker_dbus_return_val_if_fail (mtime >= 0, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to create file, "
                                   "uri:'%s', is directory:%s, mime:'%s', "
@@ -241,6 +148,8 @@
                                   size,
                                   mtime);
 
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
 	/* Create structure */
 	info = tracker_db_file_info_new (uri, 1, 0, 0);
 
@@ -258,7 +167,7 @@
 	}
 
 	service = tracker_ontology_get_service_type_for_mime (mime);
-	file_id = tracker_db_create_service (db_con, service, info);
+	file_id = tracker_db_service_create (iface, service, info);
 	tracker_db_file_info_free (info);
 
 	created = file_id != 0;
@@ -276,37 +185,36 @@
 		mtime_str = tracker_int_to_string (mtime);
 		size_str = tracker_int_to_string (size);
 	
-		tracker_db_set_single_metadata (db_con, 
+		tracker_db_metadata_set_single (iface, 
 						service, 
 						file_id_str, 
 						"File:Modified", 
 						mtime_str, 
 						FALSE);
-		tracker_db_set_single_metadata (db_con, 
+		tracker_db_metadata_set_single (iface, 
 						service, 
 						file_id_str, 
 						"File:Size", 
 						size_str, 
 						FALSE);
-		tracker_db_set_single_metadata (db_con, 
+		tracker_db_metadata_set_single (iface, 
 						service, 
 						file_id_str, 
 						"File:Name", 
 						name, 
 						FALSE);
-		tracker_db_set_single_metadata (db_con, 
+		tracker_db_metadata_set_single (iface, 
 						service, 
 						file_id_str, 
 						"File:Path", 
 						path, 
 						FALSE);
-		tracker_db_set_single_metadata (db_con, 
+		tracker_db_metadata_set_single (iface, 
 						service, 
 						file_id_str,
 						"File:Format",
 						mime, 
 						FALSE);
-		tracker_notify_file_data_available ();
 
 		g_free (size_str);
 		g_free (mtime_str);
@@ -331,10 +239,9 @@
 		      const gchar   *uri,
 		      GError       **error)
 {
-	TrackerFilesPriv   *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
 	guint               request_id;
-	DBConnection       *db_con;
 	guint32             file_id;
 	gchar              *name;
 	gchar              *path;
@@ -345,16 +252,14 @@
 
 	tracker_dbus_return_val_if_fail (uri != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to delete file, "
                                   "uri:'%s'",
                                   uri);
 
-	file_id = tracker_db_get_file_id (db_con, uri);
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
+	file_id = tracker_db_file_get_id (iface, uri);
 	if (file_id == 0) {
 		tracker_dbus_request_comment (request_id, 
 					      "File or directory was not in database to delete, uri:'%s'",
@@ -373,7 +278,11 @@
 
 	is_directory = FALSE;
 	
-	result_set = tracker_exec_proc (db_con, "GetServiceID", path, name, NULL);
+	result_set = tracker_db_exec_proc (iface, 
+					   "GetServiceID", 
+					   path, 
+					   name, 
+					   NULL);
 	if (result_set) {
 		tracker_db_result_set_get (result_set, 2, &is_directory, -1);
 		g_object_unref (result_set);
@@ -385,7 +294,7 @@
 		action = TRACKER_DB_ACTION_FILE_DELETED;
 	}
 	
-	/* tracker_db_insert_pending_file (db_con, */
+	/* tracker_db_insert_pending_file (iface_cache, */
 	/* 				file_id,  */
 	/* 				uri,  */
 	/* 				NULL,   */
@@ -410,10 +319,9 @@
 				gchar        **value,  
 				GError       **error)
 {
-	TrackerFilesPriv   *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
 	guint               request_id;
-	DBConnection       *db_con;
 	guint32             file_id;
 	gchar              *file_id_str;
 	const gchar        *mime = NULL;
@@ -423,16 +331,14 @@
 	tracker_dbus_return_val_if_fail (uri != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (value != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to get service type ",
                                   "uri:'%s'",
                                   uri);
 
-	file_id = tracker_db_get_file_id (db_con, uri);
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
+	file_id = tracker_db_file_get_id (iface, uri);
 
 	if (file_id < 1) {
 		tracker_dbus_request_failed (request_id,
@@ -446,8 +352,7 @@
 	file_id_str = tracker_uint_to_string (file_id);
 
 	mime = NULL;
-	result_set = tracker_db_get_metadata (db_con, 
-					      "Files", 
+	result_set = tracker_db_metadata_get (iface, 
 					      file_id_str, 
 					      "File:Mime");
 
@@ -494,10 +399,10 @@
 				 gchar        **value,  
 				 GError       **error)
 {
-	TrackerFilesPriv   *priv;
+ 	TrackerDBInterface *iface_metadata;
+ 	TrackerDBInterface *iface_contents;
 	TrackerDBResultSet *result_set;
 	guint               request_id;
-	DBConnection       *db_con;
 	gchar              *service_id;
 	gchar              *offset_str;
 	gchar              *max_length_str;
@@ -509,10 +414,6 @@
 	tracker_dbus_return_val_if_fail (max_length >= 0, FALSE, error);
 	tracker_dbus_return_val_if_fail (value != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to get text contents, "
                                   "uri:'%s', offset:%d, max length:%d",
@@ -520,9 +421,12 @@
                                   offset,
                                   max_length);
 
-	service_id = tracker_db_get_id (db_con, "Files", uri);
+	iface_metadata = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+	iface_contents = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_CONTENTS);
+
+	service_id = tracker_db_file_get_id_as_string (iface_metadata, "Files", uri);
 	if (!service_id) {
-		service_id = tracker_db_get_id (db_con, "Emails", uri);
+		service_id = tracker_db_file_get_id_as_string (iface_metadata, "Emails", uri);
 
 		if (!service_id) {
 			tracker_dbus_request_failed (request_id,
@@ -536,12 +440,12 @@
 	offset_str = tracker_int_to_string (offset);
 	max_length_str = tracker_int_to_string (max_length);
 
-	result_set = tracker_exec_proc (db_con->blob,
-					"GetFileContents",
-					offset_str, 
-					max_length_str, 
-					service_id, 
-					NULL);
+	result_set = tracker_db_exec_proc (iface_contents,
+					   "GetFileContents",
+					   offset_str, 
+					   max_length_str, 
+					   service_id, 
+					   NULL);
 
 	g_free (max_length_str);
 	g_free (offset_str);
@@ -575,10 +479,9 @@
 				    gchar        **value,  
 				    GError       **error)
 {
-	TrackerFilesPriv   *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set = NULL;
 	guint               request_id;
-	DBConnection       *db_con;
 	gchar              *name;
 	gchar              *path;
 	gchar              *max_length_str;
@@ -588,10 +491,6 @@
 	tracker_dbus_return_val_if_fail (uri != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (text != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (value != NULL, FALSE, error);
-
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
 	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to search text contents, "
@@ -600,6 +499,8 @@
                                   text,
                                   max_length);
 
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
 	if (uri[0] == G_DIR_SEPARATOR) {
 		name = g_path_get_basename (uri);
 		path = g_path_get_dirname (uri);
@@ -610,7 +511,7 @@
 	
 	max_length_str = tracker_int_to_string (max_length);
 
-	/* result_set = tracker_exec_proc (db_con, */
+	/* result_set = tracker_exec_proc (iface, */
 	/* 				"SearchFileContents", */
 	/* 				4, */
 	/* 				path, */
@@ -650,10 +551,9 @@
 				   gchar        ***values,  
 				   GError        **error)
 {
-	TrackerFilesPriv   *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
 	guint               request_id;
-	DBConnection       *db_con;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -662,10 +562,6 @@
 	tracker_dbus_return_val_if_fail (max_hits >= 0, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-
 	tracker_dbus_request_new (request_id,
 				  "DBus request to get files by service type, "
                                   "query id:%d, service:'%s', offset:%d, max hits:%d, ",
@@ -674,6 +570,8 @@
                                   offset,
                                   max_hits);
 
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
 	if (!tracker_ontology_is_valid_service_type (service)) {
 		tracker_dbus_request_failed (request_id,
 					     error, 
@@ -682,7 +580,7 @@
 		return FALSE;
 	}
 	
-	result_set = tracker_db_get_files_by_service (db_con, 
+	result_set = tracker_db_files_get_by_service (iface, 
 						      service, 
 						      offset, 
 						      max_hits);
@@ -707,10 +605,9 @@
 				gchar        ***values,  
 				GError        **error)
 {
-	TrackerFilesPriv   *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
 	guint               request_id;
-	DBConnection       *db_con;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -720,10 +617,6 @@
 	tracker_dbus_return_val_if_fail (max_hits >= 0, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to get files by mime types, "
                                   "query id:%d, mime types:%d, offset:%d, max hits:%d, ",
@@ -732,7 +625,9 @@
                                   offset,
                                   max_hits);
 
-	result_set = tracker_db_get_files_by_mime (db_con, 
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
+	result_set = tracker_db_files_get_by_mime (iface,
 						   mime_types, 
 						   g_strv_length (mime_types), 
 						   offset, 
@@ -759,10 +654,9 @@
 				    gchar        ***values,  
 				    GError        **error)
 {
-	TrackerFilesPriv   *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
 	guint               request_id;
-	DBConnection       *db_con;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -772,10 +666,6 @@
 	tracker_dbus_return_val_if_fail (max_hits >= 0, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to get files by mime types (VFS), "
                                   "query id:%d, mime types:%d, offset:%d, max hits:%d, ",
@@ -784,10 +674,12 @@
                                   offset,
                                   max_hits);
 
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
 	/* NOTE: The only difference between this function and the
 	 * non-VFS version is the boolean in this function call:
 	 */
-	result_set = tracker_db_get_files_by_mime (db_con, 
+	result_set = tracker_db_files_get_by_mime (iface,
 						   mime_types, 
 						   g_strv_length (mime_types), 
 						   offset, 
@@ -811,10 +703,9 @@
 			 gint          *value,
 			 GError       **error)
 {
-	TrackerFilesPriv   *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
 	guint               request_id;
-	DBConnection       *db_con;
 	gchar              *path;
 	gchar              *name;
 
@@ -823,15 +714,13 @@
 	tracker_dbus_return_val_if_fail (uri != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (value != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request for mtime, "
                                   "uri:'%s'",
                                   uri);
 
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
 	if (uri[0] == G_DIR_SEPARATOR) {
 		name = g_path_get_basename (uri);
 		path = g_path_get_dirname (uri);
@@ -840,11 +729,11 @@
 		path = tracker_file_get_vfs_path (uri);
 	}
 
-	result_set = tracker_exec_proc (db_con,
-					"GetFileMTime", 
-					path, 
-					name, 
-					NULL);
+	result_set = tracker_db_exec_proc (iface,
+					   "GetFileMTime", 
+					   path, 
+					   name, 
+					   NULL);
 	g_free (path);
 	g_free (name);
 
@@ -872,11 +761,10 @@
 						GPtrArray    **values,
 						GError       **error)
 {
-	TrackerFilesPriv   *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
-	guint               request_id;
-	DBConnection       *db_con;
 	TrackerField       *defs[255];
+	guint               request_id;
 	guint               i;
 	gchar              *uri_filtered;
 	guint32             file_id;
@@ -891,10 +779,6 @@
 	tracker_dbus_return_val_if_fail (g_strv_length (fields) > 0, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request for metadata for files in folder, "
                                   "query id:%d, uri:'%s', fields:%d",
@@ -902,6 +786,8 @@
                                   uri,
                                   g_strv_length (fields));
 
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
 	/* Get fields for metadata list provided */
 	for (i = 0; i < g_strv_length (fields); i++) {
 		defs[i] = tracker_ontology_get_field_def (fields[i]);
@@ -924,7 +810,7 @@
 	}
 
 	/* Get file ID in database */
-	file_id = tracker_db_get_file_id (db_con, uri_filtered);
+	file_id = tracker_db_file_get_id (iface, uri_filtered);
 	if (file_id == 0) {
 		g_free (uri_filtered);
 		tracker_dbus_request_failed (request_id,
@@ -964,13 +850,13 @@
 			 " FROM Services F ");
 
 	for (i = 0; i < g_strv_length (fields); i++) {
-		gchar *table;
+		const gchar *table;
 
 		if (!needs_join[i]) {
 			continue;
 		}
 
-		table = tracker_get_metadata_table (tracker_field_get_data_type (defs[i]));
+		table = tracker_db_metadata_get_table (tracker_field_get_data_type (defs[i]));
 
 		g_string_append_printf (sql, 
 					" LEFT OUTER JOIN %s M%d ON "
@@ -981,8 +867,6 @@
 					i+1, 
 					i+1, 
 					tracker_field_get_id (defs[i]));
-
-		g_free (table);
 	}
 
 	/* Build WHERE clause */
@@ -992,7 +876,7 @@
 	g_free (uri_filtered);
 
 	query = g_string_free (sql, FALSE);
-	result_set = tracker_db_interface_execute_query (db_con->db, NULL, query);
+	result_set = tracker_db_interface_execute_query (iface, NULL, query);
 	*values = tracker_dbus_query_result_to_ptr_array (result_set);
 
 	if (result_set) {

Modified: branches/xesam-support/src/trackerd/tracker-files.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-files.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-files.h	Mon Jun  9 15:41:07 2008
@@ -24,8 +24,6 @@
 
 #include <glib-object.h>
 
-#include "tracker-db-sqlite.h"
-
 #define TRACKER_FILES_SERVICE         "org.freedesktop.Tracker"
 #define TRACKER_FILES_PATH            "/org/freedesktop/Tracker/Files"
 #define TRACKER_FILES_INTERFACE       "org.freedesktop.Tracker.Files"
@@ -53,9 +51,7 @@
 GType    tracker_files_get_type                         (void);
 
 TrackerFiles *
-         tracker_files_new                              (DBConnection   *db_con);
-void     tracker_files_set_db_connection                (TrackerFiles   *object,
-							 DBConnection   *db_con);
+         tracker_files_new                              (void);
 gboolean tracker_files_exist                            (TrackerFiles   *object,
 							 const gchar    *uri,
 							 gboolean        auto_create,

Modified: branches/xesam-support/src/trackerd/tracker-indexer.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-indexer.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-indexer.c	Mon Jun  9 15:41:07 2008
@@ -70,6 +70,9 @@
 
 extern Tracker *tracker;
 
+static gint merge_count = 0;
+static gint merge_processed = 0;
+
 struct Indexer_ {
 	DEPOT  		*word_index;	/* file hashtable handle for the word -> {serviceID, ServiceTypeID, Score}  */
 	GMutex 		*word_mutex;
@@ -411,8 +414,8 @@
 	dpiterinit (src->word_index);
 	
 	tracker->in_merge = TRUE;
-	tracker->merge_count = 1;
-	tracker->merge_processed = 0;
+	merge_count = 1;
+	merge_processed = 0;
 	
         /* Signal progress */
         object = tracker_dbus_get_object (TRACKER_TYPE_DAEMON);
@@ -421,8 +424,8 @@
                                "Merging",
                                "",
                                tracker->index_count,
-                               tracker->merge_processed,
-                               tracker->merge_count);
+                               merge_processed,
+                               merge_count);
 	
 	while ((str = dpiternext (src->word_index, NULL))) {
 		
@@ -480,8 +483,8 @@
 	}
 	
 	tracker->in_merge = FALSE;
-	tracker->merge_count = 1;
-	tracker->merge_processed = 1;
+	merge_count = 1;
+	merge_processed = 1;
 
         /* Signal progress */
         object = tracker_dbus_get_object (TRACKER_TYPE_DAEMON);
@@ -490,8 +493,8 @@
                                "Merging",                     
                                "",
                                tracker->index_count,        
-                               tracker->merge_processed,  
-                               tracker->merge_count);     
+                               merge_processed,  
+                               merge_count);     
 }
 
 gboolean
@@ -671,8 +674,8 @@
 
 	g_message ("starting merge of %d indexes", index_count);
 	tracker->in_merge = TRUE;
-	tracker->merge_count = index_count;
-	tracker->merge_processed = 0;
+	merge_count = index_count;
+	merge_processed = 0;
 	
         /* Signal progress */
         g_signal_emit_by_name (object, 
@@ -680,8 +683,8 @@
                                "Merging",
                                "",
                                tracker->index_count,
-                               tracker->merge_processed,
-                               tracker->merge_count);
+                               merge_processed,
+                               merge_count);
 
 	if (index_count == 2 && !final_exists) {
                 Indexer *index1 = index_list->data ;
@@ -837,7 +840,7 @@
                                 GObject *object;
 
 				tracker_indexer_free (index, TRUE);
-				tracker->merge_processed++;
+				merge_processed++;
 
                                 /* Signal progress */
                                 object = tracker_dbus_get_object (TRACKER_TYPE_DAEMON);
@@ -846,8 +849,8 @@
                                                        "Merging",
                                                        "",
                                                        tracker->index_count,
-                                                       tracker->merge_processed,
-                                                       tracker->merge_count);
+                                                       merge_processed,
+                                                       merge_count);
 			}
 
 

Modified: branches/xesam-support/src/trackerd/tracker-keywords.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-keywords.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-keywords.c	Mon Jun  9 15:41:07 2008
@@ -26,6 +26,7 @@
 #include <libtracker-common/tracker-utils.h>
 
 #include <libtracker-db/tracker-db-dbus.h>
+#include <libtracker-db/tracker-db-manager.h>
 
 #include "tracker-dbus.h"
 #include "tracker-keywords.h"
@@ -35,26 +36,16 @@
 #define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_KEYWORDS, TrackerKeywordsPriv))
 
 typedef struct {
-	DBusGProxy   *fd_proxy;
-	DBConnection *db_con;
+	DBusGProxy *fd_proxy;
 } TrackerKeywordsPriv;
 
 enum {
-	PROP_0,
-	PROP_DB_CONNECTION
-};
-
-enum {
         KEYWORD_ADDED,
         KEYWORD_REMOVED,
         LAST_SIGNAL
 };
 
 static void keywords_finalize     (GObject      *object);
-static void keywords_set_property (GObject      *object,
-				   guint         param_id,
-				   const GValue *value,
-				   GParamSpec   *pspec);
 
 static guint signals[LAST_SIGNAL] = {0};
 
@@ -68,14 +59,6 @@
 	object_class = G_OBJECT_CLASS (klass);
 
 	object_class->finalize = keywords_finalize;
-	object_class->set_property = keywords_set_property;
-
-	g_object_class_install_property (object_class,
-					 PROP_DB_CONNECTION,
-					 g_param_spec_pointer ("db-connection",
-							       "DB connection",
-							       "Database connection to use in transactions",
-							       G_PARAM_WRITABLE));
 
         signals[KEYWORD_ADDED] =
                 g_signal_new ("keyword-added",
@@ -118,54 +101,10 @@
 	G_OBJECT_CLASS (tracker_keywords_parent_class)->finalize (object);
 }
 
-static void
-keywords_set_property (GObject      *object,
-		       guint	  param_id,
-		       const GValue *value,
-		       GParamSpec	 *pspec)
-{
-	TrackerKeywordsPriv *priv;
-
-	priv = GET_PRIV (object);
-
-	switch (param_id) {
-	case PROP_DB_CONNECTION:
-		tracker_keywords_set_db_connection (TRACKER_KEYWORDS (object),
-						    g_value_get_pointer (value));
-		break;
-
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
-		break;
-	};
-}
-
 TrackerKeywords *
-tracker_keywords_new (DBConnection *db_con)
+tracker_keywords_new (void)
 {
-	TrackerKeywords *object;
-
-	object = g_object_new (TRACKER_TYPE_KEYWORDS, 
-			       "db-connection", db_con,
-			       NULL);
-	
-	return object;
-}
-
-void
-tracker_keywords_set_db_connection (TrackerKeywords *object,
-				    DBConnection    *db_con)
-{
-	TrackerKeywordsPriv *priv;
-
-	g_return_if_fail (TRACKER_IS_KEYWORDS (object));
-	g_return_if_fail (db_con != NULL);
-
-	priv = GET_PRIV (object);
-
-	priv->db_con = db_con;
-	
-	g_object_notify (G_OBJECT (object), "db-connection");
+	return g_object_new (TRACKER_TYPE_KEYWORDS, NULL);
 }
 
 /*
@@ -177,20 +116,15 @@
 			   GPtrArray       **values,
 			   GError          **error)
 {
-	TrackerKeywordsPriv *priv;
-	TrackerDBResultSet  *result_set;
-	guint                request_id;
-	DBConnection        *db_con;
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	guint               request_id;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
 	tracker_dbus_return_val_if_fail (service != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to get keywords list, "
 				  "service:'%s'",
@@ -204,10 +138,8 @@
 		return FALSE;
 	}
 
-	/* Check we have the right database connection */
-	db_con = tracker_db_get_service_connection (db_con, service);
-
-	result_set = tracker_db_get_keyword_list (db_con, service);
+ 	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
+	result_set = tracker_db_keywords_get_list (iface, service);
         *values = tracker_dbus_query_result_to_ptr_array (result_set);
 
 	if (result_set) {
@@ -226,21 +158,16 @@
 		      gchar           ***values,
 		      GError           **error)
 {
-	TrackerKeywordsPriv *priv;
-	TrackerDBResultSet  *result_set;
-	DBConnection        *db_con;
-	guint                request_id;
-	gchar               *id;
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	guint               request_id;
+	gchar              *id;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
 	tracker_dbus_return_val_if_fail (service != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to get keywords, "
 				  "service:'%s', uri:'%s'",
@@ -262,10 +189,8 @@
 		return FALSE;
         }
 
-	/* Check we have the right database connection */
-	db_con = tracker_db_get_service_connection (db_con, service);
-
-	id = tracker_db_get_id (db_con, service, uri);
+	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
+	id = tracker_db_file_get_id_as_string (iface, service, uri);
 	if (!id) {
 		tracker_dbus_request_failed (request_id,
 					     error,
@@ -274,8 +199,7 @@
 		return FALSE;
 	}
 
-	result_set = tracker_db_get_metadata (db_con, 
-					      service, 
+	result_set = tracker_db_metadata_get (iface, 
 					      id, 
 					      "User:Keywords");
 	*values = tracker_dbus_query_result_to_strv (result_set, NULL);
@@ -298,11 +222,10 @@
 		      gchar           **values,
 		      GError          **error)
 {
-	TrackerKeywordsPriv  *priv;
-	DBConnection         *db_con;
-	guint                 request_id;
-	gchar                *id;
-	gchar               **p;
+	TrackerDBInterface  *iface;
+	guint                request_id;
+	gchar               *id;
+	gchar              **p;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -310,10 +233,6 @@
 	tracker_dbus_return_val_if_fail (uri != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to add keywords, "
 				  "service:'%s', uri:'%s'",
@@ -335,23 +254,18 @@
 		return FALSE;
         }
 
-	/* Check we have the right database connection */
-	db_con = tracker_db_get_service_connection (db_con, service);
-
-	id = tracker_db_get_id (db_con, service, uri);
+	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
+	id = tracker_db_file_get_id_as_string (iface, service, uri);
 	tracker_dbus_return_val_if_fail (id != NULL, FALSE, error);
 
-	tracker_db_set_metadata (db_con, 
+	tracker_db_metadata_set (iface, 
 				 service, 
 				 id, 
 				 "User:Keywords", 
 				 values, 
-				 g_strv_length (values), 
 				 TRUE);
 	g_free (id);
 
-	tracker_notify_file_data_available ();
-
 	for (p = values; *p; p++) {
 		g_message ("Added keyword %s to %s with ID %s", *p, uri, id);
 		g_signal_emit (object, signals[KEYWORD_ADDED], 0, service, uri, *p);
@@ -369,11 +283,10 @@
 			 gchar           **values,
 			 GError          **error)
 {
-	TrackerKeywordsPriv  *priv;
-	DBConnection         *db_con;
-	guint                 request_id;
-	gchar                *id;
-	gchar               **p;
+	TrackerDBInterface  *iface;
+	guint                request_id;
+	gchar               *id;
+	gchar              **p;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -381,10 +294,6 @@
 	tracker_dbus_return_val_if_fail (uri != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to remove keywords, "
 				  "service:'%s', uri:'%s'",
@@ -406,10 +315,8 @@
 		return FALSE;
         }
 
-	/* Check we have the right database connection */
-	db_con = tracker_db_get_service_connection (db_con, service);
-
-	id = tracker_db_get_id (db_con, service, uri);
+	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
+	id = tracker_db_file_get_id_as_string (iface, service, uri);
 	if (!id) {
 		tracker_dbus_request_failed (request_id,
 					     error,
@@ -418,14 +325,9 @@
 		return FALSE;
 	}
 
-	tracker_notify_file_data_available ();
-
 	for (p = values; *p; p++) {
 		g_message ("Removed keyword %s from %s with ID %s", *p, uri, id);
-		tracker_db_delete_metadata_value (db_con, service, id, "User:Keywords", *p);
-
-		/* FIXME: Should we be doing this for EACH keyword? */
-		tracker_notify_file_data_available ();
+		tracker_db_metadata_delete_value (iface, service, id, "User:Keywords", *p);
 
 		g_signal_emit (object, signals[KEYWORD_REMOVED], 0, service, uri, *p);
 	}
@@ -443,20 +345,15 @@
 			     const gchar      *uri,
 			     GError          **error)
 {
-	TrackerKeywordsPriv *priv;
-	DBConnection        *db_con;
-	guint                request_id;
-	gchar               *id;
+	TrackerDBInterface *iface;
+	guint               request_id;
+	gchar              *id;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
 	tracker_dbus_return_val_if_fail (service != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (uri != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to remove all keywords, "
 				  "service:'%s', uri:'%s'",
@@ -478,10 +375,8 @@
 		return FALSE;
         }
 
-	/* Check we have the right database connection */
-	db_con = tracker_db_get_service_connection (db_con, service);
-
-	id = tracker_db_get_id (db_con, service, uri);
+	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
+	id = tracker_db_file_get_id_as_string (iface, service, uri);
 	if (!id) {
 		tracker_dbus_request_failed (request_id,
 					     error,
@@ -490,11 +385,13 @@
 		return FALSE;
 	}
 
-	tracker_db_delete_metadata (db_con, service, id, "User:Keywords", TRUE);
+	tracker_db_metadata_delete (iface,
+				    service,
+				    id,
+				    "User:Keywords", 
+				    TRUE);
 	g_free (id);
 
-	tracker_notify_file_data_available ();
-
 	tracker_dbus_request_success (request_id);
 
 	return TRUE;
@@ -510,16 +407,15 @@
 			 gchar          ***values,
 			 GError          **error)
 {
-	TrackerKeywordsPriv  *priv;
-	TrackerDBResultSet   *result_set;
-	DBConnection         *db_con;
-	guint                 request_id;
-	const gchar         **p;
-	GString              *search;
-	GString              *select;
-	GString              *where;
-	gchar                *related_metadata;
-	gchar                *query;
+	TrackerDBInterface  *iface;
+	TrackerDBResultSet  *result_set;
+	guint                request_id;
+	const gchar        **p;
+	GString             *search;
+	GString             *select;
+	GString             *where;
+	gchar               *related_metadata;
+	gchar               *query;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -527,10 +423,6 @@
 	tracker_dbus_return_val_if_fail (keywords != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-
 	tracker_dbus_request_new (request_id,
 				  "DBus request to search keywords, "
 				  "query id:%d, service:'%s', offset:%d, "
@@ -548,8 +440,7 @@
 		return FALSE;
 	}
 
-	/* Check we have the right database connection */
-	db_con = tracker_db_get_service_connection (db_con, service);
+	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
 
 	/* Sanity check values */
 	offset = MAX (offset, 0);
@@ -575,7 +466,7 @@
 				  "' || S.Name as EntityName from Services S, ServiceKeywordMetaData M ");
 
 	/* Create where string */
-	related_metadata = tracker_get_related_metadata_names (db_con, "User:Keywords");
+	related_metadata = tracker_db_metadata_get_related_names (iface, "User:Keywords");
 
 	where = g_string_new ("");
 	g_string_append_printf (where, 
@@ -603,7 +494,7 @@
 
 	g_debug (query);
 
-	result_set = tracker_db_interface_execute_query (db_con->db, NULL, query);
+	result_set = tracker_db_interface_execute_query (iface, NULL, query);
 	*values = tracker_dbus_query_result_to_strv (result_set, NULL);
 
 	if (result_set) {

Modified: branches/xesam-support/src/trackerd/tracker-keywords.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-keywords.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-keywords.h	Mon Jun  9 15:41:07 2008
@@ -24,8 +24,6 @@
 
 #include <glib-object.h>
 
-#include "tracker-db-sqlite.h"
-
 #define TRACKER_KEYWORDS_SERVICE         "org.freedesktop.Tracker"
 #define TRACKER_KEYWORDS_PATH            "/org/freedesktop/Tracker/Keywords"
 #define TRACKER_KEYWORDS_INTERFACE       "org.freedesktop.Tracker.Keywords"
@@ -51,9 +49,7 @@
 };
 
 GType            tracker_keywords_get_type          (void);
-TrackerKeywords *tracker_keywords_new               (DBConnection      *db_con);
-void             tracker_keywords_set_db_connection (TrackerKeywords   *object,
-						     DBConnection      *db_con);
+TrackerKeywords *tracker_keywords_new               (void);
 gboolean         tracker_keywords_get_list          (TrackerKeywords   *object,
 						     const gchar       *service,
 						     GPtrArray        **values,

Modified: branches/xesam-support/src/trackerd/tracker-main.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-main.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-main.c	Mon Jun  9 15:41:07 2008
@@ -119,7 +119,6 @@
 
 /* Public */
 Tracker	             *tracker;
-DBConnection         *main_thread_db_con;
 
 /* Private */
 static GMainLoop     *main_loop;
@@ -248,11 +247,13 @@
 	/* Reset mtime on parent folder of all outstanding black list
 	 * files so they get indexed when next restarted 
 	 */
-	tracker_exec_proc (main_thread_db_con, 
-			   "UpdateFileMTime", "0", 
-			   dirname_parent, basename, 
-			   NULL);
-
+	tracker_db_exec_proc (tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA), 
+			      "UpdateFileMTime", 
+			      "0", 
+			      dirname_parent, 
+			      basename, 
+			      NULL);
+	
 	g_free (basename);
 	g_free (dirname_parent);
 	g_free (dirname);
@@ -290,18 +291,6 @@
 
         no_index_file_types = tracker_config_get_no_index_file_types (tracker->config);
 
-	if (!tracker_config_get_low_memory_mode (tracker->config)) {
-		tracker->memory_limit = 16000 *1024;
-	
-		tracker->max_process_queue_size = 5000;
-		tracker->max_extract_queue_size = 5000;
-	} else {
-		tracker->memory_limit = 8192 * 1024;
-
-		tracker->max_process_queue_size = 500;
-		tracker->max_extract_queue_size = 500;
-	}
-
 	g_message ("Tracker configuration options:");
 	g_message ("  Verbosity  ............................  %d", 
 		   tracker_config_get_verbosity (tracker->config));
@@ -369,36 +358,22 @@
 static void
 create_index (gboolean need_data)
 {
-	DBConnection *db_con;
+	TrackerDBInterface *iface;
 	
 	tracker->first_time_index = TRUE;
 
-	/* Create files db and emails db */
-	db_con = tracker_db_connect ();
-
 	/* Reset stats for embedded services if they are being reindexed */
 	if (!need_data) {
+		iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
 		g_message ("*** DELETING STATS *** ");
-		tracker_db_exec_no_reply (db_con->db, 
+		tracker_db_exec_no_reply (iface, 
 					  "update ServiceTypes set TypeCount = 0 where Embedded = 1");
 	}
 
-	tracker_db_close (db_con->db);
-	g_free (db_con);
-
 	/* Create databases */
-	db_con = tracker_db_connect_file_content ();
-	tracker_db_close (db_con->db);
-	g_free (db_con);
-
-	db_con = tracker_db_connect_email_content ();
-	tracker_db_close (db_con->db);
-	g_free (db_con);
-
-	db_con = tracker_db_connect_emails ();
-	tracker_db_close (db_con->db);
-	g_free (db_con);
 
+	/* create file content, email content and email dbs */
 }
 
 static gboolean 
@@ -517,7 +492,7 @@
 	g_free (filename);
 
 	/* Remove database if we are reindexing */
-	if (reindex || tracker_db_needs_setup ()) {
+	if (reindex) {
 		tracker_path_remove (data_dir);
 		*need_index = TRUE;
 	}
@@ -540,68 +515,34 @@
 }
 
 static void
-initialise_threading (void)
-{
-	tracker->files_check_mutex = g_mutex_new ();
-	tracker->files_signal_mutex = g_mutex_new ();
-	tracker->files_signal_cond = g_cond_new ();
-
-	tracker->metadata_check_mutex = g_mutex_new ();
-	tracker->metadata_signal_mutex = g_mutex_new ();
-	tracker->metadata_signal_cond = g_cond_new ();
-}
-
-static void
 initialise_databases (gboolean need_index)
 {
-	Indexer      *index;
-	DBConnection *db_con;
-	gchar        *final_index_name;
-	gboolean      need_data;
-	
-	/* FIXME: is this actually necessary? */
-	db_con = tracker_db_connect_cache ();
-	tracker_db_close (db_con->db);
-
-	need_data = tracker_db_common_need_build ();
-
-	if (need_data) {
-		tracker_create_common_db ();
-	}
-
+	Indexer  *index;
+	gchar    *final_index_name;
+	gboolean  need_data;
+	
 	if (!tracker->readonly && need_index) {
 		create_index (need_data);
 	} else {
 		tracker->first_time_index = FALSE;
 	}
 
-        /* Set up main database connection */
-	db_con = tracker_db_connect ();
-
 	/* Check db integrity if not previously shut down cleanly */
 	if (!tracker->readonly && 
 	    !need_index && 
-	    tracker_db_get_option_int (db_con, "IntegrityCheck") == 1) {
+	    tracker_db_get_option_int ("IntegrityCheck") == 1) {
 		g_message ("Performing integrity check as the daemon was not shutdown cleanly");
 		/* FIXME: Finish */
 	} 
 
 	if (!tracker->readonly) {
-		tracker_db_set_option_int (db_con, "IntegrityCheck", 1);
+		tracker_db_set_option_int ("IntegrityCheck", 1);
 	} 
 
 	if (tracker->first_time_index) {
-		tracker_db_set_option_int (db_con, "InitialIndex", 1);
+		tracker_db_set_option_int ("InitialIndex", 1);
 	}
 
-	/* Create connections */
-	// you shouldn't have to do this at all !
-	// In fact, it's even terribly wrong to do this!
-	//db_con->cache = tracker_db_connect_cache ();
-	//db_con->common = tracker_db_connect_common ();
-
-	main_thread_db_con = db_con;
-	
 	/* Move final file to index file if present and no files left
 	 * to merge.
 	 */
@@ -655,68 +596,7 @@
 	index = tracker_indexer_open (TRACKER_INDEXER_EMAIL_INDEX_DB_FILENAME, TRUE);
 	tracker->email_index = index;
 
-	db_con->word_index = tracker->file_index;
-
-	tracker_db_get_static_data (db_con);
-}
-
-static void
-shutdown_threads (GThread *thread_to_join)
-{
-	g_message ("Shutting down threads");
-
-	/* Wait for files thread to sleep */
-	while (!g_mutex_trylock (tracker->files_signal_mutex)) {
-		g_usleep (100);
-	}
-
-	g_mutex_unlock (tracker->files_signal_mutex);
-
-	while (!g_mutex_trylock (tracker->metadata_signal_mutex)) {
-		g_usleep (100);
-	}
-
-	g_mutex_unlock (tracker->metadata_signal_mutex);
-
-	/* Send signals to each thread to wake them up and then stop
-	 * them.
-	 */
-	g_mutex_lock (tracker->metadata_signal_mutex);
-	g_cond_signal (tracker->metadata_signal_cond);
-	g_mutex_unlock (tracker->metadata_signal_mutex);
-
-	g_mutex_unlock (tracker->files_check_mutex);
-
-	g_mutex_lock (tracker->files_signal_mutex);
-	g_cond_signal (tracker->files_signal_cond);
-	g_mutex_unlock (tracker->files_signal_mutex);
-
-	/* Wait for threads to exit and unlock check mutexes to
-	 * prevent any deadlocks 
-	 */
-	g_mutex_unlock (tracker->metadata_check_mutex);
-	g_mutex_unlock (tracker->files_check_mutex);
-
-#if 0
-	/* We wait now for the thread to exit and join, then clean up
-	 * the mutexts and conds. 
-	 */
-	g_message ("Waiting for thread to finish");
-	g_thread_join (thread_to_join);
-#endif
-
-	/* Clean up */
-#if 0
-	g_message ("Waiting for file check/signal mutexes to unlock before cleaning up...");
-	g_mutex_free (tracker->files_check_mutex); 
-	g_mutex_free (tracker->files_signal_mutex);
-	g_cond_free (tracker->files_signal_cond);
-
-	g_message ("Waiting for metadata check/signal mutexes to unlock before cleaning up...");
-	g_mutex_free (tracker->metadata_check_mutex);
-	g_mutex_free (tracker->metadata_signal_mutex);
-	g_cond_free (tracker->metadata_signal_cond);
-#endif
+	/* db_con->word_index = tracker->file_index; */
 }
 
 static gboolean
@@ -762,9 +642,7 @@
 shutdown_databases (void)
 {
 	/* Reset integrity status as threads have closed cleanly */
-	tracker_db_set_option_int (main_thread_db_con, "IntegrityCheck", 0);
-
-	tracker_db_close (main_thread_db_con->db);
+	tracker_db_set_option_int ("IntegrityCheck", 0);
 }
 
 static void
@@ -800,7 +678,6 @@
 {
 	GOptionContext *context = NULL;
 	GError         *error = NULL;
-	GThread        *thread; 
 	GSList         *l;
 	gchar          *example;
 	gboolean        need_index;
@@ -866,9 +743,6 @@
 
 	tracker->pid = getpid ();
 
-	tracker->max_process_queue_size = MAX_PROCESS_QUEUE_SIZE;
-	tracker->max_extract_queue_size = MAX_EXTRACT_QUEUE_SIZE;
-
 	/* This makes sure we have all the locations like the data
 	 * dir, user data dir, etc all configured.
 	 * 
@@ -935,30 +809,24 @@
 		return EXIT_FAILURE;
 	} 
 
+	initialise_directories (&need_index);
+
 	tracker_nfs_lock_init (tracker_config_get_nfs_locking (tracker->config));
-	tracker_watcher_init ();
+	tracker_ontology_init ();
 	tracker_db_init ();
-	tracker_db_manager_init (data_dir, user_data_dir, sys_tmp_dir);
+	tracker_db_manager_init (FALSE, data_dir, user_data_dir, sys_tmp_dir); /* Using TRUE=broken */
 	tracker_xesam_manager_init ();
-	tracker_ontology_init ();
 	tracker_email_start_email_watching (tracker_config_get_email_client (tracker->config));
 
 #ifdef HAVE_HAL
  	tracker->hal = tracker_hal_new ();
 #endif /* HAVE_HAL */
 
-	initialise_directories (&need_index);
-	initialise_threading ();
 
 	umask (077);
 
 	tracker->readonly = check_multiple_instances ();
 
-        if (!tracker_db_load_prepared_queries ()) {
-		g_critical ("Could not initialize database engine!");
-		return EXIT_FAILURE;
-        }
-
 	initialise_databases (need_index);
 
 	/* Set our status as running, if this is FALSE, threads stop
@@ -1036,17 +904,16 @@
 
 	shutdown_indexer ();
 	shutdown_databases ();
-	shutdown_threads (thread);
 	shutdown_directories ();
 
 	/* Shutdown major subsystems */
 	tracker_process_files_shutdown ();
 	tracker_email_end_email_watching ();
 	tracker_dbus_shutdown ();
-	tracker_ontology_shutdown ();
 	tracker_xesam_manager_shutdown ();
 	tracker_db_shutdown ();
 	tracker_db_manager_shutdown ();
+	tracker_ontology_shutdown ();
 	tracker_watcher_shutdown ();
 	tracker_nfs_lock_shutdown ();
 	tracker_log_shutdown ();

Modified: branches/xesam-support/src/trackerd/tracker-main.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-main.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-main.h	Mon Jun  9 15:41:07 2008
@@ -38,21 +38,9 @@
 
 #include "tracker-indexer.h"
 
-/* default performance options */
-#define MAX_PROCESS_QUEUE_SIZE 100
-#define MAX_EXTRACT_QUEUE_SIZE 500
-
 G_BEGIN_DECLS
 
 typedef struct {
- 	gboolean          is_running; 
-	gboolean          readonly;
-
-	gint              pid; 
-
-	gboolean          reindex;
-
-
 #ifdef HAVE_HAL
 	TrackerHal       *hal;
 #endif
@@ -60,14 +48,13 @@
         TrackerConfig    *config;
         TrackerLanguage  *language;
 
-	/* Config options */
-	guint32           watch_limit; 
+ 	gboolean          is_running; 
+	gboolean          readonly;
+
+	gint              pid; 
 
-	/* Performance and memory usage options */
-	gint              max_process_queue_size;
-	gint              max_extract_queue_size;
-	gint              memory_limit;
-     
+	gboolean          reindex;
+  
 	/* Pause/shutdown */
 	gboolean          pause_manual;
 	gboolean          pause_battery;
@@ -86,29 +73,11 @@
 	gint              mbox_count; 
 	gint              mbox_processed;
 
-	/* Email config options */
-	gint              email_service_min;
-	gint              email_service_max; 
-
 	/* Progress info for merges */
 	gboolean          in_merge; 
-	gint              merge_count; 
-	gint              merge_processed;
 	
 	/* Application run time values */
 	gint              index_count; 
-
-	gint              word_detail_count; 
-	gint              word_count;
-	gint              word_update_count; 
-
-	GMutex           *files_check_mutex;
-	GMutex           *files_signal_mutex;
-	GCond            *files_signal_cond;
-
-	GMutex           *metadata_check_mutex;
-	GMutex           *metadata_signal_mutex;
-	GCond            *metadata_signal_cond;
 } Tracker;
 
 void         tracker_shutdown        (void);

Modified: branches/xesam-support/src/trackerd/tracker-metadata.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-metadata.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-metadata.c	Mon Jun  9 15:41:07 2008
@@ -29,29 +29,13 @@
 #include <libtracker-common/tracker-utils.h>
 
 #include <libtracker-db/tracker-db-dbus.h>
+#include <libtracker-db/tracker-db-manager.h>
 
 #include "tracker-dbus.h"
 #include "tracker-metadata.h"
 #include "tracker-db.h"
 #include "tracker-marshal.h"
 
-#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_METADATA, TrackerMetadataPriv))
-
-typedef struct {
-	DBConnection *db_con;
-} TrackerMetadataPriv;
-
-enum {
-	PROP_0,
-	PROP_DB_CONNECTION
-};
-
-static void metadata_finalize     (GObject      *object);
-static void metadata_set_property (GObject      *object,
-				   guint         param_id,
-				   const GValue *value,
-				   GParamSpec   *pspec);
-
 static const gchar *types[] = {
 	"index", 
 	"string", 
@@ -65,21 +49,6 @@
 static void
 tracker_metadata_class_init (TrackerMetadataClass *klass)
 {
-	GObjectClass *object_class;
-
-	object_class = G_OBJECT_CLASS (klass);
-
-	object_class->finalize = metadata_finalize;
-	object_class->set_property = metadata_set_property;
-
-	g_object_class_install_property (object_class,
-					 PROP_DB_CONNECTION,
-					 g_param_spec_pointer ("db-connection",
-							       "DB connection",
-							       "Database connection to use in transactions",
-							       G_PARAM_WRITABLE));
-
-	g_type_class_add_private (object_class, sizeof (TrackerMetadataPriv));
 }
 
 static void
@@ -87,64 +56,10 @@
 {
 }
 
-static void
-metadata_finalize (GObject *object)
-{
-	TrackerMetadataPriv *priv;
-	
-	priv = GET_PRIV (object);
-
-	G_OBJECT_CLASS (tracker_metadata_parent_class)->finalize (object);
-}
-
-static void
-metadata_set_property (GObject      *object,
-		       guint	     param_id,
-		       const GValue *value,
-		       GParamSpec   *pspec)
-{
-	TrackerMetadataPriv *priv;
-
-	priv = GET_PRIV (object);
-
-	switch (param_id) {
-	case PROP_DB_CONNECTION:
-		tracker_metadata_set_db_connection (TRACKER_METADATA (object),
-						    g_value_get_pointer (value));
-		break;
-
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
-		break;
-	};
-}
-
 TrackerMetadata *
-tracker_metadata_new (DBConnection *db_con)
+tracker_metadata_new (void)
 {
-	TrackerMetadata *object;
-
-	object = g_object_new (TRACKER_TYPE_METADATA, 
-			       "db-connection", db_con,
-			       NULL);
-	
-	return object;
-}
-
-void
-tracker_metadata_set_db_connection (TrackerMetadata *object,
-				    DBConnection    *db_con)
-{
-	TrackerMetadataPriv *priv;
-
-	g_return_if_fail (TRACKER_IS_METADATA (object));
-	g_return_if_fail (db_con != NULL);
-
-	priv = GET_PRIV (object);
-
-	priv->db_con = db_con;
-	
-	g_object_notify (G_OBJECT (object), "db-connection");
+	return g_object_new (TRACKER_TYPE_METADATA, NULL);
 }
 
 /*
@@ -158,16 +73,15 @@
 		      gchar           ***values,
 		      GError           **error)
 {
-	TrackerMetadataPriv *priv;
-	TrackerDBResultSet  *result_set;
-	guint                request_id;
-	DBConnection        *db_con;
-	gchar               *service_result;
-	gchar               *service_id;
-	guint                i;
-	GString             *sql;
-	GString             *sql_join;
-	gchar               *query;
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	guint               request_id;
+	gchar              *service_result;
+	gchar              *service_id;
+	guint               i;
+	GString            *sql;
+	GString            *sql_join;
+	gchar              *query;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -176,10 +90,6 @@
 	tracker_dbus_return_val_if_fail (g_strv_length (keys) > 0, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-
 	if (!tracker_ontology_is_valid_service_type (service)) {
 		tracker_dbus_request_failed (request_id,
 					     error, 
@@ -193,10 +103,9 @@
 				  "service:'%s'",
 				  service);
 
-	/* Check we have the right database connection */
-	db_con = tracker_db_get_service_connection (db_con, service);
+	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
 
-	service_id = tracker_db_get_id (db_con, service, id);
+	service_id = tracker_db_file_get_id_as_string (iface, service, id);
         if (!service_id) {
 		tracker_dbus_request_failed (request_id,
 					     error,
@@ -205,7 +114,7 @@
                 return FALSE;
         }
 
-	service_result = tracker_db_get_service_for_entity (db_con, service_id);
+	service_result = tracker_db_service_get_by_entity (iface, service_id);
 	if (!service_result) {
 		g_free (service_id);
 		tracker_dbus_request_failed (request_id,
@@ -222,7 +131,7 @@
 	for (i = 0; i < g_strv_length (keys); i++) {
 		TrackerFieldData *field_data;
 
-		field_data = tracker_db_get_metadata_field (db_con, 
+		field_data = tracker_db_get_metadata_field (iface, 
 							    service_result, 
 							    keys[i], 
 							    i, 
@@ -275,7 +184,7 @@
 
 	g_debug (query);
 
-	result_set = tracker_db_interface_execute_query (db_con->db, NULL, query);
+	result_set = tracker_db_interface_execute_query (iface, NULL, query);
 	*values = tracker_dbus_query_result_to_strv (result_set, NULL);
 	g_free (query);
 
@@ -303,11 +212,10 @@
 		      gchar           **values,
 		      GError          **error)
 {
-	TrackerMetadataPriv *priv;
-	guint                request_id;
-	DBConnection        *db_con;
-	gchar               *service_id;
-	guint                i;
+	TrackerDBInterface *iface;
+	guint               request_id;
+	gchar              *service_id;
+	guint               i;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -318,10 +226,6 @@
 	tracker_dbus_return_val_if_fail (g_strv_length (values) > 0, FALSE, error);
 	tracker_dbus_return_val_if_fail (g_strv_length (keys) != g_strv_length (values), FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to set metadata keys, "
 				  "service:'%s'",
@@ -335,10 +239,9 @@
 		return FALSE;
 	}
 
-	/* Check we have the right database connection */
-	db_con = tracker_db_get_service_connection (db_con, service);
+	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
 
-	service_id = tracker_db_get_id (db_con, service, id);
+	service_id = tracker_db_file_get_id_as_string (iface, service, id);
         if (!service_id) {
 		tracker_dbus_request_failed (request_id,
 					     error, 
@@ -364,13 +267,12 @@
 			return FALSE;
 		}
 
-		tracker_db_set_single_metadata (db_con, 
+		tracker_db_metadata_set_single (iface, 
 						service, 
 						service_id,
 						key, 
 						value, 
 						TRUE);
-		tracker_notify_file_data_available ();
 	}
 	
 	g_free (service_id);
@@ -388,19 +290,15 @@
 				const gchar      *type,
 				GError          **error)
 {
-	TrackerMetadataPriv *priv;
-	guint                request_id;
-	DBConnection        *db_con;
-	const gchar         *type_id;
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	guint               request_id;
+	const gchar        *type_id;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
 	tracker_dbus_return_val_if_fail (metadata != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (type != NULL, FALSE, error);
-
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
 	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to register metadata type, "
@@ -434,14 +332,19 @@
 		return FALSE;
 	}
 
-	/* FIXME: Check return value? */
-	tracker_exec_proc (db_con, 
-			   "InsertMetadataType", 
-			   4, 
-			   metadata, 
-			   type_id, 
-			   "0", 
-			   "1");
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
+	result_set = tracker_db_exec_proc (iface, 
+					   "InsertMetadataType", 
+					   4, 
+					   metadata, 
+					   type_id, 
+					   "0", 
+					   "1");
+
+	if (result_set) {
+		g_object_unref (result_set);
+	}
 
 	tracker_dbus_request_success (request_id);
 
@@ -456,11 +359,10 @@
 				   gboolean         *is_writable,
 				   GError          **error)
 {
-	TrackerMetadataPriv *priv;
-	TrackerDBResultSet  *result_set;
-	guint                request_id;
-	DBConnection        *db_con;
-	gint                 i;
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	guint               request_id;
+	gint                i;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -469,16 +371,17 @@
 	tracker_dbus_return_val_if_fail (is_embedded != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (is_writable != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
 	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to get metadata details, "
 				  "name:'%s'",
 				  metadata);
 
-	result_set = tracker_exec_proc (db_con, "GetMetadataTypeInfo", metadata, NULL);
+	result_set = tracker_db_exec_proc (iface, 
+					   "GetMetadataTypeInfo",
+					   metadata, 
+					   NULL);
 
 	if (!result_set) {
 		tracker_dbus_request_failed (request_id,
@@ -508,26 +411,23 @@
 				       gchar           ***values,
 				       GError           **error)
 {
-	TrackerMetadataPriv *priv;
-	TrackerDBResultSet  *result_set;
-	guint                request_id;
-	DBConnection        *db_con;
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	guint               request_id;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
 	tracker_dbus_return_val_if_fail (class != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to get registered metadata types, "
 				  "class:'%s'",
 				  class);
 
-	result_set = tracker_db_get_metadata_types (db_con, class, TRUE);
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
+	result_set = tracker_db_metadata_get_types (iface, class, TRUE);
 	if (result_set) {
 		*values = tracker_dbus_query_result_to_strv (result_set, NULL);
 		g_object_unref (result_set);
@@ -544,28 +444,25 @@
 				     gchar           ***values,
 				     GError           **error)
 {
-	TrackerMetadataPriv *priv;
-	TrackerDBResultSet  *result_set;
-	guint                request_id;
-	DBConnection        *db_con;
-	gchar               *class_formatted;
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	guint               request_id;
+	gchar              *class_formatted;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
 	tracker_dbus_return_val_if_fail (class != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to get writable metadata types, "
 				  "class:'%s'",
 				  class);
 
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
 	class_formatted = g_strconcat (class, ".*", NULL);
-	result_set = tracker_db_get_metadata_types (db_con, 
+	result_set = tracker_db_metadata_get_types (iface, 
 						    class_formatted, 
 						    TRUE);
 	if (result_set) {
@@ -585,25 +482,22 @@
 					 gchar           ***values,
 					 GError           **error)
 {
-	TrackerMetadataPriv *priv;
-	TrackerDBResultSet  *result_set;
-	guint                request_id;
-	DBConnection        *db_con;
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	guint               request_id;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
 				  "DBus request to get registered classes");
 
-	result_set = tracker_exec_proc (db_con, 
-					"SelectMetadataClasses", 
-					NULL);
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
+	result_set = tracker_db_exec_proc (iface, 
+					   "SelectMetadataClasses", 
+					   NULL);
 	
 	if (result_set) {
 		*values = tracker_dbus_query_result_to_strv (result_set, NULL);

Modified: branches/xesam-support/src/trackerd/tracker-metadata.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-metadata.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-metadata.h	Mon Jun  9 15:41:07 2008
@@ -24,7 +24,6 @@
 
 #include <glib-object.h>
 
-#include "tracker-db-sqlite.h"
 #include "tracker-indexer.h"
 
 #define TRACKER_METADATA_SERVICE         "org.freedesktop.Tracker"
@@ -52,9 +51,7 @@
 };
 
 GType            tracker_metadata_get_type               (void);
-TrackerMetadata *tracker_metadata_new                    (DBConnection      *db_con);
-void             tracker_metadata_set_db_connection      (TrackerMetadata   *object,
-							  DBConnection      *db_con);
+TrackerMetadata *tracker_metadata_new                    (void);
 gboolean         tracker_metadata_get                    (TrackerMetadata   *object,
 							  const gchar       *service,
 							  const gchar       *id,

Modified: branches/xesam-support/src/trackerd/tracker-process-files.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-process-files.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-process-files.c	Mon Jun  9 15:41:07 2008
@@ -39,6 +39,8 @@
 #include <libtracker-common/tracker-type-utils.h>
 #include <libtracker-common/tracker-utils.h>
 
+#include <libtracker-db/tracker-db-manager.h>
+
 #include "../xdgmime/xdgmime.h"
 
 #include "tracker-db.h"
@@ -53,7 +55,7 @@
 static TrackerHal     *hal;
 static TrackerConfig  *config;
 
-static DBConnection   *db_con;
+/* static TrackerDBInterface   *db_con; */
 
 static GAsyncQueue    *dir_queue;
 static GAsyncQueue    *file_metadata_queue;
@@ -196,8 +198,8 @@
 }
 
 static void
-process_watch_directories (GSList       *dirs,
-                           DBConnection *db_con)
+process_watch_directories (GSList             *dirs,
+                           TrackerDBInterface *iface)
 {
         GSList *list;
        
@@ -249,7 +251,7 @@
                                 continue;
                         }
                         
-                        if (!tracker_watcher_add_dir (dir, db_con)) {
+                        if (!tracker_watcher_add_dir (dir, iface)) {
                                 g_warning ("Watch failed for:'%s'", dir);
                         }
 		}
@@ -270,35 +272,35 @@
 
 static void
 process_schedule_directory_check_foreach (const gchar  *uri, 
-                                          DBConnection *db_con)
+                                          TrackerDBInterface *iface)
 {
-	/* tracker_db_insert_pending_file (db_con, 0, uri, NULL, "unknown", 0,  */
+	/* tracker_db_insert_pending_file (iface_cache, 0, uri, NULL, "unknown", 0,  */
         /*                                 TRACKER_DB_ACTION_DIRECTORY_REFRESH, */
         /*                                 TRUE, FALSE, -1); */
 }
 
 static void
 process_schedule_file_check_foreach (const gchar  *uri, 
-                                     DBConnection *db_con)
+                                     TrackerDBInterface *iface)
 {
 	g_return_if_fail (uri != NULL);
-	g_return_if_fail (db_con != NULL);
+	g_return_if_fail (iface != NULL);
 
 	/* Keep mainloop responsive */
 	process_my_yield ();
 
 	if (!tracker_file_is_directory (uri)) {
-		/* tracker_db_insert_pending_file (db_con, 0, uri, NULL, "unknown", 0,  */
+		/* tracker_db_insert_pending_file (iface_cache, 0, uri, NULL, "unknown", 0,  */
                 /*                                 TRACKER_DB_ACTION_CHECK, 0, FALSE, -1); */
 	} else {
-		process_schedule_directory_check_foreach (uri, db_con);
+		process_schedule_directory_check_foreach (uri, iface);
 	}
 }
 
 static inline void
 process_directory_list (GSList       *list, 
                         gboolean      recurse,
-                        DBConnection *db_con)
+                        TrackerDBInterface *iface)
 {
 	crawl_directories = NULL;
 
@@ -306,16 +308,16 @@
 		return;
 	}
 
-        process_watch_directories (list, db_con);
+        process_watch_directories (list, iface);
 
 	g_slist_foreach (list, 
                          (GFunc) process_schedule_directory_check_foreach, 
-                         db_con);
+                         iface);
 
 	if (recurse && crawl_directories) {
 		g_slist_foreach (crawl_directories, 
                                  (GFunc) process_schedule_directory_check_foreach, 
-                                 db_con);
+                                 iface);
 	}
 
 	if (crawl_directories) {
@@ -327,11 +329,11 @@
 
 static void
 process_scan_directory (const gchar  *uri,
-                        DBConnection *db_con)
+                        TrackerDBInterface *iface)
 {
 	GSList *files;
 
-	g_return_if_fail (db_con != NULL);
+	g_return_if_fail (iface != NULL);
 	g_return_if_fail (uri != NULL);
 	g_return_if_fail (tracker_file_is_directory (uri));
 
@@ -344,7 +346,7 @@
 
 	g_slist_foreach (files, 
                          (GFunc) process_schedule_file_check_foreach, 
-                         db_con);
+                         iface);
 
 	g_slist_foreach (files, 
                          (GFunc) g_free, 
@@ -354,14 +356,14 @@
 	/* Recheck directory to update its mtime if its changed whilst
          * scanning.
          */
-	process_schedule_directory_check_foreach (uri, db_con);
+	process_schedule_directory_check_foreach (uri, iface);
 
 	g_message ("Finished scanning");
 }
 
 static void
 process_index_delete_file (TrackerDBFileInfo *info,
-                           DBConnection      *db_con)
+                           TrackerDBInterface      *iface)
 {
 	/* Info struct may have been deleted in transit here so check
          * if still valid and intact.
@@ -375,14 +377,14 @@
 		return;
 	}
 
-	tracker_db_delete_file (db_con, info->file_id);
+	tracker_db_file_delete (iface, info->file_id);
 
 	g_message ("Deleting file:'%s'", info->uri);
 }
 
 static void
 process_index_delete_directory (TrackerDBFileInfo *info,
-                                DBConnection      *db_con)
+                                TrackerDBInterface      *iface)
 {
 	/* Info struct may have been deleted in transit here so check
          * if still valid and intact.
@@ -396,22 +398,22 @@
 		return;
 	}
 
-	tracker_db_delete_directory (db_con, info->file_id, info->uri);
+	tracker_db_directory_delete (iface, info->file_id, info->uri);
 
-	tracker_watcher_remove_dir (info->uri, TRUE, db_con);
+	tracker_watcher_remove_dir (info->uri, TRUE, iface);
 
 	g_message ("Deleting directory:'%s' and subdirs", info->uri);
 }
 
 static void
 process_index_delete_directory_check (const gchar *uri,
-                                      DBConnection *db_con)
+                                      TrackerDBInterface *iface)
 {
 	gchar **files;
         gchar **p;
 
 	/* Check for any deletions*/
-	files = tracker_db_get_files_in_folder (db_con, uri);
+	files = tracker_db_files_get (iface, uri);
 
         if (!files) {
                 return;
@@ -424,12 +426,12 @@
                         TrackerDBFileInfo *info;
 
 			info = tracker_db_file_info_new (str, 1, 0, 0);
-			info = tracker_db_get_file_info (db_con, info);
+			info = tracker_db_file_get_info (iface, info);
 
 			if (!info->is_directory) {
-				process_index_delete_file (info, db_con);
+				process_index_delete_file (info, iface);
 			} else {
-				process_index_delete_directory (info, db_con);
+				process_index_delete_directory (info, iface);
 			}
 			tracker_db_file_info_free (info);
 		}
@@ -590,9 +592,10 @@
 }
 
 static void
-process_index_crawl_files (DBConnection *db_con)
+process_index_crawl_files (TrackerDBInterface *iface)
 {
-        GSList *crawl_directory_roots;
+        TrackerDBInterface *iface_cache;
+        GSList             *crawl_directory_roots;
 
         g_message ("Starting directory crawling...");
 
@@ -604,13 +607,14 @@
                 return;
         }
         
-        tracker_db_interface_start_transaction (db_con->cache->db);
+        iface_cache = tracker_db_manager_get_db_interface (TRACKER_DB_CACHE);
+        tracker_db_interface_start_transaction (iface_cache);
         
         process_index_crawl_add_directories (crawl_directory_roots);
 
         g_slist_foreach (crawl_directories, 
                          (GFunc) process_schedule_directory_check_foreach, 
-                         db_con);
+                         iface);
         
         if (crawl_directories) {
                 g_slist_foreach (crawl_directories, (GFunc) g_free, NULL);
@@ -620,7 +624,7 @@
         
         g_slist_foreach (crawl_directory_roots, 
                          (GFunc) process_schedule_directory_check_foreach, 
-                         db_con);
+                         iface);
 
         if (crawl_directories) {
                 g_slist_foreach (crawl_directories, (GFunc) g_free, NULL);
@@ -628,12 +632,12 @@
                 crawl_directories = NULL;
         }
         
-        tracker_db_interface_end_transaction (db_con->cache->db);
+        tracker_db_interface_end_transaction (iface_cache);
 }
 
 static gboolean 
 process_action (TrackerDBFileInfo *info,
-                DBConnection      *db_con)
+                TrackerDBInterface      *iface)
 {
         gboolean need_index;
 
@@ -654,7 +658,7 @@
                 g_message ("Starting moving file:'%s' to:'%s'",
                            info->uri, 
                            info->moved_to_uri);
-                tracker_db_move_file (db_con, info->uri, info->moved_to_uri);
+                tracker_db_file_move (iface, info->uri, info->moved_to_uri);
                 break;
                 
         case TRACKER_DB_ACTION_DIRECTORY_REFRESH:
@@ -672,14 +676,14 @@
                         g_async_queue_push (dir_queue, g_strdup (info->uri));
 			
                         if (info->indextime > 0) {
-                                process_index_delete_directory_check (info->uri, db_con);
+                                process_index_delete_directory_check (info->uri, iface);
                         }
                 }
                 
                 break;
                 
         case TRACKER_DB_ACTION_DIRECTORY_MOVED_FROM:
-                tracker_db_move_directory (db_con, info->uri, info->moved_to_uri);
+                tracker_db_directory_move (iface, info->uri, info->moved_to_uri);
                 need_index = FALSE;
                 break;
                 
@@ -698,8 +702,8 @@
                          */
                         list = g_slist_prepend (NULL, info->uri);
 
-                        process_watch_directories (list, db_con);
-                        process_scan_directory (info->uri, db_con);
+                        process_watch_directories (list, iface);
+                        process_scan_directory (info->uri, iface);
 
                         g_slist_free (list);
                 } else {
@@ -721,25 +725,25 @@
 static void
 process_mount_point_added_cb (TrackerHal   *hal,
                               const gchar  *mount_point,
-                              DBConnection *db_con)
+                              TrackerDBInterface *iface)
 {
         GSList *list;
         
         g_message ("** TRAWLING THROUGH NEW MOUNT POINT:'%s'", mount_point);
         
         list = g_slist_prepend (NULL, (gchar*) mount_point);
-        process_directory_list (list, TRUE, db_con);
+        process_directory_list (list, TRUE, iface);
         g_slist_free (list);
 }
 
 static void
 process_mount_point_removed_cb (TrackerHal  *hal,
                                 const gchar *mount_point,
-                                DBConnection *db_con)
+                                TrackerDBInterface *iface)
 {
         g_message ("** CLEANING UP OLD MOUNT POINT:'%s'", mount_point);
         
-        process_index_delete_directory_check (mount_point, db_con); 
+        process_index_delete_directory_check (mount_point, iface); 
 }
 
 #endif /* HAVE_HAL */
@@ -771,7 +775,7 @@
         hal = g_object_ref (tracker->hal);
         config = g_object_ref (tracker->config);
 
-        db_con = tracker_db_connect_all ();
+        /* iface = tracker_ifacenect_all (); */
 
 	dir_queue = g_async_queue_new ();
 	file_metadata_queue = g_async_queue_new ();
@@ -843,14 +847,15 @@
                 }
 
 		/* Check if file needs indexing */
-                need_index = process_action (info, db_con);
+                need_index = process_action (info, 
+                                             tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA));
 
                 /* FIXME: Finish, maybe call the indexer with the new file */
                 if (0) {
                         GSList *foo, *bar;
                         process_check_directory(NULL);
                         process_index_get_roots(&foo, &bar);
-                        process_index_crawl_files(db_con);
+                        process_index_crawl_files(tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA));
                 }
 
 
@@ -882,8 +887,8 @@
                 dir_queue = NULL;
 	}
 
-	tracker_db_close_all (db_con);
-        db_con = NULL;
+	/* tracker_db_close_all (iface); */
+        /* iface = NULL; */
 
         if (config) {
                 g_object_unref (config);

Modified: branches/xesam-support/src/trackerd/tracker-rdf-query.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-rdf-query.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-rdf-query.c	Mon Jun  9 15:41:07 2008
@@ -21,32 +21,33 @@
 
 #include <libtracker-common/tracker-field-data.h>
 #include <libtracker-common/tracker-log.h>
+#include <libtracker-common/tracker-ontology.h>
 #include <libtracker-common/tracker-type-utils.h>
 #include <libtracker-common/tracker-utils.h>
 
 #include "tracker-rdf-query.h"
+#include "tracker-db.h"
 
 /* RDF Query Condition
-<rdfq:Condition>
-	<rdfq:and>
-        	<rdfq:greaterThan>
-            		<rdfq:Property name="File:Size" />
-            		<rdf:Integer>1000000</rdf:Integer>
-          	</rdfq:greaterThan>
-          	<rdfq:equals>
-             		<rdfq:Property name="File:Path" />
-             		<rdf:String>/home/jamie</rdf:String>
-           	</rdfq:equals>
-	</rdfq:and>
-</rdfq:Condition>
-*/
+ * <rdfq:Condition>
+ *	<rdfq:and>
+ *       	<rdfq:greaterThan>
+ *           		<rdfq:Property name="File:Size" />
+ *           		<rdf:Integer>1000000</rdf:Integer>
+ *         	</rdfq:greaterThan>
+ *         	<rdfq:equals>
+ *            		<rdfq:Property name="File:Path" />
+ *            		<rdf:String>/home/jamie</rdf:String>
+ *          	</rdfq:equals>
+ *	</rdfq:and>
+ * </rdfq:Condition>
+ */
 
-
-/* main elements */
+/* Main elements */
 #define ELEMENT_RDF_CONDITION 		"rdfq:Condition"
 #define ELEMENT_RDF_PROPERTY 		"rdfq:Property"
 
-/* operators */
+/* Operators */
 #define ELEMENT_RDF_AND 		"rdfq:and"
 #define ELEMENT_RDF_OR	 		"rdfq:or"
 #define ELEMENT_RDF_NOT 		"rdfq:not"
@@ -56,27 +57,40 @@
 #define ELEMENT_RDF_LESS_THAN 		"rdfq:lessThan"
 #define ELEMENT_RDF_LESS_OR_EQUAL	"rdfq:lessOrEqual"
 
-/* extension operators - "contains" does a substring or full text match, "in_Set" does string in list match */
+/* Extension operators - "contains" does a substring or full text
+ * match, "in_Set" does string in list match  
+ */
 #define ELEMENT_RDF_CONTAINS 		"rdfq:contains"
 #define ELEMENT_RDF_REGEX        	"rdfq:regex"
 #define ELEMENT_RDF_STARTS_WITH 	"rdfq:startsWith"
 #define ELEMENT_RDF_IN_SET		"rdfq:inSet"
 
-/* types */
+/* Types */
 #define ELEMENT_RDF_INTEGER 		"rdf:Integer"
-#define ELEMENT_RDF_DATE 		"rdf:Date"	/* format can be iso 8601 with optional timezone "yyyy-mm-ddThh:mm:ss" or "yyyy-mm-ddThh:mm:ss+hh:mm" - most other formats are supported too */
+#define ELEMENT_RDF_DATE 		"rdf:Date"	/* Format can
+                                                         * be iso 8601
+                                                         * with
+                                                         * optional
+                                                         * timezone
+                                                         * "yyyy-mm-ddThh:mm:ss"
+                                                         * or
+                                                         * "yyyy-mm-ddThh:mm:ss+hh:mm"
+                                                         * - most
+                                                         * other
+                                                         * formats are
+                                                         * supported
+                                                         * too  
+                                                         */
 #define ELEMENT_RDF_STRING 		"rdf:String"
 #define ELEMENT_RDF_FLOAT 		"rdf:Float"
 
 #define ELEMENT_IS(name) (strcmp (element_name, (name)) == 0)
 
-
 enum {
 	NO_ERROR,
 	PARSE_ERROR,
 };
 
-
 typedef enum {
 	STATE_START,
 	STATE_CONDITION,
@@ -116,7 +130,6 @@
 	STATE_END_DATE
 } ParseState;
 
-
 typedef enum {
 	OP_NONE,
 	OP_EQUALS,
@@ -130,105 +143,110 @@
 	OP_STARTS
 } Operators;
 
-
 typedef enum {
 	LOP_NONE,
 	LOP_AND,
 	LOP_OR
 } LogicOperators;
 
-
-
 typedef struct {
-	GMarkupParseContext 	*context;
-	GMarkupParser       	*parser;
-	GSList 			*stack;
-	GSList 			*fields;
-	gboolean		query_okay;
-	int			statement_count;
-	LogicOperators		current_logic_operator;
-	Operators		current_operator;
-	char 			*current_field;
-	char			*current_value;
-	DBConnection		*db_con;
-	GString			*sql_select;
-	GString			*sql_from;
-	GString			*sql_where;
-	GString			*sql_order;
-	char			*service;
+	GMarkupParseContext *context;
+	GMarkupParser       *parser;
+	GSList              *stack;
+	GSList              *fields;
+	gboolean             query_okay;
+	gint                 statement_count;
+	LogicOperators       current_logic_operator;
+	Operators            current_operator;
+	gchar               *current_field;
+	gchar               *current_value;
+	TrackerDBInterface  *iface;
+	GString             *sql_select;
+	GString             *sql_from;
+	GString             *sql_where;
+	GString             *sql_order;
+	gchar               *service;
 } ParserData;
 
-
 static GQuark error_quark;
 
-
-static void start_element_handler (GMarkupParseContext *context,
-				   const gchar *element_name,
-				   const gchar **attribute_names,
-				   const gchar **attribute_values,
-				   gpointer user_data,
-				   GError **error);
-
-static void end_element_handler (GMarkupParseContext *context,
-				 const gchar *element_name,
-				 gpointer user_data,
-				 GError **error);
-
-static void text_handler (GMarkupParseContext *context,
-		     const gchar *text,
-		     gsize text_len,
-		     gpointer user_data,
-		     GError **error);
-
-static void error_handler (GMarkupParseContext *context,
-		      GError *error,
-		      gpointer user_data);
-
+static void start_element_handler (GMarkupParseContext  *context,
+                                   const gchar          *element_name,
+                                   const gchar         **attribute_names,
+                                   const gchar         **attribute_values,
+                                   gpointer              user_data,
+                                   GError              **error);
+static void end_element_handler   (GMarkupParseContext  *context,
+                                   const gchar          *element_name,
+                                   gpointer              user_data,
+                                   GError              **error);
+static void text_handler          (GMarkupParseContext  *context,
+                                   const gchar          *text,
+                                   gsize                 text_len,
+                                   gpointer              user_data,
+                                   GError              **error);
+static void error_handler         (GMarkupParseContext  *context,
+                                   GError               *error,
+                                   gpointer              user_data);
 
 static gboolean
 is_operator (ParseState state)
 {
-	return state == STATE_EQUALS || state == STATE_GREATER_THAN || state == STATE_LESS_THAN ||
-			state == STATE_CONTAINS || state == STATE_IN_SET || STATE_LESS_OR_EQUAL ||
-			STATE_GREATER_OR_EQUAL || state == STATE_STARTS_WITH || state == STATE_REGEX;
-
+	return 
+                state == STATE_EQUALS || 
+                state == STATE_GREATER_THAN || 
+                state == STATE_LESS_THAN ||
+                state == STATE_CONTAINS || 
+                state == STATE_IN_SET || 
+                state == STATE_LESS_OR_EQUAL ||
+                state == STATE_GREATER_OR_EQUAL || 
+                state == STATE_STARTS_WITH || 
+                state == STATE_REGEX;
 }
 
-
 static gboolean
 is_end_operator (ParseState state)
 {
-	return state == STATE_END_EQUALS || state == STATE_END_GREATER_THAN || state == STATE_END_LESS_THAN ||
-			state == STATE_END_CONTAINS || state == STATE_END_IN_SET || STATE_END_LESS_OR_EQUAL ||
-			STATE_END_GREATER_OR_EQUAL || state == STATE_END_STARTS_WITH || state == STATE_REGEX;
-
+	return 
+                state == STATE_END_EQUALS || 
+                state == STATE_END_GREATER_THAN || 
+                state == STATE_END_LESS_THAN ||
+                state == STATE_END_CONTAINS || 
+                state == STATE_END_IN_SET || 
+                state == STATE_END_LESS_OR_EQUAL ||
+                state == STATE_END_GREATER_OR_EQUAL || 
+                state == STATE_END_STARTS_WITH || 
+                state == STATE_REGEX;
 }
 
-
 static gboolean
 is_logic (ParseState state)
 {
-	return state == STATE_AND || state == STATE_OR || state == STATE_NOT;
+	return 
+                state == STATE_AND || 
+                state == STATE_OR || 
+                state == STATE_NOT;
 }
 
-
 static gboolean
 is_end_logic (ParseState state)
 {
-	return state == STATE_END_AND || state == STATE_END_NOT || state == STATE_END_OR;
+	return 
+                state == STATE_END_AND || 
+                state == STATE_END_NOT || 
+                state == STATE_END_OR;
 }
 
-
 static void
 set_error (GError              **err,
            GMarkupParseContext  *context,
-           int                   error_code,
-           const char           *format,
+           gint                  error_code,
+           const gchar          *format,
            ...)
 {
-	int	line, ch;
-	va_list args;
-	char    *str;
+	gint     line, ch;
+	va_list  args;
+	gchar   *str;
 
 	g_markup_parse_context_get_position (context, &line, &ch);
 
@@ -236,14 +254,20 @@
 	str = g_strdup_vprintf (format, args);
 	va_end (args);
 
-	g_set_error (err, error_quark, error_code, "Line %d character %d: %s", line, ch, str);
+	g_set_error (err, 
+                     error_quark, 
+                     error_code,
+                     "Line %d character %d: %s", 
+                     line, ch, str);
 
 	g_free (str);
 }
 
-
 static gboolean
-set_error_on_fail (gboolean condition, GMarkupParseContext *context, const char *msg, GError **err)
+set_error_on_fail (gboolean              condition, 
+                   GMarkupParseContext  *context, 
+                   const gchar          *msg, 
+                   GError              **err)
 {
 	if (!condition) {
 		set_error (err, context, 1, msg);
@@ -253,13 +277,12 @@
 	return FALSE;
 }
 
-
-static const char *
-get_attribute_value (const char *name,
-		     const char **names,
-		     const char **values)
+static const gchar *
+get_attribute_value (const gchar *name,
+		     const gchar **names,
+		     const gchar **values)
 {
-	int i;
+	gint i;
 
 	i = 0;
 
@@ -273,21 +296,22 @@
 	return NULL;
 }
 
-
-static const char *
-get_attribute_value_required (GMarkupParseContext *context,
-			      const char          *tag,
-			      const char          *name,
-			      const char          **names,
-			      const char          **values,
+static const gchar *
+get_attribute_value_required (GMarkupParseContext  *context,
+			      const gchar          *tag,
+			      const gchar          *name,
+			      const gchar         **names,
+			      const gchar         **values,
 			      GError              **error)
 {
-	const char *value;
+	const gchar *value;
 
 	value = get_attribute_value (name, names, values);
 
 	if (!value) {
-		set_error (error, context, PARSE_ERROR,
+		set_error (error, 
+                           context, 
+                           PARSE_ERROR,
 			   "%s must have \"%s\" attribute",
 			   tag, name);
 	}
@@ -295,14 +319,12 @@
 	return value;
 }
 
-
 static void
-push_stack (ParserData *data, ParseState  state)
+push_stack (ParserData *data, ParseState state)
 {
 	data->stack = g_slist_prepend (data->stack, GINT_TO_POINTER (state));
 }
 
-
 static void
 pop_stack (ParserData *data)
 {
@@ -311,7 +333,6 @@
 	data->stack = g_slist_remove (data->stack, data->stack->data);
 }
 
-
 static ParseState
 peek_state (ParserData *data)
 {
@@ -320,7 +341,6 @@
 	return GPOINTER_TO_INT (data->stack->data);
 }
 
-
 static void
 pop_stack_until (ParserData *data, ParseState state)
 {
@@ -335,8 +355,6 @@
 	}
 }
 
-
-
 static TrackerFieldData *
 add_metadata_field (ParserData  *data, 
                     const gchar *field_name, 
@@ -379,9 +397,8 @@
 		}
 	}
 	
-
 	if (!field_exists) {
-		field_data = tracker_db_get_metadata_field (data->db_con, 
+		field_data = tracker_db_get_metadata_field (data->iface, 
                                                             data->service, 
                                                             field_name, 
                                                             g_slist_length (data->fields), 
@@ -399,13 +416,12 @@
 	return field_data;
 }
 
-
 static void
-start_element_handler (GMarkupParseContext *context,
-		       const gchar	   *element_name,
+start_element_handler (GMarkupParseContext  *context,
+		       const gchar	    *element_name,
 		       const gchar	   **attribute_names,
 		       const gchar	   **attribute_values,
-		       gpointer		   user_data,
+		       gpointer              user_data,
 		       GError		   **error)
 {
 	ParserData *data;
@@ -415,8 +431,10 @@
 	state = peek_state (data);
 
 	if (ELEMENT_IS (ELEMENT_RDF_CONDITION)) {
-
-		if (set_error_on_fail ((state == STATE_START), context, "Condition element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_START, 
+                                       context, 
+                                       "Condition element not expected here", 
+                                       error)) {
 			return;
 		}
 
@@ -425,41 +443,53 @@
 	} else if (ELEMENT_IS (ELEMENT_RDF_PROPERTY)) {
 		const char *name;
 
-		if (set_error_on_fail ( is_operator (state), context,  "Property element not expected here", error)) {
+		if (set_error_on_fail (is_operator (state), 
+                                       context,  
+                                       "Property element not expected here", 
+                                       error)) {
 			return;
 		}
 
-		name = get_attribute_value_required (context, "<rdfq:Property>", "name",
+		name = get_attribute_value_required (context, 
+                                                     "<rdfq:Property>", "name",
 						     attribute_names, attribute_values,
 						     error);
 
 		if (!name) {
 			return;
 		} else {
-
-			if (data->current_operator == OP_NONE ) {
-				set_error (error, context, PARSE_ERROR, "no operator found for Property \"%s\"", name);
+			if (data->current_operator == OP_NONE) {
+				set_error (error, 
+                                           context, 
+                                           PARSE_ERROR, 
+                                           "no operator found for Property \"%s\"", 
+                                           name);
 				return;
 			}
 
-			data->current_field =  g_strdup (name);
+			data->current_field = g_strdup (name);
 
 			push_stack (data, STATE_PROPERTY);
 		}
-
 	} else if (ELEMENT_IS (ELEMENT_RDF_AND)) {
-
-		if (set_error_on_fail ((state == STATE_CONDITION || is_logic (state) || is_end_logic (state) || is_end_operator (state)),
-				       context, "AND element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_CONDITION || 
+                                       is_logic (state) || 
+                                       is_end_logic (state) || 
+                                       is_end_operator (state),
+				       context, 
+                                       "AND element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		if (data->statement_count > 1) {
 			if (data->current_logic_operator == LOP_AND) {
-				data->sql_where = g_string_append (data->sql_where, " AND ");
+				data->sql_where = g_string_append (data->sql_where, 
+                                                                   " AND ");
 			} else {
 				if (data->current_logic_operator == LOP_OR) {
-					data->sql_where = g_string_append (data->sql_where, " OR ");
+					data->sql_where = g_string_append (data->sql_where,
+                                                                           " OR ");
 				}
 			}
 		}
@@ -468,20 +498,25 @@
 		data->sql_where = g_string_append (data->sql_where, " ( ");
 		data->current_logic_operator = LOP_AND;
 		push_stack (data, STATE_AND);
-
 	} else if (ELEMENT_IS (ELEMENT_RDF_OR)) {
-
-		if (set_error_on_fail ((state == STATE_CONDITION || is_logic (state) || is_end_logic (state) || is_end_operator (state)),
-				       context, "OR element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_CONDITION || 
+                                       is_logic (state) || 
+                                       is_end_logic (state) || 
+                                       is_end_operator (state),
+				       context,
+                                       "OR element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		if (data->statement_count > 1) {
 			if (data->current_logic_operator == LOP_AND) {
-				data->sql_where = g_string_append (data->sql_where, " AND ");
+				data->sql_where = g_string_append (data->sql_where, 
+                                                                   " AND ");
 			} else {
 				if (data->current_logic_operator == LOP_OR) {
-					data->sql_where = g_string_append (data->sql_where, " OR ");
+					data->sql_where = g_string_append (data->sql_where, 
+                                                                           " OR ");
 				}
 			}
 		}
@@ -492,18 +527,24 @@
 		push_stack (data, STATE_OR);
 
 	} else if (ELEMENT_IS (ELEMENT_RDF_NOT)) {
-
-		if (set_error_on_fail ((state == STATE_CONDITION || is_logic (state) || is_end_logic (state) || is_end_operator (state)),
-				       context, "NOT element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_CONDITION || 
+                                       is_logic (state) || 
+                                       is_end_logic (state) || 
+                                       is_end_operator (state),
+				       context, 
+                                       "NOT element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		if (data->statement_count > 1) {
 			if (data->current_logic_operator == LOP_AND) {
-				data->sql_where = g_string_append (data->sql_where, " AND ");
+				data->sql_where = g_string_append (data->sql_where, 
+                                                                   " AND ");
 			} else {
 				if (data->current_logic_operator == LOP_OR) {
-					data->sql_where = g_string_append (data->sql_where, " OR ");
+					data->sql_where = g_string_append (data->sql_where,
+                                                                           " OR ");
 				}
 			}
 		}
@@ -511,11 +552,14 @@
 		push_stack (data, STATE_NOT);
 
 	} else if (ELEMENT_IS (ELEMENT_RDF_EQUALS)) {
-
-		if (set_error_on_fail ( state == STATE_CONDITION || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "EQUALS element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_CONDITION ||
+                                       is_logic (state) ||
+                                       ((data->current_logic_operator == LOP_AND || 
+                                         data->current_logic_operator == LOP_OR) &&
+                                        is_end_operator (state)),
+                                       context,
+                                       "EQUALS element not expected here",
+                                       error)) {
 			return;
 		}
 
@@ -524,130 +568,149 @@
 
 	} else if (ELEMENT_IS (ELEMENT_RDF_GREATER_THAN)) {
 
-		if (set_error_on_fail ( state == STATE_CONDITION || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context,  "GREATERTHAN element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_CONDITION || 
+                                       is_logic (state) ||
+                                       ((data->current_logic_operator == LOP_AND || 
+                                         data->current_logic_operator == LOP_OR) &&
+                                        is_end_operator (state)),
+                                       context, 
+                                       "GREATERTHAN element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		data->current_operator = OP_GREATER;
 		push_stack (data, STATE_GREATER_THAN);
-
 	} else if (ELEMENT_IS (ELEMENT_RDF_GREATER_OR_EQUAL)) {
-
-		if (set_error_on_fail ( state == STATE_CONDITION || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "GREATEROREQUAL element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_CONDITION || 
+                                       is_logic (state) ||
+                                       ((data->current_logic_operator == LOP_AND || 
+                                         data->current_logic_operator == LOP_OR) &&
+                                        is_end_operator (state)),
+                                       context,
+                                       "GREATEROREQUAL element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		data->current_operator = OP_GREATER_EQUAL;
 		push_stack (data, STATE_GREATER_OR_EQUAL);
-
 	} else if (ELEMENT_IS (ELEMENT_RDF_LESS_THAN )) {
-
-		if (set_error_on_fail ( state == STATE_CONDITION || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "LESSTHAN element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_CONDITION || 
+                                       is_logic (state) ||
+                                       ((data->current_logic_operator == LOP_AND || 
+                                         data->current_logic_operator == LOP_OR) &&
+                                        is_end_operator (state)),
+                                       context,
+                                       "LESSTHAN element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		data->current_operator = OP_LESS;
 		push_stack (data, STATE_LESS_THAN);
-
-	} else if (ELEMENT_IS (ELEMENT_RDF_LESS_OR_EQUAL )) {
-
-		if (set_error_on_fail ( state == STATE_CONDITION || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "LESSOREQUAL element not expected here", error)) {
+	} else if (ELEMENT_IS (ELEMENT_RDF_LESS_OR_EQUAL)) {
+		if (set_error_on_fail (state == STATE_CONDITION || 
+                                       is_logic (state) || 
+                                       ((data->current_logic_operator == LOP_AND || 
+                                         data->current_logic_operator == LOP_OR) &&
+                                        is_end_operator (state)),
+                                       context, 
+                                       "LESSOREQUAL element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		data->current_operator = OP_LESS_EQUAL;
 		push_stack (data, STATE_LESS_OR_EQUAL);
-
 	} else if (ELEMENT_IS (ELEMENT_RDF_CONTAINS)) {
-
-		if (set_error_on_fail ( state == STATE_CONDITION || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "CONTAINS element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_CONDITION || 
+                                       is_logic (state) ||
+                                       ((data->current_logic_operator == LOP_AND || 
+                                         data->current_logic_operator == LOP_OR) &&
+                                        is_end_operator (state)),
+                                       context, 
+                                       "CONTAINS element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		data->current_operator = OP_CONTAINS;
 		push_stack (data, STATE_CONTAINS);
-
 	} else if (ELEMENT_IS (ELEMENT_RDF_REGEX)) {
-
-		if (set_error_on_fail ( state == STATE_CONDITION || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "REGEX element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_CONDITION || 
+                                       is_logic (state) ||
+                                       ((data->current_logic_operator == LOP_AND || 
+                                         data->current_logic_operator == LOP_OR) &&
+                                        is_end_operator (state)),
+                                       context, 
+                                       "REGEX element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		data->current_operator = OP_REGEX;
 		push_stack (data, STATE_REGEX);
-
 	} else if (ELEMENT_IS (ELEMENT_RDF_STARTS_WITH)) {
-
-		if (set_error_on_fail ( state == STATE_CONDITION || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "STARTSWITH element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_CONDITION ||
+                                       is_logic (state) ||
+                                       ((data->current_logic_operator == LOP_AND ||
+                                         data->current_logic_operator == LOP_OR) &&
+                                        is_end_operator (state)),
+                                       context, 
+                                       "STARTSWITH element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		data->current_operator = OP_STARTS;
 		push_stack (data, STATE_STARTS_WITH);
-
 	} else if (ELEMENT_IS (ELEMENT_RDF_IN_SET)) {
-
-		if (set_error_on_fail ( state == STATE_CONDITION || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "IN SET element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_CONDITION || 
+                                       is_logic (state) ||
+                                       ((data->current_logic_operator == LOP_AND ||
+                                         data->current_logic_operator == LOP_OR) &&
+                                        is_end_operator (state)),
+                                       context,
+                                       "IN SET element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		data->current_operator = OP_SET;
 		push_stack (data, STATE_IN_SET);
-
-
 	} else if (ELEMENT_IS (ELEMENT_RDF_INTEGER)) {
-
-		if (set_error_on_fail (state == STATE_PROPERTY, context, "INTEGER element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_PROPERTY, 
+                                       context, 
+                                       "INTEGER element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		push_stack (data, STATE_INTEGER);
-
-
 	} else if (ELEMENT_IS (ELEMENT_RDF_DATE)) {
-
-		if (set_error_on_fail (state == STATE_PROPERTY, context, "DATE element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_PROPERTY, 
+                                       context, 
+                                       "DATE element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		push_stack (data, STATE_DATE);
-
-
 	} else if (ELEMENT_IS (ELEMENT_RDF_STRING)) {
-
-		if (set_error_on_fail (state == STATE_PROPERTY, context, "STRING element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_PROPERTY, 
+                                       context, 
+                                       "STRING element not expected here", 
+                                       error)) {
 			return;
 		}
 
 		push_stack (data, STATE_STRING);
-
 	} else if (ELEMENT_IS (ELEMENT_RDF_FLOAT)) {
-
-		if (set_error_on_fail (state == STATE_PROPERTY, context, "FLOAT element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_PROPERTY, 
+                                       context,
+                                       "FLOAT element not expected here", 
+                                       error)) {
 			return;
 		}
 
@@ -655,9 +718,8 @@
 	}
 }
 
-
-static char *
-get_value (const char *value, gboolean quote)
+static gchar *
+get_value (const gchar *value, gboolean quote)
 {
 	if (quote) {
 		return g_strconcat (" '", value, "' ", NULL);
@@ -666,7 +728,6 @@
 	}
 }
 
-
 static gboolean
 build_sql (ParserData *data)
 {
@@ -1075,15 +1136,31 @@
 }
 	
 
-
-char *
-tracker_rdf_query_to_sql (DBConnection *db_con, const char *query, const char *service, char **fields, int field_count, const char *search_text, const char *keyword, gboolean sort_by_service, int offset, int limit, GError *error)
-{
-	static     gboolean inited = FALSE;
-	ParserData data;
-	char       *result;
-
-	g_return_val_if_fail (query != NULL, NULL);
+gchar *
+tracker_rdf_query_to_sql (TrackerDBInterface  *iface,
+                          const gchar         *query,
+                          const gchar         *service,
+                          gchar              **fields,
+                          gint                 field_count,
+                          const gchar         *search_text,
+                          const gchar         *keyword,
+                          gboolean             sort_by_service,
+                          gint                 offset,
+                          gint                 limit,
+                          GError              *error)
+{
+	static gboolean  inited = FALSE;
+	ParserData       data;
+	gchar           *result;
+ 	gchar           *table_name;
+	gboolean         do_search = FALSE;
+
+        g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL);
+        g_return_val_if_fail (query != NULL, NULL);
+        g_return_val_if_fail (service != NULL, NULL);
+        g_return_val_if_fail (fields != NULL, NULL);
+        g_return_val_if_fail (search_text != NULL, NULL);
+        g_return_val_if_fail (keyword != NULL, NULL);
 
 	if (!inited) {
 		error_quark = g_quark_from_static_string ("RDF-parser-error-quark");
@@ -1091,14 +1168,13 @@
 	}
 
 	memset (&data, 0, sizeof (data));
-	data.db_con = db_con;
+	data.iface = iface;
 	data.statement_count = 0;
-	data.service = (char *) service;
-
+	data.service = (gchar*) service;
 	data.sql_select = get_select_header (service);
 
 	if (field_count > 0) {
-		int i;
+		gint i;
 
 		for (i = 0; i < field_count; i++) {
 			TrackerFieldData *field_data;
@@ -1106,18 +1182,19 @@
 			field_data = add_metadata_field (&data, fields[i], TRUE, FALSE);
 
 			if (!field_data) {
-				g_critical ("RDF Query failed: field %s not found", fields[i]);
-				g_slist_foreach (data.fields, (GFunc) g_object_unref, NULL);
+				g_critical ("RDF Query failed, field:'%s' not found", 
+                                            fields[i]);
+				g_slist_foreach (data.fields, 
+                                                 (GFunc) g_object_unref, 
+                                                 NULL);
 				g_slist_free (data.fields);
 				g_string_free (data.sql_select, TRUE);
+
 				return NULL;
 			}
 		}
 	}
 
-	char *table_name;
-	gboolean do_search = FALSE;
-
 	table_name = "Services";
 
 	data.sql_from = g_string_new ("");
@@ -1127,23 +1204,39 @@
 
 	if (!tracker_is_empty_string (search_text)) {
 		do_search = TRUE;
-		g_string_append_printf (data.sql_from, "\n FROM %s S INNER JOIN SearchResults1 M ON S.ID = M.SID ", table_name);
+		g_string_append_printf (data.sql_from,
+                                        "\n FROM %s S INNER JOIN SearchResults1 M ON S.ID = M.SID ", 
+                                        table_name);
 	} else {
-		g_string_append_printf (data.sql_from, "\n FROM %s S ", table_name);
+		g_string_append_printf (data.sql_from,
+                                        "\n FROM %s S ", 
+                                        table_name);
 	}
 
 	if (!tracker_is_empty_string (keyword)) {
-		char *keyword_metadata = tracker_get_related_metadata_names (db_con, "DC:Keywords");
-		g_string_append_printf (data.sql_from, "\n INNER JOIN ServiceKeywordMetaData K ON S.ID = K.ServiceID and K.MetaDataID in (%s) and K.MetaDataValue = '%s' ", keyword_metadata, keyword);
+		gchar *keyword_metadata;
+
+                keyword_metadata = tracker_db_metadata_get_related_names (iface, 
+                                                                          "DC:Keywords");
+		g_string_append_printf (data.sql_from, 
+                                        "\n INNER JOIN ServiceKeywordMetaData K ON S.ID = K.ServiceID and K.MetaDataID in (%s) and K.MetaDataValue = '%s' ", 
+                                        keyword_metadata, 
+                                        keyword);
 		g_free (keyword_metadata);
 	} 
 
 	data.sql_where = g_string_new ("");
 
 	if (strlen (query) < 10) {
-		g_string_append_printf (data.sql_where, "\n WHERE (S.ServiceTypeID in (select TypeId from ServiceTypes where TypeName = '%s' or Parent = '%s')) ", service, service);
+		g_string_append_printf (data.sql_where, 
+                                        "\n WHERE (S.ServiceTypeID in (select TypeId from ServiceTypes where TypeName = '%s' or Parent = '%s')) ", 
+                                        service, 
+                                        service);
 	} else {
-		g_string_append_printf (data.sql_where, "\n WHERE (S.ServiceTypeID in (select TypeId from ServiceTypes where TypeName = '%s' or Parent = '%s')) AND ", service, service);
+		g_string_append_printf (data.sql_where, 
+                                        "\n WHERE (S.ServiceTypeID in (select TypeId from ServiceTypes where TypeName = '%s' or Parent = '%s')) AND ", 
+                                        service, 
+                                        service);
 	}
 
 	if (limit < 1) {
@@ -1156,7 +1249,6 @@
 		} else {
 			data.sql_order = g_string_new ("\n ORDER BY S.ServiceTypeID, uri LIMIT ");
 		}
-
 	} else {
 		if (do_search) {
 			data.sql_order = g_string_new ("\n ORDER BY M.Score desc LIMIT ");
@@ -1206,8 +1298,8 @@
 			} else {
 				gchar *related_metadata;
 
-                                related_metadata = tracker_get_related_metadata_names (db_con, 
-                                                                                       tracker_field_data_get_field_name (l->data));
+                                related_metadata = tracker_db_metadata_get_related_names (iface, 
+                                                                                          tracker_field_data_get_field_name (l->data));
 				g_string_append_printf (data.sql_from, 
                                                         "\n INNER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ", 
                                                         tracker_field_data_get_table_name (l->data), 

Modified: branches/xesam-support/src/trackerd/tracker-rdf-query.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-rdf-query.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-rdf-query.h	Mon Jun  9 15:41:07 2008
@@ -23,21 +23,21 @@
 
 #include <glib.h>
 
-#include "tracker-db.h"
+#include <libtracker-db/tracker-db-manager.h>
 
 G_BEGIN_DECLS
 
-char *tracker_rdf_query_to_sql (DBConnection  *db_con,
-                                const char    *query,
-                                const char    *service,
-                                char         **fields,
-                                int            field_count,
-                                const char    *search_text,
-                                const char    *keyword,
-                                gboolean       sort_by_service,
-                                int            offset,
-                                int            limit,
-                                GError        *error);
+gchar *tracker_rdf_query_to_sql (TrackerDBInterface  *iface,
+				 const gchar         *query,
+				 const gchar         *service,
+				 gchar              **fields,
+				 gint                 field_count,
+				 const gchar         *search_text,
+				 const gchar         *keyword,
+				 gboolean             sort_by_service,
+				 gint                 offset,
+				 gint                 limit,
+				 GError              *error);
 
 G_END_DECLS
 

Modified: branches/xesam-support/src/trackerd/tracker-search.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-search.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-search.c	Mon Jun  9 15:41:07 2008
@@ -32,7 +32,9 @@
 #include <libtracker-common/tracker-utils.h>
 
 #include <libtracker-db/tracker-db-dbus.h>
+#include <libtracker-db/tracker-db-manager.h>
 
+#include "tracker-db.h"
 #include "tracker-dbus.h"
 #include "tracker-search.h"
 #include "tracker-rdf-query.h"
@@ -46,7 +48,6 @@
 
 typedef struct {
 	DBusGProxy      *fd_proxy;
-	DBConnection    *db_con;
 	TrackerConfig   *config;
 	TrackerLanguage *language;
         Indexer         *file_index;
@@ -55,7 +56,6 @@
 
 enum {
 	PROP_0,
-	PROP_DB_CONNECTION,
 	PROP_CONFIG,
 	PROP_LANGUAGE,
 	PROP_FILE_INDEX,
@@ -81,12 +81,6 @@
 	object_class->set_property = search_set_property;
 
 	g_object_class_install_property (object_class,
-					 PROP_DB_CONNECTION,
-					 g_param_spec_pointer ("db-connection",
-							       "DB connection",
-							       "Database connection to use in transactions",
-							       G_PARAM_WRITABLE));
-	g_object_class_install_property (object_class,
 					 PROP_CONFIG,
 					 g_param_spec_object ("config",
 							      "Config",
@@ -146,10 +140,6 @@
 	priv = GET_PRIV (object);
 
 	switch (param_id) {
-	case PROP_DB_CONNECTION:
-		tracker_search_set_db_connection (TRACKER_SEARCH (object),
-						  g_value_get_pointer (value));
-		break;
 	case PROP_CONFIG:
 		tracker_search_set_config (TRACKER_SEARCH (object),
 					   g_value_get_object (value));
@@ -173,31 +163,9 @@
 }
 
 TrackerSearch *
-tracker_search_new (DBConnection *db_con)
+tracker_search_new (void)
 {
-	TrackerSearch *object;
-
-	object = g_object_new (TRACKER_TYPE_SEARCH, 
-			       "db-connection", db_con,
-			       NULL);
-	
-	return object;
-}
-
-void
-tracker_search_set_db_connection (TrackerSearch *object,
-				  DBConnection  *db_con)
-{
-	TrackerSearchPriv *priv;
-
-	g_return_if_fail (TRACKER_IS_SEARCH (object));
-	g_return_if_fail (db_con != NULL);
-
-	priv = GET_PRIV (object);
-
-	priv->db_con = db_con;
-	
-	g_object_notify (G_OBJECT (object), "db-connection");
+	return g_object_new (TRACKER_TYPE_SEARCH, NULL); 
 }
 
 void
@@ -602,7 +570,6 @@
 	TrackerQueryTree  *tree;
 	GArray            *array;
 	guint              request_id;
-	DBConnection      *db_con;
 	gint               services[12];
         gint               count = 0;
 
@@ -612,10 +579,6 @@
 	tracker_dbus_return_val_if_fail (search_text != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (value != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
                                   "DBus request to get hit count, "
 				  "service:'%s', search text:'%s'",
@@ -637,9 +600,6 @@
 		return FALSE;
         }
 
-	/* Check we have the right database connection */
-	db_con = tracker_db_get_service_connection (db_con, service);
-
 	services[count++] = tracker_ontology_get_id_for_service_type (service);
 
 	if (strcmp (service, "Files") == 0) {
@@ -664,7 +624,7 @@
 	array = g_array_new (TRUE, TRUE, sizeof (gint));
 	g_array_append_vals (array, services, G_N_ELEMENTS (services));
 	tree = tracker_query_tree_new (search_text, 
-				       db_con->word_index, 
+				       priv->file_index, 
 				       priv->config,
 				       priv->language,
 				       array);
@@ -689,7 +649,6 @@
         GArray             *hit_counts;
 	GArray             *mail_hit_counts;
 	guint               request_id;
-	DBConnection       *db_con;
 	guint               i;
 
 	request_id = tracker_dbus_get_next_request_id ();
@@ -698,8 +657,6 @@
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
 	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
 	
 	tracker_dbus_request_new (request_id,
                                   "DBus request to get search hit count for all, "
@@ -714,7 +671,7 @@
         }
 
         tree = tracker_query_tree_new (search_text, 
-				       db_con->word_index, 
+				       priv->file_index, 
 				       priv->config,
 				       priv->language,
 				       NULL);
@@ -773,10 +730,9 @@
 		     gchar         ***values,
 		     GError         **error)
 {
-	TrackerSearchPriv   *priv;
+	TrackerDBInterface  *iface;
 	TrackerDBResultSet  *result_set;
 	guint               request_id;
-	DBConnection        *db_con;
         gchar              **strv = NULL;
 
 	request_id = tracker_dbus_get_next_request_id ();
@@ -785,10 +741,6 @@
 	tracker_dbus_return_val_if_fail (search_text != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
 	tracker_dbus_request_new (request_id,
                                   "DBus request to search text, "
 				  "query id:%d, service:'%s', search text:'%s', "
@@ -814,10 +766,9 @@
 		return FALSE;
         }
 
-	/* Check we have the right database connection */
-	db_con = tracker_db_get_service_connection (db_con, service);
+	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
 
-	result_set = tracker_db_search_text (db_con, 
+	result_set = tracker_db_search_text (iface, 
 					     service, 
 					     search_text, 
 					     offset, 
@@ -878,10 +829,9 @@
 			      GPtrArray     **values,
 			      GError        **error)
 {
-	TrackerSearchPriv  *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
 	guint               request_id;
-	DBConnection       *db_con;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -889,10 +839,6 @@
 	tracker_dbus_return_val_if_fail (search_text != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-	
         tracker_dbus_request_new (request_id,
                                   "DBus request to search text detailed, "
 				  "query id:%d, service:'%s', search text:'%s', "
@@ -918,10 +864,9 @@
 		return FALSE;
         }
 
-	/* Check we have the right database connection */
-	db_con = tracker_db_get_service_connection (db_con, service);
+	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
 
-	result_set = tracker_db_search_text (db_con, 
+	result_set = tracker_db_search_text (iface, 
 					     service, 
 					     search_text, 
 					     offset, 
@@ -949,9 +894,9 @@
 			    GError        **error)
 {
 	TrackerSearchPriv  *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
 	guint               request_id;
-	DBConnection       *db_con;
         gchar              *snippet = NULL;
         gchar              *service_id;
 
@@ -964,8 +909,6 @@
 
 	priv = GET_PRIV (object);
 
-	db_con = priv->db_con;
-	
         tracker_dbus_request_new (request_id,
                                   "DBus request to get snippet, "
 				  "service:'%s', search text:'%s', id:'%s'",
@@ -988,10 +931,9 @@
 		return FALSE;
         }
 
-	/* Check we have the right database connection */
-	db_con = tracker_db_get_service_connection (db_con, service);
+	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
 
-	service_id = tracker_db_get_id (db_con, service, id);
+	service_id = tracker_db_file_get_id_as_string (iface, service, id);
         if (!service_id) {
 		tracker_dbus_request_failed (request_id,
 					     error, 
@@ -999,11 +941,13 @@
                                              id);
                 return FALSE;
         }
+
+	iface = tracker_db_manager_get_db_interface_by_service (service, TRUE);
              
-	result_set = tracker_exec_proc (db_con->blob, 
-					"GetAllContents", 
-					service_id, 
-					NULL);
+	result_set = tracker_db_exec_proc (iface, 
+					   "GetAllContents", 
+					   service_id, 
+					   NULL);
         g_free (service_id);
 
 	if (result_set) {
@@ -1047,20 +991,15 @@
 			      GHashTable    **values,
 			      GError        **error)
 {
-	TrackerSearchPriv  *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
 	guint               request_id;
-	DBConnection       *db_con;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
 	tracker_dbus_return_val_if_fail (search_text != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-
         tracker_dbus_request_new (request_id,
                                   "DBus request to search files by text, "
 				  "query id:%d, search text:'%s', offset:%d"
@@ -1071,11 +1010,19 @@
                                   max_hits,
                                   group_results ? "yes" : "no");
 
-	result_set = tracker_db_search_files_by_text (db_con, 
-						      search_text, 
-						      offset, 
-						      search_sanity_check_max_hits (max_hits),
-						      group_results);
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_FILE_METADATA);
+
+	/* FIXME: This function no longer exists, it was returning
+	 * NULL in every case, this DBus function needs rewriting or
+	 * to be removed.
+	 */
+	result_set = NULL;
+
+	/* result_set = tracker_db_search_files_by_text (iface,  */
+	/* 					      search_text,  */
+	/* 					      offset,  */
+	/* 					      search_sanity_check_max_hits (max_hits), */
+	/* 					      group_results); */
 
 	*values = tracker_dbus_query_result_to_hash_table (result_set);
 
@@ -1098,10 +1045,9 @@
 			 gchar         ***values,
 			 GError         **error)
 {
-	TrackerSearchPriv  *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
 	guint               request_id;
-	DBConnection       *db_con; 
 
         /* FIXME: This function is completely redundant */
 
@@ -1112,10 +1058,6 @@
 	tracker_dbus_return_val_if_fail (search_text != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-
         tracker_dbus_request_new (request_id,
                                   "DBus request to search metadata, "
 				  "service:'%s', search text:'%s', field:'%s', "
@@ -1134,15 +1076,20 @@
 		return FALSE;
 	}
 
-	/* result_set = tracker_db_search_metadata (db_con,  */
+	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
+
+	/* FIXME: This function no longer exists, it was returning
+	 * NULL in every case, this DBus function needs rewriting or
+	 * to be removed.
+	 */
+        result_set = NULL;
+
+	/* result_set = tracker_db_search_metadata (iface,  */
 	/* 					 service,  */
 	/* 					 field,  */
 	/* 					 text,  */
 	/* 					 offset,  */
 	/* 					 search_sanity_check_max_hits (max_hits)); */
-
-        result_set = NULL;
-
 	*values = tracker_dbus_query_result_to_strv (result_set, NULL);
 
 	if (result_set) {
@@ -1162,10 +1109,9 @@
 				GHashTable    **values,
 				GError        **error)
 {
-	TrackerSearchPriv  *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
 	guint               request_id;
-	DBConnection       *db_con;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -1173,10 +1119,6 @@
 	tracker_dbus_return_val_if_fail (id != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (search_text != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
-
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
 	
         tracker_dbus_request_new (request_id,
                                   "DBus request to search matching fields, "
@@ -1200,13 +1142,18 @@
 		return FALSE;
         }
 
-	/* Check we have the right database connection */
-	db_con = tracker_db_get_service_connection (db_con, service);
+	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
+
+	/* FIXME: This function no longer exists, it was returning
+	 * NULL in every case, this DBus function needs rewriting or
+	 * to be removed.
+	 */
+        result_set = NULL;
 
-	result_set = tracker_db_search_matching_metadata (db_con, 
-							  service, 
-							  id, 
-							  search_text);
+	/* result_set = tracker_db_search_matching_metadata (iface,  */
+	/* 						  service,  */
+	/* 						  id,  */
+	/* 						  search_text); */
 	*values = tracker_dbus_query_result_to_hash_table (result_set);
 
 	if (result_set) {
@@ -1232,10 +1179,9 @@
 		      GPtrArray     **values,
 		      GError        **error)
 {
-	TrackerSearchPriv  *priv;
+	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
 	guint               request_id;
-	DBConnection       *db_con;
 
 	request_id = tracker_dbus_get_next_request_id ();
 
@@ -1246,10 +1192,6 @@
 	tracker_dbus_return_val_if_fail (query_condition != NULL, FALSE, error);
 	tracker_dbus_return_val_if_fail (values != NULL, FALSE, error);
 
-	priv = GET_PRIV (object);
-
-	db_con = priv->db_con;
-
         tracker_dbus_request_new (request_id,
                                   "DBus request to search query, "
 				  "query id:%d, service:'%s', search text '%s', "
@@ -1274,6 +1216,8 @@
 
 	result_set = NULL;
 
+	iface = tracker_db_manager_get_db_interface_by_service (service, FALSE);
+
 	if (query_condition) {
 		GError *query_error = NULL;
 		gchar  *query_translated;
@@ -1285,7 +1229,7 @@
 					      search_text,
 					      keyword);
 	
-		query_translated = tracker_rdf_query_to_sql (db_con, 
+		query_translated = tracker_rdf_query_to_sql (iface, 
                                                              query_condition, 
                                                              service, 
                                                              fields, 
@@ -1316,10 +1260,8 @@
 					      "Translated RDF query:'%s'",
 					      query_translated);
 
-		db_con = tracker_db_get_service_connection (db_con, service);
-
 		if (!tracker_is_empty_string (search_text)) {
-			tracker_db_search_text (db_con, 
+			tracker_db_search_text (iface, 
                                                 service, 
                                                 search_text, 
                                                 0, 
@@ -1328,7 +1270,9 @@
                                                 FALSE);
 		}
 
-		result_set = tracker_db_interface_execute_query (db_con->db, NULL, query_translated);
+		result_set = tracker_db_interface_execute_query (iface, 
+								 NULL, 
+								 query_translated);
 		g_free (query_translated);
 	}
 

Modified: branches/xesam-support/src/trackerd/tracker-search.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-search.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-search.h	Mon Jun  9 15:41:07 2008
@@ -26,7 +26,6 @@
 
 #include <libtracker-common/tracker-language.h>
 
-#include "tracker-db-sqlite.h"
 #include "tracker-indexer.h"
 
 #define TRACKER_SEARCH_SERVICE         "org.freedesktop.Tracker"
@@ -54,9 +53,7 @@
 };
 
 GType          tracker_search_get_type          (void);
-TrackerSearch *tracker_search_new               (DBConnection      *db_con);
-void           tracker_search_set_db_connection (TrackerSearch     *object,
-						 DBConnection      *db_con);
+TrackerSearch *tracker_search_new               (void);
 void           tracker_search_set_config        (TrackerSearch     *object,
 						 TrackerConfig     *config);
 void           tracker_search_set_language      (TrackerSearch     *object,

Modified: branches/xesam-support/src/trackerd/tracker-utils.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-utils.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-utils.c	Mon Jun  9 15:41:07 2008
@@ -66,56 +66,6 @@
 }
 
 void
-tracker_notify_file_data_available (void)
-{
-	gint revs = 0;
-
-	if (!tracker->is_running) {
-		return;
-	}
-
-	/* If file thread is asleep then we just need to wake it up! */
-	if (g_mutex_trylock (tracker->files_signal_mutex)) {
-		g_cond_signal (tracker->files_signal_cond);
-		g_mutex_unlock (tracker->files_signal_mutex);
-		return;
-	}
-
-	/* If busy - check if async queue has new stuff as we do not need to notify then */
-	if (tracker_process_files_process_queue_length () > 1) {
-		return;
-	}
-
-	/* If file thread not in check phase then we need do nothing */
-	if (g_mutex_trylock (tracker->files_check_mutex)) {
-		g_mutex_unlock (tracker->files_check_mutex);
-		return;
-	}
-
-	/* We are in check phase - we need to wait until either
-	 * check_mutex is unlocked or file thread is asleep then
-	 * awaken it.
-	 */
-	while (revs < 100000) {
-		if (g_mutex_trylock (tracker->files_check_mutex)) {
-			g_mutex_unlock (tracker->files_check_mutex);
-			return;
-		}
-
-		if (g_mutex_trylock (tracker->files_signal_mutex)) {
-			g_cond_signal (tracker->files_signal_cond);
-			g_mutex_unlock (tracker->files_signal_mutex);
-			return;
-		}
-
-		g_thread_yield ();
-		g_usleep (10);
-
-		revs++;
-	}
-}
-
-void
 tracker_add_metadata_to_table (GHashTable  *meta_table, 
 			       const gchar *key, 
 			       const gchar *value)

Modified: branches/xesam-support/src/trackerd/tracker-watcher-fam.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-watcher-fam.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-watcher-fam.c	Mon Jun  9 15:41:07 2008
@@ -197,6 +197,7 @@
 
 					g_free (parent);
 				} else {
+					
 					if (event_type == TRACKER_ACTION_CREATE) {
 						tracker_db_insert_pending_file (main_thread_db_con,
                                                                                 info->file_id, 

Modified: branches/xesam-support/src/trackerd/tracker-watcher-inotify.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-watcher-inotify.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-watcher-inotify.c	Mon Jun  9 15:41:07 2008
@@ -41,6 +41,7 @@
 
 #include <libtracker-db/tracker-db-action.h>
 #include <libtracker-db/tracker-db-file-info.h>
+#include <libtracker-db/tracker-db-manager.h>
 
 #include "tracker-watcher.h"
 #include "tracker-process-files.h"
@@ -54,7 +55,6 @@
                            guint32          cookie);
 
 extern Tracker	    *tracker;
-extern DBConnection *main_thread_db_con;
 
 static GIOChannel   *channel;
 static GSList 	    *move_list;
@@ -147,7 +147,6 @@
 
 		if (tracker_file_is_valid (parent)) {
                         tracker_process_files_process_queue_push (info);
-			tracker_notify_file_data_available ();
 		} else {
 			tracker_db_file_info_free (info);
                         info = NULL;
@@ -349,6 +348,10 @@
 static gboolean
 process_inotify_events (void)
 {
+	TrackerDBInterface *iface_cache;
+
+	iface_cache = tracker_db_manager_get_db_interface (TRACKER_DB_CACHE);
+
 	while (g_queue_get_length (event_queue) > 0) {
 		TrackerDBResultSet   *result_set;
 		TrackerDBAction       action_type;
@@ -389,10 +392,11 @@
 		/* Get watch name as monitor */
 		str_wd = g_strdup_printf ("%d", event->wd);
 
-		result_set = tracker_exec_proc (main_thread_db_con->cache, 
-                                                "GetWatchUri", 
-                                                str_wd, 
-                                                NULL);
+		
+		result_set = tracker_db_exec_proc (iface_cache, 
+						   "GetWatchUri", 
+						   str_wd, 
+						   NULL);
 		g_free (str_wd);
 
 		if (result_set) {
@@ -559,20 +563,17 @@
 }
 
 gboolean
-tracker_watcher_add_dir (const gchar  *dir, 
-                         DBConnection *db_con)
+tracker_watcher_add_dir (const gchar        *dir, 
+                         TrackerDBInterface *iface)
 {
-	gchar           *dir_in_locale;
-	static gboolean  limit_exceeded = FALSE;
+	TrackerDBInterface *iface_cache;
+	gchar              *dir_in_locale;
+	static gboolean     limit_exceeded = FALSE;
 
 	g_return_val_if_fail (dir != NULL, FALSE);
 	g_return_val_if_fail (dir[0] == G_DIR_SEPARATOR, FALSE);
 
-	if (!tracker->is_running) {
-		return FALSE;
-	}
-
-	if (tracker_watcher_is_dir_watched (dir, db_con)) {
+	if (tracker_watcher_is_dir_watched (dir, iface)) {
 		return FALSE;
 	}
 
@@ -619,8 +620,10 @@
 			return FALSE;
 		}
 
+		iface_cache = tracker_db_manager_get_db_interface (TRACKER_DB_CACHE);
+
 		str_wd = g_strdup_printf ("%d", wd);
-		tracker_exec_proc (db_con->cache, "InsertWatch", dir, str_wd, NULL);
+		tracker_db_exec_proc (iface_cache, "InsertWatch", dir, str_wd, NULL);
 		g_free (str_wd);
 
 		monitor_count++;
@@ -636,10 +639,11 @@
 }
 
 void
-tracker_watcher_remove_dir (const gchar  *dir, 
-                            gboolean      delete_subdirs,
-                            DBConnection *db_con)
+tracker_watcher_remove_dir (const gchar        *dir, 
+                            gboolean            delete_subdirs,
+                            TrackerDBInterface *iface)
 {
+	TrackerDBInterface *iface_cache;
 	TrackerDBResultSet *result_set;
 	gboolean            valid = TRUE;
 	gint                wd;
@@ -647,7 +651,8 @@
 	g_return_if_fail (dir != NULL);
 	g_return_if_fail (dir[0] == G_DIR_SEPARATOR);
 
-	result_set = tracker_exec_proc (db_con->cache, "GetWatchID", dir, NULL);
+	iface_cache = tracker_db_manager_get_db_interface (TRACKER_DB_CACHE);
+	result_set = tracker_db_exec_proc (iface_cache, "GetWatchID", dir, NULL);
 
 	wd = -1;
 
@@ -659,8 +664,7 @@
 
 	tracker_db_result_set_get (result_set, 0, &wd, -1);
 	g_object_unref (result_set);
-
-	tracker_exec_proc (db_con->cache, "DeleteWatch", dir, NULL);
+	tracker_db_exec_proc (iface_cache, "DeleteWatch", dir, NULL);
 
 	if (wd > -1) {
 		inotify_rm_watch (monitor_fd, wd);
@@ -671,7 +675,7 @@
 		return;
 	}
 
-	result_set = tracker_db_get_sub_watches (db_con, dir);
+	result_set = tracker_db_uri_sub_watches_get (dir);
 
 	if (!result_set) {
 		return;
@@ -690,24 +694,22 @@
 	}
 
 	g_object_unref (result_set);
-	tracker_db_delete_sub_watches (db_con, dir);
+	tracker_db_uri_sub_watches_delete (dir);
 }
 
 gboolean
-tracker_watcher_is_dir_watched (const char   *dir, 
-                                DBConnection *db_con)
+tracker_watcher_is_dir_watched (const char         *dir, 
+                                TrackerDBInterface *iface)
 {
+	TrackerDBInterface *iface_cache;
 	TrackerDBResultSet *result_set;
 	gint                id;
 
         g_return_val_if_fail (dir != NULL, FALSE);
         g_return_val_if_fail (dir[0] == G_DIR_SEPARATOR, FALSE);
 
-	if (!tracker->is_running) {
-		return FALSE;
-	}
-
-	result_set = tracker_exec_proc (db_con->cache, "GetWatchID", dir, NULL);
+	iface_cache = tracker_db_manager_get_db_interface (TRACKER_DB_CACHE);
+	result_set = tracker_db_exec_proc (iface_cache, "GetWatchID", dir, NULL);
 
 	if (!result_set) {
 		return FALSE;

Modified: branches/xesam-support/src/trackerd/tracker-watcher.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-watcher.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-watcher.h	Mon Jun  9 15:41:07 2008
@@ -28,13 +28,13 @@
 
 gboolean tracker_watcher_init           (void);
 void     tracker_watcher_shutdown       (void);
-gboolean tracker_watcher_add_dir        (const char   *dir,
-					 DBConnection *db_con);
-void     tracker_watcher_remove_dir     (const char   *dir,
-					 gboolean      delete_subdirs,
-					 DBConnection *db_con);
-gboolean tracker_watcher_is_dir_watched (const char   *dir,
-					 DBConnection *db_con);
+gboolean tracker_watcher_add_dir        (const char         *dir,
+					 TrackerDBInterface *iface);
+void     tracker_watcher_remove_dir     (const char         *dir,
+					 gboolean            delete_subdirs,
+					 TrackerDBInterface *iface);
+gboolean tracker_watcher_is_dir_watched (const char         *dir,
+					 TrackerDBInterface *iface);
 gint     tracker_watcher_get_dir_count  (void);
 
 G_END_DECLS

Modified: branches/xesam-support/src/trackerd/tracker-xesam-live-search.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-xesam-live-search.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-xesam-live-search.c	Mon Jun  9 15:41:07 2008
@@ -28,6 +28,7 @@
 #include "tracker-xesam-manager.h"
 #include "tracker-xesam-query.h"
 #include "tracker-dbus.h"
+#include "tracker-db.h"
 
 struct _TrackerXesamLiveSearchPriv {
 	TrackerXesamSession *session;
@@ -268,7 +269,10 @@
 
 /* Created and Modified items */
 static void
-get_hits_added_modified (TrackerXesamLiveSearch *self, MatchWithEventsFlags flags, DBConnection *db_con, GArray **added, GArray **modified) 
+get_hits_added_modified (TrackerXesamLiveSearch  *self, 
+			 TrackerDBInterface      *iface, 
+			 GArray                 **added, 
+			 GArray                 **modified) 
 {
 	gboolean            ls_valid = TRUE;
 	GArray             *m_added = NULL;
@@ -278,11 +282,11 @@
 	/* Right now we are ignoring flags (both creates and updates are 
 	 * searched) */
 
-	result_set = tracker_db_get_live_search_new_ids (db_con, 
-		tracker_xesam_live_search_get_id (self),
-		tracker_xesam_live_search_get_from_query (self),
-		tracker_xesam_live_search_get_join_query (self),
-		tracker_xesam_live_search_get_where_query (self)); /* Query */
+	result_set = tracker_db_live_search_get_new_ids (iface, 
+							 tracker_xesam_live_search_get_id (self),
+							 tracker_xesam_live_search_get_from_query (self),
+							 tracker_xesam_live_search_get_join_query (self),
+							 tracker_xesam_live_search_get_where_query (self)); /* Query */
 
 	if (!result_set)
 		return;
@@ -333,42 +337,46 @@
 	*modified = m_modified;
 }
 
-
-
 /* Created and Modified items */
 static void
-get_all_hits (TrackerXesamLiveSearch *self, DBConnection *db_con, GArray **hits) 
+get_all_hits (TrackerXesamLiveSearch  *self, 
+	      TrackerDBInterface      *iface, 
+	      GArray                 **hits) 
 {
-	gboolean            ls_valid = TRUE;
-	GArray             *m_hits = NULL;
 	TrackerDBResultSet *result_set;
+	gboolean            valid;
 
-	result_set = tracker_db_get_live_search_all_ids (db_con, 
-		tracker_xesam_live_search_get_id (self));
+	g_return_if_fail (hits != NULL);
 
-	if (!result_set)
+	*hits = NULL;
+
+	result_set = tracker_db_live_search_get_all_ids (iface, 
+							 tracker_xesam_live_search_get_id (self));
+	
+	if (!result_set) {
 		return;
+	}
 
-	while (ls_valid) {
+	valid = TRUE;
+
+	while (valid) {
 		GValue ls_value = { 0, };
-		gint ls_i_value;
+		gint   ls_i_value;
 
 		_tracker_db_result_set_get_value (result_set, 0, &ls_value);
-
 		ls_i_value = g_value_get_int (&ls_value);
 
-		if (m_hits == NULL)
-			m_hits = g_array_new (FALSE, TRUE, sizeof (guint32));
-		g_array_append_val (m_hits, ls_i_value);
+		if (*hits == NULL) {
+			*hits = g_array_new (FALSE, TRUE, sizeof (guint32));
+		}
 
+		g_array_append_val (*hits, ls_i_value);
 		g_value_unset (&ls_value);
 
-		ls_valid = tracker_db_result_set_iter_next (result_set);
+		valid = tracker_db_result_set_iter_next (result_set);
 	}
 
 	g_object_unref (result_set);
-
-	*hits = m_hits;
 }
 
 
@@ -382,61 +390,70 @@
  * Find all items that match with the current events for @self.
  **/
 void
-tracker_xesam_live_search_match_with_events (TrackerXesamLiveSearch *self, MatchWithEventsFlags flags, GArray **added, GArray **removed, GArray **modified)
+tracker_xesam_live_search_match_with_events (TrackerXesamLiveSearch  *self,
+					     MatchWithEventsFlags     flags,
+					     GArray                 **added, 
+					     GArray                 **removed, 
+					     GArray                 **modified)
 {
-	DBConnection       *db_con = NULL;
-	GArray             *m_added = NULL;
-	GArray             *m_removed = NULL;
-	GArray             *m_modified = NULL;
-
-	GObject *xesam = tracker_dbus_get_object (TRACKER_TYPE_XESAM);
+	TrackerDBInterface *iface;
+	TrackerDBResultSet *result_set;
+	GObject            *xesam;
 
-	g_object_get (xesam, "db-connection", &db_con, NULL);
+	g_return_if_fail (TRACKER_IS_XESAM_LIVE_SEARCH (self));
+	g_return_if_fail (added != NULL);
+	g_return_if_fail (removed != NULL);
+	g_return_if_fail (modified != NULL);
 
-	if (flags & MATCH_WITH_EVENTS_DELETES) {
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_XESAM);
+	xesam = tracker_dbus_get_object (TRACKER_TYPE_XESAM);
 
-		TrackerDBResultSet *result_set;
-		gboolean            ls_valid = TRUE;
+	*added = NULL;
+	*removed = NULL;
+	*modified = NULL;
 
+	if (flags & MATCH_WITH_EVENTS_DELETES) {
 		/* Deleted items */
-		result_set = tracker_db_get_live_search_deleted_ids (db_con, 
-			tracker_xesam_live_search_get_id (self));
-
-		if (!result_set)
-			goto part_two;
+		result_set = tracker_db_live_search_get_deleted_ids (iface, 
+								     tracker_xesam_live_search_get_id (self));
 
-		while (ls_valid) {
-			GValue ls_value = { 0, };
-			gint ls_i_value;
-
-			_tracker_db_result_set_get_value (result_set, 0, &ls_value);
-			ls_i_value = g_value_get_int (&ls_value);
+		if (result_set) {
+			gboolean valid;
 
-			if (m_removed == NULL)
-				m_removed = g_array_new (FALSE, TRUE, sizeof (guint32));
-			g_array_append_val (m_removed, ls_i_value);
+			valid = TRUE;
 
-			g_value_unset (&ls_value);
+			while (valid) {
+				GValue ls_value = { 0, };
+				gint   ls_i_value;
+			
+				_tracker_db_result_set_get_value (result_set, 
+								  0, 
+								  &ls_value);
+				ls_i_value = g_value_get_int (&ls_value);
+			
+				if (*removed == NULL) {
+					*removed = g_array_new (FALSE, 
+								TRUE, 
+								sizeof (guint32));
+				}
 
-			ls_valid = tracker_db_result_set_iter_next (result_set);
+				g_array_append_val (*removed, ls_i_value);
+				g_value_unset (&ls_value);
+			
+				valid = tracker_db_result_set_iter_next (result_set);
+			}
+		
+			g_object_unref (result_set);
 		}
-
-		g_object_unref (result_set);
 	}
 
-part_two:
-
-	/* Created and Modified items */
 	if (flags & MATCH_WITH_EVENTS_CREATES || flags & MATCH_WITH_EVENTS_MODIFIES) {
-		get_hits_added_modified (self, flags, db_con, &m_added, &m_modified);
+		/* Created and Modified items */
+		get_hits_added_modified (self, iface, added, modified);
 	}
-
-	*added = m_added;
-	*removed = m_removed;
-	*modified = m_modified;
-
 }
 
+
 /**
  * tracker_xesam_live_search_close:
  * @self: a #TrackerXesamLiveSearch
@@ -460,13 +477,11 @@
 			     TRACKER_XESAM_ERROR_SEARCH_CLOSED,
 			     "Search was already closed");
 	} else {
-		DBConnection *db_con = NULL;
-		GObject      *xesam;
+		TrackerDBInterface *iface;
 		
-		xesam = tracker_dbus_get_object (TRACKER_TYPE_XESAM);
+		iface = tracker_db_manager_get_db_interface (TRACKER_DB_XESAM);
 
-		g_object_get (xesam, "db-connection", &db_con, NULL);
-		tracker_db_stop_live_search (db_con, 
+		tracker_db_live_search_stop (iface, 
 					     tracker_xesam_live_search_get_id (self));
 	}
 
@@ -503,15 +518,13 @@
 			     TRACKER_XESAM_ERROR_SEARCH_NOT_ACTIVE,
 			     "Search is not active");
 	} else {
+		TrackerDBInterface *iface;
 		TrackerDBResultSet *result_set;
 		GValue              value = {0, };
-		DBConnection       *db_con = NULL;
-		GObject            *xesam;
 
-		xesam = tracker_dbus_get_object (TRACKER_TYPE_XESAM);
-		g_object_get (xesam, "db-connection", &db_con, NULL);
+		iface = tracker_db_manager_get_db_interface (TRACKER_DB_XESAM);
 
-		result_set = tracker_db_get_live_search_hit_count (db_con, 
+		result_set = tracker_db_live_search_get_hit_count (iface, 
 								   tracker_xesam_live_search_get_id (self));
 		_tracker_db_result_set_get_value (result_set, 0, &value);
 		*count = g_value_get_int (&value);
@@ -693,6 +706,7 @@
 	*hit_data = result;
 }
 
+
 /**
  * tracker_xesam_live_search_get_hits:
  * @self: a #TrackerXesamLiveSearch
@@ -725,37 +739,44 @@
 				TRACKER_XESAM_ERROR_SEARCH_NOT_ACTIVE,
 				"Search is not active");
 	else {
-		TrackerDBResultSet *result_set = NULL;
-		TrackerXesamSession *session = priv->session;
-		DBConnection       *db_con = NULL;
-		GObject            *xesam;
-
-		GValue *value;
-		GStrv fields;
-		GError *tmp_error = NULL;
-		
-		xesam = tracker_dbus_get_object (TRACKER_TYPE_XESAM);
-		g_object_get (xesam, "db-connection", &db_con, NULL);
-
-		g_debug ("live_search_get_hits");
-       
-		tracker_xesam_session_get_property (session, "hit.fields", &value, &tmp_error);
+		TrackerXesamSession *session;
+		GValue              *value;
+		GError              *tmp_error = NULL;
+
+		session = priv->session;
+
+		tracker_xesam_session_get_property (session, 
+						    "hit.fields", 
+						    &value, 
+						    &tmp_error);
 
 		if (tmp_error) {
 			g_propagate_error(error, tmp_error);
 			return;
 		}
-		
+
 		if (value) {
+			TrackerDBInterface  *iface;
+			TrackerDBResultSet  *result_set;
+			GStrv                fields;
+
 			fields = g_value_get_boxed (value);
-			
-			result_set = tracker_db_get_live_search_get_hit_data (db_con,
-									      tracker_xesam_live_search_get_id (self), fields);
-			
-			g_debug ("Got something from get_hit_data");
-			
+
+			iface = tracker_db_manager_get_db_interface (TRACKER_DB_XESAM);
+
+			/* For ottela: fetch results for get_hits */
+
+			result_set = tracker_db_live_search_get_hit_data (iface,
+									  tracker_xesam_live_search_get_id (self),
+									  fields);
+
 			if (result_set) {
-				get_hit_data (self, result_set, hits, g_strv_length(fields));
+
+				get_hit_data (self, 
+					      result_set, 
+					      hits, 
+					      g_strv_length(fields));
+
 				g_object_unref (result_set);
 			} else {
 				*hits =  g_ptr_array_new ();
@@ -787,35 +808,42 @@
 			     TRACKER_XESAM_ERROR_SEARCH_NOT_ACTIVE,
 			     "Search is not active");
 	} else {
-		TrackerDBResultSet *result_set = NULL;
 		TrackerXesamSession *session = priv->session;
-		DBConnection       *db_con = NULL;
-		GObject            *xesam;
+		TrackerDBInterface  *iface;
+		TrackerDBResultSet  *result_set;
+		GValue              *value;
+		GError              *tmp_error = NULL;
 
-		GValue *value;
-		GStrv fields;
-		GError *tmp_error = NULL;
-		
-		xesam = tracker_dbus_get_object (TRACKER_TYPE_XESAM);
-		g_object_get (xesam, "db-connection", &db_con, NULL);
+		iface = tracker_db_manager_get_db_interface (TRACKER_DB_XESAM);
 
 		g_debug ("live_search_get_range_hits");
-       
-		tracker_xesam_session_get_property (session, "hit.fields", &value, &tmp_error);
+
+		tracker_xesam_session_get_property (session, 
+						    "hit.fields", 
+						    &value, 
+						    &tmp_error);
 
 		if (tmp_error) {
 			g_propagate_error(error, tmp_error);
 			return;
 		}
-		
+
 		if (value) {
+			GStrv fields;
+
 			fields = g_value_get_boxed (value);
-			
-			result_set = tracker_db_get_live_search_get_hit_data (db_con,
-									      tracker_xesam_live_search_get_id (self), fields);
-			
+
+			result_set = tracker_db_live_search_get_hit_data (iface,
+									  tracker_xesam_live_search_get_id (self),
+									  fields);
+					
 			if (result_set) {
-				get_hit_data (self, result_set, hits, g_strv_length(fields));
+
+				get_hit_data (self, 
+					      result_set, 
+					      hits, 
+					      g_strv_length(fields));
+
 				g_object_unref (result_set);
 			} else {
 				*hits = g_ptr_array_new ();
@@ -875,18 +903,22 @@
 			     TRACKER_XESAM_ERROR_SEARCH_NOT_ACTIVE,
 			     "Search is not active yet");
 	} else {
-		TrackerDBResultSet *result_set = NULL;
-		DBConnection       *db_con = NULL;
-		GObject            *xesam;
-		
-		xesam = tracker_dbus_get_object (TRACKER_TYPE_XESAM);
-		g_object_get (xesam, "db-connection", &db_con, NULL);
+		TrackerDBInterface *iface;
+		TrackerDBResultSet *result_set;
 
-		result_set = tracker_db_get_live_search_get_hit_data (db_con,
-			      tracker_xesam_live_search_get_id (self), fields);
+		iface = tracker_db_manager_get_db_interface (TRACKER_DB_XESAM);
+
+		result_set = tracker_db_live_search_get_hit_data (iface,
+								  tracker_xesam_live_search_get_id (self),
+								  fields);
 
 		if (result_set) {
-			get_hit_data (self, result_set, hit_data,  g_strv_length (fields));
+
+			get_hit_data (self, 
+				      result_set, 
+				      hit_data,  
+				      g_strv_length (fields));
+
 			g_object_unref (result_set);
 		} else {
 			*hit_data = g_ptr_array_new ();
@@ -916,19 +948,22 @@
 			     TRACKER_XESAM_ERROR_SEARCH_NOT_ACTIVE,
 			     "Search is not active yet");
 	} else {
-		TrackerDBResultSet *result_set = NULL;
-		DBConnection       *db_con = NULL;
-		GObject            *xesam;
+		TrackerDBInterface *iface;
+		TrackerDBResultSet *result_set;
 
-		
-		xesam = tracker_dbus_get_object (TRACKER_TYPE_XESAM);
-		g_object_get (xesam, "db-connection", &db_con, NULL);
+		iface = tracker_db_manager_get_db_interface (TRACKER_DB_XESAM);
 
-		result_set = tracker_db_get_live_search_get_hit_data (db_con,
-			       tracker_xesam_live_search_get_id (self), fields);
+		result_set = tracker_db_live_search_get_hit_data (iface,
+								  tracker_xesam_live_search_get_id (self),
+								  fields);
 
 		if (result_set) {
-			get_hit_data (self, result_set, hit_data, g_strv_length(fields));
+
+			get_hit_data (self, 
+				      result_set, 
+				      hit_data, 
+				      g_strv_length(fields));
+
 			g_object_unref (result_set);
 		} else {
 			*hit_data = g_ptr_array_new ();
@@ -975,19 +1010,18 @@
 				TRACKER_XESAM_ERROR_SEARCH_CLOSED,
 				"Search is closed");
 	else {
-		DBConnection *db_con = NULL;
-		GObject      *xesam = tracker_dbus_get_object (TRACKER_TYPE_XESAM);
-		GArray       *hits = NULL;
-		
-		g_object_get (xesam, "db-connection", &db_con, NULL);
+		TrackerDBInterface *iface;
+		GArray             *hits;
 
-		tracker_db_start_live_search (db_con, 
-			tracker_xesam_live_search_get_from_query (self),
-			tracker_xesam_live_search_get_join_query (self),
-			tracker_xesam_live_search_get_where_query (self),
-			tracker_xesam_live_search_get_id (self));
+		iface = tracker_db_manager_get_db_interface (TRACKER_DB_XESAM);
 
-		get_all_hits (self, db_con, &hits);
+		tracker_db_live_search_start (iface,
+					      tracker_xesam_live_search_get_from_query (self),
+					      tracker_xesam_live_search_get_join_query (self),
+					      tracker_xesam_live_search_get_where_query (self),
+					      tracker_xesam_live_search_get_id (self));
+
+		get_all_hits (self, iface, &hits);
 
 		if (hits && hits->len > 0) {
 			g_debug ("Emitting HitsAdded");
@@ -1090,8 +1124,8 @@
 				       GError                 **error)
 {
 	TrackerXesamLiveSearchPriv *priv;
+	TrackerDBInterface         *iface;
 	GObject                    *xesam;
-	DBConnection               *db_con = NULL;
 	GError                     *parse_error = NULL;
 	gchar                      *orig_from, *orig_join, *orig_where;
 
@@ -1099,8 +1133,8 @@
 
 	priv = self->priv;
 
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_XESAM);
 	xesam = tracker_dbus_get_object (TRACKER_TYPE_XESAM);
-	g_object_get (xesam, "db-connection", &db_con, NULL);
 
 	orig_from = priv->from_sql;
 	orig_join = priv->join_sql;
@@ -1110,15 +1144,18 @@
 	priv->join_sql = NULL;
 	priv->where_sql = NULL;
 
-	tracker_xesam_query_to_sql (db_con, priv->query, 
+	tracker_xesam_query_to_sql (iface,
+				    priv->query, 
 				    &priv->from_sql,
 				    &priv->join_sql,
 				    &priv->where_sql, 
 				    &parse_error);
 
 	if (parse_error) {
-		gchar *str = g_strdup_printf ("Parse error: %s", 
-			parse_error->message);
+		gchar *str;
+
+		str = g_strdup_printf ("Parse error: %s", 
+				       parse_error->message);
 		g_set_error (error, 
 			     TRACKER_XESAM_ERROR_DOMAIN, 
 			     TRACKER_XESAM_ERROR_PARSING_FAILED,
@@ -1142,7 +1179,8 @@
 	}
 
 	g_message ("Parsed to '%s' and '%s'", 
-		   priv->from_sql, priv->where_sql);
+		   priv->from_sql, 
+		   priv->where_sql);
 
 	return TRUE;
 }

Modified: branches/xesam-support/src/trackerd/tracker-xesam-manager.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-xesam-manager.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-xesam-manager.c	Mon Jun  9 15:41:07 2008
@@ -26,6 +26,8 @@
 
 #include <libtracker-common/tracker-config.h>
 
+#include <libtracker-db/tracker-db-manager.h>
+
 #include "tracker-xesam-manager.h"
 #include "tracker-dbus.h"
 #include "tracker-main.h"
@@ -246,29 +248,24 @@
 static gboolean 
 live_search_handler (gpointer data)
 {
-	GObject *xesam;
-	DBConnection *db_con = NULL;
-	GList        *sessions;
-	gboolean      reason_to_live = FALSE;
+	TrackerXesam       *xesam;
+	TrackerDBInterface *iface;
+	GList              *sessions;
+	gboolean            reason_to_live = FALSE;
 
 	xesam = tracker_dbus_get_object (TRACKER_TYPE_XESAM);
+	g_return_val_if_fail (xesam != NULL, FALSE);
 
-	if (!xesam) {
-		return FALSE;
-	}
-
-	g_object_get (xesam, "db-connection", &db_con, NULL);
-
-	if (!db_con) { 
-		return FALSE;
-	}
+	iface = tracker_db_manager_get_db_interface (TRACKER_DB_XESAM);
+	g_return_val_if_fail (iface != NULL, FALSE);
 
 	sessions = g_hash_table_get_values (xesam_sessions);
 
 	while (sessions) {
 		GList *searches;
 
-		g_debug ("Session being handled, ID :%s", tracker_xesam_session_get_id (sessions->data));
+		g_debug ("Session being handled, ID :%s", 
+			 tracker_xesam_session_get_id (sessions->data));
 
 		searches = tracker_xesam_session_get_searches (sessions->data);
 
@@ -278,7 +275,8 @@
 			GArray                 *removed = NULL;
 			GArray                 *modified = NULL;
 
-			g_debug ("Search being handled, ID :%s", tracker_xesam_live_search_get_id (searches->data));
+			g_debug ("Search being handled, ID :%s", 
+				 tracker_xesam_live_search_get_id (searches->data));
 
 			search = searches->data;
 
@@ -329,7 +327,7 @@
 
 	g_list_free (sessions);
 
-	tracker_db_delete_handled_events (db_con);
+	tracker_db_xesam_delete_handled_events (iface);
 
 	return reason_to_live;
 }

Modified: branches/xesam-support/src/trackerd/tracker-xesam-query.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-xesam-query.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-xesam-query.c	Mon Jun  9 15:41:07 2008
@@ -29,28 +29,29 @@
 #include <libtracker-common/tracker-utils.h>
 
 #include "tracker-xesam-query.h"
+#include "tracker-db.h"
 
 /* XESAM Query Condition
-<query>
-	<and>
-        	<greaterThan>
-            		<field name="File:Size" />
-            		<integer>1000000<integer>
-          	</greaterThan>
-          	<equals>
-             		<field name="File:Path" />
-             		<string>/home/jamie<string>
-           	</equals>
-	</and>
-</Condition>
+ * <query>
+ *	<and>
+ *        	<greaterThan>
+ *           		<field name="File:Size" />
+ *           		<integer>1000000<integer>
+ *         	</greaterThan>
+ *         	<equals>
+ *            		<field name="File:Path" />
+ *            		<string>/home/jamie<string>
+ *          	</equals>
+ *	</and>
+ * </query>
 */
 
-/* main elements */
+/* Main elements */
 #define ELEMENT_XESAM_QUERY 	        "query"
 #define ELEMENT_XESAM_USER_QUERY        "userQuery"
 #define ELEMENT_XESAM_FIELD 		"field"
 
-/* operators */
+/* Operators */
 #define ELEMENT_XESAM_AND 		"and"
 #define ELEMENT_XESAM_OR	 	"or"
 #define ELEMENT_XESAM_EQUALS 		"equals"
@@ -59,13 +60,15 @@
 #define ELEMENT_XESAM_LESS_THAN 	"lessThan"
 #define ELEMENT_XESAM_LESS_OR_EQUAL	"lessOrEqual"
 
-/* extension operators - "contains" does a substring or full text match, "in_Set" does string in list match */
+/* Extension operators - "contains" does a substring or full text
+ * match, "in_Set" does string in list match
+ */
 #define ELEMENT_XESAM_CONTAINS 		"contains"
 #define ELEMENT_XESAM_REGEX        	"regex"
 #define ELEMENT_XESAM_STARTS_WITH 	"startsWith"
 #define ELEMENT_XESAM_IN_SET		"inSet"
 
-/* types */
+/* Types */
 #define ELEMENT_XESAM_INTEGER 		"integer"
 #define ELEMENT_XESAM_DATE 		"date"
 #define ELEMENT_XESAM_STRING 		"string"
@@ -74,13 +77,11 @@
 
 #define ELEMENT_IS(name) (strcmp (element_name, (name)) == 0)
 
-
 enum {
 	NO_ERROR,
 	PARSE_ERROR,
 };
 
-
 typedef enum {
 	STATE_START,
 	STATE_QUERY,
@@ -136,56 +137,52 @@
 	OP_STARTS
 } Operators;
 
-
 typedef enum {
 	LOP_NONE,
 	LOP_AND,
 	LOP_OR
 } LogicOperators;
 
-
 typedef struct {
-	GMarkupParseContext 	*context;
-	GMarkupParser       	*parser;
-	GSList 			*stack;
-	GSList 			*fields;
-	gboolean		query_okay;
-	int			statement_count;
-	LogicOperators		current_logic_operator;
-	Operators		current_operator;
-	char 			*current_field;
-	char			*current_value;
-	DBConnection	        *db_con;
-	GString			*sql_from;
-	GString                 *sql_join;
-	GString			*sql_where;
-	char			*service;
+	GMarkupParseContext *context;
+	GMarkupParser       *parser;
+	GSList              *stack;
+	GSList              *fields;
+	gboolean             query_okay;
+	gint                 statement_count;
+	LogicOperators       current_logic_operator;
+	Operators            current_operator;
+	gchar               *current_field;
+	gchar               *current_value;
+	TrackerDBInterface  *iface;
+	GString             *sql_select;
+	GString             *sql_from;
+	GString             *sql_where;
+	GString             *sql_order;
+	GString             *sql_join;
+	gchar               *service;
 } ParserData;
 
-static GQuark error_quark;
-
-static void start_element_handler (GMarkupParseContext *context,
-				   const gchar *element_name,
-				   const gchar **attribute_names,
-				   const gchar **attribute_values,
-				   gpointer user_data,
-				   GError **error);
-
-static void end_element_handler (GMarkupParseContext *context,
-				 const gchar *element_name,
-				 gpointer user_data,
-				 GError **error);
-
-static void text_handler (GMarkupParseContext *context,
-		     const gchar *text,
-		     gsize text_len,
-		     gpointer user_data,
-		     GError **error);
-
-static void error_handler (GMarkupParseContext *context,
-		      GError *error,
-		      gpointer user_data);
+static void start_element_handler (GMarkupParseContext  *context,
+				   const gchar          *element_name,
+				   const gchar         **attribute_names,
+				   const gchar         **attribute_values,
+				   gpointer              user_data,
+				   GError              **error);
+static void end_element_handler   (GMarkupParseContext  *context,
+				   const gchar          *element_name,
+				   gpointer              user_data,
+				   GError              **error);
+static void text_handler          (GMarkupParseContext  *context,
+				   const gchar          *text,
+				   gsize                 text_len,
+				   gpointer              user_data,
+				   GError              **error);
+static void error_handler         (GMarkupParseContext  *context,
+				   GError               *error,
+				   gpointer              user_data);
 
+static GQuark error_quark;
 
 static gboolean
 is_operator (ParseState state)
@@ -226,7 +223,6 @@
 		state == STATE_OR;
 }
 
-
 static gboolean
 is_end_logic (ParseState state)
 {
@@ -235,7 +231,6 @@
 		state == STATE_END_OR;
 }
 
-
 static void
 set_error (GError              **err,
            GMarkupParseContext  *context,
@@ -243,9 +238,9 @@
            const char           *format,
            ...)
 {
-	int	line, ch;
-	va_list args;
-	char    *str;
+	gint     line, ch;
+	va_list  args;
+	gchar   *str;
 
 	g_markup_parse_context_get_position (context, &line, &ch);
 
@@ -253,14 +248,22 @@
 	str = g_strdup_vprintf (format, args);
 	va_end (args);
 
-	g_set_error (err, error_quark, error_code, "Line %d character %d: %s", line, ch, str);
+	g_set_error (err, 
+		     error_quark, 
+		     error_code, 
+		     "Line %d character %d: %s",
+		     line,
+		     ch,
+		     str);
 
 	g_free (str);
 }
 
-
 static gboolean
-set_error_on_fail (gboolean condition, GMarkupParseContext *context, const char *msg, GError **err)
+set_error_on_fail (gboolean              condition, 
+		   GMarkupParseContext  *context, 
+		   const gchar          *msg, 
+		   GError              **err)
 {
 	if (!condition) {
 		set_error (err, context, 1, msg);
@@ -270,13 +273,12 @@
 	return FALSE;
 }
 
-
-static const char *
-get_attribute_value (const char *name,
-		     const char **names,
-		     const char **values)
+static const gchar *
+get_attribute_value (const gchar *name,
+		     const gchar **names,
+		     const gchar **values)
 {
-	int i;
+	gint i;
 
 	i = 0;
 
@@ -290,45 +292,42 @@
 	return NULL;
 }
 
-
-static const char *
-get_attribute_value_required (GMarkupParseContext *context,
-			      const char          *tag,
-			      const char          *name,
-			      const char          **names,
-			      const char          **values,
+static const gchar *
+get_attribute_value_required (GMarkupParseContext  *context,
+			      const gchar          *tag,
+			      const gchar          *name,
+			      const gchar         **names,
+			      const gchar         **values,
 			      GError              **error)
 {
-	const char *value;
+	const gchar *value;
 
 	value = get_attribute_value (name, names, values);
 
 	if (!value) {
-		set_error (error, context, PARSE_ERROR,
+		set_error (error, 
+			   context, 
+			   PARSE_ERROR,
 			   "%s must have \"%s\" attribute",
-			   tag, name);
+			   tag, 
+			   name);
 	}
 
 	return value;
 }
 
-
 static void
-push_stack (ParserData *data, ParseState  state)
+push_stack (ParserData *data, ParseState state)
 {
 	data->stack = g_slist_prepend (data->stack, GINT_TO_POINTER (state));
 }
 
-
 static void
 pop_stack (ParserData *data)
 {
-	g_return_if_fail (data->stack != NULL);
-
 	data->stack = g_slist_remove (data->stack, data->stack->data);
 }
 
-
 static ParseState
 peek_state (ParserData *data)
 {
@@ -337,12 +336,10 @@
 	return GPOINTER_TO_INT (data->stack->data);
 }
 
-
 static void
 pop_stack_until (ParserData *data, ParseState state)
 {
 	while (data->stack != NULL) {
-
 		if (state == peek_state (data)) {
 			pop_stack (data);
 			break;
@@ -352,13 +349,11 @@
 	}
 }
 
-
-
 static GList *
-add_metadata_field (ParserData *data, 
-		    const char *xesam_name, 
-		    gboolean    is_select, 
-		    gboolean    is_condition)
+add_metadata_field (ParserData  *data, 
+		    const gchar *xesam_name, 
+		    gboolean     is_select, 
+		    gboolean     is_condition)
 {
 	TrackerDBResultSet *result_set;
 	TrackerFieldData   *field_data;
@@ -374,7 +369,7 @@
 
 	/* Do the xesam mapping */
 	
-	result_set = tracker_get_xesam_metadata_names (data->db_con, xesam_name);
+	result_set = tracker_db_xesam_get_metadata_names (data->iface, xesam_name);
 	if (!result_set) {
 		return NULL;
 	}
@@ -407,7 +402,7 @@
 		}
 		
 		if (!field_exists) {
-			field_data = tracker_db_get_metadata_field (data->db_con, 
+			field_data = tracker_db_get_metadata_field (data->iface, 
 								    data->service, 
 								    field_name, 
 								    g_slist_length (data->fields), 
@@ -426,7 +421,6 @@
 	return reply;
 }
 
-
 static void
 start_element_handler (GMarkupParseContext  *context,
 		       const gchar	    *element_name,
@@ -445,108 +439,130 @@
 		const char *content;
 		const char *source;
 
-		if (set_error_on_fail ((state == STATE_START), context, "Query element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_START,
+				       context, 
+				       "Query element not expected here", 
+				       error)) {
 			return;
 		}
 
-		content = get_attribute_value ("content", attribute_names, attribute_values);
-		source = get_attribute_value ("source", attribute_names, attribute_values);
-
-		/* FIXME This is a bit clumsy, check that OK and get the defaults (all) from somewhere. CHECK MEMORY LEAKS! */
+		content = get_attribute_value ("content", 
+					       attribute_names, 
+					       attribute_values);
+		source = get_attribute_value ("source", 
+					      attribute_names, 
+					      attribute_values);
+
+		/* FIXME This is a bit clumsy, check that OK and get
+		 * the defaults (all) from somewhere. CHECK MEMORY
+		 * LEAKS! 
+		 */
 		if(content) {
-			TrackerDBResultSet  *result_set;
-			gboolean            valid = TRUE;
-			result_set = tracker_get_xesam_service_names (data->db_con, content);
-		 
-			if (result_set) {
-				
-				while (valid) {
+			TrackerDBResultSet *result_set;
 
-				}
-
-			}
-			
-			content = strdup(content);
+			result_set = tracker_db_xesam_get_service_names (data->iface, 
+									 content);
+		
+			content = g_strdup (content);
 		} else {
-			content = strdup("Files");
+			content = g_strdup ("Files");
 		}
 		
-		// FIXME Fix the service problems.
-		data->service = strdup("Files");
+		data->service = g_strdup ("Files");
 
-		if(source) {
+		if (source) {
 
 		} else {
-			// FIXME
+			/* FIXME */
 			source = "Files";
 		}
 
-		g_string_append_printf (data->sql_where, "\n WHERE (S.ServiceTypeID in (select TypeId from ServiceTypes where TypeName = '%s' or Parent = '%s')) AND ", content, source);
+		g_string_append_printf (data->sql_where,
+					"\n WHERE (S.ServiceTypeID in (select TypeId from ServiceTypes where TypeName = '%s' or Parent = '%s')) AND ", 
+					content, 
+					source);
 
 		push_stack (data, STATE_QUERY);
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_FIELD)) {
-		const char *name;
+		const gchar *name;
 
-		if (set_error_on_fail ( is_operator (state), context,  "Field element not expected here", error)) {
+		if (set_error_on_fail (is_operator (state), 
+				       context, 
+				       "Field element not expected here", 
+				       error)) {
 			return;
 		}
 
-		name = get_attribute_value_required (context, "<field>", "name",
-						     attribute_names, attribute_values,
+		name = get_attribute_value_required (context,
+						     "<field>", 
+						     "name",
+						     attribute_names, 
+						     attribute_values,
 						     error);
 
 		if (!name) {
 			return;
 		} else {
-
-			if (data->current_operator == OP_NONE ) {
-				set_error (error, context, PARSE_ERROR, "no operator found for field \"%s\"", name);
+			if (data->current_operator == OP_NONE) {
+				set_error (error, 
+					   context, 
+					   PARSE_ERROR,
+					   "no operator found for field \"%s\"", 
+					   name);
 				return;
 			}
 
-			data->current_field =  g_strdup (name);
-
+			data->current_field = g_strdup (name);
 			push_stack (data, STATE_FIELD);
 		}
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_AND)) {
-                const char *negate;
+                const gchar *negate;
 
-		if (set_error_on_fail ((state == STATE_QUERY || is_logic (state) || is_end_logic (state) || is_end_operator (state)),
-				       context, "AND element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_QUERY || 
+				       is_logic (state) || 
+				       is_end_logic (state) || 
+				       is_end_operator (state),
+				       context,
+				       "AND element not expected here", 
+				       error)) {
 			return;
 		}
 
 		if (data->statement_count > 1) {
-		  if (data->current_logic_operator == LOP_AND) {
-		    data->sql_where = g_string_append (data->sql_where, " AND ");
-		  } else {
-		    if (data->current_logic_operator == LOP_OR) {
-		      data->sql_where = g_string_append (data->sql_where, " OR ");
-		    }
-		  }
+			if (data->current_logic_operator == LOP_AND) {
+				data->sql_where = g_string_append (data->sql_where, " AND ");
+			} else {
+				if (data->current_logic_operator == LOP_OR) {
+					data->sql_where = g_string_append (data->sql_where, " OR ");
+				}
+			}
 		}
+		
+		negate = get_attribute_value ("negate", 
+					      attribute_names, 
+					      attribute_values);
 
-		negate = get_attribute_value ("negate", attribute_names, attribute_values);
-		if (negate&&(!strcmp(negate,"true")))
-		{
-		  data->sql_where = g_string_append (data->sql_where, " NOT "); 
+		if (negate && !strcmp (negate,"true")) {
+			data->sql_where = g_string_append (data->sql_where, " NOT "); 
 		}
 
 		data->statement_count = 0;
 		data->sql_where = g_string_append (data->sql_where, " ( ");
 		data->current_logic_operator = LOP_AND;
 		push_stack (data, STATE_AND);
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_OR)) {
-                const char *negate;
-
-		if (set_error_on_fail ((state == STATE_QUERY || is_logic (state) || is_end_logic (state) || is_end_operator (state)),
-				       context, "OR element not expected here", error)) {
+                const gchar *negate;
+		
+		if (set_error_on_fail (state == STATE_QUERY || 
+				       is_logic (state) || 
+				       is_end_logic (state) || 
+				       is_end_operator (state),
+				       context,
+				       "OR element not expected here", 
+				       error)) {
 			return;
 		}
-
+		
 		if (data->statement_count > 1) {
 			if (data->current_logic_operator == LOP_AND) {
 				data->sql_where = g_string_append (data->sql_where, " AND ");
@@ -556,236 +572,280 @@
 				}
 			}
 		}
-
-		negate = get_attribute_value ("negate", attribute_names, attribute_values);
-		if (negate&&(!strcmp(negate,"true")))
-		{
-		  data->sql_where = g_string_append (data->sql_where, " NOT "); 
+		
+		negate = get_attribute_value ("negate", 
+					      attribute_names, 
+					      attribute_values);
+		
+		if (negate && !strcmp (negate,"true")) {
+			data->sql_where = g_string_append (data->sql_where, " NOT "); 
 		}
-
+		
 		data->statement_count = 0;
 		data->sql_where = g_string_append (data->sql_where, " ( ");
 		data->current_logic_operator = LOP_OR;
 		push_stack (data, STATE_OR);
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_EQUALS)) {
-                const char *negate;
-
-		if (set_error_on_fail ( state == STATE_QUERY || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "EQUALS element not expected here", error)) {
-			return;
-		}
-
-		negate = get_attribute_value ("negate", attribute_names, attribute_values);
-		if (negate&&(!strcmp(negate,"true")))
-		{
-		  data->sql_where = g_string_append (data->sql_where, " NOT "); 
-		}
-
-		data->current_operator = OP_EQUALS;
-		push_stack (data, STATE_EQUALS);
+                const gchar *negate;
 
+		if (set_error_on_fail (state == STATE_QUERY || 
+				       is_logic (state) ||
+				       ((data->current_logic_operator == LOP_AND ||
+					 data->current_logic_operator == LOP_OR) &&
+					is_end_operator (state)),
+				       context, 
+				       "EQUALS element not expected here", 
+				       error)) {
+			    return;
+		    }
+		    
+		    negate = get_attribute_value ("negate", 
+						  attribute_names, 
+						  attribute_values);
+		    
+		    if (negate && !strcmp (negate,"true")) {
+			    data->sql_where = g_string_append (data->sql_where, " NOT "); 
+		    }
+		    
+		    data->current_operator = OP_EQUALS;
+		    push_stack (data, STATE_EQUALS);
 	} else if (ELEMENT_IS (ELEMENT_XESAM_GREATER_THAN)) {
-                const char *negate;
+                const gchar *negate;
 
-		if (set_error_on_fail ( state == STATE_QUERY || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context,  "GREATERTHAN element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_QUERY || 
+				       is_logic (state) ||
+				       ((data->current_logic_operator == LOP_AND || 
+					 data->current_logic_operator == LOP_OR) &&
+					is_end_operator (state)),
+					context,  
+				       "GREATERTHAN element not expected here", 
+				       error)) {
 			return;
 		}
 
-		negate = get_attribute_value ("negate", attribute_names, attribute_values);
-		if (negate&&(!strcmp(negate,"true")))
-		{
-		  data->sql_where = g_string_append (data->sql_where, " NOT "); 
-		}
+		negate = get_attribute_value ("negate", 
+					      attribute_names, 
+					      attribute_values);
 
+		if (negate && !strcmp (negate,"true")) {
+			data->sql_where = g_string_append (data->sql_where, " NOT "); 
+		}
+		
 		data->current_operator = OP_GREATER;
 		push_stack (data, STATE_GREATER_THAN);
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_GREATER_OR_EQUAL)) {
-                const char *negate;
+                const gchar *negate;
 
-		if (set_error_on_fail ( state == STATE_QUERY || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "GREATEROREQUAL element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_QUERY || 
+				       is_logic (state) ||
+				       ((data->current_logic_operator == LOP_AND || 
+					 data->current_logic_operator == LOP_OR) &&
+					is_end_operator (state)),
+				       context,
+				       "GREATEROREQUAL element not expected here", 
+				       error)) {
 			return;
 		}
 
-		negate = get_attribute_value ("negate", attribute_names, attribute_values);
-		if (negate&&(!strcmp(negate,"true")))
-		{
-		  data->sql_where = g_string_append (data->sql_where, " NOT "); 
+		negate = get_attribute_value ("negate", 
+					      attribute_names, 
+					      attribute_values);
+
+		if (negate && !strcmp(negate,"true")) {
+			data->sql_where = g_string_append (data->sql_where, " NOT "); 
 		}
 
 		data->current_operator = OP_GREATER_EQUAL;
 		push_stack (data, STATE_GREATER_OR_EQUAL);
+	} else if (ELEMENT_IS (ELEMENT_XESAM_LESS_THAN)) {
+                const gchar *negate;
 
-	} else if (ELEMENT_IS (ELEMENT_XESAM_LESS_THAN )) {
-                const char *negate;
-
-		if (set_error_on_fail ( state == STATE_QUERY || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "LESSTHAN element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_QUERY ||
+				       is_logic (state) ||
+				       ((data->current_logic_operator == LOP_AND ||
+					 data->current_logic_operator == LOP_OR) &&
+					is_end_operator (state)),
+				       context,
+				       "LESSTHAN element not expected here",
+				       error)) {
 			return;
 		}
 
-		negate = get_attribute_value ("negate", attribute_names, attribute_values);
-		if (negate&&(!strcmp(negate,"true")))
-		{
-		  data->sql_where = g_string_append (data->sql_where, " NOT "); 
+		negate = get_attribute_value ("negate", 
+					      attribute_names, 
+					      attribute_values);
+		if (negate && !strcmp (negate,"true")) {
+			data->sql_where = g_string_append (data->sql_where, " NOT "); 
 		}
 
 		data->current_operator = OP_LESS;
 		push_stack (data, STATE_LESS_THAN);
+	} else if (ELEMENT_IS (ELEMENT_XESAM_LESS_OR_EQUAL)) {
+                const gchar *negate;
 
-	} else if (ELEMENT_IS (ELEMENT_XESAM_LESS_OR_EQUAL )) {
-                const char *negate;
-
-
-		if (set_error_on_fail ( state == STATE_QUERY || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "LESSOREQUAL element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_QUERY || 
+				       is_logic (state) ||
+				       ((data->current_logic_operator == LOP_AND || 
+					 data->current_logic_operator == LOP_OR) &&
+					is_end_operator (state)),
+				       context,
+				       "LESSOREQUAL element not expected here", 
+				       error)) {
 			return;
 		}
 
-		negate = get_attribute_value ("negate", attribute_names, attribute_values);
-		if (negate&&(!strcmp(negate,"true")))
-		{
-		  data->sql_where = g_string_append (data->sql_where, " NOT "); 
+		negate = get_attribute_value ("negate", 
+					      attribute_names, 
+					      attribute_values);
+
+		if (negate && !strcmp(negate,"true")) {
+			data->sql_where = g_string_append (data->sql_where, " NOT "); 
 		}
 
 		data->current_operator = OP_LESS_EQUAL;
 		push_stack (data, STATE_LESS_OR_EQUAL);
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_CONTAINS)) {
-                const char *negate;
+                const gchar *negate;
 
-		if (set_error_on_fail ( state == STATE_QUERY || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "CONTAINS element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_QUERY || 
+				       is_logic (state) ||
+				       ((data->current_logic_operator == LOP_AND || 
+					 data->current_logic_operator == LOP_OR) &&
+					is_end_operator (state)),
+				       context,
+				       "CONTAINS element not expected here", 
+				       error)) {
 			return;
 		}
 
-		negate = get_attribute_value ("negate", attribute_names, attribute_values);
-		if (negate&&(!strcmp(negate,"true")))
-		{
-		  data->sql_where = g_string_append (data->sql_where, " NOT "); 
+		negate = get_attribute_value ("negate", 
+					      attribute_names, 
+					      attribute_values);
+
+		if (negate && !strcmp(negate,"true")) {
+			data->sql_where = g_string_append (data->sql_where, " NOT "); 
 		}
 
 		data->current_operator = OP_CONTAINS;
 		push_stack (data, STATE_CONTAINS);
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_REGEX)) {
-                const char *negate;
+                const gchar *negate;
 
-		if (set_error_on_fail ( state == STATE_QUERY || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "REGEX element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_QUERY || 
+				       is_logic (state) ||
+				       ((data->current_logic_operator == LOP_AND || 
+					 data->current_logic_operator == LOP_OR) &&
+					is_end_operator (state)),
+				       context, 
+				       "REGEX element not expected here", 
+				       error)) {
 			return;
 		}
 
-		negate = get_attribute_value ("negate", attribute_names, attribute_values);
-		if (negate&&(!strcmp(negate,"true")))
-		{
-		  data->sql_where = g_string_append (data->sql_where, " NOT "); 
+		negate = get_attribute_value ("negate", 
+					      attribute_names, 
+					      attribute_values);
+		if (negate && !strcmp (negate,"true")) {
+			data->sql_where = g_string_append (data->sql_where, " NOT "); 
 		}
-
+		
 		data->current_operator = OP_REGEX;
 		push_stack (data, STATE_REGEX);
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_STARTS_WITH)) {
-                const char *negate;
+                const gchar *negate;
 
-		if (set_error_on_fail ( state == STATE_QUERY || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "STARTSWITH element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_QUERY || 
+				       is_logic (state) ||
+				       ((data->current_logic_operator == LOP_AND || 
+					 data->current_logic_operator == LOP_OR) &&
+					is_end_operator (state)),
+				       context, 
+				       "STARTSWITH element not expected here", 
+				       error)) {
 			return;
 		}
 
-		negate = get_attribute_value ("negate", attribute_names, attribute_values);
-		if (negate&&(!strcmp(negate,"true")))
-		{
-		  data->sql_where = g_string_append (data->sql_where, " NOT "); 
+		negate = get_attribute_value ("negate", 
+					      attribute_names, 
+					      attribute_values);
+
+		if (negate && !strcmp(negate,"true")) {
+			data->sql_where = g_string_append (data->sql_where, " NOT "); 
 		}
 
 		data->current_operator = OP_STARTS;
 		push_stack (data, STATE_STARTS_WITH);
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_IN_SET)) {
-                const char *negate;
+                const gchar *negate;
 
-		if (set_error_on_fail ( state == STATE_QUERY || is_logic (state) ||
-					((data->current_logic_operator == LOP_AND || data->current_logic_operator == LOP_OR)
-					 && is_end_operator (state)),
-					context, "IN SET element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_QUERY || 
+				       is_logic (state) ||
+				       ((data->current_logic_operator == LOP_AND || 
+					 data->current_logic_operator == LOP_OR) &&
+					is_end_operator (state)),
+				       context, 
+				       "IN SET element not expected here", 
+				       error)) {
 			return;
 		}
 
-		negate = get_attribute_value ("negate", attribute_names, attribute_values);
-		if (negate&&(!strcmp(negate,"true")))
-		{
-		  data->sql_where = g_string_append (data->sql_where, " NOT "); 
+		negate = get_attribute_value ("negate", 
+					      attribute_names, 
+					      attribute_values);
+
+		if (negate && !strcmp(negate,"true")) {
+			data->sql_where = g_string_append (data->sql_where, " NOT "); 
 		}
 
 		data->current_operator = OP_SET;
 		push_stack (data, STATE_IN_SET);
-
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_INTEGER)) {
-
-		if (set_error_on_fail (state == STATE_FIELD, context, "INTEGER element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_FIELD, 
+				       context, 
+				       "INTEGER element not expected here", 
+				       error)) {
 			return;
 		}
 
 		push_stack (data, STATE_INTEGER);
-
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_DATE)) {
-
-		if (set_error_on_fail (state == STATE_FIELD, context, "DATE element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_FIELD, 
+				       context,
+				       "DATE element not expected here", 
+				       error)) {
 			return;
 		}
 
 		push_stack (data, STATE_DATE);
-
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_STRING)) {
-
-		if (set_error_on_fail (state == STATE_FIELD, context, "STRING element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_FIELD, 
+				       context,
+				       "STRING element not expected here", 
+				       error)) {
 			return;
 		}
 
 		push_stack (data, STATE_STRING);
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_FLOAT)) {
-
-		if (set_error_on_fail (state == STATE_FIELD, context, "FLOAT element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_FIELD, 
+				       context, 
+				       "FLOAT element not expected here", 
+				       error)) {
 			return;
 		}
 
 		push_stack (data, STATE_FLOAT);
-
 	} else if (ELEMENT_IS (ELEMENT_XESAM_BOOLEAN)) {
-
-		if (set_error_on_fail (state == STATE_FIELD, context, "BOOLEAN element not expected here", error)) {
+		if (set_error_on_fail (state == STATE_FIELD, 
+				       context, 
+				       "BOOLEAN element not expected here", 
+				       error)) {
 			return;
 		}
-
 		push_stack (data, STATE_BOOLEAN);
 	}
 }
 
-
 static char *
 get_value (const char *value, gboolean quote)
 {
@@ -796,7 +856,6 @@
 	}
 }
 
-
 static gboolean
 build_sql (ParserData *data)
 {
@@ -1204,16 +1263,24 @@
 	g_critical ("Failed to parse RDF query, %s", error->message);
 }
 
-
 void
-tracker_xesam_query_to_sql (DBConnection *db_con, const char *query, gchar **from, gchar **join, gchar **where, GError **error)
+tracker_xesam_query_to_sql (TrackerDBInterface  *iface,
+			    const gchar         *query,
+			    gchar              **from,
+			    gchar              **join,
+			    gchar              **where,
+			    GError             **error)
 {
-	static     gboolean inited = FALSE;
-	ParserData data;
-	char       *result;
-	char       *table_name;
-
-	g_return_if_fail (query != NULL);
+	static gboolean  inited = FALSE;
+	ParserData       data;
+	gchar           *result;
+	gchar           *table_name;
+
+        g_return_if_fail (TRACKER_IS_DB_INTERFACE (iface));
+        g_return_if_fail (query != NULL);
+        g_return_if_fail (from != NULL);
+        g_return_if_fail (join != NULL);
+        g_return_if_fail (where != NULL);
 
 	if (!inited) {
 		error_quark = g_quark_from_static_string ("XESAM-parser-error-quark");
@@ -1221,7 +1288,7 @@
 	}
 
 	memset (&data, 0, sizeof (data));
-	data.db_con = db_con;
+	data.iface = iface;
 	data.statement_count = 0;
 
 	table_name = "Services";
@@ -1249,7 +1316,6 @@
 	result = NULL;
 
 	if (!g_markup_parse_context_parse (data.context, query, -1, error)) {
-
 		g_string_free (data.sql_from, TRUE);
 		g_string_free (data.sql_where, TRUE);
 		g_string_free (data.sql_join, TRUE);
@@ -1257,7 +1323,6 @@
 		*from = NULL;
 		*join = NULL;
 		*where = NULL;
-
 	} else {
 		GSList *l;
 
@@ -1275,8 +1340,8 @@
 			} else {
 				gchar *related_metadata;
 
-				related_metadata = tracker_get_related_metadata_names (db_con, 
-										       tracker_field_data_get_field_name (l->data));
+				related_metadata = tracker_db_metadata_get_related_names (iface, 
+											  tracker_field_data_get_field_name (l->data));
 				g_string_append_printf (data.sql_join, 
 							"\n INNER JOIN %s %s ON (S.ID = %s.ServiceID and %s.MetaDataID in (%s)) ",
 							tracker_field_data_get_table_name (l->data),
@@ -1295,7 +1360,6 @@
 		g_string_free (data.sql_from, TRUE);
 		g_string_free (data.sql_join, TRUE);
 		g_string_free (data.sql_where, TRUE);
-		
 	}
 
 	g_slist_foreach (data.fields, (GFunc) g_object_unref, NULL);

Modified: branches/xesam-support/src/trackerd/tracker-xesam-query.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-xesam-query.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-xesam-query.h	Mon Jun  9 15:41:07 2008
@@ -1,4 +1,5 @@
-/* Tracker - indexer and metadata database engine
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
  *
  * Copyright (C) 2008, Nokia
  * Authors: Ottela Mikael, (mikael ottela ixonos com)
@@ -19,20 +20,22 @@
  * Boston, MA  02110-1301, USA.
  */
 
+#ifndef __TRACKERD_XESAM_QUERY_H__
+#define __TRACKERD_XESAM_QUERY_H__
 
+#include <glib.h>
 
-#ifndef _TRACKER_XESAM_QUERY_H_
-#define _TRACKER_XESAM_QUERY_H_
+#include <libtracker-db/tracker-db-manager.h>
 
-#include <glib.h>
+G_BEGIN_DECLS
 
-#include "tracker-db.h"
+void tracker_xesam_query_to_sql (TrackerDBInterface  *iface,
+                                 const gchar         *query,
+                                 gchar              **from,
+                                 gchar              **join,
+                                 gchar              **where,
+                                 GError             **error);
 
-void                    tracker_xesam_query_to_sql          (DBConnection *db_con, 
-                                                             const char   *query, 
-                                                             gchar       **from,
-                                                             gchar       **join,
-                                                             gchar       **where, 
-                                                             GError      **error);
+G_END_DECLS
 
-#endif
+#endif /* __TRACKERD_XESAM_QUERY_H__ */

Modified: branches/xesam-support/src/trackerd/tracker-xesam.c
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-xesam.c	(original)
+++ branches/xesam-support/src/trackerd/tracker-xesam.c	Mon Jun  9 15:41:07 2008
@@ -38,8 +38,6 @@
 #include "tracker-indexer.h"
 #include "tracker-marshal.h"
 
-#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_XESAM, TrackerXesamPriv))
-
 enum {
 	XESAM_HITS_ADDED,
 	XESAM_HITS_REMOVED,
@@ -49,95 +47,14 @@
 	XESAM_LAST_SIGNAL
 };
 
-enum {
-	PROP_0,
-	PROP_DB_CONNECTION,
-};
-
-typedef struct {
-	DBConnection *db_con;
-} TrackerXesamPriv;
-
 static GHashTable *sessions = NULL;
 static guint       signals[XESAM_LAST_SIGNAL] = {0};
 
 G_DEFINE_TYPE(TrackerXesam, tracker_xesam, G_TYPE_OBJECT)
 
 static void
-xesam_search_finalize (GObject *object)
-{
-	G_OBJECT_CLASS (tracker_xesam_parent_class)->finalize (object);
-}
-
-void
-tracker_xesam_set_db_connection (TrackerXesam *object,
-				 DBConnection *db_con)
-{
-	TrackerXesamPriv *priv;
-
-	priv = GET_PRIV (object);
-
-	priv->db_con = db_con;
-
-	g_object_notify (G_OBJECT (object), "db-connection");
-}
-
-static void
-xesam_get_property (GObject    *object, 
-		    guint       prop_id, 
-		    GValue     *value, 
-		    GParamSpec *pspec)
-{
-	TrackerXesamPriv *priv;
-
-	priv = GET_PRIV (object);
-
-	switch (prop_id) {
-	case PROP_DB_CONNECTION:
-		g_value_set_pointer (value, priv->db_con);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-		break;
-	};
-}
-
-static void
-xesam_set_property (GObject      *object,
-		    guint         param_id,
-		    const GValue *value,
-		    GParamSpec   *pspec)
-{
-	switch (param_id) {
-	case PROP_DB_CONNECTION:
-		tracker_xesam_set_db_connection (TRACKER_XESAM (object),
-						 g_value_get_pointer (value));
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
-		break;
-	};
-}
-
-static void
 tracker_xesam_class_init (TrackerXesamClass *klass)
 {
-	GObjectClass *object_class;
-
-	object_class = G_OBJECT_CLASS (klass);
-
-	object_class->finalize = xesam_search_finalize;
-
-	object_class->set_property = xesam_set_property;
-	object_class->get_property = xesam_get_property;
-
-	g_object_class_install_property (object_class,
-					 PROP_DB_CONNECTION,
-					 g_param_spec_pointer ("db-connection",
-							       "DB connection",
-							       "Database connection to use in transactions",
-							       G_PARAM_WRITABLE|G_PARAM_READABLE));
-
 	signals[XESAM_HITS_ADDED] =
 		g_signal_new ("hits-added",
 			G_TYPE_FROM_CLASS (klass),
@@ -196,8 +113,6 @@
 			G_TYPE_NONE,
 			1, 
 			G_TYPE_STRV);
-
-	g_type_class_add_private (object_class, sizeof (TrackerXesamPriv));
 }
 
 static void
@@ -206,11 +121,9 @@
 }
 
 TrackerXesam *
-tracker_xesam_new (DBConnection *db_con)
+tracker_xesam_new (void)
 {
-	return g_object_new (TRACKER_TYPE_XESAM, 
-			     "db-connection", db_con,
-			     NULL);
+	return g_object_new (TRACKER_TYPE_XESAM, NULL);
 }
 
 static void

Modified: branches/xesam-support/src/trackerd/tracker-xesam.h
==============================================================================
--- branches/xesam-support/src/trackerd/tracker-xesam.h	(original)
+++ branches/xesam-support/src/trackerd/tracker-xesam.h	Mon Jun  9 15:41:07 2008
@@ -26,7 +26,7 @@
 
 #include <dbus/dbus-glib-bindings.h>
 
-#include "tracker-db-sqlite.h"
+#include "tracker-db.h"
 #include "tracker-indexer.h"
 
 #define TRACKER_XESAM_SERVICE         "org.freedesktop.xesam.searcher"
@@ -54,7 +54,7 @@
 };
 
 GType         tracker_xesam_get_type           (void);
-TrackerXesam *tracker_xesam_new                (DBConnection          *db_con);
+TrackerXesam *tracker_xesam_new                (void);
 void          tracker_xesam_new_session        (TrackerXesam          *object,
 						DBusGMethodInvocation *context);
 void          tracker_xesam_set_property       (TrackerXesam          *object,
@@ -111,8 +111,6 @@
 						const char            *prev_owner,
 						const char            *new_owner,
 						TrackerXesam          *self);
-void          tracker_xesam_set_db_connection  (TrackerXesam          *object,
-						DBConnection          *db_con);
 
 G_END_DECLS
 



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