tracker r1364 - in branches/indexer-split: . src/libtracker-common src/trackerd



Author: mr
Date: Wed May  7 15:08:29 2008
New Revision: 1364
URL: http://svn.gnome.org/viewvc/tracker?rev=1364&view=rev

Log:
	* src/libtracker-common/tracker-utils.h: Fixed #ifndef issue where
	this utils file had the same name that the trackerd utils file
	had.

	* src/trackerd/Makefile.am:
	* src/trackerd/tracker-db-email.c:
	* src/trackerd/tracker-db-sqlite.[ch]:
	* src/trackerd/tracker-db.c:
	* src/trackerd/tracker-dbus-daemon.h:
	* src/trackerd/tracker-dbus-search.c:
	* src/trackerd/tracker-email-evolution.c:
	* src/trackerd/tracker-email-thunderbird.c:
	* src/trackerd/tracker-email.c:
	* src/trackerd/tracker-indexer.c:
	* src/trackerd/tracker-inotify.c:
	* src/trackerd/tracker-metadata.c:
	* src/trackerd/tracker-parser.c:
	* src/trackerd/tracker-process-files.h:
	* src/trackerd/tracker-utils.[ch]:
	* src/trackerd/tracker-xesam.c:
	* src/trackerd/trackerd.[ch]: Added trackerd.h for all stuff
	related to the Tracker struct. Kept all other utils based
	functions in tracker-utils.h. Fixed all the places where this
	broke things based on everything being included from
	tracker-utils.h and everwhere including that.


Added:
   branches/indexer-split/src/trackerd/trackerd.h
Modified:
   branches/indexer-split/ChangeLog
   branches/indexer-split/src/libtracker-common/tracker-utils.h
   branches/indexer-split/src/trackerd/Makefile.am
   branches/indexer-split/src/trackerd/tracker-db-email.c
   branches/indexer-split/src/trackerd/tracker-db-sqlite.c
   branches/indexer-split/src/trackerd/tracker-db-sqlite.h
   branches/indexer-split/src/trackerd/tracker-db.c
   branches/indexer-split/src/trackerd/tracker-dbus-daemon.h
   branches/indexer-split/src/trackerd/tracker-dbus-search.c
   branches/indexer-split/src/trackerd/tracker-email-evolution.c
   branches/indexer-split/src/trackerd/tracker-email-thunderbird.c
   branches/indexer-split/src/trackerd/tracker-email.c
   branches/indexer-split/src/trackerd/tracker-indexer.c
   branches/indexer-split/src/trackerd/tracker-inotify.c
   branches/indexer-split/src/trackerd/tracker-metadata.c
   branches/indexer-split/src/trackerd/tracker-parser.c
   branches/indexer-split/src/trackerd/tracker-process-files.h
   branches/indexer-split/src/trackerd/tracker-utils.c
   branches/indexer-split/src/trackerd/tracker-utils.h
   branches/indexer-split/src/trackerd/tracker-xesam.c
   branches/indexer-split/src/trackerd/trackerd.c

Modified: branches/indexer-split/src/libtracker-common/tracker-utils.h
==============================================================================
--- branches/indexer-split/src/libtracker-common/tracker-utils.h	(original)
+++ branches/indexer-split/src/libtracker-common/tracker-utils.h	Wed May  7 15:08:29 2008
@@ -19,12 +19,12 @@
  * Boston, MA  02110-1301, USA.
  */
 
-#ifndef __TRACKER_UTILS_H__
-#define __TRACKER_UTILS_H__
+#ifndef __LIBTRACKER_UTILS_H__
+#define __LIBTRACKER_UTILS_H__
 
 gboolean tracker_is_empty_string (const char  *str);
 gchar *  tracker_string_replace  (const gchar *haystack,
 				  gchar       *needle,
 				  gchar       *replacement);
 
-#endif /* __TRACKER_UTILS_H__ */
+#endif /* __LIBTRACKER_UTILS_H__ */

Modified: branches/indexer-split/src/trackerd/Makefile.am
==============================================================================
--- branches/indexer-split/src/trackerd/Makefile.am	(original)
+++ branches/indexer-split/src/trackerd/Makefile.am	Wed May  7 15:08:29 2008
@@ -85,6 +85,7 @@
 	$(hal_sources)							\
 	$(db_sources)							\
 	trackerd.c							\
+	trackerd.h							\
 	tracker-apps.c							\
 	tracker-apps.h							\
 	tracker-db.c							\

Modified: branches/indexer-split/src/trackerd/tracker-db-email.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-db-email.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-db-email.c	Wed May  7 15:08:29 2008
@@ -28,6 +28,7 @@
 #include <libtracker-common/tracker-type-utils.h>
 
 #include "tracker-db-email.h"
+#include "tracker-parser.h"
 
 #define MAX_ADDRESSES 255
 

Modified: branches/indexer-split/src/trackerd/tracker-db-sqlite.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-db-sqlite.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-db-sqlite.c	Wed May  7 15:08:29 2008
@@ -61,11 +61,13 @@
 #include "tracker-service-manager.h"
 #include "tracker-query-tree.h"
 #include "tracker-xesam.h"
+#include "trackerd.h"
 
-#define MAX_TEXT_BUFFER 65567
+#define MAX_TEXT_BUFFER     65567
 #define MAX_COMPRESS_BUFFER 65565
-#define DEFAULT_PAGE_CACHE 64
-#define MIN_PAGE_CACHE 16
+#define DEFAULT_PAGE_CACHE  64
+#define MIN_PAGE_CACHE      16
+#define ZLIBBUFSIZ          8192
 
 extern Tracker *tracker;
 
@@ -157,6 +159,181 @@
 	return result;
 }
 
+static gchar *
+function_compress_string (const gchar *ptr, 
+			  gint         size, 
+			  gint        *compressed_size)
+{
+	z_stream       zs;
+	gchar         *buf, *swap;
+	unsigned char  obuf[ZLIBBUFSIZ];
+	gint           rv, asiz, bsiz, osiz;
+
+	if (size < 0) { 
+		size = strlen (ptr);
+	}
+
+	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;
+	}
+
+	asiz = size + 16;
+
+	if (asiz < ZLIBBUFSIZ) {
+		asiz = ZLIBBUFSIZ;
+	}
+
+	if (!(buf = malloc (asiz))) {
+		deflateEnd (&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 = 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;
+			}
+
+			buf = swap;
+		}
+
+		memcpy (buf + bsiz, obuf, osiz);
+		bsiz += osiz;
+		zs.next_out = obuf;
+		zs.avail_out = ZLIBBUFSIZ;
+	}
+
+	if (rv != Z_STREAM_END) {
+		free (buf);
+		deflateEnd (&zs);
+		return NULL;
+	}
+
+	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;
+}
+
+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;
+}
+
 /* unzips data */
 static GValue
 function_uncompress (TrackerDBInterface *interface,
@@ -174,7 +351,7 @@
 		return result;
 	}
 
-	output = tracker_uncompress ((const gchar *) array->data, array->len, &len);
+	output = function_uncompress_string ((const gchar *) array->data, array->len, &len);
 
 	if (!output) {
 		g_warning ("Uncompress failed");
@@ -1507,7 +1684,7 @@
 	gint bytes_compressed;
 	FieldDef *def;
 
-	compressed = tracker_compress (text, length, &bytes_compressed);
+	compressed = function_compress_string (text, length, &bytes_compressed);
 
 	if (compressed) {
 		tracker_debug ("compressed full text size of %d to %d", length, bytes_compressed);
@@ -5019,6 +5196,49 @@
 	g_free (str_value);
 }
 
+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 = 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;
+}
 
 gboolean
 tracker_db_regulate_transactions (DBConnection *db_con, int interval)
@@ -5030,7 +5250,10 @@
 		if (tracker->index_count > 1) {
 			tracker_db_end_index_transaction (db_con);
 			tracker_db_start_index_transaction (db_con);
-			tracker_log ("Current memory usage is %d, word count %d and hits %d", tracker_get_memory_usage (), tracker->word_count, tracker->word_detail_count);
+			tracker_log ("Current memory usage is %d, word count %d and hits %d", 
+				     get_memory_usage (), 
+				     tracker->word_count, 
+				     tracker->word_detail_count);
 		}
 
 		return TRUE;
@@ -5067,3 +5290,35 @@
 	return integrity_check;
 }
 
+
+void
+tracker_free_metadata_field (FieldData *field_data)
+{
+	g_return_if_fail (field_data);
+
+	if (field_data->alias) {
+		g_free (field_data->alias);
+	}
+
+	if (field_data->where_field) {
+		g_free (field_data->where_field);
+	}
+
+	if (field_data->field_name) {
+		g_free (field_data->field_name);
+	}
+
+	if (field_data->select_field) {
+		g_free (field_data->select_field);
+	}
+
+	if (field_data->table_name) {
+		g_free (field_data->table_name);
+	}
+
+	if (field_data->id_field) {
+		g_free (field_data->id_field);
+	}
+
+	g_free (field_data);
+}

Modified: branches/indexer-split/src/trackerd/tracker-db-sqlite.h
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-db-sqlite.h	(original)
+++ branches/indexer-split/src/trackerd/tracker-db-sqlite.h	Wed May  7 15:08:29 2008
@@ -26,8 +26,9 @@
 #include <libtracker-db/tracker-db-interface.h>
 #include <libtracker-db/tracker-db-file-info.h>
 
-#include "tracker-utils.h"
 #include "tracker-service-manager.h"
+#include "tracker-indexer.h"
+#include "tracker-utils.h"
 
 typedef struct DBConnection DBConnection;
 
@@ -43,6 +44,49 @@
 	Indexer         *word_index;
 };
 
+typedef enum {
+	DATA_KEYWORD,	
+	DATA_INDEX,
+	DATA_FULLTEXT,
+	DATA_STRING,
+	DATA_INTEGER,
+	DATA_DOUBLE,
+	DATA_DATE,
+	DATA_BLOB,
+	DATA_STRUCT,
+	DATA_LINK
+} DataTypes;
+
+typedef struct {
+	char		*id;
+	DataTypes	type;
+	char 		*field_name;
+	int		weight;
+	guint           embedded : 1;
+	guint           multiple_values : 1;
+	guint           delimited : 1;
+	guint           filtered : 1;
+	guint           store_metadata : 1;
+
+	GSList		*child_ids; /* related child metadata ids */
+
+} FieldDef;
+
+typedef struct {
+	char 		*alias;
+	char 	 	*field_name;
+	char	 	*select_field;
+	char	 	*where_field;
+	char	 	*table_name;
+	char	 	*id_field;
+	DataTypes	data_type;
+	guint           multiple_values : 1;
+	guint           is_select : 1;
+	guint           is_condition : 1;
+	guint           needs_join : 1;
+
+} FieldData;
+
 gboolean            tracker_db_needs_setup                     (void);
 gboolean            tracker_db_needs_data                      (void);
 gboolean            tracker_db_initialize                      (void);
@@ -319,4 +363,6 @@
 TrackerDBResultSet *tracker_db_get_live_search_hit_count       (DBConnection *db_con, 
                                                                 const gchar *search_id);
 
+void                tracker_free_metadata_field                (FieldData *field_data);
+
 #endif

Modified: branches/indexer-split/src/trackerd/tracker-db.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-db.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-db.c	Wed May  7 15:08:29 2008
@@ -406,6 +406,60 @@
 }
 
 static void
+notify_meta_data_available (void)
+{
+	if (!tracker->is_running) {
+		return;
+	}
+
+	/* If metadata thread is asleep then we just need to wake it
+	 * up!
+	 */
+	if (g_mutex_trylock (tracker->metadata_signal_mutex)) {
+		g_cond_signal (tracker->metadata_signal_cond);
+		g_mutex_unlock (tracker->metadata_signal_mutex);
+		return;
+	}
+
+	/* If busy - check if async queue has new stuff as we do not
+	 * need to notify then.
+	 */
+	if (g_async_queue_length (tracker->file_metadata_queue) > 1) {
+		return;
+	}
+
+	/* If metadata thread not in check phase then we need do
+	 * nothing
+	 */
+	if (g_mutex_trylock (tracker->metadata_check_mutex)) {
+		g_mutex_unlock (tracker->metadata_check_mutex);
+		return;
+	}
+
+	/* We are in check phase - we need to wait until either
+	 * check_mutex is unlocked or until metadata thread is asleep
+	 * then we awaken it.
+	 */
+	while (TRUE) {
+		if (g_mutex_trylock (tracker->metadata_check_mutex)) {
+			g_mutex_unlock (tracker->metadata_check_mutex);
+			return;
+		}
+
+		if (g_mutex_trylock (tracker->metadata_signal_mutex)) {
+			g_cond_signal (tracker->metadata_signal_cond);
+			g_mutex_unlock (tracker->metadata_signal_mutex);
+			return;
+		}
+
+		g_thread_yield ();
+		g_usleep (10);
+
+		tracker_debug ("In check phase");
+	}
+}
+
+static void
 make_pending_file (DBConnection *db_con, guint32 file_id, const char *uri, const char *moved_to_uri, const char *mime, int counter, TrackerDBAction action, gboolean is_directory, gboolean is_new, int service_type_id)
 {
 	char *str_file_id, *str_action, *str_counter;
@@ -466,7 +520,7 @@
 
 	/* signal respective thread that data is available and awake it if its asleep */
 	if (action == TRACKER_DB_ACTION_EXTRACT_METADATA) {
-		tracker_notify_meta_data_available ();
+		notify_meta_data_available ();
 	} else {
 		tracker_notify_file_data_available ();
 	}
@@ -517,7 +571,7 @@
 		tracker_db_insert_pending_file (db_con, info->file_id, info->uri, NULL, info->mime, 0, TRACKER_DB_ACTION_EXTRACT_METADATA, info->is_directory, info->is_new, info->service_type_id);
 	}
 
-	tracker_notify_meta_data_available ();
+	notify_meta_data_available ();
 }
 
 static void

Modified: branches/indexer-split/src/trackerd/tracker-dbus-daemon.h
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-dbus-daemon.h	(original)
+++ branches/indexer-split/src/trackerd/tracker-dbus-daemon.h	Wed May  7 15:08:29 2008
@@ -29,6 +29,7 @@
 #include <libtracker-common/tracker-config.h>
 
 #include "tracker-db-sqlite.h"
+#include "trackerd.h"
 
 #define TRACKER_DBUS_DAEMON_SERVICE         "org.freedesktop.Tracker"
 #define TRACKER_DBUS_DAEMON_PATH            "/org/freedesktop/Tracker"

Modified: branches/indexer-split/src/trackerd/tracker-dbus-search.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-dbus-search.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-dbus-search.c	Wed May  7 15:08:29 2008
@@ -29,6 +29,7 @@
 
 #include "tracker-dbus.h"
 #include "tracker-dbus-search.h"
+#include "tracker-parser.h"
 #include "tracker-rdf-query.h"
 #include "tracker-query-tree.h"
 #include "tracker-indexer.h"
@@ -214,6 +215,304 @@
         return max_hits;
 }
 
+static const gchar *
+dbus_search_utf8_p_from_offset_skipping_decomp (const gchar *str,
+						gint         offset)
+{
+	const gchar *p, *q;
+	gchar       *casefold, *normal;
+
+	g_return_val_if_fail (str != NULL, NULL);
+
+	p = str;
+
+	while (offset > 0) {
+		q = g_utf8_next_char (p);
+		casefold = g_utf8_casefold (p, q - p);
+		normal = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFC);
+		offset -= g_utf8_strlen (normal, -1);
+		g_free (casefold);
+		g_free (normal);
+		p = q;
+	}
+
+	return p;
+}
+
+static const char *
+dbus_search_utf8_strcasestr_array (const gchar  *haystack, 
+				   gchar       **needles)
+{
+	gsize         needle_len;
+	gsize         haystack_len;
+	const gchar  *ret = NULL;
+	const gchar  *needle;
+	gchar       **array;
+	gchar        *p;
+	gchar        *casefold;
+	gchar        *caseless_haystack;
+	gint          i;
+
+	g_return_val_if_fail (haystack != NULL, NULL);
+
+	casefold = g_utf8_casefold (haystack, -1);
+	caseless_haystack = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFC);
+	g_free (casefold);
+
+	if (!caseless_haystack) {
+		return NULL;
+	}
+
+	haystack_len = g_utf8_strlen (caseless_haystack, -1);
+
+	for (array = needles; *array; array++) {
+		needle = *array;
+		needle_len = g_utf8_strlen (needle, -1);
+
+		if (needle_len == 0) {
+			continue;
+		}
+
+		if (haystack_len < needle_len) {
+			continue;
+		}
+
+		p = (gchar *) caseless_haystack;
+		needle_len = strlen (needle);
+		i = 0;
+
+		while (*p) {
+			if ((strncmp (p, needle, needle_len) == 0)) {
+				ret = dbus_search_utf8_p_from_offset_skipping_decomp (haystack, i);
+				goto done;
+			}
+
+			p = g_utf8_next_char (p);
+			i++;
+		}
+	}
+
+done:
+	g_free (caseless_haystack);
+
+	return ret;
+}
+
+static gint
+dbus_search_get_word_break (const char *a)
+{
+	gchar **words;
+	gint    value;
+
+	words = g_strsplit_set (a, "\t\n\v\f\r !\"#$%&'()*/<=>?[\\]^`{|}~+,.:;@\"[]" , -1);
+
+	if (!words) { 
+		return 0;
+	}
+
+	value = strlen (words[0]);
+	g_strfreev (words);
+
+	return value;
+}
+
+
+static gboolean
+dbus_search_is_word_break (const char a)
+{
+	const gchar *breaks = "\t\n\v\f\r !\"#$%&'()*/<=>?[\\]^`{|}~+,.:;@\"[]";
+	gint         i;
+
+	for (i = 0; breaks[i]; i++) {
+		if (a == breaks[i]) {
+			return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
+static char *
+dbus_search_highlight_terms (const gchar  *text, 
+			     gchar       **terms)
+{
+	GStrv         p;
+	GString      *s;
+	const gchar  *str;
+	gchar        *text_copy;
+	gint          term_len;
+
+	if (!text || !terms) {
+		return NULL;
+	}
+
+	text_copy = g_strdup (text);
+
+	for (p = terms; *p; p++) {
+		const gchar  *text_p;
+		gchar       **single_term;
+
+		single_term = g_new (gchar*, 2);
+		single_term[0] = g_strdup (*p);
+		single_term[1] = NULL;
+
+		s = g_string_new ("");
+		text_p = text_copy;
+
+		while ((str = dbus_search_utf8_strcasestr_array (text_p, single_term))) {
+			gchar *pre_snip;
+			gchar *term;
+
+			pre_snip = g_strndup (text_p, (str - text_p));
+			term_len = dbus_search_get_word_break (str);
+			term = g_strndup (str, term_len);
+
+			text_p = str + term_len;
+			g_string_append_printf (s, "%s<b>%s</b>", pre_snip, term);
+
+			g_free (pre_snip);
+			g_free (term);
+		}
+
+		if (text_p) {
+			g_string_append (s, text_p);
+		}
+
+		g_strfreev (single_term);
+		g_free (text_copy);
+
+		text_copy = g_string_free (s, FALSE);
+	}
+
+	return text_copy;
+}
+
+gchar *
+dbus_search_get_snippet (const gchar  *text, 
+			 gchar       **terms, 
+			 gint          length)
+{
+	const gchar *ptr = NULL;
+	const gchar *end_ptr;
+	const gchar *tmp;
+	gint         i;
+	gint         text_len;
+
+	if (!text || !terms) {
+		return NULL;
+	}
+
+	text_len = strlen (text);
+	ptr = dbus_search_utf8_strcasestr_array (text, terms);
+
+	if (ptr) {
+		gchar *snippet;
+		gchar *snippet_escaped;
+		gchar *snippet_highlighted;
+
+		tmp = ptr;
+		i = 0;
+
+		/* Get snippet before  the matching term */
+		while ((ptr = g_utf8_prev_char (ptr)) && ptr >= text && i < length) {
+			if (*ptr == '\n') {
+				break;
+			}
+
+			i++;
+		}
+
+		/* Try to start beginning of snippet on a word break */
+		if (*ptr != '\n' && ptr > text) {
+			i = 0;
+
+			while (!dbus_search_is_word_break (*ptr) && i < (length / 2)) {
+				ptr = g_utf8_next_char (ptr);
+				i++;
+			}
+		}
+
+		ptr = g_utf8_next_char (ptr);
+
+		if (!ptr || ptr < text) {
+			return NULL;
+		}
+
+		end_ptr = tmp;
+		i = 0;
+
+		/* Get snippet after match */
+		while ((end_ptr = g_utf8_next_char (end_ptr)) && 
+		       end_ptr <= text_len + text && 
+		       i < length) {
+			i++;
+
+			if (*end_ptr == '\n') {
+				break;
+			}
+		}
+
+		while (end_ptr > text_len + text) {
+			end_ptr = g_utf8_prev_char (end_ptr);
+		}
+
+		/* Try to end snippet on a word break */
+		if (*end_ptr != '\n' && end_ptr < text_len + text) {
+			i=0;
+			while (!dbus_search_is_word_break (*end_ptr) && i < (length / 2)) {
+				end_ptr = g_utf8_prev_char (end_ptr);
+				i++;
+			}
+		}
+
+		if (!end_ptr || !ptr) {
+			return NULL;
+		}
+
+		snippet = g_strndup (ptr, end_ptr - ptr);
+		i = strlen (snippet);
+		snippet_escaped = g_markup_escape_text (snippet, i);
+		g_free (snippet);
+
+		snippet_highlighted = dbus_search_highlight_terms (snippet_escaped, terms);
+		g_free (snippet_escaped);
+
+		return snippet_highlighted;
+	}
+
+	ptr = text;
+	i = 0;
+
+	while ((ptr = g_utf8_next_char (ptr)) && ptr <= text_len + text && i < length) {
+		i++;
+
+		if (*ptr == '\n') {
+			break;
+		}
+	}
+
+	if (ptr > text_len + text) {
+		ptr = g_utf8_prev_char (ptr);
+	}
+
+	if (ptr) {
+		gchar *snippet;
+		gchar *snippet_escaped;
+		gchar *snippet_highlighted;
+
+		snippet = g_strndup (text, ptr - text);
+		snippet_escaped = g_markup_escape_text (snippet, ptr - text);
+		snippet_highlighted = dbus_search_highlight_terms (snippet_escaped, terms);
+
+		g_free (snippet);
+		g_free (snippet_escaped);
+
+		return snippet_highlighted;
+	} else {
+		return NULL;
+	}
+}
+
 gboolean
 tracker_dbus_search_get_hit_count (TrackerDBusSearch  *object,
                                    const gchar        *service,
@@ -628,7 +927,7 @@
 		strv = tracker_parse_text_into_array (text);
 
 		if (strv && strv[0]) {
-			snippet = tracker_get_snippet (text, strv, 120);
+			snippet = dbus_search_get_snippet (text, strv, 120);
 		}
 
 		g_strfreev (strv);

Modified: branches/indexer-split/src/trackerd/tracker-email-evolution.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-email-evolution.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-email-evolution.c	Wed May  7 15:08:29 2008
@@ -46,6 +46,8 @@
 #include "tracker-dbus-daemon.h"
 #include "tracker-watch.h"
 #include "tracker-status.h"
+#include "tracker-utils.h"
+#include "trackerd.h"
 
 #define EVOLUTION_MAIL_DIR_S ".evolution/mail"
 

Modified: branches/indexer-split/src/trackerd/tracker-email-thunderbird.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-email-thunderbird.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-email-thunderbird.c	Wed May  7 15:08:29 2008
@@ -29,6 +29,7 @@
 
 #include "tracker-db-email.h"
 #include "tracker-watch.h"
+#include "trackerd.h"
 
 typedef enum
 {

Modified: branches/indexer-split/src/trackerd/tracker-email.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-email.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-email.c	Wed May  7 15:08:29 2008
@@ -26,6 +26,7 @@
 
 #include "tracker-email.h"
 #include "tracker-email-utils.h"
+#include "trackerd.h"
 
 extern Tracker *tracker;
 

Modified: branches/indexer-split/src/trackerd/tracker-indexer.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-indexer.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-indexer.c	Wed May  7 15:08:29 2008
@@ -29,6 +29,7 @@
 #define INDEXFBP            32     
 #define SCORE_MULTIPLIER    100000
 #define MAX_HIT_BUFFER      480000
+#define MAX_HITS_FOR_WORD   30000
 #define MAX_INDEX_FILE_SIZE 2000000000
 
 #define CREATE_INDEX                                                      \

Modified: branches/indexer-split/src/trackerd/tracker-inotify.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-inotify.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-inotify.c	Wed May  7 15:08:29 2008
@@ -41,6 +41,7 @@
 
 #include "tracker-watch.h"
 #include "tracker-process-files.h"
+#include "tracker-utils.h"
 
 #define INOTIFY_WATCH_LIMIT "/proc/sys/fs/inotify/max_user_watches"
 

Modified: branches/indexer-split/src/trackerd/tracker-metadata.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-metadata.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-metadata.c	Wed May  7 15:08:29 2008
@@ -37,10 +37,10 @@
 #include "tracker-metadata.h"
 #include "tracker-utils.h"
 #include "tracker-service-manager.h"
+#include "trackerd.h"
 
 extern Tracker *tracker;
 
-
 char *
 tracker_metadata_get_text_file (const char *uri, const char *mime)
 {

Modified: branches/indexer-split/src/trackerd/tracker-parser.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-parser.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-parser.c	Wed May  7 15:08:29 2008
@@ -33,6 +33,7 @@
 
 #include "tracker-parser.h"
 #include "tracker-utils.h"
+#include "trackerd.h"
 
 extern Tracker *tracker;
 

Modified: branches/indexer-split/src/trackerd/tracker-process-files.h
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-process-files.h	(original)
+++ branches/indexer-split/src/trackerd/tracker-process-files.h	Wed May  7 15:08:29 2008
@@ -25,6 +25,7 @@
 #include <libtracker-db/tracker-db-file-info.h>
 
 #include "tracker-utils.h"
+#include "trackerd.h"
 
 /* Thread entry point */
 gpointer tracker_process_files                        (gpointer        data);

Modified: branches/indexer-split/src/trackerd/tracker-utils.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-utils.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-utils.c	Wed May  7 15:08:29 2008
@@ -2,6 +2,7 @@
 /*
  * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc gnome org)
  * Copyright (C) 2007, Michal Pryc (Michal Pryc Sun Com)
+ * 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
@@ -20,52 +21,19 @@
  */
 #include "config.h"
 
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/types.h>
-#include <sys/stat.h>
 #include <sys/statvfs.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <limits.h>
-#include <zlib.h>
-#include <math.h>
-
-#ifdef OS_WIN32
-#include <conio.h>
-#include "mingw-compat.h"
-#else
-#include <sys/resource.h>
-#endif
-
-#include <glib/gprintf.h>
-#include <glib/gstdio.h>
-#include <glib/gpattern.h>
 
 #include <libtracker-common/tracker-log.h>
 #include <libtracker-common/tracker-config.h>
-#include <libtracker-common/tracker-os-dependant.h>
-#include <libtracker-common/tracker-file-utils.h>
-#include <libtracker-common/tracker-utils.h>
 
-
-#include "tracker-dbus.h"
 #include "tracker-utils.h"
-#include "tracker-indexer.h"
-#include "tracker-process-files.h"
-
-extern Tracker	*tracker;
-
-#define ZLIBBUFSIZ 8192
+#include "trackerd.h"
 
-static int info_allocated = 0;
-static int info_deallocated = 0;
+extern Tracker *tracker;
 
-char *
-tracker_get_radix_by_suffix (const char *str, const char *suffix)
+gchar *
+tracker_get_radix_by_suffix (const gchar *str, 
+			     const gchar *suffix)
 {
 	g_return_val_if_fail (str, NULL);
 	g_return_val_if_fail (suffix, NULL);
@@ -77,123 +45,8 @@
 	}
 }
 
-
-char *
-tracker_escape_metadata (const char *in)
-{
-	if (!in) {
-		return NULL;
-	}
-
-	GString *gs = g_string_new ("");
-
-	for(; *in; in++) {
-		if (*in == '|') {
-			g_string_append_c (gs, 30);
-		} else {
-			g_string_append_c (gs, *in);
-		}
-	}
-
-	return g_string_free (gs, FALSE);
-}
-
-
-
-char *
-tracker_unescape_metadata (const char *in)
-{
-	if (!in) {
-		return NULL;
-	}
-
-	GString *gs = g_string_new ("");
-
-	for(; *in; in++) {
-		if (*in == 30) {
-			g_string_append_c (gs, '|');
-		} else {
-			g_string_append_c (gs, *in);
-		}
-	}
-
-	return g_string_free (gs, FALSE);
-}
-
-char *
-tracker_format_search_terms (const char *str, gboolean *do_bool_search)
-{
-	char *def_prefix;
-	char **terms;
-
-	*do_bool_search = FALSE;
-
-	def_prefix = "+";
-
-	if (strlen (str) < 3) {
-		return g_strdup (str);
-	}
-
-	/* if already has quotes then do nothing */
-	if (strchr (str, '"') || strchr (str, '*')) {
-		*do_bool_search = TRUE;
-		return g_strdup (str);
-	}
-
-	if (strstr (str, " or ")) {
-		def_prefix = " ";
-	}
-
-	terms = g_strsplit (str, " ", -1);
-
-	if (terms) {
-		GString *search_term;
-		char	**st;
-		char	*prefix;
-
-		search_term = g_string_new (" ");
-
-		for (st = terms; *st; st++) {
-
-			if (*st[0] == '-') {
-				prefix = " ";
-			} else {
-				prefix = def_prefix;
-			}
-
-			if ((*st[0] != '-') && strchr (*st, '-')) {
-				char *s;
-
-				*do_bool_search = TRUE;
-
-				s = g_strconcat ("\"", *st, "\"", NULL);
-
-				g_string_append (search_term, s);
-
-				g_free (s);
-
-			} else {
-				g_string_append_printf (search_term, " %s%s ", prefix, *st);
-			}
-		}
-
-		g_strfreev (terms);
-
-		return g_string_free (search_term, FALSE);
-	}
-
-	return g_strdup (str);
-}
-
-
-void
-tracker_print_object_allocations (void)
-{
-	tracker_log ("Total allocations = %d, total deallocations = %d", info_allocated, info_deallocated);
-}
-
 void
-tracker_throttle (int multiplier)
+tracker_throttle (gint multiplier)
 {
 	gint throttle;
 
@@ -210,37 +63,38 @@
 	}
 }
 
-
 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 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 busy - check if async queue has new stuff as we do not need to notify then */
 	if (g_async_queue_length (tracker->file_process_queue) > 1) {
 		return;
 	}
 
-	/* if file thread not in check phase then we need do nothing */
+	/* 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;
 	}
 
-	int revs = 0;
-
-	/* we are in check phase - we need to wait until either check_mutex is unlocked or file thread is asleep then awaken it */
+	/* 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;
@@ -254,655 +108,22 @@
 
 		g_thread_yield ();
 		g_usleep (10);
-		revs++;
-	}
-}
-
-
-void
-tracker_notify_meta_data_available (void)
-{
-	if (!tracker->is_running) {
-		return;
-	}
-
-	/* if metadata thread is asleep then we just need to wake it up! */
-	if (g_mutex_trylock (tracker->metadata_signal_mutex)) {
-		g_cond_signal (tracker->metadata_signal_cond);
-		g_mutex_unlock (tracker->metadata_signal_mutex);
-		return;
-	}
-
-	/* if busy - check if async queue has new stuff as we do not need to notify then */
-	if (g_async_queue_length (tracker->file_metadata_queue) > 1) {
-		return;
-	}
-
-	/* if metadata thread not in check phase then we need do nothing */
-	if (g_mutex_trylock (tracker->metadata_check_mutex)) {
-		g_mutex_unlock (tracker->metadata_check_mutex);
-		return;
-	}
-
-	/* we are in check phase - we need to wait until either check_mutex is unlocked or until metadata thread is asleep then we awaken it */
-	while (TRUE) {
-
-		if (g_mutex_trylock (tracker->metadata_check_mutex)) {
-			g_mutex_unlock (tracker->metadata_check_mutex);
-			return;
-		}
-
-		if (g_mutex_trylock (tracker->metadata_signal_mutex)) {
-			g_cond_signal (tracker->metadata_signal_cond);
-			g_mutex_unlock (tracker->metadata_signal_mutex);
-			return;
-		}
-
-		g_thread_yield ();
-		g_usleep (10);
-		tracker_debug ("in check phase");
-	}
-}
-
-char *
-tracker_compress (const char *ptr, int size, int *compressed_size)
-{
-	z_stream zs;
-	char *buf, *swap;
-	unsigned char obuf[ZLIBBUFSIZ];
-	int rv, asiz, bsiz, osiz;
-	if (size < 0) size = strlen (ptr);
-	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;
-	}
-
-	asiz = size + 16;
-	if (asiz < ZLIBBUFSIZ) asiz = ZLIBBUFSIZ;
-	if (!(buf = malloc (asiz))) {
-		deflateEnd (&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 = 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;
-			}
-			buf = swap;
-		}
-		memcpy (buf + bsiz, obuf, osiz);
-		bsiz += osiz;
-		zs.next_out = obuf;
-		zs.avail_out = ZLIBBUFSIZ;
-	}
-	if (rv != Z_STREAM_END) {
-		free (buf);
-		deflateEnd (&zs);
-		return NULL;
-	}
-
-	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;
-}
-
-
-char *
-tracker_uncompress (const char *ptr, int size, int *uncompressed_size)
-{
-	z_stream zs;
-	char *buf, *swap;
-	unsigned char obuf[ZLIBBUFSIZ];
-	int 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 inline gboolean
-is_match (const char *a, const char *b)
-{
-	int len = strlen (b);
-
-	char *str1 = g_utf8_casefold (a, len);
-        char *str2 = g_utf8_casefold (b, len);
-
-	char *normal1 = g_utf8_normalize (str1, -1, G_NORMALIZE_NFC);
-	char *normal2 = g_utf8_normalize (str2, -1, G_NORMALIZE_NFC);
-
-	gboolean result = (strcmp (normal1, normal2) == 0);
-
-	g_free (str1);
-	g_free (str2);
-	g_free (normal1);
-	g_free (normal2);
-
-	return result;
-}
-
-
-static const gchar *
-pointer_from_offset_skipping_decomp (const gchar *str, gint offset)
-{
-	gchar *casefold, *normal;
-	const gchar *p, *q;
-
-	g_return_val_if_fail (str != NULL, NULL);
-
-	p = str;
-	while (offset > 0)
-	{
-		q = g_utf8_next_char (p);
-		casefold = g_utf8_casefold (p, q - p);
-		normal = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFC);
-		offset -= g_utf8_strlen (normal, -1);
-		g_free (casefold);
-		g_free (normal);
-		p = q;
-	}
-	return p;
-}
-
-
-static const char *
-g_utf8_strcasestr_array (const gchar *haystack, gchar **needles)
-{
-	gsize needle_len;
-	gsize haystack_len;
-	const char *ret = NULL, *needle;
-	char **array;
-	char *p;
-	char *casefold;
-	char *caseless_haystack;
-	int i;
-
-	g_return_val_if_fail (haystack != NULL, NULL);
-
-	casefold = g_utf8_casefold (haystack, -1);
-	caseless_haystack = g_utf8_normalize (casefold, -1, G_NORMALIZE_NFC);
-	g_free (casefold);
-
-	if (!caseless_haystack) {
-		return NULL;
-	}
-
-	haystack_len = g_utf8_strlen (caseless_haystack, -1);
-
-	for (array=needles; *array; array++)
-	{
-		needle = *array;
-		needle_len = g_utf8_strlen (needle, -1);
-
-		if (needle_len == 0) {
-			continue;
-		}
-
-		if (haystack_len < needle_len) {
-			continue;
-		}
-
-		p = (gchar *) caseless_haystack;
-		needle_len = strlen (needle);
-		i = 0;
-
-		while (*p) {
-
-			if ((strncmp (p, needle, needle_len) == 0)) {
-				ret = pointer_from_offset_skipping_decomp (haystack, i);
-				goto finally_1;
-			}
 
-			p = g_utf8_next_char (p);
-			i++;
-		}
-	}
-
-finally_1:
-	g_free (caseless_haystack);
-
-	return ret;
-}
-
-
-const char *
-substring_utf8 (const char *a, const char *b)
-{
-        const char  *ptr, *found_ptr;
-	gunichar c, lower, upper;
-	int len;
-	gboolean got_match = FALSE;
-
-	len = strlen (b);
-
-	c = g_utf8_get_char (b);
-
-	lower = g_unichar_tolower (c);
-	upper = g_unichar_toupper (c);
-
-	ptr = a;
-	found_ptr = a;
-
-	/* check lowercase first */
-	while (found_ptr) {
-
-		found_ptr = g_utf8_strchr (ptr, -1, lower);
-
-		if (found_ptr) {
-			ptr = g_utf8_find_next_char (found_ptr, NULL);
-			if (is_match (found_ptr, b)) {
-				got_match = TRUE;
-				break;
-			}
-		} else {
-			break;
-		}
-	}
-
-	if (!got_match) {
-		ptr = a;
-		found_ptr = a;
-		while (found_ptr) {
-
-			found_ptr = g_utf8_strchr (ptr, -1, upper);
-
-			if (found_ptr) {
-				ptr = g_utf8_find_next_char (found_ptr, NULL);
-				if (is_match (found_ptr, b)) {
-					break;
-				}
-			} else {
-
-			}
-		}
-	}
-
-	return found_ptr;
-}
-
-
-static int
-get_word_break (const char *a)
-{
-	char **words = g_strsplit_set (a, "\t\n\v\f\r !\"#$%&'()*/<=>?[\\]^`{|}~+,.:;@\"[]" , -1);
-
-	if (!words) return 0;
-
-	int ret = strlen (words[0]);
-
-	g_strfreev  (words);
-
-	return ret;
-}
-
-
-static gboolean
-is_word_break (const char a)
-{
-	const char *breaks = "\t\n\v\f\r !\"#$%&'()*/<=>?[\\]^`{|}~+,.:;@\"[]";
-	int i;
-
-	for (i = 0; breaks[i]; i++) {
-		if (a == breaks[i]) {
-			return TRUE;
-		}
-	}
-
-	return FALSE;
-}
-
-
-static char *
-highlight_terms (const char *str, char **terms)
-{
-	const char *ptr;
-	char *txt;
-	GString *st;
-	int term_length;
-
-	if (!str || !terms) {
-		return NULL;
-	}
-
-	char **array;
-	txt = g_strdup (str);
-
-	for (array = terms; *array; array++) {
-		char **single_term;
-
-		single_term = g_new( char *, 2);
-		single_term[0] = g_strdup (*array);
-		single_term[1] = NULL;
-
-		st = g_string_new ("");
-
-		const char *ptxt = txt;
-
-		while ((ptr = g_utf8_strcasestr_array  (ptxt, single_term))) {
-			char *pre_snip, *term;
-
-			pre_snip = g_strndup (ptxt, (ptr - ptxt));
-
-			term_length = get_word_break (ptr);
-
-			term = g_strndup (ptr, term_length);
-
-			ptxt = ptr + term_length;
-
-			g_string_append_printf (st, "%s<b>%s</b>", pre_snip, term);
-
-			g_free (pre_snip);
-			g_free (term);
-		}
-
-		if (ptxt) {
-			g_string_append (st, ptxt);
-
-		}
-
-		g_strfreev  (single_term);
-		g_free (txt);
-
-		txt = g_string_free (st, FALSE);
-	}
-
-	return txt;
-}
-
-
-char *
-tracker_get_snippet (const char *txt, char **terms, int length)
-{
-	const char *ptr = NULL, *end_ptr,  *tmp;
-	int i, txt_len;
-
-	if (!txt || !terms) {
-		return NULL;
-	}
-
-	txt_len = strlen (txt);
-
-	ptr = g_utf8_strcasestr_array (txt, terms);
-
-	if (ptr) {
-		tmp = ptr;
-
-		i = 0;
-
-		/* get snippet before  the matching term */
-		while ((ptr = g_utf8_prev_char (ptr)) && (ptr >= txt) && (i < length)) {
-
-			if (*ptr == '\n') {
-				break;
-			}
-			i++;
-		}
-
-		/* try to start beginning of snippet on a word break */
-		if ((*ptr != '\n') && (ptr > txt)) {
-			i=0;
-			while (!is_word_break (*ptr) && (i<(length/2))) {
-				ptr = g_utf8_next_char (ptr);
-				i++;
-			}
-		}
-
-		ptr = g_utf8_next_char (ptr);
-
-		if (!ptr || ptr < txt) {
-			return NULL;
-		}
-
-		end_ptr = tmp;
-		i = 0;
-
-		/* get snippet after match */
-		while ((end_ptr = g_utf8_next_char (end_ptr)) && (end_ptr <= txt_len + txt) && (i < length)) {
-			i++;
-			if (*end_ptr == '\n') {
-				break;
-			}
-		}
-
-		while (end_ptr > txt_len + txt) {
-			end_ptr = g_utf8_prev_char (end_ptr);
-		}
-
-		/* try to end snippet on a word break */
-		if ((*end_ptr != '\n') && (end_ptr < txt_len + txt)) {
-			i=0;
-			while (!is_word_break (*end_ptr) && (i<(length/2))) {
-				end_ptr = g_utf8_prev_char (end_ptr);
-				i++;
-			}
-		}
-
-		if (!end_ptr || !ptr) {
-			return NULL;
-		}
-
-		char *snip, *esc_snip,  *highlight_snip;
-
-		snip = g_strndup (ptr,  end_ptr - ptr);
-
-		i = strlen (snip);
-
-		esc_snip = g_markup_escape_text (snip, i);
-
-		g_free (snip);
-
-		highlight_snip = highlight_terms (esc_snip, terms);
-
-		g_free (esc_snip);
-
-		return highlight_snip;
-	}
-
-	ptr = txt;
-	i = 0;
-	while ((ptr = g_utf8_next_char (ptr)) && (ptr <= txt_len + txt) && (i < length)) {
-		i++;
-		if (*ptr == '\n') {
-			break;
-		}
-	}
-
-	if (ptr > txt_len + txt) {
-		ptr = g_utf8_prev_char (ptr);
-	}
-
-	if (ptr) {
-		char *snippet = g_strndup (txt, ptr - txt);
-		char *esc_snippet = g_markup_escape_text (snippet, ptr - txt);
-		char *highlight_snip = highlight_terms (esc_snippet, terms);
-
-		g_free (snippet);
-		g_free (esc_snippet);
-
-		return highlight_snip;
-	} else {
-		return NULL;
+		revs++;
 	}
 }
 
 void
-tracker_add_metadata_to_table (GHashTable *meta_table, const gchar *key, const gchar *value)
+tracker_add_metadata_to_table (GHashTable  *meta_table, 
+			       const gchar *key, 
+			       const gchar *value)
 {
-	GSList *list = g_hash_table_lookup (meta_table, (gchar *) key);
-
-	list = g_slist_prepend (list, (gchar *) value);
+	GSList *list;
 
+	list = g_hash_table_lookup (meta_table, (gchar*) key);
+	list = g_slist_prepend (list, (gchar*) value);
 	g_hash_table_steal (meta_table, key);
-
-	g_hash_table_insert (meta_table, (gchar *) key, list);
-}
-
-
-void
-tracker_free_metadata_field (FieldData *field_data)
-{
-	g_return_if_fail (field_data);
-
-	if (field_data->alias) {
-		g_free (field_data->alias);
-	}
-
-	if (field_data->where_field) {
-		g_free (field_data->where_field);
-	}
-
-	if (field_data->field_name) {
-		g_free (field_data->field_name);
-	}
-
-	if (field_data->select_field) {
-		g_free (field_data->select_field);
-	}
-
-	if (field_data->table_name) {
-		g_free (field_data->table_name);
-	}
-
-	if (field_data->id_field) {
-		g_free (field_data->id_field);
-	}
-
-	g_free (field_data);
-}
-
-
-
-
-int 
-tracker_get_memory_usage (void)
-{
-
-
-#if defined(__linux__)
-	int  fd, length, mem = 0;
-	char buffer[8192];
-
-	char *stat_file = g_strdup_printf ("/proc/%d/stat", tracker->pid);
-
-	fd = open (stat_file, O_RDONLY); 
-
-	g_free (stat_file);
-
-	if (fd ==-1) {
-		return 0;
-	}
-
-	
-	length = read (fd, buffer, 8192);
-
-	buffer[length] = 0;
-
-	close (fd);
-
-	char **terms = g_strsplit (buffer, " ", -1);
-
-	
-	if (terms) {
-
-		int 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;
+	g_hash_table_insert (meta_table, (gchar*) key, list);
 }
 
 void
@@ -912,22 +133,23 @@
 		return;
 	}
 
-	tracker_log ("file changes to %s is pausing tracker", uri);
-
+	tracker_log ("File changes to:'%s' is causing tracker to pause...", 
+		     uri);
 
 	tracker->grace_period++;
 }
 
 gboolean
-tracker_low_diskspace (void)
+tracker_is_low_diskspace (void)
 {
 	struct statvfs st;
         gint           low_disk_space_limit;
 
         low_disk_space_limit = tracker_config_get_low_disk_space_limit (tracker->config);
 
-	if (low_disk_space_limit < 1)
+	if (low_disk_space_limit < 1) {
 		return FALSE;
+	}
 
 	if (statvfs (tracker->data_dir, &st) == -1) {
 		static gboolean reported = 0;
@@ -951,7 +173,7 @@
 {
 	return  tracker->pause_manual || 
 		tracker_should_pause_on_battery () || 
-		tracker_low_diskspace () || 
+		tracker_is_low_diskspace () || 
 		tracker_indexer_are_databases_too_big ();
 }
 

Modified: branches/indexer-split/src/trackerd/tracker-utils.h
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-utils.h	(original)
+++ branches/indexer-split/src/trackerd/tracker-utils.h	Wed May  7 15:08:29 2008
@@ -1,5 +1,8 @@
-/* Tracker - indexer and metadata database engine
+/* -*- 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, Michal Pryc (Michal Pryc Sun Com)
+ * 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
@@ -17,333 +20,25 @@
  * Boston, MA  02110-1301, USA. 
  */  
 
-#ifndef _TRACKER_UTILS_H_
-#define _TRACKER_UTILS_H_
-
-extern char *type_array[];
-extern char *implemented_services[];
-extern char *file_service_array[] ;
-extern char *serice_index_array[];
-extern char *service_table_names[];
-extern char *service_metadata_table_names[];
-extern char *service_metadata_join_names[];
-
-#include "config.h"
-
-#include <time.h>
+#ifndef __TRACKERD_UTILS_H__
+#define __TRACKERD_UTILS_H__
 
 #include <glib.h>
 
-#include <libtracker-db/tracker-db-action.h>
-
-#include "tracker-parser.h"
-#include "tracker-indexer.h"
-
-#define MAX_HITS_FOR_WORD 30000
-
-/* set merge limit default to 64MB */
-#define MERGE_LIMIT 671088649
-
-/* max default file pause time in ms  = FILE_PAUSE_PERIOD * FILE_SCHEDULE_PERIOD */
-#define FILE_PAUSE_PERIOD		1
-#define FILE_SCHEDULE_PERIOD		300
-
-#define TRACKER_DB_VERSION_REQUIRED	13
-#define TRACKER_VERSION			VERSION
-#define TRACKER_VERSION_INT		604
-
-/* default performance options */
-#define MAX_INDEX_TEXT_LENGTH		1048576
-#define MAX_PROCESS_QUEUE_SIZE		100
-#define MAX_EXTRACT_QUEUE_SIZE		500
-#define OPTIMIZATION_COUNT		10000
-#define MAX_WORDS_TO_INDEX		10000
-
-typedef struct {                         
-	int	 	id;              /* word ID of the cached word */
-	int 		count;     	 /* cummulative count of the cached word */
-} CacheWord;
-
-typedef enum {
-	DATA_KEYWORD,	
-	DATA_INDEX,
-	DATA_FULLTEXT,
-	DATA_STRING,
-	DATA_INTEGER,
-	DATA_DOUBLE,
-	DATA_DATE,
-	DATA_BLOB,
-	DATA_STRUCT,
-	DATA_LINK
-} DataTypes;
-
-
-typedef enum {
-	DB_CATEGORY_FILES, 
-	DB_CATEGORY_EMAILS,
-	DB_CATEGORY_USER
-} DBCategory;
-
-
-typedef enum {
-	INDEX_CONFIG,
-	INDEX_APPLICATIONS,
-	INDEX_FILES,
-	INDEX_WEBHISTORY,
-	INDEX_CRAWL_FILES,
-	INDEX_CONVERSATIONS,	
-	INDEX_EXTERNAL,	
-	INDEX_EMAILS,
-	INDEX_FINISHED
-} IndexStatus;
-
-
-typedef struct {
-	char		*id;
-	DataTypes	type;
-	char 		*field_name;
-	int		weight;
-	guint           embedded : 1;
-	guint           multiple_values : 1;
-	guint           delimited : 1;
-	guint           filtered : 1;
-	guint           store_metadata : 1;
-
-	GSList		*child_ids; /* related child metadata ids */
-
-} FieldDef;
-
-
-typedef struct {
-	char 		*alias;
-	char 	 	*field_name;
-	char	 	*select_field;
-	char	 	*where_field;
-	char	 	*table_name;
-	char	 	*id_field;
-	DataTypes	data_type;
-	guint           multiple_values : 1;
-	guint           is_select : 1;
-	guint           is_condition : 1;
-	guint           needs_join : 1;
-
-} FieldData;
-
-
-typedef struct {
-	char 		*name;
-	char		*type;
-} ServiceInfo;
-
-
-typedef enum {
-	EVENT_NOTHING,
-	EVENT_SHUTDOWN,
-	EVENT_DISABLE,
-	EVENT_PAUSE,
-	EVENT_CACHE_FLUSHED
-} LoopEvent;
-
-
-typedef struct {
-	gchar	*uri;
-	time_t	first_change_time;
-	gint    num_of_change;
-} FileChange;
-
-
-typedef struct {
-
-	gboolean	readonly;
-
-	int		pid; 
-
-	gpointer	hal;
-
-	gboolean	reindex;
-
-        gpointer        config;
-        gpointer        language;
-
-	/* config options */
-	guint32		watch_limit;
-
-	gboolean	fatal_errors;
-
-	gpointer	index_db;
-
-	/* data directories */
-	char 		*data_dir;
-	char		*config_dir;
-	char 		*root_dir;
-	char		*user_data_dir;
-	char		*sys_tmp_root_dir;
-        char            *email_attachements_dir;
-	char 		*services_dir;
-
-	/* performance and memory usage options */
-	int		max_index_text_length; /* max size of file's text contents to index */
-	int		max_process_queue_size;
-	int		max_extract_queue_size;
-	int 		memory_limit;
-	int 		thread_stack_size;
-
-	/* HAL battery */
-	char		*battery_udi;
-
-	/* pause/shutdown vars */
-	gboolean	shutdown;
-	gboolean	pause_manual;
-	gboolean	pause_battery;
-	gboolean	pause_io;
-
-	/* indexing options */
-        Indexer         *file_index;
-        Indexer	        *file_update_index;
-        Indexer   	*email_index;
-
-	guint32		merge_limit; 		/* size of index in MBs when merging is triggered -1 == no merging*/
-	gboolean	active_file_merge;
-	gboolean	active_email_merge;
-
-	GHashTable	*stop_words;	  	/* table of stop words that are to be ignored by the parser */
-
-	gboolean	index_numbers;
-	int		index_number_min_length;
-	gboolean	strip_accents;
-
-	gboolean	first_time_index;
-	gboolean	first_flush;
-	gboolean	do_optimize;
-	
-	time_t		index_time_start;
-	int		folders_count;
-	int		folders_processed;
-	int		mbox_count;
-	int		mbox_processed;
-
-
-	const char	*current_uri;
-	
-	IndexStatus	index_status;
-
-	int		grace_period;
-	gboolean	request_waiting;
-
-	char *		xesam_dir;
-
-	/* lookup tables for service and metadata IDs */
-	GHashTable	*metadata_table;
-
-	/* email config options */
-	GSList		*additional_mboxes_to_index;
-
-	int		email_service_min;
-	int		email_service_max;
-
-	/* nfs options */
-	gboolean	use_nfs_safe_locking; /* use safer but much slower external lock file when users home dir is on an nfs systems */
-
-	/* Queue for recorad file changes */
-	GQueue		*file_change_queue;
-	gboolean	black_list_timer_active;
-	
-	/* progress info for merges */
-	int		merge_count;
-	int		merge_processed;
-	
-
-	/* application run time values */
-	gboolean	is_indexing;
-	gboolean	in_flush;
-	gboolean	in_merge;
-	int		index_count;
-	int		index_counter;
-	int		update_count;
-
-	/* cache words before saving to word index */
-	GHashTable	*file_word_table;
-	GHashTable	*file_update_word_table;
-	GHashTable	*email_word_table;
-
-	int		word_detail_limit;
-	int		word_detail_count;
-	int		word_detail_min;
-	int		word_count;
-	int		word_update_count;
-	int		word_count_limit;
-	int		word_count_min;
-	int		flush_count;
-
-	int		file_update_count;
-	int		email_update_count;
-
- 	gboolean 	is_running;
-	gboolean	is_dir_scan;
-	GMainLoop 	*loop;
-
-	GMutex 		*log_access_mutex;
-	char	 	*log_file;
-
-	GAsyncQueue 	*file_process_queue;
-	GAsyncQueue 	*file_metadata_queue;
-
-	GAsyncQueue 	*dir_queue;
-
-	GMutex		*files_check_mutex;
-	GMutex		*files_signal_mutex;
-	GCond 		*files_signal_cond;
-
-	GMutex		*metadata_check_mutex;
-	GMutex		*metadata_signal_mutex;
-	GCond 		*metadata_signal_cond;
-
-	GHashTable	*xesam_sessions;
-
-} Tracker;
-
-
-char *		tracker_get_radix_by_suffix	(const char *str, const char *suffix);
-
-char *		tracker_escape_metadata 	(const char *in);
-char *		tracker_unescape_metadata 	(const char *in);
-
-char *		tracker_format_search_terms 	(const char *str, gboolean *do_bool_search);
-
-GSList * 	tracker_get_watch_root_dirs 	(void);
-
-void		tracker_print_object_allocations (void);
-
-void		tracker_throttle 		(int multiplier);
-
-void		tracker_notify_file_data_available 	(void);
-void		tracker_notify_meta_data_available 	(void);
-void		tracker_notify_request_data_available 	(void);
-
-char *		tracker_compress 		(const char *ptr, int size, int *compressed_size);
-char *		tracker_uncompress 		(const char *ptr, int size, int *uncompressed_size);
-
-char *		tracker_get_snippet 		(const char *txt, char **terms, int length);
-
-gboolean	tracker_spawn 			(char **argv, int timeout, char **tmp_stdout, int *exit_status);
-
-void		tracker_add_metadata_to_table 	(GHashTable *meta_table, const char *key, const char *value);
-
-void		tracker_free_metadata_field 	(FieldData *field_data);
-
-int 		tracker_get_memory_usage 	(void);
-
-void		tracker_add_io_grace 		(const char *uri);
-
-void		free_file_change		(FileChange **user_data);
-gboolean	tracker_do_cleanup 		(const gchar *sig_msg);
-gboolean        tracker_watch_dir               (const gchar *uri);
-void            tracker_scan_directory          (const gchar *uri);
-
-gboolean	tracker_low_diskspace		(void);
+G_BEGIN_DECLS
 
-gboolean	tracker_should_pause 	        (void);
-gboolean	tracker_should_pause_on_battery (void);
+gchar *  tracker_get_radix_by_suffix        (const gchar  *str,
+                                             const gchar  *suffix);
+void     tracker_throttle                   (gint          multiplier);
+void     tracker_notify_file_data_available (void);
+void     tracker_add_metadata_to_table      (GHashTable   *meta_table,
+                                             const char   *key,
+                                             const char   *value);
+void     tracker_add_io_grace               (const char   *uri);
+gboolean tracker_is_diskspace_low           (void);
+gboolean tracker_should_pause               (void);
+gboolean tracker_should_pause_on_battery    (void);
 
+G_END_DECLS
 
-#endif
+#endif /* __TRACKERD_UTILS_H__ */

Modified: branches/indexer-split/src/trackerd/tracker-xesam.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-xesam.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-xesam.c	Wed May  7 15:08:29 2008
@@ -25,6 +25,7 @@
 #include <libtracker-common/tracker-config.h>
 
 #include "tracker-xesam.h"
+#include "trackerd.h"
 
 extern Tracker *tracker;
 

Modified: branches/indexer-split/src/trackerd/trackerd.c
==============================================================================
--- branches/indexer-split/src/trackerd/trackerd.c	(original)
+++ branches/indexer-split/src/trackerd/trackerd.c	Wed May  7 15:08:29 2008
@@ -218,8 +218,6 @@
 
 	if (sig_msg) {
 		tracker_log ("Received signal '%s' so now shutting down", sig_msg);
-
-		tracker_print_object_allocations ();
 	}
 
 	/* set kill timeout */

Added: branches/indexer-split/src/trackerd/trackerd.h
==============================================================================
--- (empty file)
+++ branches/indexer-split/src/trackerd/trackerd.h	Wed May  7 15:08:29 2008
@@ -0,0 +1,266 @@
+/* -*- 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, Michal Pryc (Michal Pryc Sun Com)
+ * 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
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA. 
+ */  
+
+#ifndef __TRACKERD_H__
+#define __TRACKERD_H__
+
+extern char *type_array[];
+extern char *implemented_services[];
+extern char *file_service_array[] ;
+extern char *serice_index_array[];
+extern char *service_table_names[];
+extern char *service_metadata_table_names[];
+extern char *service_metadata_join_names[];
+
+#include "config.h"
+
+#include <time.h>
+
+#include <glib.h>
+
+#include <libtracker-db/tracker-db-action.h>
+
+#include "tracker-parser.h"
+#include "tracker-indexer.h"
+
+/* set merge limit default to 64MB */
+#define MERGE_LIMIT                     671088649
+
+/* max default file pause time in ms  = FILE_PAUSE_PERIOD * FILE_SCHEDULE_PERIOD */
+#define FILE_PAUSE_PERIOD		1
+#define FILE_SCHEDULE_PERIOD		300
+
+#define TRACKER_DB_VERSION_REQUIRED	13
+#define TRACKER_VERSION			VERSION
+#define TRACKER_VERSION_INT		604
+
+/* default performance options */
+#define MAX_INDEX_TEXT_LENGTH		1048576
+#define MAX_PROCESS_QUEUE_SIZE		100
+#define MAX_EXTRACT_QUEUE_SIZE		500
+#define OPTIMIZATION_COUNT		10000
+#define MAX_WORDS_TO_INDEX		10000
+
+G_BEGIN_DECLS
+
+typedef struct {                         
+	int	 	id;              /* word ID of the cached word */
+	int 		count;     	 /* cummulative count of the cached word */
+} CacheWord;
+
+typedef enum {
+	INDEX_CONFIG,
+	INDEX_APPLICATIONS,
+	INDEX_FILES,
+	INDEX_WEBHISTORY,
+	INDEX_CRAWL_FILES,
+	INDEX_CONVERSATIONS,	
+	INDEX_EXTERNAL,	
+	INDEX_EMAILS,
+	INDEX_FINISHED
+} IndexStatus;
+
+
+typedef struct {
+	char 		*name;
+	char		*type;
+} ServiceInfo;
+
+
+typedef enum {
+	EVENT_NOTHING,
+	EVENT_SHUTDOWN,
+	EVENT_DISABLE,
+	EVENT_PAUSE,
+	EVENT_CACHE_FLUSHED
+} LoopEvent;
+
+
+typedef struct {
+	gchar	*uri;
+	time_t	first_change_time;
+	gint    num_of_change;
+} FileChange;
+
+
+typedef struct {
+
+	gboolean	readonly;
+
+	int		pid; 
+
+	gpointer	hal;
+
+	gboolean	reindex;
+
+        gpointer        config;
+        gpointer        language;
+
+	/* config options */
+	guint32		watch_limit;
+
+	gboolean	fatal_errors;
+
+	gpointer	index_db;
+
+	/* data directories */
+	char 		*data_dir;
+	char		*config_dir;
+	char 		*root_dir;
+	char		*user_data_dir;
+	char		*sys_tmp_root_dir;
+        char            *email_attachements_dir;
+	char 		*services_dir;
+
+	/* performance and memory usage options */
+	int		max_index_text_length; /* max size of file's text contents to index */
+	int		max_process_queue_size;
+	int		max_extract_queue_size;
+	int 		memory_limit;
+	int 		thread_stack_size;
+
+	/* HAL battery */
+	char		*battery_udi;
+
+	/* pause/shutdown vars */
+	gboolean	shutdown;
+	gboolean	pause_manual;
+	gboolean	pause_battery;
+	gboolean	pause_io;
+
+	/* indexing options */
+        Indexer         *file_index;
+        Indexer	        *file_update_index;
+        Indexer   	*email_index;
+
+	guint32		merge_limit; 		/* size of index in MBs when merging is triggered -1 == no merging*/
+	gboolean	active_file_merge;
+	gboolean	active_email_merge;
+
+	GHashTable	*stop_words;	  	/* table of stop words that are to be ignored by the parser */
+
+	gboolean	index_numbers;
+	int		index_number_min_length;
+	gboolean	strip_accents;
+
+	gboolean	first_time_index;
+	gboolean	first_flush;
+	gboolean	do_optimize;
+	
+	time_t		index_time_start;
+	int		folders_count;
+	int		folders_processed;
+	int		mbox_count;
+	int		mbox_processed;
+
+
+	const char	*current_uri;
+	
+	IndexStatus	index_status;
+
+	int		grace_period;
+	gboolean	request_waiting;
+
+	char *		xesam_dir;
+
+	/* lookup tables for service and metadata IDs */
+	GHashTable	*metadata_table;
+
+	/* email config options */
+	GSList		*additional_mboxes_to_index;
+
+	int		email_service_min;
+	int		email_service_max;
+
+	/* nfs options */
+	gboolean	use_nfs_safe_locking; /* use safer but much slower external lock file when users home dir is on an nfs systems */
+
+	/* Queue for recorad file changes */
+	GQueue		*file_change_queue;
+	gboolean	black_list_timer_active;
+	
+	/* progress info for merges */
+	int		merge_count;
+	int		merge_processed;
+	
+
+	/* application run time values */
+	gboolean	is_indexing;
+	gboolean	in_flush;
+	gboolean	in_merge;
+	int		index_count;
+	int		index_counter;
+	int		update_count;
+
+	/* cache words before saving to word index */
+	GHashTable	*file_word_table;
+	GHashTable	*file_update_word_table;
+	GHashTable	*email_word_table;
+
+	int		word_detail_limit;
+	int		word_detail_count;
+	int		word_detail_min;
+	int		word_count;
+	int		word_update_count;
+	int		word_count_limit;
+	int		word_count_min;
+	int		flush_count;
+
+	int		file_update_count;
+	int		email_update_count;
+
+ 	gboolean 	is_running;
+	gboolean	is_dir_scan;
+	GMainLoop 	*loop;
+
+	GMutex 		*log_access_mutex;
+	char	 	*log_file;
+
+	GAsyncQueue 	*file_process_queue;
+	GAsyncQueue 	*file_metadata_queue;
+
+	GAsyncQueue 	*dir_queue;
+
+	GMutex		*files_check_mutex;
+	GMutex		*files_signal_mutex;
+	GCond 		*files_signal_cond;
+
+	GMutex		*metadata_check_mutex;
+	GMutex		*metadata_signal_mutex;
+	GCond 		*metadata_signal_cond;
+
+	GHashTable	*xesam_sessions;
+} Tracker;
+
+GSList * tracker_get_watch_root_dirs        (void);
+gboolean tracker_spawn                      (gchar       **argv,
+                                             gint          timeout,
+                                             gchar       **tmp_stdout,
+                                             gint         *exit_status);
+gboolean tracker_do_cleanup                 (const gchar  *sig_msg);
+gboolean tracker_watch_dir                  (const gchar  *uri);
+void     tracker_scan_directory             (const gchar  *uri);
+void     free_file_change                   (FileChange  **user_data);
+
+G_END_DECLS
+
+#endif /* __TRACKERD_H__ */



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