From 923016f12c32536f7edf626c2bc08abe45fa7087 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Sun, 10 Mar 2019 21:15:18 -0700 Subject: [PATCH] Fix backup restore crash. Fixes #8011 --- .../securesms/backup/FullBackupImporter.java | 24 ------------------ .../securesms/database/DatabaseFactory.java | 2 +- .../securesms/database/MmsDatabase.java | 25 +++++++++++++++++++ 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/org/thoughtcrime/securesms/backup/FullBackupImporter.java b/src/org/thoughtcrime/securesms/backup/FullBackupImporter.java index a391638558..9fd860c037 100644 --- a/src/org/thoughtcrime/securesms/backup/FullBackupImporter.java +++ b/src/org/thoughtcrime/securesms/backup/FullBackupImporter.java @@ -87,8 +87,6 @@ public class FullBackupImporter extends FullBackupBase { else if (frame.hasAvatar()) processAvatar(context, frame.getAvatar(), inputStream); } - trimEntriesForExpiredMessages(context, db); - db.setTransactionSuccessful(); } finally { db.endTransaction(); @@ -191,28 +189,6 @@ public class FullBackupImporter extends FullBackupBase { } } - private static void trimEntriesForExpiredMessages(@NonNull Context context, @NonNull SQLiteDatabase db) { - String trimmedCondition = " NOT IN (SELECT " + MmsDatabase.ID + " FROM " + MmsDatabase.TABLE_NAME + ")"; - - db.delete(GroupReceiptDatabase.TABLE_NAME, GroupReceiptDatabase.MMS_ID + trimmedCondition, null); - - String[] columns = new String[] { AttachmentDatabase.ROW_ID, AttachmentDatabase.UNIQUE_ID }; - String where = AttachmentDatabase.MMS_ID + trimmedCondition; - - try (Cursor cursor = db.query(AttachmentDatabase.TABLE_NAME, columns, where, null, null, null, null)) { - while (cursor != null && cursor.moveToNext()) { - DatabaseFactory.getAttachmentDatabase(context).deleteAttachment(new AttachmentId(cursor.getLong(0), cursor.getLong(1))); - } - } - - try (Cursor cursor = db.query(ThreadDatabase.TABLE_NAME, new String[] { ThreadDatabase.ID }, ThreadDatabase.EXPIRES_IN + " > 0", null, null, null, null)) { - while (cursor != null && cursor.moveToNext()) { - DatabaseFactory.getThreadDatabase(context).update(cursor.getLong(0), false); - } - } - } - - private static class BackupRecordInputStream extends BackupStream { private final InputStream in; diff --git a/src/org/thoughtcrime/securesms/database/DatabaseFactory.java b/src/org/thoughtcrime/securesms/database/DatabaseFactory.java index eca45f4cea..038832364d 100644 --- a/src/org/thoughtcrime/securesms/database/DatabaseFactory.java +++ b/src/org/thoughtcrime/securesms/database/DatabaseFactory.java @@ -152,6 +152,7 @@ public class DatabaseFactory { public static void upgradeRestored(Context context, SQLiteDatabase database){ getInstance(context).databaseHelper.onUpgrade(database, database.getVersion(), -1); getInstance(context).databaseHelper.markCurrent(database); + getInstance(context).mms.trimEntriesForExpiredMessages(); } private DatabaseFactory(@NonNull Context context) { @@ -205,5 +206,4 @@ public class DatabaseFactory { listener); } } - } diff --git a/src/org/thoughtcrime/securesms/database/MmsDatabase.java b/src/org/thoughtcrime/securesms/database/MmsDatabase.java index af96049f8a..91f79c5e08 100644 --- a/src/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -531,6 +531,31 @@ public class MmsDatabase extends MessagingDatabase { updateMessageBodyAndType(messageId, body, Types.ENCRYPTION_MASK, type); } + /** + * Trims data related to expired messages. Only intended to be run after a backup restore. + */ + void trimEntriesForExpiredMessages() { + SQLiteDatabase database = databaseHelper.getWritableDatabase(); + String trimmedCondition = " NOT IN (SELECT " + MmsDatabase.ID + " FROM " + MmsDatabase.TABLE_NAME + ")"; + + database.delete(GroupReceiptDatabase.TABLE_NAME, GroupReceiptDatabase.MMS_ID + trimmedCondition, null); + + String[] columns = new String[] { AttachmentDatabase.ROW_ID, AttachmentDatabase.UNIQUE_ID }; + String where = AttachmentDatabase.MMS_ID + trimmedCondition; + + try (Cursor cursor = database.query(AttachmentDatabase.TABLE_NAME, columns, where, null, null, null, null)) { + while (cursor != null && cursor.moveToNext()) { + DatabaseFactory.getAttachmentDatabase(context).deleteAttachment(new AttachmentId(cursor.getLong(0), cursor.getLong(1))); + } + } + + try (Cursor cursor = database.query(ThreadDatabase.TABLE_NAME, new String[] { ThreadDatabase.ID }, ThreadDatabase.EXPIRES_IN + " > 0", null, null, null, null)) { + while (cursor != null && cursor.moveToNext()) { + DatabaseFactory.getThreadDatabase(context).update(cursor.getLong(0), false); + } + } + } + private Pair updateMessageBodyAndType(long messageId, String body, long maskOff, long maskOn) { SQLiteDatabase db = databaseHelper.getWritableDatabase(); db.execSQL("UPDATE " + TABLE_NAME + " SET " + BODY + " = ?, " +