[tracker/tracker-store-queue] Fixed the push modules to yield to the GMainLoop while queuing up
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: svn-commits-list gnome org
- Subject: [tracker/tracker-store-queue] Fixed the push modules to yield to the GMainLoop while queuing up
- Date: Thu, 21 May 2009 15:22:01 -0400 (EDT)
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]