From 3b65761110996b97f5e3957849b52d66d68b270d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 2 Feb 2021 21:23:16 +0100 Subject: [PATCH] Delete on cascade --- CHANGES.md | 1 + .../crypto/store/db/RealmCryptoStore.kt | 8 +++++--- .../store/db/model/CrossSigningInfoEntity.kt | 7 ++++++- .../crypto/store/db/model/DeviceInfoEntity.kt | 5 +++++ .../crypto/store/db/model/KeyInfoEntity.kt | 8 +++++++- .../crypto/store/db/model/UserEntity.kt | 10 ++++++++-- .../store/db/query/UserEntitiesQueries.kt | 6 +++--- .../sdk/internal/database/DatabaseCleaner.kt | 17 ++--------------- .../database/helper/ChunkEntityHelper.kt | 6 ------ .../database/helper/RoomEntityHelper.kt | 7 +------ .../helper/TimelineEventEntityHelper.kt | 9 --------- .../sdk/internal/database/model/ChunkEntity.kt | 10 ++++++++++ .../model/EventAnnotationsSummaryEntity.kt | 8 ++++++++ .../internal/database/model/PushRuleEntity.kt | 5 +++++ .../internal/database/model/PushRulesEntity.kt | 5 +++++ .../sdk/internal/database/model/PusherEntity.kt | 7 ++++++- .../database/model/ReadReceiptsSummaryEntity.kt | 5 +++++ .../database/model/TimelineEventEntity.kt | 11 +++++++++++ .../internal/session/pushers/GetPushersTask.kt | 3 ++- .../session/pushers/SavePushRulesTask.kt | 2 +- .../room/timeline/TokenChunkEventPersistor.kt | 9 ++++----- .../internal/session/sync/RoomSyncHandler.kt | 10 +++++----- .../session/sync/UserAccountDataSyncHandler.kt | 2 +- 23 files changed, 101 insertions(+), 60 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index fcf6659d92..9c72ff3574 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -16,6 +16,7 @@ Bugfix 🐛: - Widgets: Support $matrix_widget_id parameter (#2748) - Data for Worker overload (#2721) - Fix multiple tasks + - Object deletion in database is not complete (#2759) Translations 🗣: - diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt index 369a4976c9..8dbccb061b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/RealmCryptoStore.kt @@ -293,7 +293,8 @@ internal class RealmCryptoStore @Inject constructor( realm.insertOrUpdate(entity) } // Ensure all other devices are deleted - u.devices.deleteAllFromRealm() + u.devices.toList().forEach { it.deleteOnCascade() } + u.devices.clear() u.devices.addAll(new) } } @@ -309,7 +310,7 @@ internal class RealmCryptoStore @Inject constructor( .let { userEntity -> if (masterKey == null || selfSigningKey == null) { // The user has disabled cross signing? - userEntity.crossSigningInfoEntity?.deleteFromRealm() + userEntity.crossSigningInfoEntity?.deleteOnCascade() userEntity.crossSigningInfoEntity = null } else { var shouldResetMyDevicesLocalTrust = false @@ -1633,7 +1634,8 @@ internal class RealmCryptoStore @Inject constructor( } else { // Just override existing, caller should check and untrust id needed val existing = CrossSigningInfoEntity.getOrCreate(realm, userId) - existing.crossSigningKeys.deleteAllFromRealm() + existing.crossSigningKeys.toList().forEach { it.deleteOnCascade() } + existing.crossSigningKeys.clear() existing.crossSigningKeys.addAll( info.crossSigningKeys.map { crossSigningKeysMapper.map(it) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/CrossSigningInfoEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/CrossSigningInfoEntity.kt index fdd3e94754..5a14ede0ad 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/CrossSigningInfoEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/CrossSigningInfoEntity.kt @@ -16,10 +16,10 @@ package org.matrix.android.sdk.internal.crypto.store.db.model -import org.matrix.android.sdk.internal.crypto.model.KeyUsage import io.realm.RealmList import io.realm.RealmObject import io.realm.annotations.PrimaryKey +import org.matrix.android.sdk.internal.crypto.model.KeyUsage internal open class CrossSigningInfoEntity( @PrimaryKey @@ -29,6 +29,11 @@ internal open class CrossSigningInfoEntity( companion object + fun deleteOnCascade() { + crossSigningKeys.toList().forEach { it.deleteOnCascade() } + deleteFromRealm() + } + fun getMasterKey() = crossSigningKeys.firstOrNull { it.usages.contains(KeyUsage.MASTER.value) } fun setMasterKey(info: KeyInfoEntity?) { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/DeviceInfoEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/DeviceInfoEntity.kt index 571b9bb05f..eddf0b81c6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/DeviceInfoEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/DeviceInfoEntity.kt @@ -46,4 +46,9 @@ internal open class DeviceInfoEntity( val users: RealmResults? = null companion object + + fun deleteOnCascade() { + trustLevelEntity?.deleteFromRealm() + deleteFromRealm() + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/KeyInfoEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/KeyInfoEntity.kt index 8f2357223e..527adaf847 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/KeyInfoEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/KeyInfoEntity.kt @@ -29,4 +29,10 @@ internal open class KeyInfoEntity( */ var signatures: String? = null, var trustLevelEntity: TrustLevelEntity? = null -) : RealmObject() +) : RealmObject() { + + fun deleteOnCascade() { + trustLevelEntity?.deleteFromRealm() + deleteFromRealm() + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/UserEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/UserEntity.kt index 52c30a27cc..a5336ea848 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/UserEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/UserEntity.kt @@ -24,8 +24,14 @@ internal open class UserEntity( @PrimaryKey var userId: String? = null, var devices: RealmList = RealmList(), var crossSigningInfoEntity: CrossSigningInfoEntity? = null, - var deviceTrackingStatus: Int = 0) - : RealmObject() { + var deviceTrackingStatus: Int = 0 +) : RealmObject() { companion object + + fun deleteOnCascade() { + devices.toList().forEach { it.deleteOnCascade() } + crossSigningInfoEntity?.deleteOnCascade() + deleteFromRealm() + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/query/UserEntitiesQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/query/UserEntitiesQueries.kt index a1f8bd7262..4db03e123e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/query/UserEntitiesQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/query/UserEntitiesQueries.kt @@ -16,11 +16,11 @@ package org.matrix.android.sdk.internal.crypto.store.db.query -import org.matrix.android.sdk.internal.crypto.store.db.model.UserEntity -import org.matrix.android.sdk.internal.crypto.store.db.model.UserEntityFields import io.realm.Realm import io.realm.kotlin.createObject import io.realm.kotlin.where +import org.matrix.android.sdk.internal.crypto.store.db.model.UserEntity +import org.matrix.android.sdk.internal.crypto.store.db.model.UserEntityFields /** * Get or create a user @@ -39,5 +39,5 @@ internal fun UserEntity.Companion.delete(realm: Realm, userId: String) { realm.where() .equalTo(UserEntityFields.USER_ID, userId) .findFirst() - ?.deleteFromRealm() + ?.deleteOnCascade() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/DatabaseCleaner.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/DatabaseCleaner.kt index e305c7ea38..e780702229 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/DatabaseCleaner.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/DatabaseCleaner.kt @@ -56,7 +56,7 @@ internal class DatabaseCleaner @Inject constructor(@SessionDatabase private val } } - private suspend fun cleanUp(realm: Realm, threshold: Long) { + private fun cleanUp(realm: Realm, threshold: Long) { val numberOfEvents = realm.where(EventEntity::class.java).findAll().size val numberOfTimelineEvents = realm.where(TimelineEventEntity::class.java).findAll().size Timber.v("Number of events in db: $numberOfEvents | Number of timeline events in db: $numberOfTimelineEvents") @@ -76,20 +76,7 @@ internal class DatabaseCleaner @Inject constructor(@SessionDatabase private val chunk.numberOfTimelineEvents = chunk.numberOfTimelineEvents - eventsToRemove.size eventsToRemove.forEach { val canDeleteRoot = it.root?.stateKey == null - if (canDeleteRoot) { - it.root?.deleteFromRealm() - } - it.readReceipts?.readReceipts?.deleteAllFromRealm() - it.readReceipts?.deleteFromRealm() - it.annotations?.apply { - editSummary?.deleteFromRealm() - pollResponseSummary?.deleteFromRealm() - referencesSummaryEntity?.deleteFromRealm() - reactionsSummary.deleteAllFromRealm() - } - it.annotations?.deleteFromRealm() - it.readReceipts?.deleteFromRealm() - it.deleteFromRealm() + it.deleteOnCascade(canDeleteRoot) } // We reset the prevToken so we will need to fetch again. chunk.prevToken = null diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt index f764c4da4b..b4935cfdcc 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/ChunkEntityHelper.kt @@ -38,12 +38,6 @@ import io.realm.Sort import io.realm.kotlin.createObject import timber.log.Timber -internal fun ChunkEntity.deleteOnCascade() { - assertIsManaged() - this.timelineEvents.deleteAllFromRealm() - this.deleteFromRealm() -} - internal fun ChunkEntity.merge(roomId: String, chunkToMerge: ChunkEntity, direction: PaginationDirection) { assertIsManaged() val localRealm = this.realm diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/RoomEntityHelper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/RoomEntityHelper.kt index a4108f0966..724f307e3b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/RoomEntityHelper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/RoomEntityHelper.kt @@ -19,12 +19,7 @@ package org.matrix.android.sdk.internal.database.helper import org.matrix.android.sdk.internal.database.model.ChunkEntity import org.matrix.android.sdk.internal.database.model.RoomEntity -internal fun RoomEntity.deleteOnCascade(chunkEntity: ChunkEntity) { - chunks.remove(chunkEntity) - chunkEntity.deleteOnCascade() -} - -internal fun RoomEntity.addOrUpdate(chunkEntity: ChunkEntity) { +internal fun RoomEntity.addIfNecessary(chunkEntity: ChunkEntity) { if (!chunks.contains(chunkEntity)) { chunks.add(chunkEntity) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/TimelineEventEntityHelper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/TimelineEventEntityHelper.kt index 6f4dac182c..90e867749e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/TimelineEventEntityHelper.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/TimelineEventEntityHelper.kt @@ -18,7 +18,6 @@ package org.matrix.android.sdk.internal.database.helper import org.matrix.android.sdk.internal.database.model.TimelineEventEntity import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields -import org.matrix.android.sdk.internal.extensions.assertIsManaged import io.realm.Realm internal fun TimelineEventEntity.Companion.nextId(realm: Realm): Long { @@ -29,11 +28,3 @@ internal fun TimelineEventEntity.Companion.nextId(realm: Realm): Long { currentIdNum.toLong() + 1 } } - -internal fun TimelineEventEntity.deleteOnCascade() { - assertIsManaged() - root?.deleteFromRealm() - annotations?.deleteFromRealm() - readReceipts?.deleteFromRealm() - deleteFromRealm() -} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ChunkEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ChunkEntity.kt index 9770352a95..de7333bef2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ChunkEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ChunkEntity.kt @@ -21,6 +21,7 @@ import io.realm.RealmObject import io.realm.RealmResults import io.realm.annotations.Index import io.realm.annotations.LinkingObjects +import org.matrix.android.sdk.internal.extensions.assertIsManaged internal open class ChunkEntity(@Index var prevToken: String? = null, // Because of gaps we can have several chunks with nextToken == null @@ -42,4 +43,13 @@ internal open class ChunkEntity(@Index var prevToken: String? = null, val room: RealmResults? = null companion object + + fun deleteOnCascade(deleteStateEvents: Boolean, canDeleteRoot: Boolean) { + assertIsManaged() + if (deleteStateEvents) { + stateEvents.deleteAllFromRealm() + } + timelineEvents.forEach { it.deleteOnCascade(canDeleteRoot) } + deleteFromRealm() + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventAnnotationsSummaryEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventAnnotationsSummaryEntity.kt index 3e5e277613..4caf6bdd0d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventAnnotationsSummaryEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/EventAnnotationsSummaryEntity.kt @@ -30,4 +30,12 @@ internal open class EventAnnotationsSummaryEntity( ) : RealmObject() { companion object + + fun deleteOnCascade() { + reactionsSummary.deleteAllFromRealm() + editSummary?.deleteFromRealm() + referencesSummaryEntity?.deleteFromRealm() + pollResponseSummary?.deleteFromRealm() + deleteFromRealm() + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PushRuleEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PushRuleEntity.kt index 85375c8064..2a24208d97 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PushRuleEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PushRuleEntity.kt @@ -39,4 +39,9 @@ internal open class PushRuleEntity( val parent: RealmResults? = null companion object + + fun deleteOnCascade() { + conditions?.forEach { it.deleteFromRealm() } + deleteFromRealm() + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PushRulesEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PushRulesEntity.kt index 21e3510cd2..52fd97b408 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PushRulesEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PushRulesEntity.kt @@ -34,4 +34,9 @@ internal open class PushRulesEntity( } companion object + + fun deleteOnCascade() { + pushRules.toList().forEach { it.deleteOnCascade() } + deleteFromRealm() + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PusherEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PusherEntity.kt index f85c01c48a..e4fb474599 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PusherEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PusherEntity.kt @@ -15,8 +15,8 @@ */ package org.matrix.android.sdk.internal.database.model -import org.matrix.android.sdk.api.session.pushers.PusherState import io.realm.RealmObject +import org.matrix.android.sdk.api.session.pushers.PusherState // TODO // at java.lang.Thread.run(Thread.java:764) @@ -53,4 +53,9 @@ internal open class PusherEntity( } companion object + + fun deleteOnCascade() { + data?.deleteFromRealm() + deleteFromRealm() + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ReadReceiptsSummaryEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ReadReceiptsSummaryEntity.kt index 98b4329076..a3693720e4 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ReadReceiptsSummaryEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ReadReceiptsSummaryEntity.kt @@ -33,4 +33,9 @@ internal open class ReadReceiptsSummaryEntity( val timelineEvent: RealmResults? = null companion object + + fun deleteOnCascade() { + readReceipts.deleteAllFromRealm() + deleteFromRealm() + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/TimelineEventEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/TimelineEventEntity.kt index 7bd0dbbb8f..fbafb9c5eb 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/TimelineEventEntity.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/TimelineEventEntity.kt @@ -20,6 +20,7 @@ import io.realm.RealmObject import io.realm.RealmResults import io.realm.annotations.Index import io.realm.annotations.LinkingObjects +import org.matrix.android.sdk.internal.extensions.assertIsManaged internal open class TimelineEventEntity(var localId: Long = 0, @Index var eventId: String = "", @@ -38,4 +39,14 @@ internal open class TimelineEventEntity(var localId: Long = 0, val chunk: RealmResults? = null companion object + + fun deleteOnCascade(canDeleteRoot: Boolean) { + assertIsManaged() + if (canDeleteRoot) { + root?.deleteFromRealm() + } + annotations?.deleteOnCascade() + readReceipts?.deleteOnCascade() + deleteFromRealm() + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/GetPushersTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/GetPushersTask.kt index 4c7d370446..b66e04b4cd 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/GetPushersTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/GetPushersTask.kt @@ -41,7 +41,8 @@ internal class DefaultGetPushersTask @Inject constructor( monarchy.awaitTransaction { realm -> // clear existings? realm.where(PusherEntity::class.java) - .findAll().deleteAllFromRealm() + .findAll() + .forEach { it.deleteOnCascade() } response.pushers?.forEach { jsonPusher -> jsonPusher.toEntity().also { it.state = PusherState.REGISTERED diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/SavePushRulesTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/SavePushRulesTask.kt index 6ba769a3b7..fd433c0803 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/SavePushRulesTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/SavePushRulesTask.kt @@ -40,7 +40,7 @@ internal class DefaultSavePushRulesTask @Inject constructor(@SessionDatabase pri // clear current push rules realm.where(PushRulesEntity::class.java) .findAll() - .deleteAllFromRealm() + .forEach { it.deleteOnCascade() } // Save only global rules for the moment val globalRules = params.pushRules.global diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt index 1a497b8835..19572edc80 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TokenChunkEventPersistor.kt @@ -22,10 +22,9 @@ import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.RoomMemberContent import org.matrix.android.sdk.api.session.room.send.SendState -import org.matrix.android.sdk.internal.database.helper.addOrUpdate +import org.matrix.android.sdk.internal.database.helper.addIfNecessary import org.matrix.android.sdk.internal.database.helper.addStateEvent import org.matrix.android.sdk.internal.database.helper.addTimelineEvent -import org.matrix.android.sdk.internal.database.helper.deleteOnCascade import org.matrix.android.sdk.internal.database.helper.merge import org.matrix.android.sdk.internal.database.mapper.toEntity import org.matrix.android.sdk.internal.database.model.ChunkEntity @@ -172,7 +171,7 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri val currentLastForwardChunk = ChunkEntity.findLastForwardChunkOfRoom(realm, roomId) if (currentChunk != currentLastForwardChunk) { currentChunk.isLastForward = true - currentLastForwardChunk?.deleteOnCascade() + currentLastForwardChunk?.deleteOnCascade(deleteStateEvents = false, canDeleteRoot = false) RoomSummaryEntity.where(realm, roomId).findFirst()?.apply { latestPreviewableEvent = RoomSummaryEventsHelper.getLatestPreviewableEvent(realm, roomId) } @@ -235,7 +234,7 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri } } chunksToDelete.forEach { - it.deleteOnCascade() + it.deleteOnCascade(deleteStateEvents = false, canDeleteRoot = false) } val roomSummaryEntity = RoomSummaryEntity.getOrCreate(realm, roomId) val shouldUpdateSummary = roomSummaryEntity.latestPreviewableEvent == null @@ -244,7 +243,7 @@ internal class TokenChunkEventPersistor @Inject constructor(@SessionDatabase pri roomSummaryEntity.latestPreviewableEvent = RoomSummaryEventsHelper.getLatestPreviewableEvent(realm, roomId) } if (currentChunk.isValid) { - RoomEntity.where(realm, roomId).findFirst()?.addOrUpdate(currentChunk) + RoomEntity.where(realm, roomId).findFirst()?.addIfNecessary(currentChunk) } } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt index 456b0f9c26..4fb7708ed1 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt @@ -30,9 +30,8 @@ import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.internal.crypto.DefaultCryptoService import org.matrix.android.sdk.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM import org.matrix.android.sdk.internal.crypto.algorithms.olm.OlmDecryptionResult -import org.matrix.android.sdk.internal.database.helper.addOrUpdate +import org.matrix.android.sdk.internal.database.helper.addIfNecessary import org.matrix.android.sdk.internal.database.helper.addTimelineEvent -import org.matrix.android.sdk.internal.database.helper.deleteOnCascade import org.matrix.android.sdk.internal.database.mapper.asDomain import org.matrix.android.sdk.internal.database.mapper.toEntity import org.matrix.android.sdk.internal.database.model.ChunkEntity @@ -175,7 +174,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle syncLocalTimestampMillis, isInitialSync ) - roomEntity.addOrUpdate(chunkEntity) + roomEntity.addIfNecessary(chunkEntity) } val hasRoomMember = roomSync.state?.events?.firstOrNull { it.type == EventType.STATE_ROOM_MEMBER @@ -263,7 +262,8 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle val leftMember = RoomMemberSummaryEntity.where(realm, roomId, userId).findFirst() val membership = leftMember?.membership ?: Membership.LEAVE roomEntity.membership = membership - roomEntity.chunks.deleteAllFromRealm() + roomEntity.chunks.forEach { it.deleteOnCascade(deleteStateEvents = true, canDeleteRoot = true) } + roomEntity.chunks.clear() roomTypingUsersHandler.handle(realm, roomId, null) roomChangeMembershipStateDataSource.setMembershipFromSync(roomId, Membership.LEAVE) roomSummaryUpdater.update(realm, roomId, membership, roomSync.summary, roomSync.unreadNotifications) @@ -340,7 +340,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle } } // Finally delete the local echo - sendingEventEntity.deleteOnCascade() + sendingEventEntity.deleteOnCascade(true) } else { Timber.v("Can't find corresponding local echo for tx:$it") } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/UserAccountDataSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/UserAccountDataSyncHandler.kt index 0e549172f3..880dbdcb88 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/UserAccountDataSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/UserAccountDataSyncHandler.kt @@ -113,7 +113,7 @@ internal class UserAccountDataSyncHandler @Inject constructor( val pushRules = event.content.toModel() ?: return realm.where(PushRulesEntity::class.java) .findAll() - .deleteAllFromRealm() + .forEach { it.deleteOnCascade() } // Save only global rules for the moment val globalRules = pushRules.global