summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2023-01-22 17:31:43 +0100
committerCarlos Garnacho <carlosg@gnome.org>2023-01-23 15:50:06 +0100
commitb849ebbd37202c82e5a94353f5e0e0008236e1b2 (patch)
tree66276d1a5661591b80f9278b0eb0b5427a4db6d1 /src
parentbe4c9bdb65b97be1ccc3ffabb9d1b53f8882366e (diff)
downloadtracker-b849ebbd37202c82e5a94353f5e0e0008236e1b2.tar.gz
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.
Diffstat (limited to 'src')
-rw-r--r--src/libtracker-sparql/core/tracker-data-manager.c31
-rw-r--r--src/libtracker-sparql/core/tracker-db-manager.c26
2 files changed, 44 insertions, 13 deletions
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
@@ -4160,6 +4160,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,
GError **error)
@@ -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 *