Improve MMS database insertion performance.

fork-5.53.8
Greyson Parrelli 2021-09-01 11:35:13 -04:00
rodzic 7447e2497b
commit 0b53ba8950
3 zmienionych plików z 44 dodań i 25 usunięć

Wyświetl plik

@ -12,9 +12,11 @@ import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.SqlUtil; import org.thoughtcrime.securesms.util.SqlUtil;
import org.whispersystems.libsignal.util.Pair; import org.whispersystems.libsignal.util.Pair;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -49,20 +51,19 @@ public class GroupReceiptDatabase extends Database {
public void insert(Collection<RecipientId> recipientIds, long mmsId, int status, long timestamp) { public void insert(Collection<RecipientId> recipientIds, long mmsId, int status, long timestamp) {
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
db.beginTransaction(); List<ContentValues> contentValues = new ArrayList<>(recipientIds.size());
try { for (RecipientId recipientId : recipientIds) {
for (RecipientId recipientId : recipientIds) { ContentValues values = new ContentValues(4);
ContentValues values = new ContentValues(4); values.put(MMS_ID, mmsId);
values.put(MMS_ID, mmsId); values.put(RECIPIENT_ID, recipientId.serialize());
values.put(RECIPIENT_ID, recipientId.serialize()); values.put(STATUS, status);
values.put(STATUS, status); values.put(TIMESTAMP, timestamp);
values.put(TIMESTAMP, timestamp); contentValues.add(values);
}
db.insert(TABLE_NAME, null, values); List<SqlUtil.Query> statements = SqlUtil.buildBulkInsert(TABLE_NAME, new String[] { MMS_ID, RECIPIENT_ID, STATUS, TIMESTAMP }, contentValues);
} for (SqlUtil.Query statement : statements) {
db.setTransactionSuccessful(); db.execSQL(statement.getWhere(), statement.getWhereArgs());
} finally {
db.endTransaction();
} }
} }

Wyświetl plik

@ -750,12 +750,19 @@ public class MmsDatabase extends MessageDatabase {
private void updateMailboxBitmask(long id, long maskOff, long maskOn, Optional<Long> threadId) { private void updateMailboxBitmask(long id, long maskOff, long maskOn, Optional<Long> threadId) {
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
db.execSQL("UPDATE " + TABLE_NAME +
" SET " + MESSAGE_BOX + " = (" + MESSAGE_BOX + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + " )" +
" WHERE " + ID + " = ?", new String[] {id + ""});
if (threadId.isPresent()) { db.beginTransaction();
DatabaseFactory.getThreadDatabase(context).updateSnippetTypeSilently(threadId.get()); try {
db.execSQL("UPDATE " + TABLE_NAME +
" SET " + MESSAGE_BOX + " = (" + MESSAGE_BOX + " & " + (Types.TOTAL_MASK - maskOff) + " | " + maskOn + " )" +
" WHERE " + ID + " = ?", new String[] { id + "" });
if (threadId.isPresent()) {
DatabaseFactory.getThreadDatabase(context).updateSnippetTypeSilently(threadId.get());
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
} }
} }
@ -1344,7 +1351,7 @@ public class MmsDatabase extends MessageDatabase {
return Optional.absent(); return Optional.absent();
} }
long messageId = insertMediaMessage(threadId, retrieved.getBody(), retrieved.getAttachments(), quoteAttachments, retrieved.getSharedContacts(), retrieved.getLinkPreviews(), retrieved.getMentions(), contentValues, null); long messageId = insertMediaMessage(threadId, retrieved.getBody(), retrieved.getAttachments(), quoteAttachments, retrieved.getSharedContacts(), retrieved.getLinkPreviews(), retrieved.getMentions(), contentValues, null, true);
if (!Types.isExpirationTimerUpdate(mailbox)) { if (!Types.isExpirationTimerUpdate(mailbox)) {
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1); DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
@ -1530,7 +1537,7 @@ public class MmsDatabase extends MessageDatabase {
MentionUtil.UpdatedBodyAndMentions updatedBodyAndMentions = MentionUtil.updateBodyAndMentionsWithPlaceholders(message.getBody(), message.getMentions()); MentionUtil.UpdatedBodyAndMentions updatedBodyAndMentions = MentionUtil.updateBodyAndMentionsWithPlaceholders(message.getBody(), message.getMentions());
long messageId = insertMediaMessage(threadId, updatedBodyAndMentions.getBodyAsString(), message.getAttachments(), quoteAttachments, message.getSharedContacts(), message.getLinkPreviews(), updatedBodyAndMentions.getMentions(), contentValues, insertListener); long messageId = insertMediaMessage(threadId, updatedBodyAndMentions.getBodyAsString(), message.getAttachments(), quoteAttachments, message.getSharedContacts(), message.getLinkPreviews(), updatedBodyAndMentions.getMentions(), contentValues, insertListener, false);
if (message.getRecipient().isGroup()) { if (message.getRecipient().isGroup()) {
OutgoingGroupUpdateMessage outgoingGroupUpdateMessage = (message instanceof OutgoingGroupUpdateMessage) ? (OutgoingGroupUpdateMessage) message : null; OutgoingGroupUpdateMessage outgoingGroupUpdateMessage = (message instanceof OutgoingGroupUpdateMessage) ? (OutgoingGroupUpdateMessage) message : null;
@ -1556,8 +1563,7 @@ public class MmsDatabase extends MessageDatabase {
} }
} }
DatabaseFactory.getThreadDatabase(context).setLastSeenSilently(threadId); DatabaseFactory.getThreadDatabase(context).updateLastSeenAndMarkSentAndLastScrolledSilenty(threadId);
DatabaseFactory.getThreadDatabase(context).setHasSentSilently(threadId, true);
ApplicationDependencies.getDatabaseObserver().notifyMessageInsertObservers(threadId, new MessageId(messageId, true)); ApplicationDependencies.getDatabaseObserver().notifyMessageInsertObservers(threadId, new MessageId(messageId, true));
notifyConversationListListeners(); notifyConversationListListeners();
@ -1585,7 +1591,8 @@ public class MmsDatabase extends MessageDatabase {
@NonNull List<LinkPreview> linkPreviews, @NonNull List<LinkPreview> linkPreviews,
@NonNull List<Mention> mentions, @NonNull List<Mention> mentions,
@NonNull ContentValues contentValues, @NonNull ContentValues contentValues,
@Nullable SmsDatabase.InsertListener insertListener) @Nullable SmsDatabase.InsertListener insertListener,
boolean updateThread)
throws MmsException throws MmsException
{ {
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
@ -1651,8 +1658,10 @@ public class MmsDatabase extends MessageDatabase {
long contentValuesThreadId = contentValues.getAsLong(THREAD_ID); long contentValuesThreadId = contentValues.getAsLong(THREAD_ID);
DatabaseFactory.getThreadDatabase(context).setLastScrolled(contentValuesThreadId, 0); if (updateThread) {
ThreadUpdateJob.enqueue(contentValuesThreadId); DatabaseFactory.getThreadDatabase(context).setLastScrolled(contentValuesThreadId, 0);
ThreadUpdateJob.enqueue(contentValuesThreadId);
}
} }
} }

Wyświetl plik

@ -1110,6 +1110,15 @@ public class ThreadDatabase extends Database {
return getThreadIdIfExistsFor(recipientId) > -1; return getThreadIdIfExistsFor(recipientId) > -1;
} }
public void updateLastSeenAndMarkSentAndLastScrolledSilenty(long threadId) {
ContentValues contentValues = new ContentValues(3);
contentValues.put(LAST_SEEN, System.currentTimeMillis());
contentValues.put(HAS_SENT, 1);
contentValues.put(LAST_SCROLLED, 0);
databaseHelper.getSignalWritableDatabase().update(TABLE_NAME, contentValues, ID_WHERE, SqlUtil.buildArgs(threadId));
}
public void setHasSentSilently(long threadId, boolean hasSent) { public void setHasSentSilently(long threadId, boolean hasSent) {
ContentValues contentValues = new ContentValues(1); ContentValues contentValues = new ContentValues(1);
contentValues.put(HAS_SENT, hasSent ? 1 : 0); contentValues.put(HAS_SENT, hasSent ? 1 : 0);