diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2020-12-19 22:55:44 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2020-12-31 13:07:29 +0100 |
commit | e2f65f38aa0abe458935a02bed7d575c51e35c36 (patch) | |
tree | 2ee8fe65ac2a44d463cddac21a7163e48e0da2e1 | |
parent | fd9a62d68d43ad65d6d25355b8cbc818322e525b (diff) | |
download | tracker-e2f65f38aa0abe458935a02bed7d575c51e35c36.tar.gz |
libtracker-data: Propagate TrackerResource deletes to subproperties
This fast path was missing the propagation to superproperties necessary
to be equivalent to the issued SPARQL. Make it sure deleted properties
propagate to superproperties.
-rw-r--r-- | src/libtracker-data/tracker-data-update.c | 75 |
1 files changed, 62 insertions, 13 deletions
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c index 5d5f539e7..2ab0f9ef3 100644 --- a/src/libtracker-data/tracker-data-update.c +++ b/src/libtracker-data/tracker-data-update.c @@ -2189,6 +2189,65 @@ tracker_data_delete_statement (TrackerData *data, } static gboolean +delete_all_helper (TrackerData *data, + const gchar *graph, + const gchar *subject, + TrackerProperty *subproperty, + TrackerProperty *property, + GArray *old_values, + GError **error) +{ + TrackerProperty **super_properties; + GArray *super_old_values; + GValue *value; + gint i; + + if (subproperty == property) { + if (tracker_property_get_multiple_values (property)) { + cache_delete_all_values (data, + tracker_property_get_table_name (property), + tracker_property_get_name (property)); + } else { + cache_delete_value (data, + tracker_property_get_table_name (property), + tracker_property_get_name (property), + &g_array_index (old_values, GValue, 0), + FALSE); + } + } else { + super_old_values = get_old_property_values (data, property, error); + if (!super_old_values) + return FALSE; + + for (i = 0; i < old_values->len; i++) { + value = &g_array_index (old_values, GValue, i); + + if (!value_set_remove_value (super_old_values, value)) + continue; + + cache_delete_value (data, + tracker_property_get_table_name (property), + tracker_property_get_name (property), + value, + tracker_property_get_multiple_values (property)); + } + } + + /* also delete super property values */ + super_properties = tracker_property_get_super_properties (property); + while (*super_properties) { + if (!delete_all_helper (data, graph, subject, + subproperty, *super_properties, + old_values, error)) + return FALSE; + + super_properties++; + } + + return TRUE; +} + +static gboolean tracker_data_delete_all (TrackerData *data, const gchar *graph, const gchar *subject, @@ -2226,19 +2285,9 @@ tracker_data_delete_all (TrackerData *data, return FALSE; } - if (tracker_property_get_multiple_values (property)) { - cache_delete_all_values (data, - tracker_property_get_table_name (property), - tracker_property_get_name (property)); - } else { - cache_delete_value (data, - tracker_property_get_table_name (property), - tracker_property_get_name (property), - &g_array_index (old_values, GValue, 0), - FALSE); - } - - return TRUE; + return delete_all_helper (data, graph, subject, + property, property, + old_values, error); } static gboolean |