diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2022-12-03 23:10:17 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2022-12-24 01:14:41 +0100 |
commit | a22c64a1286b3e7e31c3148355efadd1de7e793e (patch) | |
tree | 5722838f9d8bd688dfc7a7085af15e732d171cf8 | |
parent | f6085ed4e946465e158b6a5ddbe7058cbdf6f624 (diff) | |
download | tracker-a22c64a1286b3e7e31c3148355efadd1de7e793e.tar.gz |
direct: Implement TrackerBatch::add_statement vmethod
This method allows attaching a prepared statement, plus a list
of names/values for the parameters used in the query. statements
may be attached multiple times to the same or different batches,
and will be executed with the given parameters in their place
during TrackerBatch execution.
-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 (); } |