[tracker/wip/carlosg/resource-leak-fix: 7/8] libtracker-data: Add Graph table



commit 82df13c5e148a62d9f4833b35c99cbf046d212a6
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Jul 5 11:01:08 2017 +0200

    libtracker-data: Add Graph table
    
    This new table will perform the accounting of those URNs used
    as a graph on SPARQL updates. Those are kind of special in that
    they are not referenced anywhere else, so we couldn't distinguish
    between those and an entirely unused URN.
    
    The creation of this new table has also been made to trigger
    the recreation of all class tables, so the resource refcounting
    changes in the previous commits become effective.

 src/libtracker-data/tracker-data-manager.c |   38 +++++++++++++++++++++-
 src/libtracker-data/tracker-data-update.c  |   48 +++++++++++++++++++++++----
 2 files changed, 78 insertions(+), 8 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index c7bea50..98f732a 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -3590,6 +3590,16 @@ create_base_tables (TrackerDataManager  *manager,
                return FALSE;
        }
 
+       if (!query_table_exists (iface, "Graph", &internal_error) && !internal_error) {
+               tracker_db_interface_execute_query (iface, &internal_error,
+                                                   "CREATE TABLE Graph (ID INTEGER NOT NULL PRIMARY KEY)");
+       }
+
+       if (internal_error) {
+               g_propagate_error (error, internal_error);
+               return FALSE;
+       }
+
        return TRUE;
 }
 
@@ -3620,6 +3630,7 @@ tracker_data_ontology_import_into_db (TrackerDataManager  *manager,
 
                /* Also !is_new classes are processed, they might have new properties */
                create_decomposed_metadata_tables (manager, iface, classes[i], in_update,
+                                                  base_tables_altered ||
                                                   tracker_class_get_db_schema_changed (classes[i]),
                                                   &internal_error);
 
@@ -3997,7 +4008,7 @@ tracker_data_manager_initable_init (GInitable     *initable,
 {
        TrackerDataManager *manager = TRACKER_DATA_MANAGER (initable);
        TrackerDBInterface *iface;
-       gboolean is_first_time_index, check_ontology;
+       gboolean is_first_time_index, check_ontology, has_graph_table;
        TrackerDBCursor *cursor;
        TrackerDBStatement *stmt;
        GHashTable *ontos_table;
@@ -4270,6 +4281,14 @@ tracker_data_manager_initable_init (GInitable     *initable,
                tracker_data_manager_init_fts (iface, FALSE);
        }
 
+       has_graph_table = query_table_exists (iface, "Graph", &internal_error);
+       if (internal_error) {
+               g_propagate_error (error, internal_error);
+               return FALSE;
+       }
+
+       check_ontology |= !has_graph_table;
+
        if (check_ontology) {
                GList *to_reload = NULL;
                GList *ontos = NULL;
@@ -4366,6 +4385,23 @@ tracker_data_manager_initable_init (GInitable     *initable,
                                GError *ontology_error = NULL;
                                gint val = GPOINTER_TO_INT (value);
 
+                               if (!has_graph_table) {
+                                       /* No graph table and no resource triggers,
+                                        * the table must be recreated.
+                                        */
+                                       if (!transaction_started) {
+                                               tracker_data_begin_ontology_transaction 
(manager->data_update, &internal_error);
+                                               if (internal_error) {
+                                                       g_propagate_error (error, internal_error);
+                                                       return FALSE;
+                                               }
+                                               transaction_started = TRUE;
+                                       }
+
+                                       to_reload = g_list_prepend (to_reload, ontology_file);
+                                       continue;
+                               }
+
                                /* When the last-modified in our database isn't the same as the last
                                 * modified in the latest version of the file, deal with changes. */
                                if (val != last_mod) {
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index 03697ee..1a4655a 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -745,6 +745,40 @@ ensure_resource_id (TrackerData *data,
        return id;
 }
 
+static gint
+ensure_graph_id (TrackerData *data,
+                 const gchar *uri,
+                gboolean    *create)
+{
+       TrackerDBInterface *iface;
+       TrackerDBStatement *stmt;
+       GError *error = NULL;
+       gboolean resource_create;
+       gint id;
+
+       id = GPOINTER_TO_INT (g_hash_table_lookup (data->update_buffer.resource_cache, uri));
+       if (id != 0)
+               return id;
+
+       id = ensure_resource_id (data, uri, create);
+       iface = tracker_data_manager_get_writable_db_interface (data->manager);
+       stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &error,
+                                                     "INSERT INTO Graph (ID) VALUES (?)");
+
+       if (stmt) {
+               tracker_db_statement_bind_int (stmt, 0, id);
+               tracker_db_statement_execute (stmt, &error);
+               g_object_unref (stmt);
+       }
+
+       if (error) {
+               g_critical ("Could not ensure graph existence: %s", error->message);
+               g_error_free (error);
+       }
+
+       return id;
+}
+
 static void
 statement_bind_gvalue (TrackerDBStatement *stmt,
                        gint               *idx,
@@ -1264,7 +1298,7 @@ cache_create_service_decomposed (TrackerData  *data,
 
        cache_insert_row (data, cl);
 
-       final_graph_id = (graph != NULL ? ensure_resource_id (data, graph, NULL) : graph_id);
+       final_graph_id = (graph != NULL ? ensure_graph_id (data, graph, NULL) : graph_id);
 
        /* This is the original, no idea why tracker_class_get_id wasn't used here:
         * class_id = ensure_resource_id (tracker_class_get_uri (cl), NULL); */
@@ -1340,7 +1374,7 @@ cache_create_service_decomposed (TrackerData  *data,
                                            tracker_property_get_name (*domain_indexes),
                                            tracker_property_get_transient (*domain_indexes),
                                            &gvalue_copy,
-                                           graph != NULL ? ensure_resource_id (data, graph, NULL) : graph_id,
+                                           graph != NULL ? ensure_graph_id (data, graph, NULL) : graph_id,
                                            tracker_property_get_multiple_values (*domain_indexes),
                                            tracker_property_get_fulltext_indexed (*domain_indexes),
                                            tracker_property_get_data_type (*domain_indexes) == 
TRACKER_PROPERTY_TYPE_DATETIME);
@@ -1724,7 +1758,7 @@ process_domain_indexes (TrackerData     *data,
                                            field_name,
                                            tracker_property_get_transient (property),
                                            &gvalue_copy,
-                                           graph != NULL ? ensure_resource_id (data, graph, NULL) : graph_id,
+                                           graph != NULL ? ensure_graph_id (data, graph, NULL) : graph_id,
                                            FALSE,
                                            tracker_property_get_fulltext_indexed (property),
                                            tracker_property_get_data_type (property) == 
TRACKER_PROPERTY_TYPE_DATETIME);
@@ -1836,7 +1870,7 @@ cache_insert_metadata_decomposed (TrackerData      *data,
                cache_insert_value (data, table_name, field_name,
                                    tracker_property_get_transient (property),
                                    &gvalue,
-                                   graph != NULL ? ensure_resource_id (data, graph, NULL) : graph_id,
+                                   graph != NULL ? ensure_graph_id (data, graph, NULL) : graph_id,
                                    multiple_values,
                                    tracker_property_get_fulltext_indexed (property),
                                    tracker_property_get_data_type (property) == 
TRACKER_PROPERTY_TYPE_DATETIME);
@@ -2051,7 +2085,7 @@ cache_update_metadata_decomposed (TrackerData      *data,
        cache_insert_value (data, table_name, field_name,
                            tracker_property_get_transient (property),
                            &gvalue,
-                           graph != NULL ? ensure_resource_id (data, graph, NULL) : graph_id,
+                           graph != NULL ? ensure_graph_id (data, graph, NULL) : graph_id,
                            multiple_values,
                            tracker_property_get_fulltext_indexed (property),
                            tracker_property_get_data_type (property) == TRACKER_PROPERTY_TYPE_DATETIME);
@@ -2369,7 +2403,7 @@ cache_delete_resource_type_full (TrackerData  *data,
                guint n;
                gint final_graph_id;
 
-               final_graph_id = (graph != NULL ? ensure_resource_id (data, graph, NULL) : graph_id);
+               final_graph_id = (graph != NULL ? ensure_graph_id (data, graph, NULL) : graph_id);
 
                for (n = 0; n < data->delete_callbacks->len; n++) {
                        TrackerStatementDelegate *delegate;
@@ -2455,7 +2489,7 @@ resource_buffer_switch (TrackerData *data,
 
                        /* Ensure the graph gets an ID */
                        if (graph != NULL) {
-                               ensure_resource_id (data, graph, NULL);
+                               ensure_graph_id (data, graph, NULL);
                        }
                }
 


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