summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-12-03 23:10:17 +0100
committerCarlos Garnacho <carlosg@gnome.org>2022-12-24 01:14:41 +0100
commita22c64a1286b3e7e31c3148355efadd1de7e793e (patch)
tree5722838f9d8bd688dfc7a7085af15e732d171cf8
parentf6085ed4e946465e158b6a5ddbe7058cbdf6f624 (diff)
downloadtracker-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.c63
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 ();
}