summaryrefslogtreecommitdiff
path: root/src/libtracker-sparql
diff options
context:
space:
mode:
Diffstat (limited to 'src/libtracker-sparql')
-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__ */