[tracker/wip/carlosg/refcount-in-code: 5/6] libtracker-data: Do not implicitly delete rdf:type relation




commit 4c2246c115e08ca5bde8bee670ec7640b5122da6
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Dec 31 12:08:50 2020 +0100

    libtracker-data: Do not implicitly delete rdf:type relation
    
    Delete this explicitly before deleting the row, we want things explicit
    as we'll be managing refcount in code.
    
    There is also the slight inconsistence that deleting a "rdfs:Resource"
    will have the rdf:type deletion go together with the handling of all
    other rdfs:Resource properties, and then again on each of the subclasses
    being deleted. Ensure this is done in one place, so refcount does not
    get messed up.

 src/libtracker-data/tracker-data-update.c | 28 +++++++++-------------------
 1 file changed, 9 insertions(+), 19 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index 633d5130a..e7e1e19d3 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -868,23 +868,6 @@ tracker_data_resource_buffer_flush (TrackerData                      *data,
                        GString *sql, *values_sql;
 
                        if (table->delete_row) {
-                               /* remove entry from rdf:type table */
-                               stmt = tracker_db_interface_create_vstatement (iface, 
TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error,
-                                                                              "DELETE FROM 
\"%s\".\"rdfs:Resource_rdf:type\" WHERE ID = ? AND \"rdf:type\" = ?",
-                                                                              database);
-
-                               if (stmt) {
-                                       tracker_db_statement_bind_int (stmt, 0, resource->id);
-                                       tracker_db_statement_bind_int (stmt, 1, tracker_class_get_id 
(table->class));
-                                       tracker_db_statement_execute (stmt, &actual_error);
-                                       g_object_unref (stmt);
-                               }
-
-                               if (actual_error) {
-                                       g_propagate_error (error, actual_error);
-                                       return;
-                               }
-
                                /* remove row from class table */
                                stmt = tracker_db_interface_create_vstatement (iface, 
TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error,
                                                                               "DELETE FROM \"%s\".\"%s\" 
WHERE ID = ?",
@@ -1877,6 +1860,7 @@ cache_delete_resource_type_full (TrackerData  *data,
        GError             *error = NULL;
        TrackerOntologies  *ontologies;
        const gchar        *database;
+       GValue gvalue = G_VALUE_INIT;
 
        iface = tracker_data_manager_get_writable_db_interface (data->manager);
        ontologies = tracker_data_manager_get_ontologies (data->manager);
@@ -1963,9 +1947,10 @@ cache_delete_resource_type_full (TrackerData  *data,
 
                prop = properties[p];
 
-               if (tracker_property_get_domain (prop) != class) {
+               if (prop == tracker_ontologies_get_rdf_type (ontologies))
+                       continue;
+               if (tracker_property_get_domain (prop) != class)
                        continue;
-               }
 
                multiple_values = tracker_property_get_multiple_values (prop);
                table_name = tracker_property_get_table_name (prop);
@@ -2003,6 +1988,11 @@ cache_delete_resource_type_full (TrackerData  *data,
                }
        }
 
+       g_value_init (&gvalue, G_TYPE_INT64);
+       g_value_set_int64 (&gvalue, tracker_class_get_id (class));
+       cache_delete_value (data, "rdfs:Resource_rdf:type", "rdf:type",
+                           &gvalue, TRUE);
+
        cache_delete_row (data, class);
 
        tracker_data_dispatch_delete_statement_callbacks (data,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]