[tracker/wip/carlosg/resource-leak-fix: 4/5] libtracker-data: Add Graph table
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/resource-leak-fix: 4/5] libtracker-data: Add Graph table
- Date: Tue, 11 Jul 2017 23:20:16 +0000 (UTC)
commit 630cff8589413c2c2684baf06ec41d1d24563b86
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 | 51 ++++++++++++++++++++++++----
2 files changed, 81 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..a68c9de 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -745,6 +745,43 @@ 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 = ensure_resource_id (data, uri, &resource_create);
+
+ if (resource_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);
+ }
+ }
+
+ if (create) {
+ *create = resource_create;
+ }
+
+ return id;
+}
+
static void
statement_bind_gvalue (TrackerDBStatement *stmt,
gint *idx,
@@ -1264,7 +1301,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 +1377,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 +1761,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 +1873,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 +2088,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 +2406,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 +2492,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]