mirror of
https://github.com/matrix-org/matrix-rust-sdk.git
synced 2026-05-05 14:35:20 -04:00
sled: Store memberships as strings
Storing as bitset is not future-proof. Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
This commit is contained in:
committed by
Jonas Platte
parent
a511500e6e
commit
252f4cb9a2
@@ -30,7 +30,7 @@ use tracing::debug;
|
||||
use super::{keys, Result, RoomMember, SledStateStore, SledStoreError};
|
||||
use crate::encode_key::EncodeKey;
|
||||
|
||||
const DATABASE_VERSION: u8 = 6;
|
||||
const DATABASE_VERSION: u8 = 7;
|
||||
|
||||
const VERSION_KEY: &str = "state-store-version";
|
||||
|
||||
@@ -87,8 +87,10 @@ impl SledStateStore {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
if old_version < 6 {
|
||||
self.migrate_to_v6()?;
|
||||
// Version 6 was dropped and migration is similar to v7.
|
||||
|
||||
if old_version < 7 {
|
||||
self.migrate_to_v7()?;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
@@ -277,8 +279,12 @@ impl SledStateStore {
|
||||
}
|
||||
|
||||
/// Remove the old user IDs stores and populate the new ones.
|
||||
fn migrate_to_v6(&self) -> Result<()> {
|
||||
fn migrate_to_v7(&self) -> Result<()> {
|
||||
{
|
||||
// Reset v6 stores.
|
||||
self.user_ids.clear()?;
|
||||
self.stripped_user_ids.clear()?;
|
||||
|
||||
// We only have joined and invited user IDs in the old stores, so instead we
|
||||
// use the room member events to populate the new stores.
|
||||
let state = &self.inner.open_tree(keys::ROOM_STATE)?;
|
||||
@@ -345,7 +351,7 @@ impl SledStateStore {
|
||||
self.inner.drop_tree(old_keys::STRIPPED_JOINED_USER_ID)?;
|
||||
self.inner.drop_tree(old_keys::STRIPPED_INVITED_USER_ID)?;
|
||||
|
||||
self.set_db_version(6)
|
||||
self.set_db_version(7)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -697,7 +703,7 @@ mod test {
|
||||
}
|
||||
|
||||
#[async_test]
|
||||
pub async fn migrating_v5_to_v6() {
|
||||
pub async fn migrating_v5_to_v7() {
|
||||
let room_id = room_id!("!room:localhost");
|
||||
let invite_member_event =
|
||||
Raw::new(&*test_json::MEMBER_INVITE).unwrap().cast::<SyncRoomMemberEvent>();
|
||||
|
||||
@@ -34,7 +34,9 @@ use ruma::{
|
||||
events::{
|
||||
presence::PresenceEvent,
|
||||
receipt::{Receipt, ReceiptThread, ReceiptType},
|
||||
room::member::{RoomMemberEventContent, StrippedRoomMemberEvent, SyncRoomMemberEvent},
|
||||
room::member::{
|
||||
MembershipState, RoomMemberEventContent, StrippedRoomMemberEvent, SyncRoomMemberEvent,
|
||||
},
|
||||
AnyGlobalAccountDataEvent, AnyRoomAccountDataEvent, AnySyncStateEvent,
|
||||
GlobalAccountDataEventType, RoomAccountDataEventType, StateEventType, SyncStateEvent,
|
||||
},
|
||||
@@ -873,10 +875,7 @@ impl SledStateStore {
|
||||
.deserialize_value::<RoomMember>(&u.map_err(StoreError::backend)?.1)
|
||||
.map_err(StoreError::backend)?;
|
||||
|
||||
Ok((memberships.is_empty()
|
||||
|| memberships
|
||||
.contains(RoomMemberships::from_bits_retain(member.membership)))
|
||||
.then_some(member.user_id))
|
||||
Ok(memberships.matches(&member.membership).then_some(member.user_id))
|
||||
})
|
||||
.filter_map(|u| u.transpose())
|
||||
.collect::<StoreResult<Vec<_>>>()
|
||||
@@ -1381,24 +1380,18 @@ impl StateStore for SledStateStore {
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
struct RoomMember {
|
||||
user_id: OwnedUserId,
|
||||
membership: u16,
|
||||
membership: MembershipState,
|
||||
}
|
||||
|
||||
impl From<&SyncStateEvent<RoomMemberEventContent>> for RoomMember {
|
||||
fn from(event: &SyncStateEvent<RoomMemberEventContent>) -> Self {
|
||||
Self {
|
||||
user_id: event.state_key().clone(),
|
||||
membership: RoomMemberships::from(event.membership()).bits(),
|
||||
}
|
||||
Self { user_id: event.state_key().clone(), membership: event.membership().clone() }
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&StrippedRoomMemberEvent> for RoomMember {
|
||||
fn from(event: &StrippedRoomMemberEvent) -> Self {
|
||||
Self {
|
||||
user_id: event.state_key.clone(),
|
||||
membership: RoomMemberships::from(&event.content.membership).bits(),
|
||||
}
|
||||
Self { user_id: event.state_key.clone(), membership: event.content.membership.clone() }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user