[tracker/wip/carlosg/resource-leak-fix: 1/5] libtracker-data: Refactor Resource table creation
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/resource-leak-fix: 1/5] libtracker-data: Refactor Resource table creation
- Date: Tue, 11 Jul 2017 23:20:00 +0000 (UTC)
commit bcee39a447d48afdd8f68b7a035c735de0fefcc2
Author: Carlos Garnacho <carlosg gnome org>
Date: Wed Jul 5 10:45:42 2017 +0200
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.
src/libtracker-data/tracker-data-manager.c | 70 +++++++++++++++++++++++++--
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 737b2f8..aa0c127 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 927aa1e..03697ee 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 {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]