diff options
author | Sam Thursfield <sam@afuera.me.uk> | 2019-10-05 12:36:17 +0200 |
---|---|---|
committer | Sam Thursfield <sam@afuera.me.uk> | 2019-10-05 12:36:17 +0200 |
commit | e8ed9fd47cf074420dc613793ccc48934b0e69d2 (patch) | |
tree | 1ec6c022e893803240ae706fe25234eb59a5db79 | |
parent | 95aa2646eecaf50f04ba0e14999d4f8a3868d091 (diff) | |
parent | db511c4f82cd51007b38196d5fe1893f146b813d (diff) | |
download | tracker-e8ed9fd47cf074420dc613793ccc48934b0e69d2.tar.gz |
Merge branch 'sam/2.3-tracker-resource-delete-nested-resources' into tracker-2.3
See https://gitlab.gnome.org/GNOME/tracker/merge_requests/153
-rw-r--r-- | src/libtracker-sparql/tracker-resource.c | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/src/libtracker-sparql/tracker-resource.c b/src/libtracker-sparql/tracker-resource.c index 059289b78..87b9c692d 100644 --- a/src/libtracker-sparql/tracker-resource.c +++ b/src/libtracker-sparql/tracker-resource.c @@ -961,6 +961,13 @@ tracker_resource_compare (TrackerResource *a, return strcmp (a_priv->identifier, b_priv->identifier); }; +/* Internal helper. */ +static GList * +g_list_find_resource (GList *list, + TrackerResource *resource) { + return g_list_find_custom (list, resource, (GCompareFunc) tracker_resource_compare); +} + /* Helper function for serialization code. This allows you to selectively * populate 'interned_namespaces' from 'all_namespaces' based on when a @@ -1039,7 +1046,7 @@ generate_nested_turtle_resource (TrackerResource *resource, data->all_namespaces)) return; - if (g_list_find_custom (data->done_list, resource, (GCompareFunc) tracker_resource_compare) == NULL) { + if (g_list_find_resource (data->done_list, resource) == NULL) { data->done_list = g_list_prepend (data->done_list, resource); generate_turtle (resource, data); g_string_append (data->string, "\n"); @@ -1308,13 +1315,23 @@ generate_sparql_relation_deletes_foreach (gpointer key, { const GValue *value = value_ptr; GenerateSparqlData *data = user_data; + int i; if (G_VALUE_HOLDS (value, TRACKER_TYPE_RESOURCE)) { TrackerResource *relation = g_value_get_object (value); - if (g_list_find_custom (data->done_list, relation, (GCompareFunc) tracker_resource_compare) == NULL) { - data->done_list = g_list_prepend (data->done_list, relation); - generate_sparql_deletes (relation, data); + generate_sparql_deletes (relation, data); + } else if (G_VALUE_HOLDS (value, G_TYPE_PTR_ARRAY)) { + GPtrArray *array = g_value_get_boxed (value); + + for (i = 0; i < array->len; i ++) { + GValue *value = g_ptr_array_index (array, i); + + if (G_VALUE_HOLDS (value, TRACKER_TYPE_RESOURCE)) { + TrackerResource *relation = g_value_get_object (value); + + generate_sparql_deletes (relation, data); + } } } } @@ -1335,10 +1352,7 @@ generate_sparql_relation_inserts_foreach (gpointer key, data->namespaces)) return; - if (g_list_find_custom (data->done_list, relation, (GCompareFunc) tracker_resource_compare) == NULL) { - data->done_list = g_list_prepend (data->done_list, relation); - generate_sparql_insert_pattern (relation, data); - } + generate_sparql_insert_pattern (relation, data); } else if (G_VALUE_HOLDS (value, G_TYPE_PTR_ARRAY)) { GPtrArray *array = g_value_get_boxed (value); const GValue *array_value; @@ -1358,11 +1372,6 @@ generate_sparql_relation_inserts_foreach (gpointer key, data->namespaces)) continue; - if (g_list_find_custom (data->done_list, relation, - (GCompareFunc) tracker_resource_compare) != NULL) - continue; - - data->done_list = g_list_prepend (data->done_list, relation); generate_sparql_insert_pattern (relation, data); } } @@ -1419,6 +1428,12 @@ generate_sparql_deletes (TrackerResource *resource, { TrackerResourcePrivate *priv = GET_PRIVATE (resource); + if (g_list_find_resource (data->done_list, resource) != NULL) + /* We already processed this resource. */ + return; + + data->done_list = g_list_prepend (data->done_list, resource); + if (! is_blank_node (priv->identifier) && g_hash_table_size (priv->overwrite) > 0) { generate_sparql_delete_queries (resource, priv->overwrite, data); } @@ -1438,6 +1453,12 @@ generate_sparql_insert_pattern (TrackerResource *resource, const GValue *value; gboolean had_property = FALSE; + if (g_list_find_resource (data->done_list, resource) != NULL) + /* We already processed this resource. */ + return; + + data->done_list = g_list_prepend (data->done_list, resource); + /* First, emit any sub-resources. */ g_hash_table_foreach (priv->properties, generate_sparql_relation_inserts_foreach, data); @@ -1520,7 +1541,7 @@ tracker_resource_print_sparql_update (TrackerResource *resource, /* Resources can be recursive, and may have repeated or even cyclic * relationships. This list keeps track of what we already processed. */ - context.done_list = g_list_prepend (NULL, resource); + context.done_list = NULL; /* Delete the existing data. If we don't do this, we may get constraint * violations due to trying to add a second value to a single-valued @@ -1529,7 +1550,7 @@ tracker_resource_print_sparql_update (TrackerResource *resource, generate_sparql_deletes (resource, &context); g_list_free (context.done_list); - context.done_list = g_list_prepend (NULL, resource); + context.done_list = NULL; /* Finally insert the data */ g_string_append (context.string, "INSERT DATA {\n"); @@ -1589,7 +1610,7 @@ generate_jsonld_value (const GValue *value, resource = TRACKER_RESOURCE (g_value_get_object (value)); - if (g_list_find_custom (data->done_list, resource, (GCompareFunc) tracker_resource_compare) == NULL) { + if (g_list_find_resource (data->done_list, resource) == NULL) { data->done_list = g_list_prepend (data->done_list, resource); json_builder_begin_object (data->builder); |