[tracker/tracker-store-queue: 12/13] Ported push modules to TrackerStore API



commit 4d9f576d7c1b9189b4006aa4579067f1ed52572e
Author: Philip Van Hoof <philip codeminded be>
Date:   Wed May 27 16:55:36 2009 +0200

    Ported push modules to TrackerStore API
---
 .../evolution/tracker-evolution-registrar.c        |  334 +++++++++++++------
 src/plugins/kmail/tracker-kmail-registrar.c        |  294 ++++++++++++------
 2 files changed, 430 insertions(+), 198 deletions(-)

diff --git a/src/plugins/evolution/tracker-evolution-registrar.c b/src/plugins/evolution/tracker-evolution-registrar.c
index 8dc72c7..1cab05f 100644
--- a/src/plugins/evolution/tracker-evolution-registrar.c
+++ b/src/plugins/evolution/tracker-evolution-registrar.c
@@ -28,12 +28,11 @@
 #include <glib-object.h>
 #include <dbus/dbus-glib-bindings.h>
 
-#include <libtracker-data/tracker-data-update.h>
 #include <libtracker-data/tracker-data-manager.h>
-#include <libtracker-data/tracker-data-query.h>
 #include <libtracker-common/tracker-ontology.h>
 
 #include <tracker-store/tracker-push-registrar.h>
+#include <tracker-store/tracker-store.h>
 
 #define __TRACKER_EVOLUTION_REGISTRAR_C__
 
@@ -45,8 +44,6 @@
 #define TRACKER_TYPE_EVOLUTION_PUSH_REGISTRAR    (tracker_evolution_push_registrar_get_type ())
 #define TRACKER_EVOLUTION_PUSH_REGISTRAR(module) (G_TYPE_CHECK_INSTANCE_CAST ((module), TRACKER_TYPE_EVOLUTION_PUSH_REGISTRAR, TrackerEvolutionPushRegistrar))
 
-#define TRANSACTION_MAX 200
-
 #define NIE_DATASOURCE 			       TRACKER_NIE_PREFIX "DataSource"
 #define NIE_DATASOURCE_P 		       TRACKER_NIE_PREFIX "dataSource"
 
@@ -191,13 +188,13 @@ extract_mime_parts (GMimeObject *object,
 		subject = g_strdup_printf ("%s/%s", message_subject, 
 					   filename);
 
-		tracker_data_insert_statement (subject, 
-					       "File:Path", 
-					       filename);
+		data_insert_statement (subject, 
+		                      "File:Path", 
+				       filename);
 
-		tracker_data_insert_statement (subject, 
-					       "File:Name", 
-					       filename);
+		data_insert_statement (subject, 
+		                       "File:Name", 
+		                       filename);
 
 		g_free (subject);
 	}
@@ -271,6 +268,16 @@ get_email_and_fullname (const gchar *line, gchar **email, gchar **fullname)
 }
 
 static void
+data_insert_statement (TrackerEvolutionRegistrar *self, 
+		       const gchar *subject, 
+		       const gchar *predicate,
+		       const gchar *object)
+{
+	tracker_store_queue_insert_statement (subject, predicate, object, 
+	                                      NULL, NULL, NULL);
+}
+
+static void
 perform_set (TrackerEvolutionRegistrar *object, 
 	     const gchar *subject, 
 	     const GStrv predicates, 
@@ -278,19 +285,17 @@ perform_set (TrackerEvolutionRegistrar *object,
 {
 	guint i = 0;
 
-	if (!tracker_data_query_resource_exists (DATASOURCE_URN, NULL, NULL)) {
-		tracker_data_insert_statement (DATASOURCE_URN, RDF_PREFIX "type",
-					       NIE_DATASOURCE);
-	}
+	data_insert_statement (object, DATASOURCE_URN, RDF_PREFIX "type",
+			       NIE_DATASOURCE);
 
-	tracker_data_insert_statement (subject, RDF_PREFIX "type",
-		                       NMO_PREFIX "Email");
+	data_insert_statement (object, subject, RDF_PREFIX "type",
+	                       NMO_PREFIX "Email");
 
-	tracker_data_insert_statement (subject, RDF_PREFIX "type",
-		                       NMO_PREFIX "MailboxDataObject");
+	data_insert_statement (object, subject, RDF_PREFIX "type",
+	                       NMO_PREFIX "MailboxDataObject");
 
-	tracker_data_insert_statement (subject, NIE_DATASOURCE_P,
-		                       DATASOURCE_URN);
+	data_insert_statement (object, subject, NIE_DATASOURCE_P,
+	                       DATASOURCE_URN);
 
 	while (predicates [i] != NULL && values[i] != NULL) {
 
@@ -376,9 +381,9 @@ perform_set (TrackerEvolutionRegistrar *object,
 				} else
 					text = orig_text;
 
-				tracker_data_insert_statement (subject, 
-							       METADATA_EMAIL_TEXT, 
-							       text);
+				data_insert_statement (object, subject, 
+				                       METADATA_EMAIL_TEXT, 
+				                       text);
 
 				g_free (text);
 				g_free (encoding);
@@ -402,85 +407,96 @@ perform_set (TrackerEvolutionRegistrar *object,
 			if (value) {
 				*value = '\0';
 				value++;
-			}
 
-			tracker_data_insert_statement (":1", RDF_PREFIX "type",
-			                               NAO_PREFIX "Property");
+				data_insert_statement (object, ":1", RDF_PREFIX "type",
+				                       NAO_PREFIX "Property");
+
+				data_insert_statement (object, ":1", 
+				                       NAO_PREFIX "propertyName",
+				                       key);
 
-			tracker_data_insert_statement (":1", 
-			                               NAO_PREFIX "propertyName",
-			                               key);
+				data_insert_statement (object, ":1", 
+				                       NAO_PREFIX "propertyValue",
+				                       value);
 
-			tracker_data_insert_statement (":1", 
-			                               NAO_PREFIX "propertyValue",
-			                               value);
+				data_insert_statement (object, subject, 
+				                       NAO_PREFIX "hasProperty", 
+				                       ":1");
+			} else {
+				data_insert_statement (object, ":1", RDF_PREFIX "type",
+				                       NAO_PREFIX "Tag");
 
-			tracker_data_insert_statement (subject, 
-			                               NAO_PREFIX "hasProperty", 
-			                               ":1");
+				data_insert_statement (object, ":1", 
+				                       NAO_PREFIX "prefLabel",
+				                       key);
+
+				data_insert_statement (object, subject, 
+				                       NAO_PREFIX "hasTag", 
+				                       ":1");
+			}
 
 			g_free (key);
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_EVOLUTION_PREDICATE_SUBJECT) == 0) {
-			tracker_data_insert_statement (subject,
-						       TRACKER_NMO_PREFIX "messageSubject", 
-						       values[i]);
+			data_insert_statement (object, subject,
+			                       TRACKER_NMO_PREFIX "messageSubject", 
+			                       values[i]);
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_EVOLUTION_PREDICATE_SENT) == 0) {
-			tracker_data_insert_statement (subject,
-						       TRACKER_NMO_PREFIX "receivedDate", 
-						       values[i]);
+			data_insert_statement (object, subject,
+			                       TRACKER_NMO_PREFIX "receivedDate", 
+			                       values[i]);
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_EVOLUTION_PREDICATE_FROM) == 0) {
 			gchar *email_uri, *email = NULL, *fullname = NULL;
-			tracker_data_insert_statement (":1", RDF_PREFIX "type", NCO_PREFIX "Contact");
+			data_insert_statement (object, ":1", RDF_PREFIX "type", NCO_PREFIX "Contact");
 			get_email_and_fullname (values[i], &email, &fullname);
 			if (fullname) {
-				tracker_data_insert_statement (":1", NCO_PREFIX "fullname", fullname);
+				data_insert_statement (object, ":1", NCO_PREFIX "fullname", fullname);
 				g_free (fullname);
 			}
 			email_uri = tracker_uri_printf_escaped ("mailto:%s";, email); 
-			tracker_data_insert_statement (email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
-			tracker_data_insert_statement (email_uri, NCO_PREFIX "emailAddress", email);
-			tracker_data_insert_statement (":1", NCO_PREFIX "hasEmailAddress", email_uri);
-			tracker_data_insert_statement (subject, NMO_PREFIX "from", ":1");
+			data_insert_statement (object, email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
+			data_insert_statement (object, email_uri, NCO_PREFIX "emailAddress", email);
+			data_insert_statement (object, ":1", NCO_PREFIX "hasEmailAddress", email_uri);
+			data_insert_statement (object, subject, NMO_PREFIX "from", ":1");
 			g_free (email_uri);
 			g_free (email);
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_EVOLUTION_PREDICATE_TO) == 0) {
 			gchar *email_uri, *email = NULL, *fullname = NULL;
-			tracker_data_insert_statement (":1", RDF_PREFIX "type", NCO_PREFIX "Contact");
+			data_insert_statement (object, ":1", RDF_PREFIX "type", NCO_PREFIX "Contact");
 			get_email_and_fullname (values[i], &email, &fullname);
 			if (fullname) {
-				tracker_data_insert_statement (":1", NCO_PREFIX "fullname", fullname);
+				data_insert_statement (object, ":1", NCO_PREFIX "fullname", fullname);
 				g_free (fullname);
 			}
 			email_uri = tracker_uri_printf_escaped ("mailto:%s";, email); 
-			tracker_data_insert_statement (email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
-			tracker_data_insert_statement (email_uri, NCO_PREFIX "emailAddress", email);
-			tracker_data_insert_statement (":1", NCO_PREFIX "hasEmailAddress", email_uri);
-			tracker_data_insert_statement (subject, NMO_PREFIX "to", ":1");
+			data_insert_statement (object, email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
+			data_insert_statement (object, email_uri, NCO_PREFIX "emailAddress", email);
+			data_insert_statement (object, ":1", NCO_PREFIX "hasEmailAddress", email_uri);
+			data_insert_statement (object, subject, NMO_PREFIX "to", ":1");
 			g_free (email_uri);
 			g_free (email);
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_EVOLUTION_PREDICATE_CC) == 0) {
 			gchar *email_uri, *email = NULL, *fullname = NULL;
-			tracker_data_insert_statement (":1", RDF_PREFIX "type", NCO_PREFIX "Contact");
+			data_insert_statement (object, ":1", RDF_PREFIX "type", NCO_PREFIX "Contact");
 			get_email_and_fullname (values[i], &email, &fullname);
 			if (fullname) {
-				tracker_data_insert_statement (":1", NCO_PREFIX "fullname", fullname);
+				data_insert_statement (object, ":1", NCO_PREFIX "fullname", fullname);
 				g_free (fullname);
 			}
 			email_uri = tracker_uri_printf_escaped ("mailto:%s";, email); 
-			tracker_data_insert_statement (email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
-			tracker_data_insert_statement (email_uri, NCO_PREFIX "emailAddress", email);
-			tracker_data_insert_statement (":1", NCO_PREFIX "hasEmailAddress", email_uri);
-			tracker_data_insert_statement (subject, NMO_PREFIX "cc", ":1");
+			data_insert_statement (object, email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
+			data_insert_statement (object, email_uri, NCO_PREFIX "emailAddress", email);
+			data_insert_statement (object, ":1", NCO_PREFIX "hasEmailAddress", email_uri);
+			data_insert_statement (object, subject, NMO_PREFIX "cc", ":1");
 			g_free (email_uri);
 			g_free (email);
 		}
@@ -494,22 +510,23 @@ perform_set (TrackerEvolutionRegistrar *object,
 
 static void 
 perform_unset (TrackerEvolutionRegistrar *object, 
-	       const gchar *subject)
+	       const gchar *subject, gboolean batch)
 {
-	tracker_data_delete_resource (subject); 
+	gchar *sparql = g_strdup_printf ("DELETE { <%s> a rdfs:Resource }", subject);
+
+	if (batch) {
+		tracker_store_sparql_update (sparql, NULL);
+	} else {
+		tracker_store_queue_sparql_update (sparql, NULL, NULL, NULL);
+	}
+
+	g_free (sparql);
 }
 
 static void
 perform_cleanup (TrackerEvolutionRegistrar *object)
 {
-	GError *error = NULL;
-
-	tracker_data_update_sparql ("DELETE { ?s ?p ?o } WHERE { ?s nie:dataSource <" DATASOURCE_URN "> }", &error);
-
-	if (error) {
-		g_warning ("%s", error->message);
-		g_error_free (error);
-	}
+	tracker_store_sparql_update ("DELETE { ?s ?p ?o } WHERE { ?s nie:dataSource <" DATASOURCE_URN "> }", NULL);
 }
 
 static void
@@ -540,9 +557,91 @@ tracker_evolution_registrar_set (TrackerEvolutionRegistrar *object,
 
 	set_stored_last_modseq (modseq);
 
+	tracker_store_queue_commit (NULL, NULL, NULL);
+
 	dbus_g_method_return (context);
 }
 
+
+
+typedef struct {
+	TrackerEvolutionRegistrar *object;
+	GStrv subjects;
+	GPtrArray *predicates;
+	GPtrArray *values;
+	guint modseq;
+	DBusGMethodInvocation *context;
+} SetManyInfo;
+
+static gboolean
+set_many_idle (gpointer user_data)
+{
+	guint i = 0;
+	SetManyInfo *info = user_data;
+	gboolean cont = FALSE;
+
+	while (info->subjects[i] != NULL) {
+		GStrv preds = g_ptr_array_index (info->predicates, i);
+		GStrv vals = g_ptr_array_index (info->values, i);
+
+		perform_set (info->object, info->subjects[i], preds, vals);
+
+		if (i > 100) {
+			cont = TRUE;
+			break;
+		}
+
+		i++;
+	}
+
+	return cont;
+}
+
+static void
+strv_ptrarray_free (GPtrArray *array)
+{
+	guint i;
+
+	for (i = 0; i < array->len; i++) {
+		g_strfreev (g_ptr_array_index (array, i));
+	}
+
+	g_ptr_array_free (array, TRUE);
+}
+
+static void 
+set_many_destroy (gpointer user_data)
+{
+	SetManyInfo *info = user_data;
+
+	strv_ptrarray_free (info->predicates);
+	strv_ptrarray_free (info->values);
+	g_strfreev (info->subjects);
+
+	set_stored_last_modseq (info->modseq);
+
+	tracker_store_queue_commit (NULL, NULL, NULL);
+
+	dbus_g_method_return (info->context);
+
+	g_object_unref (info->object);
+	g_free (info);
+}
+
+static GPtrArray* 
+strv_ptrarray_dup (const GPtrArray *array)
+{
+	GPtrArray *new_array = g_ptr_array_sized_new (array->len);
+	guint i;
+
+	for (i = 0; i < array->len; i++) {
+		g_ptr_array_add	(new_array, g_strdupv (
+		                 g_ptr_array_index (array, i)));
+	}
+
+	return new_array;
+}
+
 void
 tracker_evolution_registrar_set_many (TrackerEvolutionRegistrar *object, 
 				      const GStrv subjects, 
@@ -553,7 +652,7 @@ tracker_evolution_registrar_set_many (TrackerEvolutionRegistrar *object,
 				      GError *derror)
 {
 	guint len;
-	guint i = 0, amount = 0;
+	SetManyInfo *info;
 
 	dbus_async_return_if_fail (subjects != NULL, context);
 	dbus_async_return_if_fail (predicates != NULL, context);
@@ -564,30 +663,64 @@ tracker_evolution_registrar_set_many (TrackerEvolutionRegistrar *object,
 	dbus_async_return_if_fail (len == predicates->len, context);
 	dbus_async_return_if_fail (len == values->len, context);
 
-	tracker_data_begin_transaction ();
+	info = g_new0 (SetManyInfo, 1);
+
+	info->object = g_object_ref (object);
+	info->context = context;
+	info->modseq = modseq;
+	info->subjects = g_strdupv (subjects);
+	info->predicates = strv_ptrarray_dup (predicates);
+	info->values = strv_ptrarray_dup (values);
+
+	g_idle_add_full (G_PRIORITY_DEFAULT,
+	                 set_many_idle,
+	                 info,
+	                 set_many_destroy);
+}
+
+
+typedef struct {
+	GStrv subjects;
+	guint modseq;
+	DBusGMethodInvocation *context;
+	TrackerEvolutionRegistrar *object;
+} UnsetManyInfo;
+
+static gboolean
+unset_many_idle (gpointer user_data)
+{
+	guint i = 0;
+	gboolean cont = FALSE;
+	UnsetManyInfo *info = user_data;
 
-	while (subjects[i] != NULL) {
-		GStrv preds = g_ptr_array_index (predicates, i);
-		GStrv vals = g_ptr_array_index (values, i);
+	while (info->subjects[i] != NULL) {
 
-		perform_set (object, subjects[i], preds, vals);
+		perform_unset (info->object, info->subjects[i], TRUE);
 
-		amount++;
-		if (amount > TRANSACTION_MAX) {
-			tracker_data_commit_transaction ();
-			g_main_context_iteration (NULL, FALSE);
-			tracker_data_begin_transaction ();
-			amount = 0;
+		if (i > 100) {
+			cont = TRUE;
+			break;
 		}
 
 		i++;
 	}
 
-	set_stored_last_modseq (modseq);
+	return cont;
+}
+
+static void
+unset_many_destroy (gpointer user_data)
+{
+	UnsetManyInfo *info = user_data;
 
-	tracker_data_commit_transaction ();
+	set_stored_last_modseq (info->modseq);
 
-	dbus_g_method_return (context);
+	tracker_store_queue_commit (NULL, NULL, NULL);
+
+	dbus_g_method_return (info->context);
+
+	g_object_unref (info->object);
+	g_free (info);
 }
 
 void
@@ -597,32 +730,21 @@ tracker_evolution_registrar_unset_many (TrackerEvolutionRegistrar *object,
 					DBusGMethodInvocation *context,
 					GError *derror)
 {
-	guint i = 0, amount = 0;
+	UnsetManyInfo *info;
 
 	dbus_async_return_if_fail (subjects != NULL, context);
 
-	tracker_data_begin_transaction ();
+	info = g_new0 (UnsetManyInfo, 1);
 
-	while (subjects[i] != NULL) {
+	info->object = g_object_ref (object);
+	info->context = context;
+	info->modseq = modseq;
+	info->subjects = g_strdupv (subjects);
 
-		perform_unset (object, subjects[i]);
-
-		amount++;
-		if (amount > TRANSACTION_MAX) {
-			tracker_data_commit_transaction ();
-			g_main_context_iteration (NULL, FALSE);
-			tracker_data_begin_transaction ();
-			amount = 0;
-		}
-
-		i++;
-	}
-
-	set_stored_last_modseq (modseq);
-
-	tracker_data_commit_transaction ();
-
-	dbus_g_method_return (context);
+	g_idle_add_full (G_PRIORITY_DEFAULT,
+	                 unset_many_idle,
+	                 info,
+	                 unset_many_destroy);
 }
 
 void
@@ -634,7 +756,7 @@ tracker_evolution_registrar_unset (TrackerEvolutionRegistrar *object,
 {
 	dbus_async_return_if_fail (subject != NULL, context);
 
-	perform_unset (object, subject);
+	perform_unset (object, subject, FALSE);
 
 	dbus_g_method_return (context);
 }
diff --git a/src/plugins/kmail/tracker-kmail-registrar.c b/src/plugins/kmail/tracker-kmail-registrar.c
index 3aeaff3..4ebf0f3 100644
--- a/src/plugins/kmail/tracker-kmail-registrar.c
+++ b/src/plugins/kmail/tracker-kmail-registrar.c
@@ -28,16 +28,13 @@
 #include <glib-object.h>
 #include <dbus/dbus-glib-bindings.h>
 
-#include <libtracker-data/tracker-data-update.h>
 #include <libtracker-data/tracker-data-manager.h>
-#include <libtracker-data/tracker-data-query.h>
 
 #include <tracker-store/tracker-push-registrar.h>
+#include <tracker-store/tracker-store.h>
 
 #define __TRACKER_KMAIL_REGISTRAR_C__
 
-#define TRANSACTION_MAX 200
-
 #include "tracker-kmail-registrar.h"
 #include "tracker-kmail-registrar-glue.h"
 
@@ -155,6 +152,15 @@ get_email_and_fullname (const gchar *line, gchar **email, gchar **fullname)
 	}
 }
 
+static void
+data_insert_statement (TrackerKMailRegistrar *self, 
+		       const gchar *subject, 
+		       const gchar *predicate,
+		       const gchar *object)
+{
+	tracker_store_queue_insert_statement (subject, predicate, object, 
+	                                      NULL, NULL, NULL); 
+}
 
 static void
 perform_set (TrackerKMailRegistrar *object, 
@@ -164,20 +170,18 @@ perform_set (TrackerKMailRegistrar *object,
 {
 	guint i = 0;
 
-	if (!tracker_data_query_resource_exists (DATASOURCE_URN, NULL, NULL)) {
-		tracker_data_insert_statement (DATASOURCE_URN, RDF_PREFIX "type",
-					       NIE_DATASOURCE);
-	}
+	data_insert_statement (object, DATASOURCE_URN, RDF_PREFIX "type",
+	                      NIE_DATASOURCE);
 
 
-	tracker_data_insert_statement (subject, RDF_PREFIX "type",
-		                       NMO_PREFIX "Email");
+	data_insert_statement (object, subject, RDF_PREFIX "type",
+	                       NMO_PREFIX "Email");
 
-	tracker_data_insert_statement (subject, RDF_PREFIX "type",
-		                       NMO_PREFIX "MailboxDataObject");
+	data_insert_statement (object, subject, RDF_PREFIX "type",
+	                       NMO_PREFIX "MailboxDataObject");
 
-	tracker_data_insert_statement (subject, NIE_DATASOURCE_P,
-		                       DATASOURCE_URN);
+	data_insert_statement (object, subject, NIE_DATASOURCE_P,
+	                       DATASOURCE_URN);
 
 	while (predicates [i] != NULL && values[i] != NULL) {
 
@@ -194,77 +198,77 @@ perform_set (TrackerKMailRegistrar *object,
 
 		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_TAG) == 0) {
 
-			tracker_data_insert_statement (":1", RDF_PREFIX "type",
-			                               NAO_PREFIX "Tag");
+			data_insert_statement (object, ":1", RDF_PREFIX "type",
+			                       NAO_PREFIX "Tag");
 
-			tracker_data_insert_statement (":1", 
-			                               NAO_PREFIX "prefLabel",
-			                               values[i]);
+			data_insert_statement (object, ":1", 
+			                       NAO_PREFIX "prefLabel",
+			                       values[i]);
 
-			tracker_data_insert_statement (subject, 
-			                               NAO_PREFIX "hasTag", 
-			                                ":1");
+			data_insert_statement (object, subject, 
+			                       NAO_PREFIX "hasTag", 
+			                       ":1");
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_SUBJECT) == 0) {
-			tracker_data_insert_statement (subject,
-						       TRACKER_NMO_PREFIX "messageSubject", 
-						       values[i]);
+			data_insert_statement (object, subject,
+			                       TRACKER_NMO_PREFIX "messageSubject", 
+			                       values[i]);
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_SENT) == 0) {
-			tracker_data_insert_statement (subject,
-						       TRACKER_NMO_PREFIX "receivedDate", 
-						       values[i]);
+			data_insert_statement (object, subject,
+			                      TRACKER_NMO_PREFIX "receivedDate", 
+			                      values[i]);
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_FROM) == 0) {
 			gchar *email_uri, *email = NULL, *fullname = NULL;
-			tracker_data_insert_statement (":1", RDF_PREFIX "type", NCO_PREFIX "Contact");
+			data_insert_statement (object, ":1", RDF_PREFIX "type", NCO_PREFIX "Contact");
 			get_email_and_fullname (values[i], &email, &fullname);
 			if (fullname) {
-				tracker_data_insert_statement (":1", NCO_PREFIX "fullname", fullname);
+				data_insert_statement (object, ":1", NCO_PREFIX "fullname", fullname);
 				g_free (fullname);
 			}
 			email_uri = tracker_uri_printf_escaped ("mailto:%s";, email); 
-			tracker_data_insert_statement (email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
-			tracker_data_insert_statement (email_uri, NCO_PREFIX "emailAddress", email);
-			tracker_data_insert_statement (":1", NCO_PREFIX "hasEmailAddress", email_uri);
-			tracker_data_insert_statement (subject, NMO_PREFIX "from", ":1");
+			data_insert_statement (object, email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
+			data_insert_statement (object, email_uri, NCO_PREFIX "emailAddress", email);
+			data_insert_statement (object, ":1", NCO_PREFIX "hasEmailAddress", email_uri);
+			data_insert_statement (object, subject, NMO_PREFIX "from", ":1");
 			g_free (email_uri);
 			g_free (email);
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_TO) == 0) {
 			gchar *email_uri, *email = NULL, *fullname = NULL;
-			tracker_data_insert_statement (":1", RDF_PREFIX "type", NCO_PREFIX "Contact");
+			data_insert_statement (object, ":1", RDF_PREFIX "type", NCO_PREFIX "Contact");
 			get_email_and_fullname (values[i], &email, &fullname);
 			if (fullname) {
-				tracker_data_insert_statement (":1", NCO_PREFIX "fullname", fullname);
+				data_insert_statement (object, ":1", NCO_PREFIX "fullname", fullname);
 				g_free (fullname);
 			}
 			email_uri = tracker_uri_printf_escaped ("mailto:%s";, email); 
-			tracker_data_insert_statement (email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
-			tracker_data_insert_statement (email_uri, NCO_PREFIX "emailAddress", email);
-			tracker_data_insert_statement (":1", NCO_PREFIX "hasEmailAddress", email_uri);
-			tracker_data_insert_statement (subject, NMO_PREFIX "to", ":1");
+			data_insert_statement (object, email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
+			data_insert_statement (object, email_uri, NCO_PREFIX "emailAddress", email);
+			data_insert_statement (object, ":1", NCO_PREFIX "hasEmailAddress", email_uri);
+			data_insert_statement (object, subject, NMO_PREFIX "to", ":1");
 			g_free (email_uri);
 			g_free (email);
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_CC) == 0) {
 			gchar *email_uri, *email = NULL, *fullname = NULL;
-			tracker_data_insert_statement (":1", RDF_PREFIX "type", NCO_PREFIX "Contact");
+			data_insert_statement (object, ":1", RDF_PREFIX "type", NCO_PREFIX "Contact");
 			get_email_and_fullname (values[i], &email, &fullname);
 			if (fullname) {
-				tracker_data_insert_statement (":1", NCO_PREFIX "fullname", fullname);
+				data_insert_statement (object, ":1", NCO_PREFIX "fullname", fullname);
 				g_free (fullname);
 			}
 			email_uri = tracker_uri_printf_escaped ("mailto:%s";, email); 
-			tracker_data_insert_statement (email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
-			tracker_data_insert_statement (email_uri, NCO_PREFIX "emailAddress", email);
-			tracker_data_insert_statement (":1", NCO_PREFIX "hasEmailAddress", email_uri);
-			tracker_data_insert_statement (subject, NMO_PREFIX "cc", ":1");
+			data_insert_statement (object, email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
+			data_insert_statement (object, email_uri, NCO_PREFIX "emailAddress", email);
+			data_insert_statement (object, ":1", NCO_PREFIX "hasEmailAddress", email_uri);
+			data_insert_statement (object, subject, NMO_PREFIX "cc", ":1");
 			g_free (email_uri);
 			g_free (email);
 		}
@@ -277,22 +281,24 @@ perform_set (TrackerKMailRegistrar *object,
 
 static void 
 perform_unset (TrackerKMailRegistrar *object, 
-	       const gchar *subject)
+	       const gchar *subject, 
+	       gboolean batch)
 {
-	tracker_data_delete_resource (subject); 
+	gchar *sparql = g_strdup_printf ("DELETE { <%s> a rdfs:Resource }", subject);
+
+	if (batch) {
+		tracker_store_sparql_update (sparql, NULL);
+	} else {
+		tracker_store_queue_sparql_update (sparql, NULL, NULL, NULL);
+	}
+
+	g_free (sparql);
 }
 
 static void
 perform_cleanup (TrackerKMailRegistrar *object)
 {
-	GError *error = NULL;
-
-	tracker_data_update_sparql ("DELETE { ?s ?p ?o } WHERE { ?s nie:dataSource <" DATASOURCE_URN "> }", &error);
-
-	if (error) {
-		g_warning ("%s", error->message);
-		g_error_free (error);
-	}
+	tracker_store_sparql_update ("DELETE { ?s ?p ?o } WHERE { ?s nie:dataSource <" DATASOURCE_URN "> }", NULL);
 }
 
 static void
@@ -323,9 +329,89 @@ tracker_kmail_registrar_set (TrackerKMailRegistrar *object,
 
 	set_stored_last_modseq (modseq);
 
+	tracker_store_queue_commit (NULL, NULL, NULL);
+
 	dbus_g_method_return (context);
 }
 
+typedef struct {
+	TrackerKMailRegistrar *object;
+	GStrv subjects;
+	GPtrArray *predicates;
+	GPtrArray *values;
+	guint modseq;
+	DBusGMethodInvocation *context;
+} SetManyInfo;
+
+static gboolean
+set_many_idle (gpointer user_data)
+{
+	guint i = 0;
+	SetManyInfo *info = user_data;
+	gboolean cont = FALSE;
+
+	while (info->subjects[i] != NULL) {
+		GStrv preds = g_ptr_array_index (info->predicates, i);
+		GStrv vals = g_ptr_array_index (info->values, i);
+
+		perform_set (info->object, info->subjects[i], preds, vals);
+
+		if (i > 100) {
+			cont = TRUE;
+			break;
+		}
+
+		i++;
+	}
+
+	return cont;
+}
+
+static void
+strv_ptrarray_free (GPtrArray *array)
+{
+	guint i;
+
+	for (i = 0; i < array->len; i++) {
+		g_strfreev (g_ptr_array_index (array, i));
+	}
+
+	g_ptr_array_free (array, TRUE);
+}
+
+static void 
+set_many_destroy (gpointer user_data)
+{
+	SetManyInfo *info = user_data;
+
+	strv_ptrarray_free (info->predicates);
+	strv_ptrarray_free (info->values);
+	g_strfreev (info->subjects);
+
+	set_stored_last_modseq (info->modseq);
+
+	tracker_store_queue_commit (NULL, NULL, NULL);
+
+	dbus_g_method_return (info->context);
+
+	g_object_unref (info->object);
+	g_free (info);
+}
+
+static GPtrArray* 
+strv_ptrarray_dup (const GPtrArray *array)
+{
+	GPtrArray *new_array = g_ptr_array_sized_new (array->len);
+	guint i;
+
+	for (i = 0; i < array->len; i++) {
+		g_ptr_array_add	(new_array, g_strdupv (
+		                 g_ptr_array_index (array, i)));
+	}
+
+	return new_array;
+}
+
 void
 tracker_kmail_registrar_set_many (TrackerKMailRegistrar *object, 
 				      const GStrv subjects, 
@@ -336,7 +422,7 @@ tracker_kmail_registrar_set_many (TrackerKMailRegistrar *object,
 				      GError *derror)
 {
 	guint len;
-	guint i = 0, amount = 0;
+	SetManyInfo *info;
 
 	dbus_async_return_if_fail (subjects != NULL, context);
 	dbus_async_return_if_fail (predicates != NULL, context);
@@ -347,30 +433,64 @@ tracker_kmail_registrar_set_many (TrackerKMailRegistrar *object,
 	dbus_async_return_if_fail (len == predicates->len, context);
 	dbus_async_return_if_fail (len == values->len, context);
 
-	tracker_data_begin_transaction ();
+	info = g_new0 (SetManyInfo, 1);
+
+	info->object = g_object_ref (object);
+	info->context = context;
+	info->modseq = modseq;
+	info->subjects = g_strdupv (subjects);
+	info->predicates = strv_ptrarray_dup (predicates);
+	info->values = strv_ptrarray_dup (values);
+
+	g_idle_add_full (G_PRIORITY_DEFAULT,
+	                 set_many_idle,
+	                 info,
+	                 set_many_destroy);
+
+}
+
+typedef struct {
+	GStrv subjects;
+	guint modseq;
+	DBusGMethodInvocation *context;
+	TrackerKMailRegistrar *object;
+} UnsetManyInfo;
+
+static gboolean
+unset_many_idle (gpointer user_data)
+{
+	guint i = 0;
+	gboolean cont = FALSE;
+	UnsetManyInfo *info = user_data;
 
-	while (subjects[i] != NULL) {
-		GStrv preds = g_ptr_array_index (predicates, i);
-		GStrv vals = g_ptr_array_index (values, i);
+	while (info->subjects[i] != NULL) {
 
-		perform_set (object, subjects[i], preds, vals);
+		perform_unset (info->object, info->subjects[i], TRUE);
 
-		amount++;
-		if (amount > TRANSACTION_MAX) {
-			tracker_data_commit_transaction ();
-			g_main_context_iteration (NULL, FALSE);
-			tracker_data_begin_transaction ();
-			amount = 0;
+		if (i > 100) {
+			cont = TRUE;
+			break;
 		}
 
 		i++;
 	}
 
-	set_stored_last_modseq (modseq);
+	return cont;
+}
 
-	tracker_data_commit_transaction ();
+static void
+unset_many_destroy (gpointer user_data)
+{
+	UnsetManyInfo *info = user_data;
 
-	dbus_g_method_return (context);
+	set_stored_last_modseq (info->modseq);
+
+	tracker_store_queue_commit (NULL, NULL, NULL);
+
+	dbus_g_method_return (info->context);
+
+	g_object_unref (info->object);
+	g_free (info);
 }
 
 void
@@ -380,32 +500,22 @@ tracker_kmail_registrar_unset_many (TrackerKMailRegistrar *object,
 				    DBusGMethodInvocation *context,
 				    GError *derror)
 {
-	guint i = 0, amount = 0;
+	UnsetManyInfo *info;
 
 	dbus_async_return_if_fail (subjects != NULL, context);
 
-	tracker_data_begin_transaction ();
+	info = g_new0 (UnsetManyInfo, 1);
 
-	while (subjects[i] != NULL) {
+	info->object = g_object_ref (object);
+	info->context = context;
+	info->modseq = modseq;
+	info->subjects = g_strdupv (subjects);
 
-		perform_unset (object, subjects[i]);
+	g_idle_add_full (G_PRIORITY_DEFAULT,
+	                 unset_many_idle,
+	                 info,
+	                 unset_many_destroy);
 
-		amount++;
-		if (amount > TRANSACTION_MAX) {
-			tracker_data_commit_transaction ();
-			g_main_context_iteration (NULL, FALSE);
-			tracker_data_begin_transaction ();
-			amount = 0;
-		}
-
-		i++;
-	}
-
-	set_stored_last_modseq (modseq);
-
-	tracker_data_commit_transaction ();
-
-	dbus_g_method_return (context);
 }
 
 void
@@ -417,7 +527,7 @@ tracker_kmail_registrar_unset (TrackerKMailRegistrar *object,
 {
 	dbus_async_return_if_fail (subject != NULL, context);
 
-	perform_unset (object, subject);
+	perform_unset (object, subject, FALSE);
 
 	dbus_g_method_return (context);
 }



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