diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2022-12-03 23:37:38 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2022-12-24 01:14:41 +0100 |
commit | 5934d11c78581b454e88122fce0ac2befead5eaf (patch) | |
tree | 12e5c19138ca783ac0e0ed7a49ab7e593e6220e7 /src/libtracker-sparql | |
parent | 7dbda80a20f403d96971e3aaf89db7e8203b97fc (diff) | |
download | tracker-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.c | 77 |
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 * |