summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2018-08-27 21:35:58 +0200
committerCarlos Garnacho <carlosg@gnome.org>2018-08-30 00:43:14 +0200
commit053154dc56fcc5c2f46d864de282cb8166cb5b11 (patch)
tree0b52b918d97983dc382f2227e04789bff23f4e06
parent706c0df1329c7aca46dde44b95f961e150cf1e09 (diff)
downloadtracker-wip/carlosg/insert-delete-triggers.tar.gz
libtracker-data: Avoid refcount leaks on ontology updateswip/carlosg/insert-delete-triggers
Make sure we add the new triggers after the "rename table, create replacement one, dump data" dance we do on ontology changes. This will avoid leaks as the last step there would increase refcount for all involved resources. There is only one situation where this does not work: Ontology changes that remove properties with rdfs:Resource range will result in those resources being leaked. This breaks differently but in similar ways for single-valued and multivalued properties, in the first we fail to delete elements from the old table, in the second we fail to delete the table altogether. This barely ever happens, so a FIXME has been added, we should cross this bridge before doing any such modification in the ontology.
-rw-r--r--src/libtracker-data/tracker-data-manager.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index 6dbe664f4..06012b427 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -3373,10 +3373,6 @@ create_decomposed_metadata_tables (TrackerDataManager *manager,
g_debug ("Creating: '%s'", create_sql->str);
tracker_db_interface_execute_query (iface, &internal_error,
"%s", create_sql->str);
-
- if (!internal_error)
- create_table_triggers (manager, iface, service, &internal_error);
-
if (internal_error) {
g_propagate_error (error, internal_error);
goto error_out;
@@ -3488,6 +3484,19 @@ create_decomposed_metadata_tables (TrackerDataManager *manager,
}
}
+ if (!in_update || in_change || tracker_class_get_is_new (service)) {
+ /* FIXME: We are trusting object refcount will stay intact across
+ * ontology changes. One situation where this is not true are
+ * removal or properties with rdfs:Resource range.
+ */
+ create_table_triggers (manager, iface, service, &internal_error);
+
+ if (internal_error) {
+ g_propagate_error (error, internal_error);
+ goto error_out;
+ }
+ }
+
if (copy_schedule) {
guint i;
for (i = 0; i < copy_schedule->len; i++) {