From 413d688e4dc671ed048df63d5dcb3772aee1bdf8 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Sun, 12 Jan 2025 22:49:46 +0300 Subject: [PATCH] SQLitePreparedStatementWrapper refactoring --- .../java/org/telegram/SQLite/DbSelector.java | 7 ++++ .../SQLite/SQLiteDatabaseWrapper.java | 39 ++++++++++--------- ...va => SQLitePreparedStatementWrapper.java} | 23 +++++------ .../telegram/messenger/MessagesStorage.java | 35 ++++++++++++----- 4 files changed, 65 insertions(+), 39 deletions(-) create mode 100644 TMessagesProj/src/main/java/org/telegram/SQLite/DbSelector.java rename TMessagesProj/src/main/java/org/telegram/SQLite/{SQLitePreparedStatementMultiple.java => SQLitePreparedStatementWrapper.java} (83%) diff --git a/TMessagesProj/src/main/java/org/telegram/SQLite/DbSelector.java b/TMessagesProj/src/main/java/org/telegram/SQLite/DbSelector.java new file mode 100644 index 000000000..09de63b55 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/SQLite/DbSelector.java @@ -0,0 +1,7 @@ +package org.telegram.SQLite; + +public enum DbSelector { + FILE_DB, + MEMORY_DB, + BOTH_DB +} diff --git a/TMessagesProj/src/main/java/org/telegram/SQLite/SQLiteDatabaseWrapper.java b/TMessagesProj/src/main/java/org/telegram/SQLite/SQLiteDatabaseWrapper.java index 39368acf8..f043fd64f 100644 --- a/TMessagesProj/src/main/java/org/telegram/SQLite/SQLiteDatabaseWrapper.java +++ b/TMessagesProj/src/main/java/org/telegram/SQLite/SQLiteDatabaseWrapper.java @@ -3,9 +3,8 @@ package org.telegram.SQLite; import org.telegram.messenger.partisan.PartisanLog; import java.util.Arrays; -import java.util.Collections; import java.util.HashSet; -import java.util.List; +import java.util.Map; import java.util.Set; public class SQLiteDatabaseWrapper extends SQLiteDatabase { @@ -18,11 +17,6 @@ public class SQLiteDatabaseWrapper extends SQLiteDatabase { private final Set onlyMemoryTables = new HashSet<>(Arrays.asList( "messages_v2", "chats", "contacts", "dialogs", "messages_holes" )); - private enum DbSelector { - FILE_DB, - MEMORY_DB, - BOTH_DB - } private final SQLiteDatabase fileDatabase; private final SQLiteDatabase memoryDatabase; @@ -72,16 +66,16 @@ public class SQLiteDatabaseWrapper extends SQLiteDatabase { void apply(SQLiteDatabase db) throws SQLiteException; } - private List executeFunctionInSpecificDB(String sql, DbFunction function) throws SQLiteException { + private Map executeFunctionInSpecificDB(String sql, DbFunction function) throws SQLiteException { return executeFunctionInSpecificDB(getDbSelectorBySqlQuery(sql), function); } - private List executeFunctionInSpecificDB(DbSelector dbSelector, DbFunction function) throws SQLiteException { + private Map executeFunctionInSpecificDB(DbSelector dbSelector, DbFunction function) throws SQLiteException { switch (dbSelector) { case FILE_DB: - return Collections.singletonList(function.apply(fileDatabase)); + return Map.of(dbSelector, function.apply(fileDatabase)); case MEMORY_DB: - return Collections.singletonList(function.apply(memoryDatabase)); + return Map.of(dbSelector, function.apply(memoryDatabase)); case BOTH_DB: default: R memoryDbResult; @@ -93,7 +87,10 @@ public class SQLiteDatabaseWrapper extends SQLiteDatabase { throw e; } fileDbResult = function.apply(fileDatabase); - return Arrays.asList(memoryDbResult, fileDbResult); + return Map.of( + DbSelector.MEMORY_DB, memoryDbResult, + DbSelector.FILE_DB, fileDbResult + ); } } @@ -106,17 +103,19 @@ public class SQLiteDatabaseWrapper extends SQLiteDatabase { @Override public SQLitePreparedStatement executeFast(String sql) throws SQLiteException { - return new SQLitePreparedStatementMultiple(executeFunctionInSpecificDB(sql, db -> db.executeFast(sql))); + return new SQLitePreparedStatementWrapper(executeFunctionInSpecificDB(sql, db -> db.executeFast(sql))); } - public SQLitePreparedStatementMultiple executeFastForBothDb(String sql) throws SQLiteException { - return new SQLitePreparedStatementMultiple(executeFunctionInSpecificDB(DbSelector.BOTH_DB, db -> db.executeFast(sql))); + public SQLitePreparedStatementWrapper executeFastForBothDb(String sql) throws SQLiteException { + return new SQLitePreparedStatementWrapper(executeFunctionInSpecificDB(DbSelector.BOTH_DB, db -> db.executeFast(sql))); } @Override public Integer executeInt(String sql, Object... args) throws SQLiteException { - List ints = executeFunctionInSpecificDB(sql, db -> db.executeInt(sql, args)); - return ints.get(ints.size() - 1); + Map ints = executeFunctionInSpecificDB(sql, db -> db.executeInt(sql, args)); + return ints.containsKey(DbSelector.FILE_DB) + ? ints.get(DbSelector.FILE_DB) + : ints.get(DbSelector.MEMORY_DB); } @Override @@ -126,8 +125,10 @@ public class SQLiteDatabaseWrapper extends SQLiteDatabase { @Override public SQLiteCursor queryFinalized(String sql, Object... args) throws SQLiteException { - List cursors = executeFunctionInSpecificDB(sql, db -> db.queryFinalized(sql, args)); - return cursors.get(cursors.size() - 1); + Map cursors = executeFunctionInSpecificDB(sql, db -> db.queryFinalized(sql, args)); + return cursors.containsKey(DbSelector.MEMORY_DB) + ? cursors.get(DbSelector.MEMORY_DB) + : cursors.get(DbSelector.FILE_DB); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/SQLite/SQLitePreparedStatementMultiple.java b/TMessagesProj/src/main/java/org/telegram/SQLite/SQLitePreparedStatementWrapper.java similarity index 83% rename from TMessagesProj/src/main/java/org/telegram/SQLite/SQLitePreparedStatementMultiple.java rename to TMessagesProj/src/main/java/org/telegram/SQLite/SQLitePreparedStatementWrapper.java index ce5f2f607..57c00d21c 100644 --- a/TMessagesProj/src/main/java/org/telegram/SQLite/SQLitePreparedStatementMultiple.java +++ b/TMessagesProj/src/main/java/org/telegram/SQLite/SQLitePreparedStatementWrapper.java @@ -3,18 +3,18 @@ package org.telegram.SQLite; import org.telegram.tgnet.NativeByteBuffer; import java.nio.ByteBuffer; -import java.util.List; +import java.util.Map; -public class SQLitePreparedStatementMultiple extends SQLitePreparedStatement { - private final List statements; - private int forceStatementIndex = -1; +public class SQLitePreparedStatementWrapper extends SQLitePreparedStatement { + private final Map statements; + private DbSelector dbSelector = DbSelector.BOTH_DB; - public SQLitePreparedStatementMultiple(List statements) { + public SQLitePreparedStatementWrapper(Map statements) { this.statements = statements; } - public void setForcedStatementIndex(int forceStatementIndex) { - this.forceStatementIndex = forceStatementIndex; + public void setDbSelector(DbSelector dbSelector) { + this.dbSelector = dbSelector; } private interface StatementFunction { @@ -30,12 +30,13 @@ public class SQLitePreparedStatementMultiple extends SQLitePreparedStatement { if (statements.isEmpty()) { throw new RuntimeException(); } - if (forceStatementIndex != -1) { - result = function.apply(statements.get(forceStatementIndex)); - } else { - for (SQLitePreparedStatement statement : statements) { + if (dbSelector == DbSelector.BOTH_DB) { + for (SQLitePreparedStatement statement : statements.values()) { result = function.apply(statement); } + + } else { + result = function.apply(statements.get(dbSelector)); } return result; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java index d78cc299c..baa4a2649 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java @@ -29,12 +29,13 @@ import androidx.annotation.UiThread; import androidx.collection.LongSparseArray; import org.telegram.PhoneFormat.PhoneFormat; +import org.telegram.SQLite.DbSelector; import org.telegram.SQLite.SQLiteCursor; import org.telegram.SQLite.SQLiteDatabase; import org.telegram.SQLite.SQLiteDatabaseWrapper; import org.telegram.SQLite.SQLiteException; import org.telegram.SQLite.SQLitePreparedStatement; -import org.telegram.SQLite.SQLitePreparedStatementMultiple; +import org.telegram.SQLite.SQLitePreparedStatementWrapper; import org.telegram.messenger.fakepasscode.FakePasscodeUtils; import org.telegram.messenger.fakepasscode.results.RemoveChatsResult; import org.telegram.messenger.partisan.PartisanDatabaseMigrationHelper; @@ -4527,7 +4528,9 @@ public class MessagesStorage extends BaseController { state = database.executeFastForBothDb("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?, ?, ?)"); for (int a = 0; a < messages.size(); a++) { TLRPC.Message message = messages.get(a); - ((SQLitePreparedStatementMultiple)state).setForcedStatementIndex(DialogObject.isEncryptedDialog(message.dialog_id) ? -1 : 0); + if (state instanceof SQLitePreparedStatementWrapper && !DialogObject.isEncryptedDialog(message.dialog_id)) { + ((SQLitePreparedStatementWrapper)state).setDbSelector(DbSelector.MEMORY_DB); + } MessageObject.normalizeFlags(message); NativeByteBuffer data = new NativeByteBuffer(message.getObjectSize()); @@ -9992,7 +9995,9 @@ public class MessagesStorage extends BaseController { data5.reuse(); if (dialog != null) { state = database.executeFastForBothDb("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); - ((SQLitePreparedStatementMultiple)state).setForcedStatementIndex(DialogObject.isEncryptedDialog(dialog.id) ? -1 : 0); + if (state instanceof SQLitePreparedStatementWrapper && !DialogObject.isEncryptedDialog(dialog.id)) { + ((SQLitePreparedStatementWrapper)state).setDbSelector(DbSelector.MEMORY_DB); + } state.bindLong(1, dialog.id); state.bindInteger(2, dialog.last_message_date); state.bindInteger(3, dialog.unread_count); @@ -11662,7 +11667,9 @@ public class MessagesStorage extends BaseController { for (int a = 0; a < messages.size(); a++) { TLRPC.Message message = messages.get(a); - ((SQLitePreparedStatementMultiple)state_messages).setForcedStatementIndex(DialogObject.isEncryptedDialog(message.dialog_id) ? -1 : 0); + if (state_messages instanceof SQLitePreparedStatementWrapper && !DialogObject.isEncryptedDialog(message.dialog_id)) { + ((SQLitePreparedStatementWrapper)state_messages).setDbSelector(DbSelector.MEMORY_DB); + } int messageId = message.id; MessageObject.getDialogId(message); @@ -12485,7 +12492,9 @@ public class MessagesStorage extends BaseController { state_dialogs_update_without_message.step(); } } else { - ((SQLitePreparedStatementMultiple)state_dialogs_replace).setForcedStatementIndex(DialogObject.isEncryptedDialog(message.dialog_id) ? -1 : 0); + if (state_dialogs_replace instanceof SQLitePreparedStatementWrapper && !DialogObject.isEncryptedDialog(message.dialog_id)) { + ((SQLitePreparedStatementWrapper)state_dialogs_replace).setDbSelector(DbSelector.MEMORY_DB); + } state_dialogs_replace.requery(); state_dialogs_replace.bindLong(1, key); state_dialogs_replace.bindInteger(2, message != null && (!doNotUpdateDialogDate || dialog_date == 0) ? message.date : dialog_date); @@ -14839,7 +14848,9 @@ public class MessagesStorage extends BaseController { } } else { state = database.executeFastForBothDb("REPLACE INTO messages_v2 VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?, ?, ?)"); - ((SQLitePreparedStatementMultiple)state).setForcedStatementIndex(DialogObject.isEncryptedDialog(message.dialog_id) ? -1 : 0); + if (state instanceof SQLitePreparedStatementWrapper && !DialogObject.isEncryptedDialog(message.dialog_id)) { + ((SQLitePreparedStatementWrapper)state).setDbSelector(DbSelector.MEMORY_DB); + } } state.requery(); @@ -15289,7 +15300,9 @@ public class MessagesStorage extends BaseController { state3.bindLong(8, dialogId); } else { state3 = database.executeFastForBothDb("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); - ((SQLitePreparedStatementMultiple)state3).setForcedStatementIndex(DialogObject.isEncryptedDialog(dialogId) ? -1 : 0); + if (state3 instanceof SQLitePreparedStatementWrapper && !DialogObject.isEncryptedDialog(dialogId)) { + ((SQLitePreparedStatementWrapper)state3).setDbSelector(DbSelector.MEMORY_DB); + } state3.bindLong(1, dialogId); state3.bindInteger(2, message.date); state3.bindInteger(3, 0); @@ -16273,7 +16286,9 @@ public class MessagesStorage extends BaseController { TLRPC.Message message = new_dialogMessage.get(dialog.id); if (message != null) { - ((SQLitePreparedStatementMultiple)state_messages).setForcedStatementIndex(DialogObject.isEncryptedDialog(dialog.id) ? -1 : 0); + if (state_messages instanceof SQLitePreparedStatementWrapper && !DialogObject.isEncryptedDialog(dialog.id)) { + ((SQLitePreparedStatementWrapper)state_messages).setDbSelector(DbSelector.MEMORY_DB); + } messageDate = Math.max(message.date, messageDate); if (isValidKeyboardToSave(message)) { @@ -16378,7 +16393,9 @@ public class MessagesStorage extends BaseController { } } - ((SQLitePreparedStatementMultiple)state_dialogs).setForcedStatementIndex(DialogObject.isEncryptedDialog(dialog.id) ? -1 : 0); + if (state_dialogs instanceof SQLitePreparedStatementWrapper && !DialogObject.isEncryptedDialog(dialog.id)) { + ((SQLitePreparedStatementWrapper)state_dialogs).setDbSelector(DbSelector.MEMORY_DB); + } state_dialogs.requery(); state_dialogs.bindLong(1, dialog.id); state_dialogs.bindInteger(2, messageDate);