From 1e4e6b6b41cecec2cf4a1490dee9280b610af655 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 13 Aug 2024 11:30:10 -0400 Subject: [PATCH] Potential fix for missing FTS tables. --- .../securesms/database/SearchTable.kt | 46 ++++++++++++------- .../securesms/database/SignalDatabase.kt | 2 +- .../database/SqlCipherErrorHandler.kt | 2 +- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SearchTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SearchTable.kt index 5eaaa273d6..8932576cdd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SearchTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SearchTable.kt @@ -236,26 +236,40 @@ class SearchTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa * Drops all tables and recreates them. */ @JvmOverloads - fun fullyResetTables(db: SQLiteDatabase = writableDatabase.sqlCipherDatabase) { - Log.w(TAG, "[fullyResetTables] Dropping tables and triggers...") - db.execSQL("DROP TABLE IF EXISTS $FTS_TABLE_NAME") - db.execSQL("DROP TABLE IF EXISTS ${FTS_TABLE_NAME}_config") - db.execSQL("DROP TABLE IF EXISTS ${FTS_TABLE_NAME}_content") - db.execSQL("DROP TABLE IF EXISTS ${FTS_TABLE_NAME}_data") - db.execSQL("DROP TABLE IF EXISTS ${FTS_TABLE_NAME}_idx") - db.execSQL("DROP TRIGGER IF EXISTS $TRIGGER_AFTER_INSERT") - db.execSQL("DROP TRIGGER IF EXISTS $TRIGGER_AFTER_DELETE") - db.execSQL("DROP TRIGGER IF EXISTS $TRIGGER_AFTER_UPDATE") + fun fullyResetTables(db: SQLiteDatabase = writableDatabase.sqlCipherDatabase, useTransaction: Boolean = true) { + if (useTransaction) { + db.beginTransaction() + } - Log.w(TAG, "[fullyResetTables] Recreating table...") - CREATE_TABLE.forEach { db.execSQL(it) } + try { + Log.w(TAG, "[fullyResetTables] Dropping tables and triggers...") + db.execSQL("DROP TABLE IF EXISTS $FTS_TABLE_NAME") + db.execSQL("DROP TABLE IF EXISTS ${FTS_TABLE_NAME}_config") + db.execSQL("DROP TABLE IF EXISTS ${FTS_TABLE_NAME}_content") + db.execSQL("DROP TABLE IF EXISTS ${FTS_TABLE_NAME}_data") + db.execSQL("DROP TABLE IF EXISTS ${FTS_TABLE_NAME}_idx") + db.execSQL("DROP TRIGGER IF EXISTS $TRIGGER_AFTER_INSERT") + db.execSQL("DROP TRIGGER IF EXISTS $TRIGGER_AFTER_DELETE") + db.execSQL("DROP TRIGGER IF EXISTS $TRIGGER_AFTER_UPDATE") - Log.w(TAG, "[fullyResetTables] Recreating triggers...") - CREATE_TRIGGERS.forEach { db.execSQL(it) } + Log.w(TAG, "[fullyResetTables] Recreating table...") + CREATE_TABLE.forEach { db.execSQL(it) } - RebuildMessageSearchIndexJob.enqueue() + Log.w(TAG, "[fullyResetTables] Recreating triggers...") + CREATE_TRIGGERS.forEach { db.execSQL(it) } - Log.w(TAG, "[fullyResetTables] Done. Index will be rebuilt asynchronously)") + RebuildMessageSearchIndexJob.enqueue() + + Log.w(TAG, "[fullyResetTables] Done. Index will be rebuilt asynchronously)") + + if (useTransaction) { + db.setTransactionSuccessful() + } + } finally { + if (useTransaction) { + db.endTransaction() + } + } } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt index 775c5c509b..42d538d99a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SignalDatabase.kt @@ -291,7 +291,7 @@ open class SignalDatabase(private val context: Application, databaseSecret: Data instance!!.messageTable.deleteAbandonedMessages() instance!!.messageTable.trimEntriesForExpiredMessages() instance!!.reactionTable.deleteAbandonedReactions() - instance!!.searchTable.fullyResetTables() + instance!!.searchTable.fullyResetTables(useTransaction = false) instance!!.rawWritableDatabase.execSQL("DROP TABLE IF EXISTS key_value") instance!!.rawWritableDatabase.execSQL("DROP TABLE IF EXISTS megaphone") instance!!.rawWritableDatabase.execSQL("DROP TABLE IF EXISTS job_spec") diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.kt index b82f4b32a3..322a769bee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SqlCipherErrorHandler.kt @@ -171,7 +171,7 @@ class SqlCipherErrorHandler(private val databaseName: String) : DatabaseErrorHan } catch (e: Exception) { Log.w(TAG, "Failed to re-open as read-write!", e) } - SignalDatabase.messageSearch.fullyResetTables(db) + SignalDatabase.messageSearch.fullyResetTables(db, useTransaction = false) } catch (e: Throwable) { Log.w(TAG, "Failed to clear full text search index.", e) }