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.whispersystems.libsignal.util.Pair;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
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) {
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
db.beginTransaction();
try {
for (RecipientId recipientId : recipientIds) {
ContentValues values = new ContentValues(4);
values.put(MMS_ID, mmsId);
values.put(RECIPIENT_ID, recipientId.serialize());
values.put(STATUS, status);
values.put(TIMESTAMP, timestamp);
List<ContentValues> contentValues = new ArrayList<>(recipientIds.size());
for (RecipientId recipientId : recipientIds) {
ContentValues values = new ContentValues(4);
values.put(MMS_ID, mmsId);
values.put(RECIPIENT_ID, recipientId.serialize());
values.put(STATUS, status);
values.put(TIMESTAMP, timestamp);
contentValues.add(values);
}
db.insert(TABLE_NAME, null, values);
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
List<SqlUtil.Query> statements = SqlUtil.buildBulkInsert(TABLE_NAME, new String[] { MMS_ID, RECIPIENT_ID, STATUS, TIMESTAMP }, contentValues);
for (SqlUtil.Query statement : statements) {
db.execSQL(statement.getWhere(), statement.getWhereArgs());
}
}

Wyświetl plik

@ -750,12 +750,19 @@ public class MmsDatabase extends MessageDatabase {
private void updateMailboxBitmask(long id, long maskOff, long maskOn, Optional<Long> threadId) {
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()) {
DatabaseFactory.getThreadDatabase(context).updateSnippetTypeSilently(threadId.get());
db.beginTransaction();
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();
}
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)) {
DatabaseFactory.getThreadDatabase(context).incrementUnread(threadId, 1);
@ -1530,7 +1537,7 @@ public class MmsDatabase extends MessageDatabase {
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()) {
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).setHasSentSilently(threadId, true);
DatabaseFactory.getThreadDatabase(context).updateLastSeenAndMarkSentAndLastScrolledSilenty(threadId);
ApplicationDependencies.getDatabaseObserver().notifyMessageInsertObservers(threadId, new MessageId(messageId, true));
notifyConversationListListeners();
@ -1585,7 +1591,8 @@ public class MmsDatabase extends MessageDatabase {
@NonNull List<LinkPreview> linkPreviews,
@NonNull List<Mention> mentions,
@NonNull ContentValues contentValues,
@Nullable SmsDatabase.InsertListener insertListener)
@Nullable SmsDatabase.InsertListener insertListener,
boolean updateThread)
throws MmsException
{
SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
@ -1651,8 +1658,10 @@ public class MmsDatabase extends MessageDatabase {
long contentValuesThreadId = contentValues.getAsLong(THREAD_ID);
DatabaseFactory.getThreadDatabase(context).setLastScrolled(contentValuesThreadId, 0);
ThreadUpdateJob.enqueue(contentValuesThreadId);
if (updateThread) {
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;
}
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) {
ContentValues contentValues = new ContentValues(1);
contentValues.put(HAS_SENT, hasSent ? 1 : 0);