add cache for Addresses and Messages.

make multiple insertion into one transaction.
pull/54/head
ryanzhao 5 years ago
parent f92506b7bb
commit 66d87533d3

@ -50,14 +50,21 @@ import org.whispersystems.libsignal.util.Pair;
import org.whispersystems.libsignal.util.guava.Optional;
import java.io.Closeable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ThreadDatabase extends Database {
private static final String TAG = ThreadDatabase.class.getSimpleName();
private Map<Long, Address> addressCache = new HashMap<>();
private Map<Long, List<ContentValues>> messageCache = new HashMap<>();
private Map<Long, String> recipientCache = new HashMap<>();
public static final String TABLE_NAME = "thread";
public static final String ID = "_id";
public static final String DATE = "date";
@ -150,11 +157,34 @@ public class ThreadDatabase extends Database {
contentValues.put(ARCHIVED, 0);
}
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.update(TABLE_NAME, contentValues, ID + " = ?", new String[] {threadId + ""});
notifyConversationListListeners();
if (!messageCache.containsKey(threadId)) {
messageCache.put(threadId, new ArrayList<>());
}
messageCache.get(threadId).add(contentValues);
if (!recipientCache.containsKey(threadId)) {
recipientCache.put(threadId, getRecipientForThreadId(threadId).getName().replaceAll("\\s*", ""));
}
String key = recipientCache.get(threadId);
int newMessagesNumber = TextSecurePreferences.getNewMessagesNumber(this.context, key);
if (newMessagesNumber == 0 || newMessagesNumber == messageCache.get(threadId).size()) {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.beginTransactionNonExclusive();
try {
for (ContentValues contentValue : messageCache.get(threadId)) {
db.update(TABLE_NAME, contentValue, ID + " = ?", new String[] {threadId + ""});
}
TextSecurePreferences.setNewMessagesNumber(this.context, key, TextSecurePreferences.getNewMessagesNumber(this.context, key) - newMessagesNumber);
messageCache.get(threadId).clear();
db.setTransactionSuccessful();
notifyConversationListListeners();
} finally {
db.endTransaction();
}
}
}
public void updateSnippet(long threadId, String snippet, @Nullable Uri attachment, long date, long type, boolean unarchive) {
ContentValues contentValues = new ContentValues(4);
@ -528,6 +558,13 @@ public class ThreadDatabase extends Database {
}
public @Nullable Recipient getRecipientForThreadId(long threadId) {
// Loki - Cache the address.
// Don't know if this will affect any other signal code
// Don't know if it is necessary to add some cache time
if (addressCache.containsKey(threadId) && addressCache.get(threadId) != null) {
return Recipient.from(context, addressCache.get(threadId), false);
}
SQLiteDatabase db = databaseHelper.getReadableDatabase();
Cursor cursor = null;
@ -536,6 +573,7 @@ public class ThreadDatabase extends Database {
if (cursor != null && cursor.moveToFirst()) {
Address address = Address.fromSerialized(cursor.getString(cursor.getColumnIndexOrThrow(ADDRESS)));
addressCache.put(threadId, address);
return Recipient.from(context, address, false);
}
} finally {

@ -166,6 +166,14 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper {
}
}
@Override
public void onConfigure(SQLiteDatabase db) {
super.onConfigure(db);
//Loki: Enable Write Ahead Logging Mode, increase the cache size
db.enableWriteAheadLogging();
db.execSQL("PRAGMA cache_size = 10000");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i(TAG, "Upgrading database: " + oldVersion + ", " + newVersion);

@ -6,6 +6,7 @@ import org.thoughtcrime.securesms.database.Address
import org.thoughtcrime.securesms.database.Database
import org.thoughtcrime.securesms.database.DatabaseFactory
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
import org.thoughtcrime.securesms.logging.Log
import org.whispersystems.signalservice.loki.messaging.LokiMessageDatabaseProtocol
import org.whispersystems.signalservice.loki.messaging.LokiMessageFriendRequestStatus

@ -246,6 +246,8 @@ class LokiPublicChatPoller(private val context: Context, private val group: Loki
displayNameUpdatees = displayNameUpdatees.union(newDisplayNameUpdatees)
}.successBackground { messages ->
// Process messages in the background
val key = group.displayName.replace(Regex("\\s*"), "")
TextSecurePreferences.setNewMessagesNumber(this.context, key, TextSecurePreferences.getNewMessagesNumber(this.context, key) + messages.size)
messages.forEach { message ->
if (userDevices.contains(message.hexEncodedPublicKey)) {
processOutgoingMessage(message)

@ -185,6 +185,14 @@ public class TextSecurePreferences {
private static final String MEDIA_KEYBOARD_MODE = "pref_media_keyboard_mode";
public static void setNewMessagesNumber(@NonNull Context context, String key, int value) {
setIntegerPrefrence(context, key, value);
}
public static int getNewMessagesNumber(@NonNull Context context, String key) {
return getIntegerPreference(context, key, 0);
}
public static boolean isScreenLockEnabled(@NonNull Context context) {
return getBooleanPreference(context, SCREEN_LOCK, false);
}

Loading…
Cancel
Save