diff options
-rw-r--r-- | src/libtracker-sparql/direct/tracker-direct.c | 45 | ||||
-rw-r--r-- | src/libtracker-sparql/tracker-connection.c | 38 |
2 files changed, 30 insertions, 53 deletions
diff --git a/src/libtracker-sparql/direct/tracker-direct.c b/src/libtracker-sparql/direct/tracker-direct.c index ff4642a9a..7f5131deb 100644 --- a/src/libtracker-sparql/direct/tracker-direct.c +++ b/src/libtracker-sparql/direct/tracker-direct.c @@ -848,6 +848,26 @@ tracker_direct_connection_update_finish (TrackerSparqlConnection *self, } static void +on_batch_finished (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + TrackerBatch *batch = TRACKER_BATCH (source); + GTask *task = user_data; + GError *error = NULL; + gboolean retval; + + retval = tracker_batch_execute_finish (batch, result, &error); + + if (retval) + g_task_return_boolean (task, TRUE); + else + g_task_return_error (task, error); + + g_object_unref (task); +} + +static void tracker_direct_connection_update_array_async (TrackerSparqlConnection *self, gchar **updates, gint n_updates, @@ -855,29 +875,18 @@ tracker_direct_connection_update_array_async (TrackerSparqlConnection *self, GAsyncReadyCallback callback, gpointer user_data) { - TrackerDirectConnectionPrivate *priv; - TrackerDirectConnection *conn; - TaskData *task_data; + TrackerBatch *batch; GTask *task; - gchar *concatenated; - gchar **array_copy; - - conn = TRACKER_DIRECT_CONNECTION (self); - priv = tracker_direct_connection_get_instance_private (conn); + gint i; - /* Make a NULL-terminated array and concatenate it */ - array_copy = g_new0 (gchar *, n_updates + 1); - memcpy (array_copy, updates, n_updates * sizeof (gchar *)); - concatenated = g_strjoinv ("\n", array_copy); - g_free (array_copy); + batch = tracker_sparql_connection_create_batch (self); - task_data = task_data_query_new (TASK_TYPE_UPDATE, concatenated, g_free); + for (i = 0; i < n_updates; i++) + tracker_batch_add_sparql (batch, updates[i]); task = g_task_new (self, cancellable, callback, user_data); - g_task_set_task_data (task, task_data, - (GDestroyNotify) task_data_free); - - g_thread_pool_push (priv->update_thread, task, NULL); + tracker_batch_execute_async (batch, cancellable, on_batch_finished, task); + g_object_unref (batch); } static gboolean diff --git a/src/libtracker-sparql/tracker-connection.c b/src/libtracker-sparql/tracker-connection.c index a1fbc18cf..2cacd7735 100644 --- a/src/libtracker-sparql/tracker-connection.c +++ b/src/libtracker-sparql/tracker-connection.c @@ -417,9 +417,8 @@ tracker_sparql_connection_update_finish (TrackerSparqlConnection *connection, * asynchronous operation is finished. * @user_data: user-defined data to be passed to @callback * - * Executes asynchronously an array of SPARQL updates. Each update in the - * array is its own transaction. This means that update n+1 is not halted - * due to an error in update n. + * Executes asynchronously an array of SPARQL updates. All updates in the + * array are handled within a single transaction. */ void tracker_sparql_connection_update_array_async (TrackerSparqlConnection *connection, @@ -449,38 +448,7 @@ tracker_sparql_connection_update_array_async (TrackerSparqlConnection *connecti * * Finishes the asynchronous SPARQL update_array operation. * - * <example> - * <programlisting> - * static void - * async_update_array_callback (GObject *source_object, - * GAsyncResult *result, - * gpointer user_data) - * { - * GError *error = NULL; - * GPtrArray *errors; - * guint i; - * - * errors = tracker_sparql_connection_update_array_finish (connection, result, &error); - * g_assert_no_error (error); - * - * for (i = 0; i < errors->len; i++) { - * const GError *e = g_ptr_array_index (errors, i); - * - * ... - * } - * - * g_ptr_array_unref (errors); - * } - * </programlisting> - * </example> - * - * Returns: a #GPtrArray of size @sparql_length with elements that are - * either NULL or a GError instance. The returned array should be freed with - * g_ptr_array_unref when no longer used, not with g_ptr_array_free. When - * you use errors of the array, you must g_error_copy them. Errors inside of - * the array must be considered as const data and not freed. The index of - * the error corresponds to the index of the update query in the array that - * you passed to tracker_sparql_connection_update_array_async. + * Returns: #TRUE if there were no errors. */ gboolean tracker_sparql_connection_update_array_finish (TrackerSparqlConnection *connection, |