summaryrefslogtreecommitdiff
path: root/src/libtracker-sparql
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-12-03 23:37:38 +0100
committerCarlos Garnacho <carlosg@gnome.org>2022-12-24 01:14:41 +0100
commit5934d11c78581b454e88122fce0ac2befead5eaf (patch)
tree12e5c19138ca783ac0e0ed7a49ab7e593e6220e7 /src/libtracker-sparql
parent7dbda80a20f403d96971e3aaf89db7e8203b97fc (diff)
downloadtracker-5934d11c78581b454e88122fce0ac2befead5eaf.tar.gz
bus: Implement TrackerBatch::add_statement vmethod
Diffstat (limited to 'src/libtracker-sparql')
-rw-r--r--src/libtracker-sparql/bus/tracker-bus-batch.c77
1 files changed, 76 insertions, 1 deletions
diff --git a/src/libtracker-sparql/bus/tracker-bus-batch.c b/src/libtracker-sparql/bus/tracker-bus-batch.c
index 421eb8eeb..92f3410b8 100644
--- a/src/libtracker-sparql/bus/tracker-bus-batch.c
+++ b/src/libtracker-sparql/bus/tracker-bus-batch.c
@@ -23,10 +23,13 @@
#include "tracker-bus-batch.h"
+#include "tracker-common.h"
+
struct _TrackerBusBatch
{
TrackerBatch parent_instance;
GPtrArray *updates;
+ GPtrArray *parameters;
};
typedef struct {
@@ -48,6 +51,7 @@ tracker_bus_batch_finalize (GObject *object)
TrackerBusBatch *bus_batch = TRACKER_BUS_BATCH (object);
g_ptr_array_unref (bus_batch->updates);
+ g_ptr_array_unref (bus_batch->parameters);
G_OBJECT_CLASS (tracker_bus_batch_parent_class)->finalize (object);
}
@@ -59,6 +63,7 @@ tracker_bus_batch_add_sparql (TrackerBatch *batch,
TrackerBusBatch *bus_batch = TRACKER_BUS_BATCH (batch);
g_ptr_array_add (bus_batch->updates, g_strdup (sparql));
+ g_ptr_array_add (bus_batch->parameters, NULL);
}
static void
@@ -75,6 +80,67 @@ tracker_bus_batch_add_resource (TrackerBatch *batch,
namespaces = tracker_sparql_connection_get_namespace_manager (conn);
sparql = tracker_resource_print_sparql_update (resource, namespaces, graph);
g_ptr_array_add (bus_batch->updates, sparql);
+ g_ptr_array_add (bus_batch->parameters, NULL);
+}
+
+static GVariant *
+value_to_variant (const GValue *value)
+{
+ GVariant *variant = NULL;
+
+ if (G_VALUE_TYPE (value) == G_TYPE_STRING) {
+ variant = g_variant_new_string (g_value_get_string (value));
+ } else if (G_VALUE_TYPE (value) == G_TYPE_INT64) {
+ variant = g_variant_new_int64 (g_value_get_int64 (value));
+ } else if (G_VALUE_TYPE (value) == G_TYPE_INT) {
+ variant = g_variant_new_int64 (g_value_get_int (value));
+ } else if (G_VALUE_TYPE (value) == G_TYPE_BOOLEAN) {
+ variant = g_variant_new_boolean (g_value_get_boolean (value));
+ } else if (G_VALUE_TYPE (value) == G_TYPE_DOUBLE) {
+ variant = g_variant_new_double (g_value_get_double (value));
+ } else if (G_VALUE_TYPE (value) == G_TYPE_DATE_TIME) {
+ gchar *str;
+
+ str = tracker_date_format_iso8601 (g_value_get_boxed (value));
+ variant = g_variant_new_string (str);
+ g_free (str);
+ }
+
+ return variant;
+}
+
+static void
+tracker_bus_batch_add_statement (TrackerBatch *batch,
+ TrackerSparqlStatement *stmt,
+ guint n_values,
+ const gchar *binding_names[],
+ const GValue bindings[])
+{
+ TrackerBusBatch *bus_batch = TRACKER_BUS_BATCH (batch);
+ GHashTable *parameters;
+ const gchar *sparql;
+ guint i;
+
+ parameters = g_hash_table_new_full (g_str_hash,
+ g_str_equal,
+ g_free,
+ (GDestroyNotify) g_variant_unref);
+
+ for (i = 0; i < n_values; i++) {
+ GVariant *variant;
+
+ variant = value_to_variant (&bindings[i]);
+ if (!variant)
+ continue;
+
+ g_hash_table_insert (parameters,
+ g_strdup (binding_names[i]),
+ g_variant_ref_sink (variant));
+ }
+
+ sparql = tracker_sparql_statement_get_sparql (stmt);
+ g_ptr_array_add (bus_batch->updates, g_strdup (sparql));
+ g_ptr_array_add (bus_batch->parameters, parameters);
}
static void
@@ -152,7 +218,7 @@ tracker_bus_batch_execute_async (TrackerBatch *batch,
conn = tracker_batch_get_connection (batch);
tracker_bus_connection_perform_update_array_async (TRACKER_BUS_CONNECTION (conn),
(gchar **) bus_batch->updates->pdata,
- NULL,
+ (GHashTable **) bus_batch->parameters->pdata,
bus_batch->updates->len,
cancellable,
update_array_cb,
@@ -177,16 +243,25 @@ tracker_bus_batch_class_init (TrackerBusBatchClass *klass)
batch_class->add_sparql = tracker_bus_batch_add_sparql;
batch_class->add_resource = tracker_bus_batch_add_resource;
+ batch_class->add_statement = tracker_bus_batch_add_statement;
batch_class->execute = tracker_bus_batch_execute;
batch_class->execute_async = tracker_bus_batch_execute_async;
batch_class->execute_finish = tracker_bus_batch_execute_finish;
}
static void
+clear_hashtable (GHashTable *hashtable)
+{
+ g_clear_pointer (&hashtable, g_hash_table_unref);
+}
+
+static void
tracker_bus_batch_init (TrackerBusBatch *batch)
{
batch->updates = g_ptr_array_new ();
g_ptr_array_set_free_func (batch->updates, g_free);
+ batch->parameters = g_ptr_array_new ();
+ g_ptr_array_set_free_func (batch->parameters, (GDestroyNotify) clear_hashtable);
}
TrackerBatch *