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



Author: pvanhoof
Date: Fri May  2 11:12:42 2008
New Revision: 1332
URL: http://svn.gnome.org/viewvc/tracker?rev=1332&view=rev

Log:
2008-05-02  Philip Van Hoof  <pvanhoof gnome org>

	* src/trackerd/tracker-xesam-live-search.c
	* src/trackerd/tracker-xesam-live-search.h
	* src/trackerd/tracker-dbus.c
	* src/trackerd/tracker-dbus-xesam.c
	* src/trackerd/tracker-dbus-xesam.h
	* src/trackerd/tracker-xesam.c
	* src/trackerd/tracker-xesam.h
	* src/trackerd/tracker-db-sqlite.c
	* src/trackerd/tracker-db-sqlite.h
	* src/libtracker-common/tracker-config.c
	* src/libtracker-common/tracker-config.h
	* data/sqlite-stored-procs.sql
	* data/sqlite-tracker.sql
	* data/Makefile.am: Xesam support infrastructure



Added:
   branches/indexer-split/data/sqlite-temp-tables.sql
Modified:
   branches/indexer-split/ChangeLog
   branches/indexer-split/data/Makefile.am
   branches/indexer-split/data/sqlite-stored-procs.sql
   branches/indexer-split/data/sqlite-tracker.sql
   branches/indexer-split/src/libtracker-common/tracker-config.c
   branches/indexer-split/src/libtracker-common/tracker-config.h
   branches/indexer-split/src/trackerd/tracker-db-sqlite.c
   branches/indexer-split/src/trackerd/tracker-db-sqlite.h
   branches/indexer-split/src/trackerd/tracker-dbus-xesam.c
   branches/indexer-split/src/trackerd/tracker-dbus-xesam.h
   branches/indexer-split/src/trackerd/tracker-dbus.c
   branches/indexer-split/src/trackerd/tracker-xesam-live-search.c
   branches/indexer-split/src/trackerd/tracker-xesam-live-search.h
   branches/indexer-split/src/trackerd/tracker-xesam.c
   branches/indexer-split/src/trackerd/tracker-xesam.h

Modified: branches/indexer-split/data/Makefile.am
==============================================================================
--- branches/indexer-split/data/Makefile.am	(original)
+++ branches/indexer-split/data/Makefile.am	Fri May  2 11:12:42 2008
@@ -19,7 +19,8 @@
 	sqlite-stored-procs.sql 		\
 	sqlite-service.sql			\
 	sqlite-service-types.sql 		\
-	sqlite-metadata.sql 
+	sqlite-metadata.sql 			\
+	sqlite-temp-tables.sql
 
 servicedir       = $(DBUS_SERVICES_DIR)
 service_in_files = tracker.service.in

Modified: branches/indexer-split/data/sqlite-stored-procs.sql
==============================================================================
--- branches/indexer-split/data/sqlite-stored-procs.sql	(original)
+++ branches/indexer-split/data/sqlite-stored-procs.sql	Fri May  2 11:12:42 2008
@@ -24,6 +24,16 @@
 
 GetNewID SELECT OptionValue FROM Options WHERE OptionKey = 'Sequence';
 UpdateNewID UPDATE Options set OptionValue = ? WHERE OptionKey = 'Sequence';
+CreateEvent INSERT INTO Events (ID, ServiceID, EventType) VALUES (?,?,?); 
+DeleteHandled DELETE FROM Events WHERE BeingHandled = 1;
+GetEvents SELECT ID, ServiceID, EventType FROM Events WHERE BeingHandled = 0;
+SetBeingHandled UPDATE Events SET BeingHandled = 1;
+
+GetXesamLiveSearchModifiedIDs SELECT E.ServiceID FROM Events as E, XesamLiveSearches as X WHERE E.ServiceID = X.ServiceID AND SearchID = ? AND EventType IS NOT 'Create';
+GetXesamHitCount SELECT count(*) FROM XesamLiveSearches WHERE SearchID = ?;
+
+GetNewEventID SELECT OptionValue FROM Options WHERE OptionKey = 'EventSequence';
+UpdateNewEventID UPDATE Options set OptionValue = ? WHERE OptionKey = 'EventSequence';
 
 GetUpdateCount SELECT OptionValue FROM Options WHERE OptionKey = 'UpdateCount';
 SetUpdateCount UPDATE Options set OptionValue = ?  WHERE OptionKey = 'UpdateCount';
@@ -33,6 +43,7 @@
 
 CreateService INSERT INTO Services (ID, Path, Name, ServiceTypeID, Mime, Size, IsDirectory, IsLink, Offset, IndexTime, AuxilaryID) VALUES (?,?,?,?,?,?,?,?,?,?,?); 
 
+
 GetServiceID SELECT ID, IndexTime, IsDirectory, ServiceTypeID FROM Services WHERE Path = ? AND Name = ?;
 
 SelectFileChild SELECT ID, Path, Name, IsDirectory  FROM Services WHERE Path = ?;

Added: branches/indexer-split/data/sqlite-temp-tables.sql
==============================================================================
--- (empty file)
+++ branches/indexer-split/data/sqlite-temp-tables.sql	Fri May  2 11:12:42 2008
@@ -0,0 +1,14 @@
+CREATE TEMPORARY TABLE Events
+(
+	ID		Integer primary key not null,
+	ServiceID	Integer not null,
+	BeingHandled	Integer default 0,
+	EventType	Text
+);
+
+CREATE TEMPORARY TABLE XesamLiveSearches
+(
+	ID		Integer primary key not null,
+	ServiceID	Integer not null,
+	SearchID	Text
+);

Modified: branches/indexer-split/data/sqlite-tracker.sql
==============================================================================
--- branches/indexer-split/data/sqlite-tracker.sql	(original)
+++ branches/indexer-split/data/sqlite-tracker.sql	Fri May  2 11:12:42 2008
@@ -6,6 +6,7 @@
 
 insert Into Options (OptionKey, OptionValue) values ('DBVersion', '20');
 insert Into Options (OptionKey, OptionValue) values ('Sequence', '1');
+insert Into Options (OptionKey, OptionValue) values ('EventSequence', '1');
 insert Into Options (OptionKey, OptionValue) values ('UpdateCount', '0');
 
 

Modified: branches/indexer-split/src/libtracker-common/tracker-config.c
==============================================================================
--- branches/indexer-split/src/libtracker-common/tracker-config.c	(original)
+++ branches/indexer-split/src/libtracker-common/tracker-config.c	Fri May  2 11:12:42 2008
@@ -75,6 +75,9 @@
 #define KEY_PADDING				 "Padding"
 #define KEY_THREAD_STACK_SIZE			 "ThreadStackSize"
 
+#define GROUP_SERVICES				 "Services"
+#define KEY_ENABLE_XESAM			 "EnableXesam"
+
 /* Default values */
 #define DEFAULT_VERBOSITY			 0
 #define DEFAULT_INITIAL_SLEEP			 45	  /* 0->1000 */
@@ -82,6 +85,7 @@
 #define DEFAULT_ENABLE_WATCHES			 TRUE
 #define DEFAULT_THROTTLE			 0	  /* 0->20 */
 #define DEFAULT_ENABLE_INDEXING			 TRUE
+#define DEFAULT_ENABLE_XESAM			 FALSE
 #define DEFAULT_ENABLE_CONTENT_INDEXING		 TRUE
 #define DEFAULT_ENABLE_THUMBNAILS		 TRUE
 #define DEFAULT_FAST_MERGES			 FALSE
@@ -149,6 +153,9 @@
 	gint	  bucket_ratio;
 	gint	  padding;
 	gint	  thread_stack_size;
+
+	/* Services*/
+	gboolean enable_xesam;
 };
 
 static void config_finalize	(GObject      *object);
@@ -205,7 +212,10 @@
 	PROP_DIVISIONS,
 	PROP_BUCKET_RATIO,
 	PROP_PADDING,
-	PROP_THREAD_STACK_SIZE
+	PROP_THREAD_STACK_SIZE,
+
+	/* Services*/
+	PROP_ENABLE_XESAM
 };
 
 G_DEFINE_TYPE (TrackerConfig, tracker_config, G_TYPE_OBJECT);
@@ -505,6 +515,15 @@
 							   DEFAULT_THREAD_STACK_SIZE,
 							   G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 
+	/* Services */
+	g_object_class_install_property (object_class,
+					 PROP_ENABLE_XESAM,
+					 g_param_spec_boolean ("enable-xesam",
+							       "Enable Xesam",
+							       "Xesam DBus service",
+							       DEFAULT_ENABLE_XESAM,
+							       G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
 	g_type_class_add_private (object_class, sizeof (TrackerConfigPriv));
 }
 
@@ -639,6 +658,12 @@
 	case PROP_THREAD_STACK_SIZE:
 		g_value_set_int (value, priv->thread_stack_size);
 		break;
+
+	/* Services */
+	case PROP_ENABLE_XESAM:
+		g_value_set_boolean (value, priv->enable_xesam);
+		break;
+
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 		break;
@@ -783,6 +808,13 @@
 		tracker_config_set_thread_stack_size (TRACKER_CONFIG (object),
 						      g_value_get_int (value));
 		break;
+
+	/* Services */
+	case PROP_ENABLE_XESAM:
+		tracker_config_set_enable_xesam (TRACKER_CONFIG (object),
+						    g_value_get_boolean (value));
+		break;
+
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
 		break;
@@ -1096,6 +1128,12 @@
 				" 0 uses the default stack size for this platform",
 				NULL);
 
+	/* Services */
+	g_key_file_set_boolean (key_file, GROUP_SERVICES, KEY_ENABLE_XESAM, DEFAULT_ENABLE_XESAM);
+	g_key_file_set_comment (key_file, GROUP_SERVICES, KEY_ENABLE_XESAM,
+				" Xesam DBus service.\n",
+				NULL);
+
 	content = g_key_file_to_data (key_file, NULL, &error);
 	g_free (language);
 	g_key_file_free (key_file);
@@ -1334,6 +1372,9 @@
 	config_load_int (config, "padding", key_file, GROUP_PERFORMANCE, KEY_PADDING);
 	config_load_int (config, "thread-stack-size", key_file, GROUP_PERFORMANCE, KEY_THREAD_STACK_SIZE);
 
+	/* Services */
+	config_load_boolean (config, "enable-xesam", key_file, GROUP_SERVICES, KEY_ENABLE_XESAM);
+
 	g_key_file_free (key_file);
 }
 
@@ -1481,6 +1522,18 @@
 }
 
 gboolean
+tracker_config_get_enable_xesam (TrackerConfig *config)
+{
+	TrackerConfigPriv *priv;
+
+	g_return_val_if_fail (TRACKER_IS_CONFIG (config), DEFAULT_ENABLE_XESAM);
+
+	priv = GET_PRIV (config);
+
+	return priv->enable_xesam;
+}
+
+gboolean
 tracker_config_get_enable_content_indexing (TrackerConfig *config)
 {
 	TrackerConfigPriv *priv;
@@ -1853,6 +1906,20 @@
 }
 
 void
+tracker_config_set_enable_xesam (TrackerConfig *config,
+				 gboolean	   value)
+{
+	TrackerConfigPriv *priv;
+
+	g_return_if_fail (TRACKER_IS_CONFIG (config));
+
+	priv = GET_PRIV (config);
+
+	priv->enable_xesam = value;
+	g_object_notify (G_OBJECT (config), "enable-xesam");
+}
+
+void
 tracker_config_set_enable_content_indexing (TrackerConfig *config,
 					    gboolean	   value)
 {

Modified: branches/indexer-split/src/libtracker-common/tracker-config.h
==============================================================================
--- branches/indexer-split/src/libtracker-common/tracker-config.h	(original)
+++ branches/indexer-split/src/libtracker-common/tracker-config.h	Fri May  2 11:12:42 2008
@@ -60,6 +60,7 @@
 gboolean       tracker_config_get_enable_watches                   (TrackerConfig *config);
 gint           tracker_config_get_throttle                         (TrackerConfig *config);
 gboolean       tracker_config_get_enable_indexing                  (TrackerConfig *config);
+gboolean       tracker_config_get_enable_xesam                     (TrackerConfig *config);
 gboolean       tracker_config_get_enable_content_indexing          (TrackerConfig *config);
 gboolean       tracker_config_get_enable_thumbnails                (TrackerConfig *config);
 gboolean       tracker_config_get_fast_merges                      (TrackerConfig *config);
@@ -95,6 +96,8 @@
 								    gint           value);
 void           tracker_config_set_enable_indexing                  (TrackerConfig *config,
 								    gboolean       value);
+void           tracker_config_set_enable_xesam                     (TrackerConfig *config,
+								    gboolean       value);
 void           tracker_config_set_enable_content_indexing          (TrackerConfig *config,
 								    gboolean       value);
 void           tracker_config_set_enable_thumbnails                (TrackerConfig *config,

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	Fri May  2 11:12:42 2008
@@ -60,6 +60,7 @@
 #include "tracker-watch.h"
 #include "tracker-service-manager.h"
 #include "tracker-query-tree.h"
+#include "tracker-xesam.h"
 
 #define MAX_TEXT_BUFFER 65567
 #define MAX_COMPRESS_BUFFER 65565
@@ -896,6 +897,7 @@
 		tracker_db_exec_no_reply (db_con, "ANALYZE");
 	}
 
+	load_sql_file (db_con, "sqlite-temp-tables.sql");
 
 	tracker_db_attach_db (db_con, "common");
 	tracker_db_attach_db (db_con, "cache");
@@ -3245,6 +3247,96 @@
 
 }
 
+TrackerDBResultSet* 
+tracker_db_get_xeam_hit_count (DBConnection *db_con, const gchar *search_id)
+{
+	TrackerDBResultSet *result;
+	result = tracker_exec_proc (db_con->common, "GetXesamHitCount", search_id, NULL);
+	return result;
+}
+
+
+TrackerDBResultSet* 
+tracker_db_get_xesam_live_search_mod_ids (DBConnection *db_con, const gchar *search_id)
+{
+	TrackerDBResultSet *result;
+	result = tracker_exec_proc (db_con->common, "GetXesamLiveSearchModifiedIDs", search_id, NULL);
+	return result;
+}
+
+TrackerDBResultSet* 
+tracker_db_get_xesam_live_search_creat_ids (DBConnection *db_con, const gchar *search_id, const gchar *query)
+{
+	TrackerDBResultSet *result;
+
+	// todo: this is a query for ottela to review
+
+	gchar *m_query = g_strdup_printf (
+			"SELECT ServiceID, ... FROM XesamLiveSearches as X, ... "
+			"INNER JOIN ... "
+			"WHERE X.SearchID = ? AND X.EventType IS 'Create' AND "
+			"(%s)", query);
+
+	result = tracker_db_interface_execute_query (db_con->db, NULL, m_query);
+
+	g_free (m_query);
+
+	return result;
+}
+
+TrackerDBResultSet* 
+tracker_db_get_events (DBConnection *db_con)
+{
+	TrackerDBResultSet *result_set, *result;
+	result = tracker_exec_proc (db_con->common, "GetEvents", NULL);
+	result_set = tracker_exec_proc (db_con->common, "SetBeingHandled", NULL);
+	g_object_unref (result_set);
+	return result;
+}
+
+void 
+tracker_db_delete_handled (DBConnection *db_con, TrackerDBResultSet *events)
+{
+	TrackerDBResultSet *result_set;
+	result_set = tracker_exec_proc (db_con->common, "DeleteHandled", NULL);
+	g_object_unref (result_set);
+}
+
+static guint32
+tracker_db_create_event (DBConnection *db_con, const gchar *service_id_str, const gchar *type)
+{
+	TrackerDBResultSet *result_set;
+	char	   *eid;
+	int	   i;
+	guint32	   id = 0;
+
+	result_set = tracker_exec_proc (db_con->common, "GetNewEventID", NULL);
+
+	if (!result_set) {
+		tracker_error ("ERROR: could not create event - GetNewEventID failed");
+		return 0;
+	}
+
+	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_exec_proc (db_con->common, "UpdateNewEventID", eid, NULL);
+	g_object_unref (result_set);
+
+	result_set = tracker_exec_proc (db_con, "CreateEvent", eid, service_id_str, type, NULL);
+	id = tracker_db_interface_sqlite_get_last_insert_id (TRACKER_DB_INTERFACE_SQLITE (db_con->db));
+	g_object_unref (result_set);
+
+	tracker_xesam_wakeup (id);
+
+	g_free (eid);
+
+	return id;
+}
+
 guint32
 tracker_db_create_service (DBConnection *db_con, const char *service, TrackerDBFileInfo *info)
 {
@@ -3361,7 +3453,9 @@
 			g_free (parent);
 		}
 
+		tracker_db_create_event (db_con, sid, "Create");
 	}
+
 	g_free (name);
 	g_free (path);
 	g_free (str_aux);
@@ -3549,6 +3643,8 @@
 			tracker_exec_proc (db_con->common, "DeleteService7", path, name, NULL);
 			tracker_exec_proc (db_con->common, "DeleteService9", path, name, NULL);
 
+			tracker_db_create_event (db_con, str_file_id, "Delete");
+
 			g_free (name);
 			g_free (path);
 		}
@@ -3638,7 +3734,9 @@
 	path = g_path_get_dirname (info->uri);
 
 	tracker_exec_proc (db_con->index, "UpdateFile", str_service_type_id, path, name, info->mime, str_size, str_mtime, str_offset, str_file_id, NULL);
-	
+
+	tracker_db_create_event (db_con, str_file_id, "Update");
+
 	g_free (str_service_type_id);
 	g_free (str_size);
 	g_free (str_offset);
@@ -4248,6 +4346,8 @@
 	/* update db so that fileID reflects new uri */
 	tracker_exec_proc (db_con, "UpdateFileMove", path, name, str_file_id, NULL);
 
+	tracker_db_create_event (db_con, str_file_id, "Update");
+
 	/* update File:Path and File:Filename metadata */
 	tracker_db_set_single_metadata (db_con, "Files", str_file_id, "File:Path", path, FALSE);
 	tracker_db_set_single_metadata (db_con, "Files", str_file_id, "File:Name", name, FALSE);

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	Fri May  2 11:12:42 2008
@@ -344,5 +344,15 @@
                                                                 const gchar    *option,
                                                                 gint            value);
 gboolean            tracker_db_integrity_check                 (DBConnection   *db_con);
+TrackerDBResultSet *tracker_db_get_events                      (DBConnection *db_con);
+void                tracker_db_delete_handled                  (DBConnection   *db_con, 
+                                                                TrackerDBResultSet *events);
+TrackerDBResultSet *tracker_db_get_xesam_live_search_mod_ids   (DBConnection *db_con, 
+                                                                const gchar *search_id);
+TrackerDBResultSet *tracker_db_get_xesam_live_search_creat_ids (DBConnection *db_con, 
+                                                                const gchar *search_id,
+                                                                const gchar *query);
+TrackerDBResultSet *tracker_db_get_xeam_hit_count              (DBConnection *db_con, 
+                                                                const gchar *search_id);
 
 #endif

Modified: branches/indexer-split/src/trackerd/tracker-dbus-xesam.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-dbus-xesam.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-dbus-xesam.c	Fri May  2 11:12:42 2008
@@ -42,17 +42,61 @@
 	XESAM_LAST_SIGNAL
 };
 
+enum {
+	PROP_0,
+	PROP_DB_CONNECTION,
+};
+
+typedef struct {
+	DBConnection *db_con;
+} TrackerDBusXesamPriv;
+
 static GHashTable *sessions = NULL;
 static guint       signals[XESAM_LAST_SIGNAL] = {0};
 
 G_DEFINE_TYPE(TrackerDBusXesam, tracker_dbus_xesam, G_TYPE_OBJECT)
 
+#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_DBUS_XESAM, TrackerDBusXesamPriv))
+
 static void
 xesam_search_finalize (GObject *object)
 {
 	G_OBJECT_CLASS (tracker_dbus_xesam_parent_class)->finalize (object);
 }
 
+
+void
+tracker_dbus_xesam_set_db_connection (TrackerDBusXesam *object,
+				     DBConnection      *db_con)
+{
+	TrackerDBusXesamPriv *priv;
+
+	priv = GET_PRIV (object);
+
+	priv->db_con = db_con;
+
+	g_object_notify (G_OBJECT (object), "db-connection");
+}
+
+static void
+xesam_set_property (GObject      *object,
+		    guint param_id,
+		    const GValue *value,
+		    GParamSpec   *pspec)
+{
+	switch (param_id) {
+	case PROP_DB_CONNECTION:
+		tracker_dbus_xesam_set_db_connection (TRACKER_DBUS_XESAM (object),
+						      g_value_get_pointer (value));
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
+	};
+}
+
+
+
 static void
 tracker_dbus_xesam_class_init (TrackerDBusXesamClass *klass)
 {
@@ -62,6 +106,15 @@
 
 	object_class->finalize = xesam_search_finalize;
 
+	object_class->set_property = xesam_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[XESAM_HITS_ADDED] =
 		g_signal_new ("hits-added",
 			G_TYPE_FROM_CLASS (klass),
@@ -120,17 +173,23 @@
 			G_TYPE_NONE,
 			1, 
 			G_TYPE_STRV);
+
+	g_type_class_add_private (object_class, sizeof (TrackerDBusXesamPriv));
 }
 
 static void
 tracker_dbus_xesam_init (TrackerDBusXesam *object)
 {
+	TrackerDBusXesamPriv *priv = GET_PRIV (object);
+	priv->db_con = NULL;
 }
 
 TrackerDBusXesam *
-tracker_dbus_xesam_new (void)
+tracker_dbus_xesam_new (DBConnection *db_con)
 {
-	return g_object_new (TRACKER_TYPE_DBUS_XESAM, NULL);
+	return g_object_new (TRACKER_TYPE_DBUS_XESAM, 
+			       "db-connection", db_con,
+			       NULL);
 }
 
 static void

Modified: branches/indexer-split/src/trackerd/tracker-dbus-xesam.h
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-dbus-xesam.h	(original)
+++ branches/indexer-split/src/trackerd/tracker-dbus-xesam.h	Fri May  2 11:12:42 2008
@@ -56,7 +56,7 @@
 
 GType tracker_dbus_xesam_get_type           (void);
 TrackerDBusXesam *
-      tracker_dbus_xesam_new                (void); 
+      tracker_dbus_xesam_new                (DBConnection *db_con); 
 void  tracker_dbus_xesam_new_session        (TrackerDBusXesam    *object,
 					       DBusGMethodInvocation *context);
 void  tracker_dbus_xesam_set_property       (TrackerDBusXesam    *object,
@@ -102,6 +102,8 @@
 					       const char            *prev_owner,
 					       const char            *new_owner,
 					       TrackerDBusXesam    *self);
+void  tracker_dbus_xesam_set_db_connection  (TrackerDBusXesam *object,
+				             DBConnection      *db_con);
 
 G_END_DECLS
 

Modified: branches/indexer-split/src/trackerd/tracker-dbus.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-dbus.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-dbus.c	Fri May  2 11:12:42 2008
@@ -227,27 +227,29 @@
         g_object_set (object, "email-index", tracker->email_index, NULL);
         objects = g_slist_prepend (objects, object);
 
-
-        /* Add org.freedesktop.xesam.Search */
-        if (!(object = dbus_register_object (connection, 
+        if (tracker_config_get_enable_xesam (tracker->config)) {
+            /* Add org.freedesktop.xesam.Search */
+            if (!(object = dbus_register_object (connection, 
                                              proxy,
                                              TRACKER_TYPE_DBUS_XESAM,
                                              &dbus_glib_tracker_dbus_xesam_object_info,
                                              TRACKER_DBUS_XESAM_PATH))) {
-                return FALSE;
-        }
+                    return FALSE;
+            }
+
+            g_object_set (object, "db-connection", tracker->index_db, NULL);
 
-        dbus_g_proxy_add_signal (proxy, "NameOwnerChanged",
+            dbus_g_proxy_add_signal (proxy, "NameOwnerChanged",
 				 G_TYPE_STRING, G_TYPE_STRING,
 				 G_TYPE_STRING, G_TYPE_INVALID);
 	
-        dbus_g_proxy_connect_signal (proxy, "NameOwnerChanged", 
+            dbus_g_proxy_connect_signal (proxy, "NameOwnerChanged", 
 				     G_CALLBACK (tracker_dbus_xesam_name_owner_changed), 
 				     g_object_ref (object),
 				     name_owner_changed_done);
 
-        objects = g_slist_prepend (objects, object);
-
+            objects = g_slist_prepend (objects, object);
+        }
 
         /* Reverse list since we added objects at the top each time */
         objects = g_slist_reverse (objects);

Modified: branches/indexer-split/src/trackerd/tracker-xesam-live-search.c
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-xesam-live-search.c	(original)
+++ branches/indexer-split/src/trackerd/tracker-xesam-live-search.c	Fri May  2 11:12:42 2008
@@ -28,23 +28,72 @@
 	gchar *search_id;
 	gboolean active;
 	gboolean closed;
+	gchar *query;
+};
+
+enum {
+	PROP_0,
+	PROP_XMLQUERY
 };
 
 G_DEFINE_TYPE(TrackerXesamLiveSearch, tracker_xesam_live_search, G_TYPE_OBJECT)
 
+#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_XESAM_LIVE_SEARCH, TrackerXesamLiveSearch))
+
 static void
 tracker_xesam_live_search_finalize (GObject *object)
 {
 	TrackerXesamLiveSearch *self = (TrackerXesamLiveSearch *) object;
 	TrackerXesamLiveSearchPriv *priv = self->priv;
 	g_free (priv->search_id);
+	g_free (priv->query);
+}
+
+void
+tracker_xesam_live_search_set_xml_query (TrackerXesamLiveSearch *self, const gchar *query)
+{
+	TrackerXesamLiveSearchPriv *priv = self->priv;
+
+	g_free (priv->query);
+
+	// ottela, look!
+	// TODO: parse XML query into SQL query here
+
+	priv->query = g_strdup (query);
+}
+
+static void
+xexam_search_set_property (GObject      *object,
+                          guint 	param_id,
+                          const GValue *value,
+                          GParamSpec   *pspec)
+{
+	switch (param_id) {
+	case PROP_XMLQUERY:
+		tracker_xesam_live_search_set_xml_query (TRACKER_XESAM_LIVE_SEARCH (object),
+						     g_value_get_pointer (value));
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
+	};
 }
 
+
 static void 
 tracker_xesam_live_search_class_init (TrackerXesamLiveSearchClass *klass) 
 {
 	GObjectClass *object_class;
 	object_class = G_OBJECT_CLASS (klass);
+	object_class->set_property = xexam_search_set_property;
+
+	g_object_class_install_property (object_class,
+					 PROP_XMLQUERY,
+					 g_param_spec_pointer ("xml-query",
+							       "XML Query",
+							       "XML Query",
+							       G_PARAM_WRITABLE));
+
 	object_class->finalize = tracker_xesam_live_search_finalize;
 }
 
@@ -55,6 +104,7 @@
 	priv->search_id = NULL;
 	priv->active = FALSE;
 	priv->closed = FALSE;
+	priv->query = g_strdup ("1=1");
 }
 
 /**
@@ -132,6 +182,104 @@
 	g_signal_emit_by_name (proxy, "search-done", tracker_xesam_live_search_get_id (self)); 
 }
 
+
+/**
+ * tracker_xesam_live_search_match_with_events:
+ * @self: A #TrackerXesamLiveSearch
+ * @result_set: a #TrackerDBResultSet with all items in Events
+ * @added: (caller-owns) (out): added items
+ * @removed: (caller-owns) (out): removed items
+ * @modified: (caller-owns) (out): modified items
+ *
+ * Find all items that match with the current events for @self.
+ **/
+void
+tracker_xesam_live_search_match_with_events (TrackerXesamLiveSearch *self, TrackerDBResultSet *events, GArray **added, GArray **removed, GArray **modified)
+{
+	TrackerDBusXesam *proxy = TRACKER_DBUS_XESAM (tracker_dbus_get_object (TRACKER_TYPE_DBUS_XESAM));
+	DBConnection *db_con = NULL;
+	TrackerDBResultSet *result_set;
+	gboolean ls_valid = TRUE;
+	GArray *m_added = NULL, *m_removed = NULL, *m_modified = NULL;
+
+	g_object_get (proxy, "db-connection", &db_con, NULL);
+
+	result_set = tracker_db_get_xesam_live_search_mod_ids (db_con, 
+		tracker_xesam_live_search_get_id (self));
+
+	while (ls_valid) {
+		GValue ls_value = { 0, };
+		gboolean ev_valid = TRUE;
+
+		_tracker_db_result_set_get_value (result_set, 0, &ls_value);
+
+		while (ev_valid) {
+			GValue ev_value = { 0, };
+			gint ev_i_value;
+
+			_tracker_db_result_set_get_value (result_set, 1, &ev_value);
+
+			ev_i_value = g_value_get_int (&ev_value);
+
+			if (ev_i_value == g_value_get_int (&ls_value)) {
+				GValue ev_type = { 0, };
+				const gchar *str = g_value_get_string (&ev_type);
+
+				_tracker_db_result_set_get_value (events, 2, &ev_type);
+
+				if (!strcmp (str, "Update")) {
+					if (m_modified == NULL)
+						m_modified = g_array_new (FALSE, TRUE, sizeof (guint32));
+					g_array_append_val (m_modified, ev_i_value);
+				} else if (!strcmp (str, "Delete")) {
+					if (*removed == NULL)
+						m_removed = g_array_new (FALSE, TRUE, sizeof (guint32));
+					g_array_append_val (m_removed, ev_i_value);
+				}
+
+				g_value_unset (&ev_type);
+			}
+
+			g_value_unset (&ev_value);
+			ev_valid = tracker_db_result_set_iter_next (events);
+		}
+
+		tracker_db_result_set_rewind (events);
+
+	}
+
+	g_object_unref (result_set);
+
+	ls_valid = TRUE;
+
+	result_set = tracker_db_get_xesam_live_search_creat_ids (db_con, 
+		tracker_xesam_live_search_get_id (self),
+		tracker_xesam_live_search_get_query (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 (m_added == NULL)
+			m_added = g_array_new (FALSE, TRUE, sizeof (guint32));
+		g_array_append_val (m_added, ls_i_value);
+
+		g_value_unset (&ls_value);
+		ls_valid = tracker_db_result_set_iter_next (result_set);
+	}
+
+	g_object_unref (result_set);
+
+	*added = m_added;
+	*removed = m_removed;
+	*modified = m_modified;
+
+}
+
 /**
  * tracker_xesam_live_search_close:
  * @self: a #TrackerXesamLiveSearch
@@ -149,8 +297,7 @@
 				TRACKER_XESAM_ERROR_SEARCH_CLOSED,
 				"Search was already closed");
 	priv->closed = TRUE;
-
-	// todo
+	priv->active = FALSE;
 }
 
 /**
@@ -171,14 +318,26 @@
 {
 	TrackerXesamLiveSearchPriv *priv = self->priv;
 
-	// todo
-
 	if (!priv->active)
 		g_set_error (error, TRACKER_XESAM_ERROR, 
 				TRACKER_XESAM_ERROR_SEARCH_NOT_ACTIVE,
-				"Search is not active yet");
+				"Search is not active");
+	else {
+		TrackerDBResultSet *result_set;
+		TrackerDBusXesam *proxy = TRACKER_DBUS_XESAM (tracker_dbus_get_object (TRACKER_TYPE_DBUS_XESAM));
+		GValue value = {0, };
+		DBConnection *db_con = NULL;
+
+		g_object_get (proxy, "db-connection", &db_con, NULL);
+
+		result_set = tracker_db_get_xeam_hit_count (db_con, 
+			tracker_xesam_live_search_get_id (self));
+		_tracker_db_result_set_get_value (result_set, 0, &value);
+		*count = g_value_get_int (&value);
+		g_value_unset (&value);
+		g_object_unref (result_set);
+	}
 
-	*count = 0;
 }
 
 static void
@@ -231,14 +390,13 @@
 {
 	TrackerXesamLiveSearchPriv *priv = self->priv;
 
-	// todo
-
-	get_hit_data (self, hits);
-
 	if (!priv->active)
 		g_set_error (error, TRACKER_XESAM_ERROR, 
 				TRACKER_XESAM_ERROR_SEARCH_NOT_ACTIVE,
-				"Search is not active yet");
+				"Search is not active");
+	else {
+		get_hit_data (self, hits);
+	}
 }
 
 /**
@@ -277,16 +435,13 @@
 {
 	TrackerXesamLiveSearchPriv *priv = self->priv;
 
-	// todo
-
-	get_hit_data (self, hit_data);
-
 	if (!priv->active)
 		g_set_error (error, TRACKER_XESAM_ERROR, 
 				TRACKER_XESAM_ERROR_SEARCH_NOT_ACTIVE,
 				"Search is not active yet");
-
-	*hit_data = NULL;
+	else {
+		get_hit_data (self, hit_data);
+	}
 }
 
 /**
@@ -325,8 +480,6 @@
 				"Search is closed");
 
 	priv->active = TRUE;
-
-	// todo
 }
 
 /**
@@ -342,10 +495,8 @@
 const gchar* 
 tracker_xesam_live_search_get_query (TrackerXesamLiveSearch *self)
 {
-
-	// todo
-
-	return "WHERE 1=1";
+	TrackerXesamLiveSearchPriv *priv = self->priv;
+	return (const gchar *) priv->query;
 }
 
 /**
@@ -392,7 +543,8 @@
 TrackerXesamLiveSearch* 
 tracker_xesam_live_search_new (const gchar *query_xml) 
 {
-	return g_object_newv (TRACKER_TYPE_XESAM_LIVE_SEARCH, 0, NULL);
+	return g_object_new (TRACKER_TYPE_XESAM_LIVE_SEARCH, 
+		"xml-query", query_xml, NULL);
 }
 
 

Modified: branches/indexer-split/src/trackerd/tracker-xesam-live-search.h
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-xesam-live-search.h	(original)
+++ branches/indexer-split/src/trackerd/tracker-xesam-live-search.h	Fri May  2 11:12:42 2008
@@ -24,6 +24,8 @@
 #include <glib.h>
 #include <glib-object.h>
 
+#include <libtracker-db/tracker-db-interface-sqlite.h>
+
 G_BEGIN_DECLS
 
 #define TRACKER_TYPE_XESAM_LIVE_SEARCH (tracker_xesam_live_search_get_type ())
@@ -52,6 +54,8 @@
 							   const gchar             *search_id);
 const gchar* tracker_xesam_live_search_get_id             (TrackerXesamLiveSearch  *self);
 const gchar* tracker_xesam_live_search_get_query          (TrackerXesamLiveSearch  *self);
+void         tracker_xesam_live_search_set_xml_query      (TrackerXesamLiveSearch *self, 
+							   const gchar *xml_query);
 void         tracker_xesam_live_search_activate           (TrackerXesamLiveSearch  *self,
 							   GError                 **error);
 gboolean     tracker_xesam_live_search_is_active          (TrackerXesamLiveSearch  *self);
@@ -76,6 +80,11 @@
 void         tracker_xesam_live_search_emit_hits_modified (TrackerXesamLiveSearch  *self,
 							   GArray                  *hit_ids);
 void         tracker_xesam_live_search_emit_done          (TrackerXesamLiveSearch  *self);
+void         tracker_xesam_live_search_match_with_events  (TrackerXesamLiveSearch  *self, 
+							   TrackerDBResultSet      *events,
+							   GArray                 **added, 
+							   GArray                 **removed, 
+							   GArray                 **modified);
 
 G_END_DECLS
 

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	Fri May  2 11:12:42 2008
@@ -88,14 +88,21 @@
 	while (sessions) {
 		TrackerXesamLiveSearch *search = tracker_xesam_session_get_search (sessions->data, search_id, NULL);
 		if (search) {
+
+			/* Search got a reference added already */
 			if (search_in)
-				*search_in = g_object_ref (search);
+				*search_in = search;
+			else
+				g_object_unref (search);
+
 			retval = g_object_ref (sessions->data);
 			break;
 		}
 		sessions = g_list_next (sessions);
 	}
 
+	g_list_free (sessions);
+
 	if (!retval) 
 		g_set_error (error, TRACKER_XESAM_ERROR, 
 				TRACKER_XESAM_ERROR_SEARCH_ID_NOT_REGISTERED,
@@ -114,12 +121,15 @@
 	while (sessions) {
 		TrackerXesamLiveSearch *search = tracker_xesam_session_get_search (sessions->data, search_id, NULL);
 		if (search) {
-			retval = g_object_ref (search);
+			/* Search got a reference added already */
+			retval = search;
 			break;
 		}
 		sessions = g_list_next (sessions);
 	}
 
+	g_list_free (sessions);
+
 	if (!retval) 
 		g_set_error (error, TRACKER_XESAM_ERROR, 
 				TRACKER_XESAM_ERROR_SEARCH_ID_NOT_REGISTERED,
@@ -128,4 +138,88 @@
 	return retval;
 }
 
+static gboolean 
+live_search_handler (gpointer data)
+{
+	gboolean reason_to_live = FALSE;
+	GList * sessions = g_hash_table_get_values (tracker->xesam_sessions);
+	TrackerDBResultSet *result_set;
+	TrackerDBusXesam *proxy = TRACKER_DBUS_XESAM (tracker_dbus_get_object (TRACKER_TYPE_DBUS_XESAM));
+	DBConnection *db_con = NULL;
+
+	g_object_get (proxy, "db-connection", &db_con, NULL);
+
+	// lock (indexer)
+	result_set = tracker_db_get_events (db_con);
+	// lock (indexer)
+
+	if (result_set /* TODO: If there are events */) {
+
+		reason_to_live = TRUE;
+
+		while (sessions) {
+			GList *searches = tracker_xesam_session_get_searches (sessions->data);
+			while (searches) {
+				GArray *added = NULL, *removed = NULL, *modified = NULL;
+				TrackerXesamLiveSearch *search = searches->data;
+
+				tracker_xesam_live_search_match_with_events (search, result_set, &added, &removed, &modified);
+
+				if (added && added->len > 0) {
+					tracker_xesam_live_search_emit_hits_added (search, added->len);
+					g_array_free (added, TRUE);
+				}
+				if (removed && removed->len > 0) {
+					tracker_xesam_live_search_emit_hits_removed (search, removed);
+					g_array_free (removed, TRUE);
+				}
+				if (modified && modified->len > 0) {
+					tracker_xesam_live_search_emit_hits_modified (search, modified);
+					g_array_free (modified, TRUE);
+				}
+
+				searches = g_list_next (searches);
+			}
+			g_list_free (searches);
+
+			sessions = g_list_next (sessions);
+		}
+		g_list_free (sessions);
+
+		// lock (indexer)
+		tracker_db_delete_handled (db_con, result_set);
+		// unlock (indexer)
+	}
+
+	g_object_unref (result_set);
+
+	return reason_to_live;
+}
+
+/* Should be set initially to FALSE instead (but then we activate this 
+ * unfinished code)*/
+
+static gboolean live_search_handler_running = TRUE;
+
+static void 
+live_search_handler_destroy (gpointer data)
+{
+	live_search_handler_running = FALSE;
+}
+
+void 
+tracker_xesam_wakeup (guint32 last_id)
+{
+	// This happens each time a new event is created
+
+	if (!live_search_handler_running) {
+		live_search_handler_running = TRUE;
+		g_timeout_add_full (G_PRIORITY_DEFAULT_IDLE,
+			2000, /* 2 seconds */
+			live_search_handler,
+			NULL,
+			live_search_handler_destroy);
+	}
+}
+
 

Modified: branches/indexer-split/src/trackerd/tracker-xesam.h
==============================================================================
--- branches/indexer-split/src/trackerd/tracker-xesam.h	(original)
+++ branches/indexer-split/src/trackerd/tracker-xesam.h	Fri May  2 11:12:42 2008
@@ -51,5 +51,6 @@
 void                    tracker_xesam_close_session          (const gchar             *session_id,
                                                               GError                 **error);
 void                    tracker_xesam_init                   (void);
+void                    tracker_xesam_wakeup                 (guint32 last_id);
 
 #endif



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