summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-12-19 22:55:44 +0100
committerCarlos Garnacho <carlosg@gnome.org>2020-12-31 13:07:29 +0100
commite2f65f38aa0abe458935a02bed7d575c51e35c36 (patch)
tree2ee8fe65ac2a44d463cddac21a7163e48e0da2e1
parentfd9a62d68d43ad65d6d25355b8cbc818322e525b (diff)
downloadtracker-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.c75
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