do not use trigger but delete message index entries manually
This commit is contained in:
parent
9b43f37758
commit
be579332be
|
@ -35,6 +35,7 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import org.json.JSONException;
|
||||
|
||||
import eu.siacs.conversations.Config;
|
||||
|
@ -59,11 +60,9 @@ import rocks.xmpp.addr.Jid;
|
|||
|
||||
public class DatabaseBackend extends SQLiteOpenHelper {
|
||||
|
||||
private static DatabaseBackend instance = null;
|
||||
|
||||
private static final String DATABASE_NAME = "history";
|
||||
private static final int DATABASE_VERSION = 41;
|
||||
|
||||
private static final int DATABASE_VERSION = 42;
|
||||
private static DatabaseBackend instance = null;
|
||||
private static String CREATE_CONTATCS_STATEMENT = "create table "
|
||||
+ Contact.TABLENAME + "(" + Contact.ACCOUNT + " TEXT, "
|
||||
+ Contact.SERVERNAME + " TEXT, " + Contact.SYSTEMNAME + " TEXT,"
|
||||
|
@ -168,13 +167,26 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
|||
private static String CREATE_MESSAGE_INDEX_TABLE = "CREATE VIRTUAL TABLE messages_index USING FTS4(uuid TEXT PRIMARY KEY, body TEXT)";
|
||||
private static String CREATE_MESSAGE_INSERT_TRIGGER = "CREATE TRIGGER after_message_insert AFTER INSERT ON " + Message.TABLENAME + " BEGIN INSERT INTO messages_index (uuid,body) VALUES (new.uuid,new.body); END;";
|
||||
private static String CREATE_MESSAGE_UPDATE_TRIGGER = "CREATE TRIGGER after_message_update UPDATE of uuid,body ON " + Message.TABLENAME + " BEGIN update messages_index set body=new.body,uuid=new.uuid WHERE uuid=old.uuid; END;";
|
||||
private static String CREATE_MESSAGE_DELETE_TRIGGER = "CREATE TRIGGER after_message_delete AFTER DELETE ON "+Message.TABLENAME+ " BEGIN DELETE from messages_index where uuid=old.uuid; END;";
|
||||
private static String COPY_PREEXISTING_ENTRIES = "INSERT into messages_index(uuid,body) select uuid,body FROM " + Message.TABLENAME + ";";
|
||||
|
||||
private DatabaseBackend(Context context) {
|
||||
super(context, DATABASE_NAME, null, DATABASE_VERSION);
|
||||
}
|
||||
|
||||
private static ContentValues createFingerprintStatusContentValues(FingerprintStatus.Trust trust, boolean active) {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(SQLiteAxolotlStore.TRUST, trust.toString());
|
||||
values.put(SQLiteAxolotlStore.ACTIVE, active ? 1 : 0);
|
||||
return values;
|
||||
}
|
||||
|
||||
public static synchronized DatabaseBackend getInstance(Context context) {
|
||||
if (instance == null) {
|
||||
instance = new DatabaseBackend(context);
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(SQLiteDatabase db) {
|
||||
db.execSQL("PRAGMA foreign_keys=ON;");
|
||||
|
@ -234,7 +246,6 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
|||
db.execSQL(CREATE_MESSAGE_INDEX_TABLE);
|
||||
db.execSQL(CREATE_MESSAGE_INSERT_TRIGGER);
|
||||
db.execSQL(CREATE_MESSAGE_UPDATE_TRIGGER);
|
||||
db.execSQL(CREATE_MESSAGE_DELETE_TRIGGER);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -495,16 +506,12 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
|||
db.execSQL(CREATE_MESSAGE_INDEX_TABLE);
|
||||
db.execSQL(CREATE_MESSAGE_INSERT_TRIGGER);
|
||||
db.execSQL(CREATE_MESSAGE_UPDATE_TRIGGER);
|
||||
db.execSQL(CREATE_MESSAGE_DELETE_TRIGGER);
|
||||
db.execSQL(COPY_PREEXISTING_ENTRIES);
|
||||
}
|
||||
}
|
||||
|
||||
private static ContentValues createFingerprintStatusContentValues(FingerprintStatus.Trust trust, boolean active) {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(SQLiteAxolotlStore.TRUST,trust.toString());
|
||||
values.put(SQLiteAxolotlStore.ACTIVE,active ? 1 : 0);
|
||||
return values;
|
||||
if (oldVersion < 42 && newVersion >= 42) {
|
||||
db.execSQL("DROP TRIGGER IF EXISTS after_message_delete");
|
||||
}
|
||||
}
|
||||
|
||||
private void canonicalizeJids(SQLiteDatabase db) {
|
||||
|
@ -586,13 +593,6 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
|||
cursor.close();
|
||||
}
|
||||
|
||||
public static synchronized DatabaseBackend getInstance(Context context) {
|
||||
if (instance == null) {
|
||||
instance = new DatabaseBackend(context);
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public void createConversation(Conversation conversation) {
|
||||
SQLiteDatabase db = this.getWritableDatabase();
|
||||
db.insert(Conversation.TABLENAME, null, conversation.getContentValues());
|
||||
|
@ -909,16 +909,23 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
|||
public void deleteMessagesInConversation(Conversation conversation) {
|
||||
long start = SystemClock.elapsedRealtime();
|
||||
final SQLiteDatabase db = this.getWritableDatabase();
|
||||
db.beginTransaction();
|
||||
String[] args = {conversation.getUuid()};
|
||||
db.delete("messages_index", "uuid in (select uuid from messages where conversationUuid=?)", args);
|
||||
int num = db.delete(Message.TABLENAME, Message.CONVERSATION + "=?", args);
|
||||
db.setTransactionSuccessful();
|
||||
db.endTransaction();
|
||||
Log.d(Config.LOGTAG, "deleted " + num + " messages for " + conversation.getJid().asBareJid() + " in " + (SystemClock.elapsedRealtime() - start) + "ms");
|
||||
}
|
||||
|
||||
public boolean expireOldMessages(long timestamp) {
|
||||
String where = Message.TIME_SENT+"<?";
|
||||
String[] whereArgs = {String.valueOf(timestamp)};
|
||||
public void expireOldMessages(long timestamp) {
|
||||
final String[] args = {String.valueOf(timestamp)};
|
||||
SQLiteDatabase db = this.getReadableDatabase();
|
||||
return db.delete(Message.TABLENAME,where,whereArgs) > 0;
|
||||
db.beginTransaction();
|
||||
db.delete("messages_index", "uuid in (select uuid from messages where timeSent<?)", args);
|
||||
db.delete(Message.TABLENAME, "timeSent<?", args);
|
||||
db.setTransactionSuccessful();
|
||||
db.endTransaction();
|
||||
}
|
||||
|
||||
public MamReference getLastMessageReceived(Account account) {
|
||||
|
|
Loading…
Reference in a new issue