diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2017-07-05 10:45:42 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2017-08-05 21:51:59 +0200 |
commit | 9a60e96bf89ee8ba2646c0f69c959515b4c7ac39 (patch) | |
tree | e5c0b4bdaa59f451527b0e0ac41ec43b08f4bae0 | |
parent | 1561d7c8e3e123119575079e332774d07b0dd9fd (diff) | |
download | tracker-9a60e96bf89ee8ba2646c0f69c959515b4c7ac39.tar.gz |
libtracker-data: Refactor Resource table creation
Instead of creating it just in time for the rdfs:Resource table,
create it in advance so we have a common hook for other essential
tables.
The "Available" column that we add to the main class is kind of
useless, but is preserved so older Tracker versions don't stumble
on a database created with a more modern Tracker.
We are also adding a "Refcount" column to the Resource table, which
will be used in the following commits.
-rw-r--r-- | src/libtracker-data/tracker-data-manager.c | 70 | ||||
-rw-r--r-- | src/libtracker-data/tracker-data-update.c | 4 |
2 files changed, 66 insertions, 8 deletions
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c index 737b2f83f..aa0c12730 100644 --- a/src/libtracker-data/tracker-data-manager.c +++ b/src/libtracker-data/tracker-data-manager.c @@ -2953,12 +2953,8 @@ create_decomposed_metadata_tables (TrackerDataManager *manager, create_sql = g_string_new (""); g_string_append_printf (create_sql, "CREATE TABLE \"%s\" (ID INTEGER NOT NULL PRIMARY KEY", service_name); if (main_class) { - tracker_db_interface_execute_query (iface, &internal_error, "CREATE TABLE Resource (ID INTEGER NOT NULL PRIMARY KEY, Uri TEXT NOT NULL, UNIQUE (Uri))"); - if (internal_error) { - g_propagate_error (error, internal_error); - goto error_out; - } - g_string_append (create_sql, ", Available INTEGER NOT NULL"); + /* FIXME: This column is unneeded */ + g_string_append (create_sql, ", Available INTEGER DEFAULT 1"); } } @@ -3424,6 +3420,63 @@ tracker_data_ontology_import_finished (TrackerDataManager *manager) } } +static gboolean +query_table_exists (TrackerDBInterface *iface, + const gchar *table_name, + GError **error) +{ + TrackerDBCursor *cursor = NULL; + TrackerDBStatement *stmt; + gboolean exists = FALSE; + + stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT, error, + "SELECT 1 FROM sqlite_master WHERE tbl_name=\"%s\" AND type=\"table\"", + table_name); + if (stmt) { + cursor = tracker_db_statement_start_cursor (stmt, error); + g_object_unref (stmt); + } + + if (cursor) { + if (tracker_db_cursor_iter_next (cursor, NULL, error)) { + exists = TRUE; + } + g_object_unref (cursor); + } + + return exists; +} + +static gboolean +create_base_tables (TrackerDataManager *manager, + TrackerDBInterface *iface, + gboolean *altered, + GError **error) +{ + GError *internal_error = NULL; + + if (!query_table_exists (iface, "Resource", &internal_error) && !internal_error) { + tracker_db_interface_execute_query (iface, &internal_error, + "CREATE TABLE Resource (ID INTEGER NOT NULL PRIMARY KEY," + " Uri TEXT NOT NULL, Refcount INTEGER DEFAULT 0, UNIQUE (Uri))"); + } else if (!internal_error) { + tracker_db_interface_execute_query (iface, &internal_error, + "ALTER TABLE Resource ADD COLUMN Refcount INTEGER DEFAULT 0"); + + if (!internal_error) + *altered = TRUE; + else + g_clear_error (&internal_error); + } + + if (internal_error) { + g_propagate_error (error, internal_error); + return FALSE; + } + + return TRUE; +} + static void tracker_data_ontology_import_into_db (TrackerDataManager *manager, gboolean in_update, @@ -3434,12 +3487,17 @@ tracker_data_ontology_import_into_db (TrackerDataManager *manager, TrackerClass **classes; TrackerProperty **properties; guint i, n_props, n_classes; + gboolean base_tables_altered = FALSE; iface = tracker_db_manager_get_writable_db_interface (manager->db_manager); classes = tracker_ontologies_get_classes (manager->ontologies, &n_classes); properties = tracker_ontologies_get_properties (manager->ontologies, &n_props); + if (!create_base_tables (manager, iface, &base_tables_altered, error)) { + return; + } + /* create tables */ for (i = 0; i < n_classes; i++) { GError *internal_error = NULL; diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c index 927aa1e6a..03697ee5b 100644 --- a/src/libtracker-data/tracker-data-update.c +++ b/src/libtracker-data/tracker-data-update.c @@ -917,8 +917,8 @@ tracker_data_resource_buffer_flush (TrackerData *data, g_string_append (sql, "\" (ID"); if (strcmp (table_name, "rdfs:Resource") == 0) { - g_string_append (sql, ", \"tracker:added\", \"tracker:modified\", Available"); - g_string_append (values_sql, ", ?, ?, 1"); + g_string_append (sql, ", \"tracker:added\", \"tracker:modified\""); + g_string_append (values_sql, ", ?, ?"); } else { } } else { |