summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libtracker-sparql/direct/tracker-direct.c45
-rw-r--r--src/libtracker-sparql/tracker-connection.c38
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,