From 6399a2d8999f7157e9bd336a2941260c28768e88 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 5 Jun 2026 00:35:53 -0400 Subject: [PATCH] Avoid taking a transaction in RemappedRecordTables. --- .../database/RemappedRecordTables.kt | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordTables.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordTables.kt index 4989b2ea11..9d6666db70 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordTables.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordTables.kt @@ -4,6 +4,7 @@ import android.content.Context import android.database.Cursor import androidx.core.content.contentValuesOf import org.signal.core.util.delete +import org.signal.core.util.exists import org.signal.core.util.logging.Log import org.signal.core.util.readToList import org.signal.core.util.requireLong @@ -78,9 +79,20 @@ class RemappedRecordTables internal constructor(context: Context?, databaseHelpe } fun trimStaleMappings() { + val hasStaleRecipients = hasInvalidEntries(Recipients.TABLE_NAME, RecipientTable.TABLE_NAME) + val hasStaleThreads = hasInvalidEntries(Threads.TABLE_NAME, ThreadTable.TABLE_NAME) + + if (!hasStaleRecipients && !hasStaleThreads) { + return + } + writableDatabase.withinTransaction { db -> - trimInvalidRecipientEntries(db) - trimInvalidThreadEntries(db) + if (hasStaleRecipients) { + trimInvalidRecipientEntries(db) + } + if (hasStaleThreads) { + trimInvalidThreadEntries(db) + } } } @@ -116,6 +128,13 @@ class RemappedRecordTables internal constructor(context: Context?, databaseHelpe RemappedRecords.getInstance().resetCache() } + private fun hasInvalidEntries(table: String, sourceTable: String): Boolean { + return readableDatabase + .exists(table) + .where("$OLD_ID IN (SELECT $ID FROM $sourceTable)") + .run() + } + private fun trimInvalidRecipientEntries(db: SQLiteDatabase) { val count = db.delete(Recipients.TABLE_NAME) .where("$OLD_ID IN (SELECT $ID FROM ${RecipientTable.TABLE_NAME})")