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



commit b16727dc7d5dd42fc788c7e93dd6dda0d68719d0
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 |   40 ++++++++++++++++++++++-
 src/libtracker-data/tracker-data-update.c  |   48 +++++++++++++++++++++++----
 2 files changed, 80 insertions(+), 8 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index c7bea50..f957fd7 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,16 @@ tracker_data_manager_initable_init (GInitable     *initable,
                tracker_data_manager_init_fts (iface, FALSE);
        }
 
+       if (!read_only) {
+               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 +4387,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..641724a 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 OR IGNORE 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]