summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2023-01-22 17:33:37 +0100
committerCarlos Garnacho <carlosg@gnome.org>2023-01-23 15:50:06 +0100
commit69db1874b52587442d29d1a5585540e3f87e8b5f (patch)
treeb2e75917151797e8577a56fa236df319e8d2a26f /src
parentb849ebbd37202c82e5a94353f5e0e0008236e1b2 (diff)
downloadtracker-69db1874b52587442d29d1a5585540e3f87e8b5f.tar.gz
core: Check and repair FTS integrity during integrity check
Extend the integrity check so it covers FTS index integrity in all graph databases. If FTS is still corrupt after rebuild, an error will be indirectly risen.
Diffstat (limited to 'src')
-rw-r--r--src/libtracker-sparql/core/tracker-data-manager.c34
-rw-r--r--src/libtracker-sparql/core/tracker-db-interface-sqlite.c7
-rw-r--r--src/libtracker-sparql/core/tracker-db-interface-sqlite.h3
-rw-r--r--src/libtracker-sparql/core/tracker-fts.c17
-rw-r--r--src/libtracker-sparql/core/tracker-fts.h4
5 files changed, 65 insertions, 0 deletions
diff --git a/src/libtracker-sparql/core/tracker-data-manager.c b/src/libtracker-sparql/core/tracker-data-manager.c
index daa8dfffb..4cd917e2b 100644
--- a/src/libtracker-sparql/core/tracker-data-manager.c
+++ b/src/libtracker-sparql/core/tracker-data-manager.c
@@ -4166,6 +4166,11 @@ integrity_check_cb (TrackerDBManager *db_manager,
{
GError *internal_error = NULL;
TrackerDBStatement *stmt;
+ GHashTableIter iter;
+ const gchar *graph;
+ TrackerProperty **properties;
+ guint len, i;
+ gboolean has_fts = FALSE;
/* Ensure that database has been initialized earlier
* by checking whether Resource table exists.
@@ -4185,6 +4190,35 @@ integrity_check_cb (TrackerDBManager *db_manager,
g_clear_object (&stmt);
+ properties = tracker_ontologies_get_properties (data_manager->ontologies, &len);
+
+ for (i = 0; i < len; i++) {
+ has_fts |= tracker_property_get_fulltext_indexed (properties[i]);
+ if (has_fts)
+ break;
+ }
+
+ if (has_fts) {
+ g_hash_table_iter_init (&iter, data_manager->graphs);
+ while (g_hash_table_iter_next (&iter, (gpointer*) &graph, NULL)) {
+ if (!tracker_db_interface_sqlite_fts_integrity_check (iface, graph)) {
+ tracker_db_interface_sqlite_fts_rebuild_tokens (iface, graph, NULL);
+ if (!tracker_db_interface_sqlite_fts_integrity_check (iface, graph)) {
+ g_message ("Corrupt database: FTS index on graph %s is corrupt", graph);
+ return TRUE;
+ }
+ }
+ }
+
+ if (!tracker_db_interface_sqlite_fts_integrity_check (iface, "main")) {
+ tracker_db_interface_sqlite_fts_rebuild_tokens (iface, "main", NULL);
+ if (!tracker_db_interface_sqlite_fts_integrity_check (iface, "main")) {
+ g_message ("Corrupt database: FTS index on main database is corrupt");
+ return TRUE;
+ }
+ }
+ }
+
return FALSE;
}
diff --git a/src/libtracker-sparql/core/tracker-db-interface-sqlite.c b/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
index 385b59f4f..e4959ce2e 100644
--- a/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
+++ b/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
@@ -2379,6 +2379,13 @@ tracker_db_interface_sqlite_fts_delete_text_stmt (TrackerDBInterface *db_interf
}
gboolean
+tracker_db_interface_sqlite_fts_integrity_check (TrackerDBInterface *interface,
+ const gchar *database)
+{
+ return tracker_fts_integrity_check (interface->db, database, "fts5");
+}
+
+gboolean
tracker_db_interface_sqlite_fts_rebuild_tokens (TrackerDBInterface *interface,
const gchar *database,
GError **error)
diff --git a/src/libtracker-sparql/core/tracker-db-interface-sqlite.h b/src/libtracker-sparql/core/tracker-db-interface-sqlite.h
index 9848df6e9..d1889881a 100644
--- a/src/libtracker-sparql/core/tracker-db-interface-sqlite.h
+++ b/src/libtracker-sparql/core/tracker-db-interface-sqlite.h
@@ -78,6 +78,9 @@ TrackerDBStatement * tracker_db_interface_sqlite_fts_delete_text_stmt (TrackerDB
const gchar **properties,
GError **error);
+gboolean tracker_db_interface_sqlite_fts_integrity_check (TrackerDBInterface *interface,
+ const gchar *database);
+
gboolean tracker_db_interface_sqlite_fts_rebuild_tokens (TrackerDBInterface *interface,
const gchar *database,
GError **error);
diff --git a/src/libtracker-sparql/core/tracker-fts.c b/src/libtracker-sparql/core/tracker-fts.c
index 8b0a9052c..50f4c0e55 100644
--- a/src/libtracker-sparql/core/tracker-fts.c
+++ b/src/libtracker-sparql/core/tracker-fts.c
@@ -264,6 +264,23 @@ error:
}
gboolean
+tracker_fts_integrity_check (sqlite3 *db,
+ const gchar *database,
+ const gchar *table_name)
+{
+ gchar *query;
+ gint rc;
+
+ /* This special query rebuilds the tokens in the given FTS table */
+ query = g_strdup_printf ("INSERT INTO \"%s\".%s(%s, rank) VALUES('integrity-check', 1)",
+ database, table_name, table_name);
+ rc = sqlite3_exec (db, query, NULL, NULL, NULL);
+ g_free (query);
+
+ return rc == SQLITE_OK;
+}
+
+gboolean
tracker_fts_rebuild_tokens (sqlite3 *db,
const gchar *database,
const gchar *table_name,
diff --git a/src/libtracker-sparql/core/tracker-fts.h b/src/libtracker-sparql/core/tracker-fts.h
index 1c3aebbdc..56c157a8f 100644
--- a/src/libtracker-sparql/core/tracker-fts.h
+++ b/src/libtracker-sparql/core/tracker-fts.h
@@ -56,6 +56,10 @@ gboolean tracker_fts_rebuild_tokens (sqlite3 *db,
const gchar *table_name,
GError **error);
+gboolean tracker_fts_integrity_check (sqlite3 *db,
+ const gchar *database,
+ const gchar *table_name);
+
G_END_DECLS
#endif /* __LIBTRACKER_FTS_FTS_H__ */