From 5f993ed0f750ab3cdf9942c574a656e0a989ddee Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 4 Oct 2019 12:07:46 -0400 Subject: [PATCH] Fix threading issue in RecipientDatabase. --- .../securesms/database/RecipientDatabase.java | 84 +++++++++++-------- 1 file changed, 51 insertions(+), 33 deletions(-) diff --git a/src/org/thoughtcrime/securesms/database/RecipientDatabase.java b/src/org/thoughtcrime/securesms/database/RecipientDatabase.java index 974372303b..7b44001f86 100644 --- a/src/org/thoughtcrime/securesms/database/RecipientDatabase.java +++ b/src/org/thoughtcrime/securesms/database/RecipientDatabase.java @@ -188,18 +188,24 @@ public class RecipientDatabase extends Database { String query = PHONE + " = ?"; String[] args = new String[] { e164 }; - synchronized (this) { - try (Cursor cursor = db.query(TABLE_NAME, ID_PROJECTION, query, args, null, null, null)) { - if (cursor != null && cursor.moveToFirst()) { - return RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(ID))); - } else { - ContentValues values = new ContentValues(); - values.put(PHONE, e164); - long id = db.insertOrThrow(TABLE_NAME, null, values); - if (id < 0) throw new AssertionError("Failed to insert recipient!"); - return RecipientId.from(id); - } + db.beginTransaction(); + + try (Cursor cursor = db.query(TABLE_NAME, ID_PROJECTION, query, args, null, null, null)) { + if (cursor != null && cursor.moveToFirst()) { + db.setTransactionSuccessful(); + return RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(ID))); + } else { + ContentValues values = new ContentValues(); + values.put(PHONE, e164); + + long id = db.insertOrThrow(TABLE_NAME, null, values); + if (id < 0) throw new AssertionError("Failed to insert recipient!"); + + db.setTransactionSuccessful(); + return RecipientId.from(id); } + } finally { + db.endTransaction(); } } @@ -212,18 +218,24 @@ public class RecipientDatabase extends Database { String query = EMAIL + " = ?"; String[] args = new String[] { email }; - synchronized (this) { - try (Cursor cursor = db.query(TABLE_NAME, ID_PROJECTION, query, args, null, null, null)) { - if (cursor != null && cursor.moveToFirst()) { - return RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(ID))); - } else { - ContentValues values = new ContentValues(); - values.put(EMAIL, email); - long id = db.insertOrThrow(TABLE_NAME, null, values); - if (id < 0) throw new AssertionError("Failed to insert recipient!"); - return RecipientId.from(id); - } + db.beginTransaction(); + + try (Cursor cursor = db.query(TABLE_NAME, ID_PROJECTION, query, args, null, null, null)) { + if (cursor != null && cursor.moveToFirst()) { + db.setTransactionSuccessful(); + return RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(ID))); + } else { + ContentValues values = new ContentValues(); + values.put(EMAIL, email); + + long id = db.insertOrThrow(TABLE_NAME, null, values); + if (id < 0) throw new AssertionError("Failed to insert recipient!"); + + db.setTransactionSuccessful(); + return RecipientId.from(id); } + } finally { + db.endTransaction(); } } @@ -236,18 +248,24 @@ public class RecipientDatabase extends Database { String query = GROUP_ID + " = ?"; String[] args = new String[] { groupId }; - synchronized (this) { - try (Cursor cursor = db.query(TABLE_NAME, ID_PROJECTION, query, args, null, null, null)) { - if (cursor != null && cursor.moveToFirst()) { - return RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(ID))); - } else { - ContentValues values = new ContentValues(); - values.put(GROUP_ID, groupId); - long id = db.insertOrThrow(TABLE_NAME, null, values); - if (id < 0) throw new AssertionError("Failed to insert recipient!"); - return RecipientId.from(id); - } + db.beginTransaction(); + + try (Cursor cursor = db.query(TABLE_NAME, ID_PROJECTION, query, args, null, null, null)) { + if (cursor != null && cursor.moveToFirst()) { + db.setTransactionSuccessful(); + return RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(ID))); + } else { + ContentValues values = new ContentValues(); + values.put(GROUP_ID, groupId); + + long id = db.insertOrThrow(TABLE_NAME, null, values); + if (id < 0) throw new AssertionError("Failed to insert recipient!"); + + db.setTransactionSuccessful(); + return RecipientId.from(id); } + } finally { + db.endTransaction(); } }