From b849ebbd37202c82e5a94353f5e0e0008236e1b2 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Sun, 22 Jan 2023 17:31:43 +0100 Subject: core: Add TrackerDBManager::integrity-check signal We will want to handle integrity in a way that is dependent of database structure and other things handled by the upper layers, in fact we already do. Add a TrackerDBManager::integrity-check signal, that TrackerDataManager connects to, and move the basic database structure check there. --- src/libtracker-sparql/core/tracker-data-manager.c | 31 +++++++++++++++++++++++ src/libtracker-sparql/core/tracker-db-manager.c | 26 +++++++++---------- 2 files changed, 44 insertions(+), 13 deletions(-) (limited to 'src/libtracker-sparql') diff --git a/src/libtracker-sparql/core/tracker-data-manager.c b/src/libtracker-sparql/core/tracker-data-manager.c index 8eca3d8d9..daa8dfffb 100644 --- a/src/libtracker-sparql/core/tracker-data-manager.c +++ b/src/libtracker-sparql/core/tracker-data-manager.c @@ -4159,6 +4159,35 @@ update_interface_cb (TrackerDBManager *db_manager, } } +static gboolean +integrity_check_cb (TrackerDBManager *db_manager, + TrackerDBInterface *iface, + TrackerDataManager *data_manager) +{ + GError *internal_error = NULL; + TrackerDBStatement *stmt; + + /* Ensure that database has been initialized earlier + * by checking whether Resource table exists. + */ + stmt = tracker_db_interface_create_statement (iface, + TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, + &internal_error, + "SELECT 1 FROM Resource"); + if (!stmt) { + if (internal_error) { + g_message ("Corrupt database: failed to create resource check statement: %s", internal_error->message); + } + + g_clear_error (&internal_error); + return TRUE; + } + + g_clear_object (&stmt); + + return FALSE; +} + static gboolean tracker_data_manager_update_from_version (TrackerDataManager *manager, TrackerDBVersion version, @@ -4276,6 +4305,8 @@ tracker_data_manager_initable_init (GInitable *initable, G_CALLBACK (setup_interface_cb), manager); g_signal_connect (manager->db_manager, "update-interface", G_CALLBACK (update_interface_cb), manager); + g_signal_connect (manager->db_manager, "integrity-check", + G_CALLBACK (integrity_check_cb), manager); tracker_data_manager_update_status (manager, "Initializing data manager"); diff --git a/src/libtracker-sparql/core/tracker-db-manager.c b/src/libtracker-sparql/core/tracker-db-manager.c index 71a378e52..cb4318727 100644 --- a/src/libtracker-sparql/core/tracker-db-manager.c +++ b/src/libtracker-sparql/core/tracker-db-manager.c @@ -96,6 +96,7 @@ struct _TrackerDBManager { enum { SETUP_INTERFACE, UPDATE_INTERFACE, + INTEGRITY_CHECK, N_SIGNALS }; @@ -448,6 +449,7 @@ db_check_integrity (TrackerDBManager *db_manager) GError *internal_error = NULL; TrackerDBStatement *stmt; TrackerDBCursor *cursor = NULL; + gboolean handled = FALSE; stmt = tracker_db_interface_create_statement (db_manager->db.iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &internal_error, @@ -478,21 +480,11 @@ db_check_integrity (TrackerDBManager *db_manager) g_object_unref (cursor); } - /* ensure that database has been initialized by an earlier tracker-store start - by checking whether Resource table exists */ - stmt = tracker_db_interface_create_statement (db_manager->db.iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, - &internal_error, - "SELECT 1 FROM Resource"); - if (!stmt) { - if (internal_error) { - g_message ("Corrupt database: failed to create resource check statement: %s", internal_error->message); - } + g_signal_emit (db_manager, signals[INTEGRITY_CHECK], 0, db_manager->db.iface, &handled); - g_clear_error (&internal_error); + /* Someone raised an error */ + if (handled) return FALSE; - } - - g_object_unref (stmt); return TRUE; } @@ -909,6 +901,14 @@ tracker_db_manager_class_init (TrackerDBManagerClass *klass) g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, TRACKER_TYPE_DB_INTERFACE); + signals[INTEGRITY_CHECK] = + g_signal_new ("integrity-check", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, 0, + g_signal_accumulator_true_handled, + NULL, NULL, + G_TYPE_BOOLEAN, + 1, TRACKER_TYPE_DB_INTERFACE); } static TrackerDBInterface * -- cgit v1.2.1