summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2017-07-05 11:01:08 +0200
committerCarlos Garnacho <carlosg@gnome.org>2017-08-05 21:52:00 +0200
commitb16727dc7d5dd42fc788c7e93dd6dda0d68719d0 (patch)
tree95267dc4b1e1eb778c6ab87de919702a91345683
parentc4444621d2ac363b2147648985048503c4db6c83 (diff)
downloadtracker-b16727dc7d5dd42fc788c7e93dd6dda0d68719d0.tar.gz
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.
-rw-r--r--src/libtracker-data/tracker-data-manager.c40
-rw-r--r--src/libtracker-data/tracker-data-update.c48
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 c7bea50a0..f957fd784 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 03697ee5b..641724a28 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);
}
}