[tracker/tracker-store-queue] Fixed the push modules to yield to the GMainLoop while queuing up



commit c3bb2243af0c58116cb89e7241ca493bf9250935
Author: Philip Van Hoof <philip codeminded be>
Date:   Thu May 21 21:21:10 2009 +0200

    Fixed the push modules to yield to the GMainLoop while queuing up
---
 .../evolution/tracker-evolution-registrar.c        |  267 +++++++++++++++-----
 src/plugins/kmail/tracker-kmail-registrar.c        |  260 +++++++++++++++-----
 2 files changed, 408 insertions(+), 119 deletions(-)

diff --git a/src/plugins/evolution/tracker-evolution-registrar.c b/src/plugins/evolution/tracker-evolution-registrar.c
index 646942c..0e4b870 100644
--- a/src/plugins/evolution/tracker-evolution-registrar.c
+++ b/src/plugins/evolution/tracker-evolution-registrar.c
@@ -69,7 +69,7 @@ struct TrackerEvolutionPushRegistrarClass {
 
 
 typedef struct {
-	gpointer dummy;
+	guint batch_count;
 } TrackerEvolutionRegistrarPrivate;
 
 enum {
@@ -270,12 +270,42 @@ get_email_and_fullname (const gchar *line, gchar **email, gchar **fullname)
 }
 
 static void
-data_insert_statement (const gchar *subject, 
+commit_callback(gpointer user_data)
+{
+	TrackerEvolutionRegistrar *object = user_data;
+	TrackerEvolutionRegistrarPrivate *priv;
+
+	priv = TRACKER_EVOLUTION_REGISTRAR_GET_PRIVATE (object);
+
+	priv->batch_count = 0;
+}
+
+static void
+insert_callback (GError *error, gpointer user_data)
+{
+	TrackerEvolutionRegistrar *object = user_data;
+	TrackerEvolutionRegistrarPrivate *priv;
+
+	priv = TRACKER_EVOLUTION_REGISTRAR_GET_PRIVATE (object);
+
+	if (++priv->batch_count >= TRACKER_STORE_TRANSACTION_MAX) {
+		tracker_store_queue_batch_commit (commit_callback,
+		                                  g_object_ref (object),
+		                                  (GDestroyNotify) g_object_unref);
+	}
+
+}
+
+static void
+data_insert_statement (TrackerEvolutionRegistrar *self, 
+		       const gchar *subject, 
 		       const gchar *predicate,
 		       const gchar *object)
 {
 	tracker_store_queue_batch_insert_statement (subject, predicate, object, 
-	                                            NULL, NULL, NULL);
+	                                            insert_callback, 
+						    g_object_ref (self), 
+						    (GDestroyNotify) g_object_unref);
 }
 
 static void
@@ -286,16 +316,16 @@ perform_set (TrackerEvolutionRegistrar *object,
 {
 	guint i = 0;
 
-	data_insert_statement (DATASOURCE_URN, RDF_PREFIX "type",
+	data_insert_statement (object, DATASOURCE_URN, RDF_PREFIX "type",
 			       NIE_DATASOURCE);
 
-	data_insert_statement (subject, RDF_PREFIX "type",
+	data_insert_statement (object, subject, RDF_PREFIX "type",
 	                       NMO_PREFIX "Email");
 
-	data_insert_statement (subject, RDF_PREFIX "type",
+	data_insert_statement (object, subject, RDF_PREFIX "type",
 	                       NMO_PREFIX "MailboxDataObject");
 
-	data_insert_statement (subject, NIE_DATASOURCE_P,
+	data_insert_statement (object, subject, NIE_DATASOURCE_P,
 	                       DATASOURCE_URN);
 
 	while (predicates [i] != NULL && values[i] != NULL) {
@@ -382,7 +412,7 @@ perform_set (TrackerEvolutionRegistrar *object,
 				} else
 					text = orig_text;
 
-				data_insert_statement (subject, 
+				data_insert_statement (object, subject, 
 				                       METADATA_EMAIL_TEXT, 
 				                       text);
 
@@ -410,18 +440,18 @@ perform_set (TrackerEvolutionRegistrar *object,
 				value++;
 			}
 
-			data_insert_statement (":1", RDF_PREFIX "type",
+			data_insert_statement (object, ":1", RDF_PREFIX "type",
 			                       NAO_PREFIX "Property");
 
-			data_insert_statement (":1", 
+			data_insert_statement (object, ":1", 
 			                       NAO_PREFIX "propertyName",
 			                       key);
 
-			data_insert_statement (":1", 
+			data_insert_statement (object, ":1", 
 			                       NAO_PREFIX "propertyValue",
 			                       value);
 
-			data_insert_statement (subject, 
+			data_insert_statement (object, subject, 
 			                       NAO_PREFIX "hasProperty", 
 			                       ":1");
 
@@ -429,64 +459,64 @@ perform_set (TrackerEvolutionRegistrar *object,
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_EVOLUTION_PREDICATE_SUBJECT) == 0) {
-			data_insert_statement (subject,
+			data_insert_statement (object, subject,
 			                       TRACKER_NMO_PREFIX "messageSubject", 
 			                       values[i]);
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_EVOLUTION_PREDICATE_SENT) == 0) {
-			data_insert_statement (subject,
+			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;
-			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) {
-				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); 
-			data_insert_statement (email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
-			data_insert_statement (email_uri, NCO_PREFIX "emailAddress", email);
-			data_insert_statement (":1", NCO_PREFIX "hasEmailAddress", email_uri);
-			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;
-			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) {
-				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); 
-			data_insert_statement (email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
-			data_insert_statement (email_uri, NCO_PREFIX "emailAddress", email);
-			data_insert_statement (":1", NCO_PREFIX "hasEmailAddress", email_uri);
-			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;
-			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) {
-				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); 
-			data_insert_statement (email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
-			data_insert_statement (email_uri, NCO_PREFIX "emailAddress", email);
-			data_insert_statement (":1", NCO_PREFIX "hasEmailAddress", email_uri);
-			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);
 		}
@@ -507,7 +537,9 @@ perform_unset (TrackerEvolutionRegistrar *object,
 	if (batch) {
 		tracker_store_queue_sparql_update (sparql, NULL, NULL, NULL);
 	} else {
-		tracker_store_queue_batch_sparql_update (sparql, NULL, NULL, NULL);
+		tracker_store_queue_batch_sparql_update (sparql, insert_callback,
+		                                         g_object_ref (object), 
+		                                         (GDestroyNotify) g_object_unref);
 	}
 
 	g_free (sparql);
@@ -553,6 +585,87 @@ tracker_evolution_registrar_set (TrackerEvolutionRegistrar *object,
 	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);
+
+		cont = TRUE;
+
+		if (i > 100) {
+			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_batch_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, 
@@ -563,7 +676,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);
@@ -574,26 +687,65 @@ 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);
 
-	while (subjects[i] != NULL) {
-		GStrv preds = g_ptr_array_index (predicates, i);
-		GStrv vals = g_ptr_array_index (values, i);
+	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 (predicates);
+
+	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 (info->subjects[i] != NULL) {
+
+		perform_unset (info->object, info->subjects[i], TRUE);
 
-		perform_set (object, subjects[i], preds, vals);
+		cont = TRUE;
 
-		amount++;
-		if (amount > TRANSACTION_MAX) {
-			tracker_store_queue_batch_commit (NULL, NULL, NULL);
-			amount = 0;
+		if (i > 100) {
+			break;
 		}
 
 		i++;
 	}
 
-	set_stored_last_modseq (modseq);
+	return cont;
+}
+
+static void
+unset_many_destroy (gpointer user_data)
+{
+	UnsetManyInfo *info = user_data;
+
+	set_stored_last_modseq (info->modseq);
 
 	tracker_store_queue_batch_commit (NULL, NULL, NULL);
 
-	dbus_g_method_return (context);
+	dbus_g_method_return (info->context);
+
+	g_object_unref (info->object);
+	g_free (info);
 }
 
 void
@@ -603,28 +755,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);
 
-	while (subjects[i] != NULL) {
+	info = g_new0 (UnsetManyInfo, 1);
 
-		perform_unset (object, subjects[i], TRUE);
+	info->object = g_object_ref (object);
+	info->context = context;
+	info->modseq = modseq;
+	info->subjects = g_strdupv (subjects);
 
-		amount++;
-		if (amount > TRANSACTION_MAX) {
-			tracker_store_queue_batch_commit (NULL, NULL, NULL);
-			amount = 0;
-		}
-
-		i++;
-	}
-
-	set_stored_last_modseq (modseq);
-
-	tracker_store_queue_batch_commit (NULL, NULL, NULL);
-
-	dbus_g_method_return (context);
+	g_idle_add_full (G_PRIORITY_DEFAULT,
+	                 unset_many_idle,
+	                 info,
+	                 unset_many_destroy);
 }
 
 void
diff --git a/src/plugins/kmail/tracker-kmail-registrar.c b/src/plugins/kmail/tracker-kmail-registrar.c
index 7a5705e..1abec7f 100644
--- a/src/plugins/kmail/tracker-kmail-registrar.c
+++ b/src/plugins/kmail/tracker-kmail-registrar.c
@@ -68,7 +68,7 @@ struct TrackerKMailPushRegistrarClass {
 
 
 typedef struct {
-	gpointer dummy;
+	guint batch_count;
 } TrackerKMailRegistrarPrivate;
 
 enum {
@@ -156,12 +156,42 @@ get_email_and_fullname (const gchar *line, gchar **email, gchar **fullname)
 
 
 static void
-data_insert_statement (const gchar *subject, 
+commit_callback(gpointer user_data)
+{
+	TrackerKMailRegistrar *object = user_data;
+	TrackerKMailRegistrarPrivate *priv;
+
+	priv = TRACKER_KMAIL_REGISTRAR_GET_PRIVATE (object);
+
+	priv->batch_count = 0;
+}
+
+static void
+insert_callback (GError *error, gpointer user_data)
+{
+	TrackerKMailRegistrar *object = user_data;
+	TrackerKMailRegistrarPrivate *priv;
+
+	priv = TRACKER_KMAIL_REGISTRAR_GET_PRIVATE (object);
+
+	if (++priv->batch_count >= TRACKER_STORE_TRANSACTION_MAX) {
+		tracker_store_queue_batch_commit (commit_callback,
+		                                  g_object_ref (object),
+		                                  (GDestroyNotify) g_object_unref);
+	}
+
+}
+
+static void
+data_insert_statement (TrackerKMailRegistrar *self, 
+		       const gchar *subject, 
 		       const gchar *predicate,
 		       const gchar *object)
 {
 	tracker_store_queue_batch_insert_statement (subject, predicate, object, 
-	                                            NULL, NULL, NULL);
+	                                            insert_callback, 
+						    g_object_ref (self), 
+						    (GDestroyNotify) g_object_unref);
 }
 
 static void
@@ -172,17 +202,17 @@ perform_set (TrackerKMailRegistrar *object,
 {
 	guint i = 0;
 
-	data_insert_statement (DATASOURCE_URN, RDF_PREFIX "type",
+	data_insert_statement (object, DATASOURCE_URN, RDF_PREFIX "type",
 	                      NIE_DATASOURCE);
 
 
-	data_insert_statement (subject, RDF_PREFIX "type",
+	data_insert_statement (object, subject, RDF_PREFIX "type",
 	                       NMO_PREFIX "Email");
 
-	data_insert_statement (subject, RDF_PREFIX "type",
+	data_insert_statement (object, subject, RDF_PREFIX "type",
 	                       NMO_PREFIX "MailboxDataObject");
 
-	data_insert_statement (subject, NIE_DATASOURCE_P,
+	data_insert_statement (object, subject, NIE_DATASOURCE_P,
 	                       DATASOURCE_URN);
 
 	while (predicates [i] != NULL && values[i] != NULL) {
@@ -200,77 +230,77 @@ perform_set (TrackerKMailRegistrar *object,
 
 		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_TAG) == 0) {
 
-			data_insert_statement (":1", RDF_PREFIX "type",
+			data_insert_statement (object, ":1", RDF_PREFIX "type",
 			                       NAO_PREFIX "Tag");
 
-			data_insert_statement (":1", 
+			data_insert_statement (object, ":1", 
 			                       NAO_PREFIX "prefLabel",
 			                       values[i]);
 
-			data_insert_statement (subject, 
+			data_insert_statement (object, subject, 
 			                       NAO_PREFIX "hasTag", 
 			                       ":1");
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_SUBJECT) == 0) {
-			data_insert_statement (subject,
+			data_insert_statement (object, subject,
 			                       TRACKER_NMO_PREFIX "messageSubject", 
 			                       values[i]);
 		}
 
 		if (g_strcmp0 (predicates[i], TRACKER_KMAIL_PREDICATE_SENT) == 0) {
-			data_insert_statement (subject,
+			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;
-			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) {
-				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); 
-			data_insert_statement (email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
-			data_insert_statement (email_uri, NCO_PREFIX "emailAddress", email);
-			data_insert_statement (":1", NCO_PREFIX "hasEmailAddress", email_uri);
-			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;
-			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) {
-				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); 
-			data_insert_statement (email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
-			data_insert_statement (email_uri, NCO_PREFIX "emailAddress", email);
-			data_insert_statement (":1", NCO_PREFIX "hasEmailAddress", email_uri);
-			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;
-			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) {
-				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); 
-			data_insert_statement (email_uri, RDF_PREFIX "type", NCO_PREFIX "EmailAddress");
-			data_insert_statement (email_uri, NCO_PREFIX "emailAddress", email);
-			data_insert_statement (":1", NCO_PREFIX "hasEmailAddress", email_uri);
-			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);
 		}
@@ -291,7 +321,9 @@ perform_unset (TrackerKMailRegistrar *object,
 	if (batch) {
 		tracker_store_queue_sparql_update (sparql, NULL, NULL, NULL);
 	} else {
-		tracker_store_queue_batch_sparql_update (sparql, NULL, NULL, NULL);
+		tracker_store_queue_batch_sparql_update (sparql, insert_callback,
+		                                         g_object_ref (object), 
+		                                         (GDestroyNotify) g_object_unref);
 	}
 
 	g_free (sparql);
@@ -337,6 +369,85 @@ tracker_kmail_registrar_set (TrackerKMailRegistrar *object,
 	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);
+
+		cont = TRUE;
+
+		if (i > 100) {
+			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_batch_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, 
@@ -347,7 +458,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);
@@ -358,26 +469,65 @@ 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);
 
-	while (subjects[i] != NULL) {
-		GStrv preds = g_ptr_array_index (predicates, i);
-		GStrv vals = g_ptr_array_index (values, i);
+	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 (predicates);
+
+	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;
 
-		perform_set (object, subjects[i], preds, vals);
+	while (info->subjects[i] != NULL) {
 
-		amount++;
-		if (amount > TRANSACTION_MAX) {
-			tracker_store_queue_batch_commit (NULL, NULL, NULL);
-			amount = 0;
+		perform_unset (info->object, info->subjects[i], TRUE);
+
+		cont = TRUE;
+
+		if (i > 100) {
+			break;
 		}
 
 		i++;
 	}
 
-	set_stored_last_modseq (modseq);
+	return cont;
+}
+
+static void
+unset_many_destroy (gpointer user_data)
+{
+	UnsetManyInfo *info = user_data;
+
+	set_stored_last_modseq (info->modseq);
 
 	tracker_store_queue_batch_commit (NULL, NULL, NULL);
 
-	dbus_g_method_return (context);
+	dbus_g_method_return (info->context);
+
+	g_object_unref (info->object);
+	g_free (info);
 }
 
 void
@@ -387,28 +537,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);
 
-	while (subjects[i] != NULL) {
+	info = g_new0 (UnsetManyInfo, 1);
 
-		perform_unset (object, subjects[i], TRUE);
+	info->object = g_object_ref (object);
+	info->context = context;
+	info->modseq = modseq;
+	info->subjects = g_strdupv (subjects);
 
-		amount++;
-		if (amount > TRANSACTION_MAX) {
-			tracker_store_queue_batch_commit (NULL, NULL, NULL);
-			amount = 0;
-		}
+	g_idle_add_full (G_PRIORITY_DEFAULT,
+	                 unset_many_idle,
+	                 info,
+	                 unset_many_destroy);
 
-		i++;
-	}
-
-	set_stored_last_modseq (modseq);
-
-	tracker_store_queue_batch_commit (NULL, NULL, NULL);
-
-	dbus_g_method_return (context);
 }
 
 void



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