Better clearing of RealmLists
This commit is contained in:
parent
3b65761110
commit
424035f56f
@ -94,6 +94,7 @@ import org.matrix.android.sdk.internal.di.CryptoDatabase
|
|||||||
import org.matrix.android.sdk.internal.di.DeviceId
|
import org.matrix.android.sdk.internal.di.DeviceId
|
||||||
import org.matrix.android.sdk.internal.di.MoshiProvider
|
import org.matrix.android.sdk.internal.di.MoshiProvider
|
||||||
import org.matrix.android.sdk.internal.di.UserId
|
import org.matrix.android.sdk.internal.di.UserId
|
||||||
|
import org.matrix.android.sdk.internal.extensions.clearWith
|
||||||
import org.matrix.android.sdk.internal.session.SessionScope
|
import org.matrix.android.sdk.internal.session.SessionScope
|
||||||
import org.matrix.olm.OlmAccount
|
import org.matrix.olm.OlmAccount
|
||||||
import org.matrix.olm.OlmException
|
import org.matrix.olm.OlmException
|
||||||
@ -293,8 +294,7 @@ internal class RealmCryptoStore @Inject constructor(
|
|||||||
realm.insertOrUpdate(entity)
|
realm.insertOrUpdate(entity)
|
||||||
}
|
}
|
||||||
// Ensure all other devices are deleted
|
// Ensure all other devices are deleted
|
||||||
u.devices.toList().forEach { it.deleteOnCascade() }
|
u.devices.clearWith { it.deleteOnCascade() }
|
||||||
u.devices.clear()
|
|
||||||
u.devices.addAll(new)
|
u.devices.addAll(new)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1634,8 +1634,7 @@ internal class RealmCryptoStore @Inject constructor(
|
|||||||
} else {
|
} else {
|
||||||
// Just override existing, caller should check and untrust id needed
|
// Just override existing, caller should check and untrust id needed
|
||||||
val existing = CrossSigningInfoEntity.getOrCreate(realm, userId)
|
val existing = CrossSigningInfoEntity.getOrCreate(realm, userId)
|
||||||
existing.crossSigningKeys.toList().forEach { it.deleteOnCascade() }
|
existing.crossSigningKeys.clearWith { it.deleteOnCascade() }
|
||||||
existing.crossSigningKeys.clear()
|
|
||||||
existing.crossSigningKeys.addAll(
|
existing.crossSigningKeys.addAll(
|
||||||
info.crossSigningKeys.map {
|
info.crossSigningKeys.map {
|
||||||
crossSigningKeysMapper.map(it)
|
crossSigningKeysMapper.map(it)
|
||||||
|
@ -20,6 +20,7 @@ import io.realm.RealmList
|
|||||||
import io.realm.RealmObject
|
import io.realm.RealmObject
|
||||||
import io.realm.annotations.PrimaryKey
|
import io.realm.annotations.PrimaryKey
|
||||||
import org.matrix.android.sdk.internal.crypto.model.KeyUsage
|
import org.matrix.android.sdk.internal.crypto.model.KeyUsage
|
||||||
|
import org.matrix.android.sdk.internal.extensions.clearWith
|
||||||
|
|
||||||
internal open class CrossSigningInfoEntity(
|
internal open class CrossSigningInfoEntity(
|
||||||
@PrimaryKey
|
@PrimaryKey
|
||||||
@ -30,7 +31,7 @@ internal open class CrossSigningInfoEntity(
|
|||||||
companion object
|
companion object
|
||||||
|
|
||||||
fun deleteOnCascade() {
|
fun deleteOnCascade() {
|
||||||
crossSigningKeys.toList().forEach { it.deleteOnCascade() }
|
crossSigningKeys.clearWith { it.deleteOnCascade() }
|
||||||
deleteFromRealm()
|
deleteFromRealm()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ package org.matrix.android.sdk.internal.crypto.store.db.model
|
|||||||
import io.realm.RealmList
|
import io.realm.RealmList
|
||||||
import io.realm.RealmObject
|
import io.realm.RealmObject
|
||||||
import io.realm.annotations.PrimaryKey
|
import io.realm.annotations.PrimaryKey
|
||||||
|
import org.matrix.android.sdk.internal.extensions.clearWith
|
||||||
|
|
||||||
internal open class UserEntity(
|
internal open class UserEntity(
|
||||||
@PrimaryKey var userId: String? = null,
|
@PrimaryKey var userId: String? = null,
|
||||||
@ -30,7 +31,7 @@ internal open class UserEntity(
|
|||||||
companion object
|
companion object
|
||||||
|
|
||||||
fun deleteOnCascade() {
|
fun deleteOnCascade() {
|
||||||
devices.toList().forEach { it.deleteOnCascade() }
|
devices.clearWith { it.deleteOnCascade() }
|
||||||
crossSigningInfoEntity?.deleteOnCascade()
|
crossSigningInfoEntity?.deleteOnCascade()
|
||||||
deleteFromRealm()
|
deleteFromRealm()
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ import io.realm.RealmResults
|
|||||||
import io.realm.annotations.Index
|
import io.realm.annotations.Index
|
||||||
import io.realm.annotations.LinkingObjects
|
import io.realm.annotations.LinkingObjects
|
||||||
import org.matrix.android.sdk.internal.extensions.assertIsManaged
|
import org.matrix.android.sdk.internal.extensions.assertIsManaged
|
||||||
|
import org.matrix.android.sdk.internal.extensions.clearWith
|
||||||
|
|
||||||
internal open class ChunkEntity(@Index var prevToken: String? = null,
|
internal open class ChunkEntity(@Index var prevToken: String? = null,
|
||||||
// Because of gaps we can have several chunks with nextToken == null
|
// Because of gaps we can have several chunks with nextToken == null
|
||||||
@ -49,7 +50,7 @@ internal open class ChunkEntity(@Index var prevToken: String? = null,
|
|||||||
if (deleteStateEvents) {
|
if (deleteStateEvents) {
|
||||||
stateEvents.deleteAllFromRealm()
|
stateEvents.deleteAllFromRealm()
|
||||||
}
|
}
|
||||||
timelineEvents.forEach { it.deleteOnCascade(canDeleteRoot) }
|
timelineEvents.clearWith { it.deleteOnCascade(canDeleteRoot) }
|
||||||
deleteFromRealm()
|
deleteFromRealm()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ internal open class PushRuleEntity(
|
|||||||
companion object
|
companion object
|
||||||
|
|
||||||
fun deleteOnCascade() {
|
fun deleteOnCascade() {
|
||||||
conditions?.forEach { it.deleteFromRealm() }
|
conditions?.deleteAllFromRealm()
|
||||||
deleteFromRealm()
|
deleteFromRealm()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ package org.matrix.android.sdk.internal.database.model
|
|||||||
import org.matrix.android.sdk.api.pushrules.RuleKind
|
import org.matrix.android.sdk.api.pushrules.RuleKind
|
||||||
import io.realm.RealmList
|
import io.realm.RealmList
|
||||||
import io.realm.RealmObject
|
import io.realm.RealmObject
|
||||||
|
import org.matrix.android.sdk.internal.extensions.clearWith
|
||||||
|
|
||||||
internal open class PushRulesEntity(
|
internal open class PushRulesEntity(
|
||||||
var scope: String = "",
|
var scope: String = "",
|
||||||
@ -36,7 +37,7 @@ internal open class PushRulesEntity(
|
|||||||
companion object
|
companion object
|
||||||
|
|
||||||
fun deleteOnCascade() {
|
fun deleteOnCascade() {
|
||||||
pushRules.toList().forEach { it.deleteOnCascade() }
|
pushRules.clearWith { it.deleteOnCascade() }
|
||||||
deleteFromRealm()
|
deleteFromRealm()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,8 +16,18 @@
|
|||||||
|
|
||||||
package org.matrix.android.sdk.internal.extensions
|
package org.matrix.android.sdk.internal.extensions
|
||||||
|
|
||||||
|
import io.realm.RealmList
|
||||||
import io.realm.RealmObject
|
import io.realm.RealmObject
|
||||||
|
|
||||||
internal fun RealmObject.assertIsManaged() {
|
internal fun RealmObject.assertIsManaged() {
|
||||||
check(isManaged) { "${javaClass.simpleName} entity should be managed to use this function" }
|
check(isManaged) { "${javaClass.simpleName} entity should be managed to use this function" }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear a RealmList by deleting all its items calling the provided lambda
|
||||||
|
*/
|
||||||
|
internal fun <T> RealmList<T>.clearWith(delete: (T) -> Unit) {
|
||||||
|
while (!isEmpty()) {
|
||||||
|
first()?.let { delete.invoke(it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -47,6 +47,7 @@ import org.matrix.android.sdk.internal.database.query.getOrNull
|
|||||||
import org.matrix.android.sdk.internal.database.query.where
|
import org.matrix.android.sdk.internal.database.query.where
|
||||||
import org.matrix.android.sdk.internal.di.MoshiProvider
|
import org.matrix.android.sdk.internal.di.MoshiProvider
|
||||||
import org.matrix.android.sdk.internal.di.UserId
|
import org.matrix.android.sdk.internal.di.UserId
|
||||||
|
import org.matrix.android.sdk.internal.extensions.clearWith
|
||||||
import org.matrix.android.sdk.internal.session.DefaultInitialSyncProgressService
|
import org.matrix.android.sdk.internal.session.DefaultInitialSyncProgressService
|
||||||
import org.matrix.android.sdk.internal.session.mapWithProgress
|
import org.matrix.android.sdk.internal.session.mapWithProgress
|
||||||
import org.matrix.android.sdk.internal.session.room.membership.RoomChangeMembershipStateDataSource
|
import org.matrix.android.sdk.internal.session.room.membership.RoomChangeMembershipStateDataSource
|
||||||
@ -262,8 +263,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
|
|||||||
val leftMember = RoomMemberSummaryEntity.where(realm, roomId, userId).findFirst()
|
val leftMember = RoomMemberSummaryEntity.where(realm, roomId, userId).findFirst()
|
||||||
val membership = leftMember?.membership ?: Membership.LEAVE
|
val membership = leftMember?.membership ?: Membership.LEAVE
|
||||||
roomEntity.membership = membership
|
roomEntity.membership = membership
|
||||||
roomEntity.chunks.forEach { it.deleteOnCascade(deleteStateEvents = true, canDeleteRoot = true) }
|
roomEntity.chunks.clearWith { it.deleteOnCascade(deleteStateEvents = true, canDeleteRoot = true) }
|
||||||
roomEntity.chunks.clear()
|
|
||||||
roomTypingUsersHandler.handle(realm, roomId, null)
|
roomTypingUsersHandler.handle(realm, roomId, null)
|
||||||
roomChangeMembershipStateDataSource.setMembershipFromSync(roomId, Membership.LEAVE)
|
roomChangeMembershipStateDataSource.setMembershipFromSync(roomId, Membership.LEAVE)
|
||||||
roomSummaryUpdater.update(realm, roomId, membership, roomSync.summary, roomSync.unreadNotifications)
|
roomSummaryUpdater.update(realm, roomId, membership, roomSync.summary, roomSync.unreadNotifications)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user