diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt index 2657332a86..76fb0bcb2d 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/GroupTableTest.kt @@ -7,7 +7,7 @@ import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Rule import org.junit.Test -import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.signal.core.util.readToList import org.signal.core.util.requireLong import org.signal.core.util.withinTransaction @@ -33,8 +33,8 @@ class GroupTableTest { fun setUp() { groupTable = SignalDatabase.groups - groupTable.writableDatabase.delete(GroupTable.TABLE_NAME).run() - groupTable.writableDatabase.delete(GroupTable.MembershipTable.TABLE_NAME).run() + groupTable.writableDatabase.deleteAll(GroupTable.TABLE_NAME) + groupTable.writableDatabase.deleteAll(GroupTable.MembershipTable.TABLE_NAME) } @Test diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/LogDatabaseTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/LogDatabaseTest.kt index 12bcf4dcd5..b9ddb53c47 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/LogDatabaseTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/LogDatabaseTest.kt @@ -10,7 +10,7 @@ import org.signal.core.util.forEach import org.signal.core.util.requireLong import org.signal.core.util.requireNonNullString import org.signal.core.util.select -import org.signal.core.util.update +import org.signal.core.util.updateAll import org.thoughtcrime.securesms.crash.CrashConfig import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.testing.assertIs @@ -220,7 +220,7 @@ class LogDatabaseTest { ) db.writableDatabase - .update(LogDatabase.CrashTable.TABLE_NAME) + .updateAll(LogDatabase.CrashTable.TABLE_NAME) .values(LogDatabase.CrashTable.LAST_PROMPTED_AT to currentTime) .run() diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalDatabaseRule.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalDatabaseRule.kt index 4adebe0b15..a3a0794545 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalDatabaseRule.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalDatabaseRule.kt @@ -2,7 +2,9 @@ package org.thoughtcrime.securesms.testing import org.junit.rules.TestWatcher import org.junit.runner.Description +import org.signal.core.util.deleteAll import org.thoughtcrime.securesms.database.SignalDatabase +import org.thoughtcrime.securesms.database.ThreadTable import org.thoughtcrime.securesms.keyvalue.SignalStore import org.whispersystems.signalservice.api.push.ServiceId.ACI import org.whispersystems.signalservice.api.push.ServiceId.PNI @@ -34,7 +36,8 @@ class SignalDatabaseRule( private fun deleteAllThreads() { if (deleteAllThreadsOnEachRun) { - SignalDatabase.threads.clearForTests() + SignalDatabase.threads.deleteAllConversations() + SignalDatabase.rawDatabase.deleteAll(ThreadTable.TABLE_NAME) } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/AttachmentTableBackupExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/AttachmentTableBackupExtensions.kt index 08934ef9c5..79986f7c1f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/AttachmentTableBackupExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/AttachmentTableBackupExtensions.kt @@ -5,9 +5,9 @@ package org.thoughtcrime.securesms.backup.v2.database -import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.thoughtcrime.securesms.database.AttachmentTable fun AttachmentTable.clearAllDataForBackupRestore() { - writableDatabase.delete(AttachmentTable.TABLE_NAME).run() + writableDatabase.deleteAll(AttachmentTable.TABLE_NAME) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/DistributionListTablesBackupExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/DistributionListTablesBackupExtensions.kt index d8e1001d22..919251b0bc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/DistributionListTablesBackupExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/DistributionListTablesBackupExtensions.kt @@ -7,7 +7,7 @@ package org.thoughtcrime.securesms.backup.v2.database import okio.ByteString.Companion.toByteString import org.signal.core.util.CursorUtil -import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.signal.core.util.logging.Log import org.signal.core.util.readToList import org.signal.core.util.requireLong @@ -88,12 +88,10 @@ fun DistributionListTables.restoreFromBackup(dlist: BackupDistributionList, back fun DistributionListTables.clearAllDataForBackupRestore() { writableDatabase - .delete(DistributionListTables.ListTable.TABLE_NAME) - .run() + .deleteAll(DistributionListTables.ListTable.TABLE_NAME) writableDatabase - .delete(DistributionListTables.MembershipTable.TABLE_NAME) - .run() + .deleteAll(DistributionListTables.MembershipTable.TABLE_NAME) } private fun DistributionListPrivacyMode.toBackupPrivacyMode(): BackupDistributionList.PrivacyMode { diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/RecipientTableBackupExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/RecipientTableBackupExtensions.kt index e6ac7e8348..c669acb1e3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/RecipientTableBackupExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/RecipientTableBackupExtensions.kt @@ -10,7 +10,7 @@ import android.database.Cursor import okio.ByteString.Companion.toByteString import org.signal.core.util.Base64 import org.signal.core.util.SqlUtil -import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.signal.core.util.logging.Log import org.signal.core.util.nullIfBlank import org.signal.core.util.requireBoolean @@ -155,7 +155,7 @@ fun RecipientTable.restoreSelfFromBackup(accountData: AccountData, selfId: Recip } fun RecipientTable.clearAllDataForBackupRestore() { - writableDatabase.delete(RecipientTable.TABLE_NAME).run() + writableDatabase.deleteAll(RecipientTable.TABLE_NAME) SqlUtil.resetAutoIncrementValue(writableDatabase, RecipientTable.TABLE_NAME) RecipientId.clearCache() diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberRepository.kt index 4e4b36313c..e2d9741ccc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberRepository.kt @@ -216,7 +216,7 @@ class ChangeNumberRepository( @WorkerThread fun changeLocalNumber(e164: String, pni: PNI): Single { val oldStorageId: ByteArray? = Recipient.self().storageServiceId - SignalDatabase.recipients.updateSelfPhone(e164, pni) + SignalDatabase.recipients.updateSelfE164(e164, pni) val newStorageId: ByteArray? = Recipient.self().storageServiceId if (e164 != SignalStore.account().requireE164() && MessageDigest.isEqual(oldStorageId, newStorageId)) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt index d6eaf3d66f..bfd9df5a2f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt @@ -39,6 +39,7 @@ import org.signal.core.util.SqlUtil.buildSingleCollectionQuery import org.signal.core.util.StreamUtil import org.signal.core.util.ThreadUtil import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.signal.core.util.exists import org.signal.core.util.forEach import org.signal.core.util.groupBy @@ -475,9 +476,7 @@ class AttachmentTable( fun deleteAllAttachments() { Log.d(TAG, "[deleteAllAttachments]") - writableDatabase - .delete(TABLE_NAME) - .run() + writableDatabase.deleteAll(TABLE_NAME) FileUtils.deleteDirectoryContents(context.getDir(DIRECTORY, Context.MODE_PRIVATE)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt index 4cb5afb476..6b0e9d30e2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/CallTable.kt @@ -8,6 +8,7 @@ import org.signal.core.util.IntSerializer import org.signal.core.util.Serializer import org.signal.core.util.SqlUtil import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.signal.core.util.flatten import org.signal.core.util.insertInto import org.signal.core.util.logging.Log @@ -1014,9 +1015,7 @@ class CallTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTabl @Discouraged("Using this method is generally considered an error. Utilize other deletion methods instead of this.") fun deleteAllCalls() { Log.w(TAG, "Deleting all calls from the local database.") - writableDatabase - .delete(TABLE_NAME) - .run() + writableDatabase.deleteAll(TABLE_NAME) } private fun getCallSelectionQuery(callId: Long, recipientId: RecipientId): SqlUtil.Query { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/CdsTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/CdsTable.kt index f9fb2ce078..c58c6d99ce 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/CdsTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/CdsTable.kt @@ -5,6 +5,7 @@ import android.content.Context import androidx.core.content.contentValuesOf import org.signal.core.util.SqlUtil import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.signal.core.util.logging.Log import org.signal.core.util.requireNonNullString import org.signal.core.util.select @@ -106,8 +107,6 @@ class CdsTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable * Wipes the entire table. */ fun clearAll() { - writableDatabase - .delete(TABLE_NAME) - .run() + writableDatabase.deleteAll(TABLE_NAME) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/DraftTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/DraftTable.kt index 803df48d4b..167e9361e5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/DraftTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/DraftTable.kt @@ -5,6 +5,7 @@ import android.net.Uri import androidx.core.content.contentValuesOf import org.signal.core.util.SqlUtil import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.signal.core.util.logging.Log import org.signal.core.util.readToList import org.signal.core.util.requireNonNullString @@ -71,9 +72,7 @@ class DraftTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT } fun clearAllDrafts() { - writableDatabase - .delete(TABLE_NAME) - .run() + writableDatabase.deleteAll(TABLE_NAME) } fun getDrafts(threadId: Long): Drafts { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptTable.kt index ee1bf1fa09..4603c6b245 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupReceiptTable.kt @@ -6,6 +6,7 @@ import android.database.Cursor import androidx.core.content.contentValuesOf import org.signal.core.util.SqlUtil import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.signal.core.util.forEach import org.signal.core.util.readToList import org.signal.core.util.requireBoolean @@ -172,7 +173,7 @@ class GroupReceiptTable(context: Context?, databaseHelper: SignalDatabase?) : Da } fun deleteAllRows() { - writableDatabase.delete(TABLE_NAME).run() + writableDatabase.deleteAll(TABLE_NAME) } override fun remapRecipient(fromId: RecipientId, toId: RecipientId) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.kt index 1eca5b4df6..1b1cb03462 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/JobDatabase.kt @@ -21,6 +21,7 @@ import org.signal.core.util.requireNonNullString import org.signal.core.util.requireString import org.signal.core.util.select import org.signal.core.util.update +import org.signal.core.util.updateAll import org.signal.core.util.withinTransaction import org.thoughtcrime.securesms.crypto.DatabaseSecret import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider @@ -235,7 +236,7 @@ class JobDatabase( @Synchronized fun updateAllJobsToBePending() { writableDatabase - .update(Jobs.TABLE_NAME) + .updateAll(Jobs.TABLE_NAME) .values(Jobs.IS_RUNNING to 0) .run() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/LogDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/LogDatabase.kt index 7dbd016e61..ea69387bd7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/LogDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/LogDatabase.kt @@ -9,6 +9,7 @@ import org.signal.core.util.CursorUtil import org.signal.core.util.SqlUtil import org.signal.core.util.Stopwatch import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.signal.core.util.exists import org.signal.core.util.getTableRowCount import org.signal.core.util.insertInto @@ -268,9 +269,7 @@ class LogDatabase private constructor( } fun clearAll() { - writableDatabase - .delete(TABLE_NAME) - .run() + writableDatabase.deleteAll(TABLE_NAME) } private fun getSize(query: String?, args: Array?): Long { @@ -403,9 +402,7 @@ class LogDatabase private constructor( } fun clear() { - writableDatabase - .delete(TABLE_NAME) - .run() + writableDatabase.deleteAll(TABLE_NAME) } private fun CrashConfig.CrashPattern.asLikeQuery(): Pair> { @@ -494,9 +491,7 @@ class LogDatabase private constructor( } fun clear() { - writableDatabase - .delete(TABLE_NAME) - .run() + writableDatabase.deleteAll(TABLE_NAME) } data class AnrRecord( diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt index 067a40ec3c..42ff7b28a6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -40,6 +40,7 @@ import org.signal.core.util.SqlUtil.getNextAutoIncrementId import org.signal.core.util.Stopwatch import org.signal.core.util.count import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.signal.core.util.exists import org.signal.core.util.forEach import org.signal.core.util.insertInto @@ -3390,7 +3391,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat attachments.deleteAllAttachments() groupReceipts.deleteAllRows() mentions.deleteAllMentions() - writableDatabase.delete(TABLE_NAME).run() + writableDatabase.deleteAll(TABLE_NAME) calls.updateCallEventDeletionTimestamps() OptimizeMessageSearchIndexJob.enqueue() diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/PendingPniSignatureMessageTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/PendingPniSignatureMessageTable.kt index 080dfc8f08..dcd9c74ab2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/PendingPniSignatureMessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/PendingPniSignatureMessageTable.kt @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.database import android.content.Context import androidx.core.content.contentValuesOf import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.signal.core.util.exists import org.signal.core.util.logging.Log import org.signal.core.util.update @@ -117,7 +118,7 @@ class PendingPniSignatureMessageTable(context: Context, databaseHelper: SignalDa * Deletes all record of pending PNI verification messages. Should only be called after the user changes their number. */ fun deleteAll() { - writableDatabase.delete(TABLE_NAME).run() + writableDatabase.deleteAll(TABLE_NAME) } override fun remapRecipient(oldId: RecipientId, newId: RecipientId) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt index 2e68304b9e..1591c9e8d1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt @@ -33,6 +33,7 @@ import org.signal.core.util.requireNonNullString import org.signal.core.util.requireString import org.signal.core.util.select import org.signal.core.util.update +import org.signal.core.util.updateAll import org.signal.core.util.withinTransaction import org.signal.libsignal.protocol.IdentityKey import org.signal.libsignal.protocol.InvalidKeyException @@ -2011,7 +2012,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da /** * Does *not* handle clearing the recipient cache. It is assumed the caller handles this. */ - fun updateSelfPhone(e164: String, pni: PNI) { + fun updateSelfE164(e164: String, pni: PNI) { val db = writableDatabase db.beginTransaction() @@ -2022,11 +2023,10 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da if (id == newId) { Log.i(TAG, "[updateSelfPhone] Phone updated for self") } else { - throw AssertionError("[updateSelfPhone] Self recipient id changed when updating phone. old: $id new: $newId") + throw AssertionError("[updateSelfPhone] Self recipient id changed when updating e164. old: $id new: $newId") } - db - .update(TABLE_NAME) + db.updateAll(TABLE_NAME) .values(NEEDS_PNI_SIGNATURE to 0) .run() diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RemoteMegaphoneTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RemoteMegaphoneTable.kt index 6f9a2f7897..9f38be56af 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RemoteMegaphoneTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RemoteMegaphoneTable.kt @@ -8,7 +8,7 @@ import androidx.core.content.contentValuesOf import androidx.core.net.toUri import org.json.JSONException import org.json.JSONObject -import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.signal.core.util.logging.Log import org.signal.core.util.readToList import org.signal.core.util.requireInt @@ -194,9 +194,7 @@ class RemoteMegaphoneTable(context: Context, databaseHelper: SignalDatabase) : D /** Only call from internal settings */ fun debugRemoveAll() { - writableDatabase - .delete(TABLE_NAME) - .run() + writableDatabase.deleteAll(TABLE_NAME) } private fun RemoteMegaphoneRecord.toContentValues(): ContentValues { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeySharedTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeySharedTable.kt index 2fdc940a97..1aea05b317 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeySharedTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeySharedTable.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.deleteAll import org.signal.core.util.logging.Log import org.signal.core.util.readToSet import org.signal.core.util.requireInt @@ -137,9 +138,7 @@ class SenderKeySharedTable internal constructor(context: Context?, databaseHelpe * Clears all database content. */ fun deleteAll() { - writableDatabase - .delete(TABLE_NAME) - .run() + writableDatabase.deleteAll(TABLE_NAME) } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeyTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeyTable.kt index aadf6026cf..f45310f1e6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeyTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SenderKeyTable.kt @@ -5,6 +5,7 @@ import android.database.Cursor import androidx.core.content.contentValuesOf import org.signal.core.util.CursorUtil import org.signal.core.util.delete +import org.signal.core.util.deleteAll import org.signal.core.util.firstOrNull import org.signal.core.util.logging.Log import org.signal.core.util.requireLong @@ -123,8 +124,6 @@ class SenderKeyTable internal constructor(context: Context?, databaseHelper: Sig * Deletes all database state. */ fun deleteAll() { - writableDatabase - .delete(TABLE_NAME) - .run() + writableDatabase.deleteAll(TABLE_NAME) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt index 0a0dfb89e3..5fd13a7370 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt @@ -6,7 +6,6 @@ import android.content.Context import android.database.Cursor import android.database.MergeCursor import android.net.Uri -import androidx.annotation.VisibleForTesting import androidx.core.content.contentValuesOf import com.fasterxml.jackson.annotation.JsonProperty import org.json.JSONObject @@ -26,6 +25,7 @@ import org.signal.core.util.requireString import org.signal.core.util.select import org.signal.core.util.toInt import org.signal.core.util.update +import org.signal.core.util.updateAll import org.signal.core.util.withinTransaction import org.signal.libsignal.zkgroup.InvalidInputException import org.signal.libsignal.zkgroup.groups.GroupMasterKey @@ -403,7 +403,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa fun setAllThreadsRead(): List { writableDatabase - .update(TABLE_NAME) + .updateAll(TABLE_NAME) .values( READ to ReadStatus.READ.serialize(), UNREAD_COUNT to 0, @@ -1107,14 +1107,6 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa ConversationUtil.clearShortcuts(context, recipientIds) } - @VisibleForTesting - fun clearForTests() { - writableDatabase.withinTransaction { - deleteAllConversations() - it.delete(TABLE_NAME).run() - } - } - @SuppressLint("DiscouragedApi") fun deleteAllConversations() { writableDatabase.withinTransaction { db -> @@ -1294,7 +1286,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa writableDatabase.withinTransaction { db -> applyStorageSyncUpdate(recipientId, record.isNoteToSelfArchived, record.isNoteToSelfForcedUnread) - db.update(TABLE_NAME) + db.updateAll(TABLE_NAME) .values(PINNED to 0) .run() @@ -1664,36 +1656,42 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa } private fun SQLiteDatabase.deactivateThread(query: SqlUtil.Query?) { - val update = update(TABLE_NAME) - .values( - DATE to 0, - MEANINGFUL_MESSAGES to 0, - READ to ReadStatus.READ.serialize(), - TYPE to 0, - ERROR to 0, - SNIPPET to null, - SNIPPET_TYPE to 0, - SNIPPET_URI to null, - SNIPPET_CONTENT_TYPE to null, - SNIPPET_EXTRAS to null, - UNREAD_COUNT to 0, - ARCHIVED to 0, - STATUS to 0, - HAS_DELIVERY_RECEIPT to 0, - HAS_READ_RECEIPT to 0, - EXPIRES_IN to 0, - LAST_SEEN to 0, - HAS_SENT to 0, - LAST_SCROLLED to 0, - PINNED to 0, - UNREAD_SELF_MENTION_COUNT to 0, - ACTIVE to 0 - ) + val contentValues = contentValuesOf( + DATE to 0, + MEANINGFUL_MESSAGES to 0, + READ to ReadStatus.READ.serialize(), + TYPE to 0, + ERROR to 0, + SNIPPET to null, + SNIPPET_TYPE to 0, + SNIPPET_URI to null, + SNIPPET_CONTENT_TYPE to null, + SNIPPET_EXTRAS to null, + UNREAD_COUNT to 0, + ARCHIVED to 0, + STATUS to 0, + HAS_DELIVERY_RECEIPT to 0, + HAS_READ_RECEIPT to 0, + EXPIRES_IN to 0, + LAST_SEEN to 0, + HAS_SENT to 0, + LAST_SCROLLED to 0, + PINNED to 0, + UNREAD_SELF_MENTION_COUNT to 0, + ACTIVE to 0 + ) if (query != null) { - update.where(query.where, query.whereArgs).run() + writableDatabase + .update(TABLE_NAME) + .values(contentValues) + .where(query.where, query.whereArgs) + .run() } else { - update.run() + writableDatabase + .updateAll(TABLE_NAME) + .values(contentValues) + .run() } } diff --git a/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt b/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt index 4d56634a1d..ff2cf42032 100644 --- a/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt +++ b/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt @@ -92,18 +92,31 @@ fun SupportSQLiteDatabase.count(): SelectBuilderPart1 { /** * Begins an UPDATE statement with a helpful builder pattern. + * Requires a WHERE clause as a way of mitigating mistakes. If you'd like to update all items in the table, use [updateAll]. */ fun SupportSQLiteDatabase.update(tableName: String): UpdateBuilderPart1 { return UpdateBuilderPart1(this, tableName) } +fun SupportSQLiteDatabase.updateAll(tableName: String): UpdateAllBuilderPart1 { + return UpdateAllBuilderPart1(this, tableName) +} + /** * Begins a DELETE statement with a helpful builder pattern. + * Requires a WHERE clause as a way of mitigating mistakes. If you'd like to delete all items in the table, use [deleteAll]. */ fun SupportSQLiteDatabase.delete(tableName: String): DeleteBuilderPart1 { return DeleteBuilderPart1(this, tableName) } +/** + * Deletes all data in the table. + */ +fun SupportSQLiteDatabase.deleteAll(tableName: String): Int { + return this.delete(tableName, null, null) +} + fun SupportSQLiteDatabase.insertInto(tableName: String): InsertBuilderPart1 { return InsertBuilderPart1(this, tableName) } @@ -271,16 +284,14 @@ class UpdateBuilderPart2( private val values: ContentValues ) { fun where(@Language("sql") where: String, vararg whereArgs: Any): UpdateBuilderPart3 { + require(where.isNotBlank()) return UpdateBuilderPart3(db, tableName, values, where, SqlUtil.buildArgs(*whereArgs)) } fun where(@Language("sql") where: String, whereArgs: Array): UpdateBuilderPart3 { + require(where.isNotBlank()) return UpdateBuilderPart3(db, tableName, values, where, whereArgs) } - - fun run(conflictStrategy: Int = SQLiteDatabase.CONFLICT_NONE): Int { - return db.update(tableName, conflictStrategy, values, null, arrayOf()) - } } class UpdateBuilderPart3( @@ -296,21 +307,43 @@ class UpdateBuilderPart3( } } +class UpdateAllBuilderPart1( + private val db: SupportSQLiteDatabase, + private val tableName: String +) { + fun values(values: ContentValues): UpdateAllBuilderPart2 { + return UpdateAllBuilderPart2(db, tableName, values) + } + + fun values(vararg values: Pair): UpdateAllBuilderPart2 { + return UpdateAllBuilderPart2(db, tableName, contentValuesOf(*values)) + } +} + +class UpdateAllBuilderPart2( + private val db: SupportSQLiteDatabase, + private val tableName: String, + private val values: ContentValues +) { + @JvmOverloads + fun run(conflictStrategy: Int = SQLiteDatabase.CONFLICT_NONE): Int { + return db.update(tableName, conflictStrategy, values, null, emptyArray()) + } +} + class DeleteBuilderPart1( private val db: SupportSQLiteDatabase, private val tableName: String ) { fun where(@Language("sql") where: String, vararg whereArgs: Any): DeleteBuilderPart2 { + require(where.isNotBlank()) return DeleteBuilderPart2(db, tableName, where, SqlUtil.buildArgs(*whereArgs)) } fun where(@Language("sql") where: String, whereArgs: Array): DeleteBuilderPart2 { + require(where.isNotBlank()) return DeleteBuilderPart2(db, tableName, where, whereArgs) } - - fun run(): Int { - return db.delete(tableName, null, emptyArray()) - } } class DeleteBuilderPart2(