diff options
-rw-r--r-- | src/libtracker-sparql/direct/tracker-direct-batch.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/libtracker-sparql/direct/tracker-direct-batch.c b/src/libtracker-sparql/direct/tracker-direct-batch.c index 0b248cea0..f0c309d10 100644 --- a/src/libtracker-sparql/direct/tracker-direct-batch.c +++ b/src/libtracker-sparql/direct/tracker-direct-batch.c @@ -24,6 +24,7 @@ #include <libtracker-sparql/core/tracker-data.h> #include "tracker-direct-batch.h" +#include "tracker-direct-statement.h" #include "tracker-direct.h" #include "tracker-private.h" @@ -41,6 +42,11 @@ struct _TrackerBatchElem gchar *graph; TrackerResource *resource; } resource; + + struct { + TrackerSparqlStatement *stmt; + GHashTable *parameters; + } statement; } d; }; @@ -52,6 +58,7 @@ struct _TrackerDirectBatchPrivate enum { TRACKER_DIRECT_BATCH_RESOURCE, TRACKER_DIRECT_BATCH_SPARQL, + TRACKER_DIRECT_BATCH_STATEMENT, }; G_DEFINE_TYPE_WITH_PRIVATE (TrackerDirectBatch, @@ -97,6 +104,52 @@ tracker_direct_batch_add_resource (TrackerBatch *batch, g_array_append_val (priv->array, elem); } +static void +free_value (gpointer data) +{ + GValue *value = data; + + g_value_unset (value); + g_free (value); +} + +static void +tracker_direct_batch_add_statement (TrackerBatch *batch, + TrackerSparqlStatement *stmt, + guint n_values, + const gchar *binding_names[], + const GValue bindings[]) +{ + TrackerDirectBatch *direct = TRACKER_DIRECT_BATCH (batch); + TrackerDirectBatchPrivate *priv = tracker_direct_batch_get_instance_private (direct); + TrackerBatchElem elem; + GHashTable *parameters = NULL; + guint i; + + for (i = 0; i < n_values; i++) { + GValue *copy; + + if (!parameters) { + parameters = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) free_value); + } + + copy = g_new0 (GValue, 1); + g_value_init (copy, G_VALUE_TYPE (&bindings[i])); + g_value_copy (&bindings[i], copy); + g_hash_table_insert (parameters, + g_strdup (binding_names[i]), + copy); + } + + elem.type = TRACKER_DIRECT_BATCH_STATEMENT; + elem.d.statement.stmt = g_object_ref (stmt); + elem.d.statement.parameters = parameters; + g_array_append_val (priv->array, elem); +} + static gboolean tracker_direct_batch_execute (TrackerBatch *batch, GCancellable *cancellable, @@ -147,6 +200,7 @@ tracker_direct_batch_class_init (TrackerDirectBatchClass *klass) batch_class->add_sparql = tracker_direct_batch_add_sparql; batch_class->add_resource = tracker_direct_batch_add_resource; + batch_class->add_statement = tracker_direct_batch_add_statement; batch_class->execute = tracker_direct_batch_execute; batch_class->execute_async = tracker_direct_batch_execute_async; batch_class->execute_finish = tracker_direct_batch_execute_finish; @@ -159,6 +213,10 @@ tracker_batch_elem_clear (TrackerBatchElem *elem) g_object_run_dispose (G_OBJECT (elem->d.resource.resource)); g_object_unref (elem->d.resource.resource); g_free (elem->d.resource.graph); + } else if (elem->type == TRACKER_DIRECT_BATCH_STATEMENT) { + g_object_unref (elem->d.statement.stmt); + g_clear_pointer (&elem->d.statement.parameters, + g_hash_table_unref); } else if (elem->type == TRACKER_DIRECT_BATCH_SPARQL) { g_free (elem->d.sparql); } @@ -236,6 +294,11 @@ tracker_direct_batch_update (TrackerDirectBatch *batch, NULL, &inner_error); g_object_unref (query); + } else if (elem->type == TRACKER_DIRECT_BATCH_STATEMENT) { + tracker_direct_statement_execute_update (elem->d.statement.stmt, + elem->d.statement.parameters, + bnodes, + &inner_error); } else { g_assert_not_reached (); } |