base: Use encoded keys for the whole sled store

master
Damir Jelić 2021-01-26 14:04:37 +01:00
parent b4a916b797
commit fc085a7391
1 changed files with 45 additions and 35 deletions

View File

@ -84,6 +84,18 @@ trait EncodeKey {
fn encode(&self) -> Vec<u8>; fn encode(&self) -> Vec<u8>;
} }
impl EncodeKey for &UserId {
fn encode(&self) -> Vec<u8> {
self.as_str().encode()
}
}
impl EncodeKey for &RoomId {
fn encode(&self) -> Vec<u8> {
self.as_str().encode()
}
}
impl EncodeKey for &str { impl EncodeKey for &str {
fn encode(&self) -> Vec<u8> { fn encode(&self) -> Vec<u8> {
[self.as_bytes(), &[Self::SEPARATOR]].concat() [self.as_bytes(), &[Self::SEPARATOR]].concat()
@ -187,7 +199,7 @@ impl SledStore {
let db = Config::new().temporary(false).path(path).open()?; let db = Config::new().temporary(false).path(path).open()?;
let store_key: Option<DatabaseType> = db let store_key: Option<DatabaseType> = db
.get("store_key")? .get("store_key".encode())?
.map(|k| serde_json::from_slice(&k).map_err(StoreError::Json)) .map(|k| serde_json::from_slice(&k).map_err(StoreError::Json))
.transpose()?; .transpose()?;
@ -203,7 +215,7 @@ impl SledStore {
key.export(passphrase) key.export(passphrase)
.map_err::<StoreError, _>(|e| e.into())?, .map_err::<StoreError, _>(|e| e.into())?,
); );
db.insert("store_key", serde_json::to_vec(&encrypted_key)?)?; db.insert("store_key".encode(), serde_json::to_vec(&encrypted_key)?)?;
key key
}; };
@ -243,7 +255,7 @@ impl SledStore {
pub async fn save_filter(&self, filter_name: &str, filter_id: &str) -> Result<()> { pub async fn save_filter(&self, filter_name: &str, filter_id: &str) -> Result<()> {
self.session self.session
.insert(&format!("filter{}", filter_name), filter_id)?; .insert(("filter", filter_name).encode(), filter_id)?;
Ok(()) Ok(())
} }
@ -251,14 +263,14 @@ impl SledStore {
pub async fn get_filter(&self, filter_name: &str) -> Result<Option<String>> { pub async fn get_filter(&self, filter_name: &str) -> Result<Option<String>> {
Ok(self Ok(self
.session .session
.get(&format!("filter{}", filter_name))? .get(("filter", filter_name).encode())?
.map(|f| String::from_utf8_lossy(&f).to_string())) .map(|f| String::from_utf8_lossy(&f).to_string()))
} }
pub async fn get_sync_token(&self) -> Result<Option<String>> { pub async fn get_sync_token(&self) -> Result<Option<String>> {
Ok(self Ok(self
.session .session
.get("sync_token")? .get("sync_token".encode())?
.map(|t| String::from_utf8_lossy(&t).to_string())) .map(|t| String::from_utf8_lossy(&t).to_string()))
} }
@ -299,17 +311,17 @@ impl SledStore {
stripped_state, stripped_state,
)| { )| {
if let Some(s) = &changes.sync_token { if let Some(s) = &changes.sync_token {
session.insert("sync_token", s.as_str())?; session.insert("sync_token".encode(), s.as_str())?;
} }
for (room, events) in &changes.members { for (room, events) in &changes.members {
let profile_changes = changes.profiles.get(room); let profile_changes = changes.profiles.get(room);
for event in events.values() { for event in events.values() {
let key = format!("{}{}", room.as_str(), event.state_key.as_str()); let key = (room.as_str(), event.state_key.as_str()).encode();
let old_profile: Option<MemberEventContent> = if let Some(p) = profiles let old_profile: Option<MemberEventContent> = if let Some(p) = profiles
.get(key.as_str())? .get(key.as_slice())?
.map(|p| self.deserialize_event(&p)) .map(|p| self.deserialize_event(&p))
.transpose() .transpose()
.map_err(ConflictableTransactionError::Abort)? .map_err(ConflictableTransactionError::Abort)?
@ -317,7 +329,7 @@ impl SledStore {
p p
} else { } else {
members members
.get(key.as_str())? .get(key.as_slice())?
.map(|m| self.deserialize_event::<MemberEvent>(&m)) .map(|m| self.deserialize_event::<MemberEvent>(&m))
.transpose() .transpose()
.map_err(ConflictableTransactionError::Abort)? .map_err(ConflictableTransactionError::Abort)?
@ -351,28 +363,28 @@ impl SledStore {
match event.content.membership { match event.content.membership {
MembershipState::Join => { MembershipState::Join => {
joined.insert(key.as_str(), event.state_key.as_str())?; joined.insert(key.as_slice(), event.state_key.as_str())?;
invited.remove(key.as_str())?; invited.remove(key.as_slice())?;
display_names.remove(old_display_name_key)?; display_names.remove(old_display_name_key)?;
display_names display_names
.insert(display_name_key, event.state_key.as_str())?; .insert(display_name_key, event.state_key.as_str())?;
} }
MembershipState::Invite => { MembershipState::Invite => {
invited.insert(key.as_str(), event.state_key.as_str())?; invited.insert(key.as_slice(), event.state_key.as_str())?;
joined.remove(key.as_str())?; joined.remove(key.as_slice())?;
display_names.remove(old_display_name_key)?; display_names.remove(old_display_name_key)?;
display_names display_names
.insert(display_name_key, event.state_key.as_str())?; .insert(display_name_key, event.state_key.as_str())?;
} }
_ => { _ => {
display_names.remove(old_display_name_key)?; display_names.remove(old_display_name_key)?;
joined.remove(key.as_str())?; joined.remove(key.as_slice())?;
invited.remove(key.as_str())?; invited.remove(key.as_slice())?;
} }
} }
members.insert( members.insert(
key.as_str(), key.as_slice(),
self.serialize_event(&event) self.serialize_event(&event)
.map_err(ConflictableTransactionError::Abort)?, .map_err(ConflictableTransactionError::Abort)?,
)?; )?;
@ -381,7 +393,7 @@ impl SledStore {
profile_changes.map(|p| p.get(&event.state_key)).flatten() profile_changes.map(|p| p.get(&event.state_key)).flatten()
{ {
profiles.insert( profiles.insert(
key.as_str(), key.as_slice(),
self.serialize_event(&profile) self.serialize_event(&profile)
.map_err(ConflictableTransactionError::Abort)?, .map_err(ConflictableTransactionError::Abort)?,
)?; )?;
@ -391,7 +403,7 @@ impl SledStore {
for (event_type, event) in &changes.account_data { for (event_type, event) in &changes.account_data {
account_data.insert( account_data.insert(
event_type.as_str(), event_type.as_str().encode(),
self.serialize_event(&event) self.serialize_event(&event)
.map_err(ConflictableTransactionError::Abort)?, .map_err(ConflictableTransactionError::Abort)?,
)?; )?;
@ -400,7 +412,7 @@ impl SledStore {
for (room, events) in &changes.room_account_data { for (room, events) in &changes.room_account_data {
for (event_type, event) in events { for (event_type, event) in events {
room_account_data.insert( room_account_data.insert(
format!("{}{}", room.as_str(), event_type).as_str(), (room.as_str(), event_type.as_str()).encode(),
self.serialize_event(&event) self.serialize_event(&event)
.map_err(ConflictableTransactionError::Abort)?, .map_err(ConflictableTransactionError::Abort)?,
)?; )?;
@ -411,13 +423,12 @@ impl SledStore {
for events in event_types.values() { for events in event_types.values() {
for event in events.values() { for event in events.values() {
state.insert( state.insert(
format!( (
"{}{}{}",
room.as_str(), room.as_str(),
event.content().event_type(), event.content().event_type(),
event.state_key(), event.state_key(),
) )
.as_bytes(), .encode(),
self.serialize_event(&event) self.serialize_event(&event)
.map_err(ConflictableTransactionError::Abort)?, .map_err(ConflictableTransactionError::Abort)?,
)?; )?;
@ -427,7 +438,7 @@ impl SledStore {
for (room_id, room_info) in &changes.room_infos { for (room_id, room_info) in &changes.room_infos {
rooms.insert( rooms.insert(
room_id.as_bytes(), room_id.encode(),
self.serialize_event(room_info) self.serialize_event(room_info)
.map_err(ConflictableTransactionError::Abort)?, .map_err(ConflictableTransactionError::Abort)?,
)?; )?;
@ -435,7 +446,7 @@ impl SledStore {
for (sender, event) in &changes.presence { for (sender, event) in &changes.presence {
presence.insert( presence.insert(
sender.as_bytes(), sender.encode(),
self.serialize_event(&event) self.serialize_event(&event)
.map_err(ConflictableTransactionError::Abort)?, .map_err(ConflictableTransactionError::Abort)?,
)?; )?;
@ -443,7 +454,7 @@ impl SledStore {
for (room_id, info) in &changes.invited_room_info { for (room_id, info) in &changes.invited_room_info {
striped_rooms.insert( striped_rooms.insert(
room_id.as_str(), room_id.encode(),
self.serialize_event(&info) self.serialize_event(&info)
.map_err(ConflictableTransactionError::Abort)?, .map_err(ConflictableTransactionError::Abort)?,
)?; )?;
@ -452,7 +463,7 @@ impl SledStore {
for (room, events) in &changes.stripped_members { for (room, events) in &changes.stripped_members {
for event in events.values() { for event in events.values() {
stripped_members.insert( stripped_members.insert(
format!("{}{}", room.as_str(), &event.state_key).as_str(), (room.as_str(), event.state_key.as_str()).encode(),
self.serialize_event(&event) self.serialize_event(&event)
.map_err(ConflictableTransactionError::Abort)?, .map_err(ConflictableTransactionError::Abort)?,
)?; )?;
@ -463,13 +474,12 @@ impl SledStore {
for events in event_types.values() { for events in event_types.values() {
for event in events.values() { for event in events.values() {
stripped_state.insert( stripped_state.insert(
format!( (
"{}{}{}",
room.as_str(), room.as_str(),
event.content().event_type(), event.content().event_type(),
event.state_key(), event.state_key(),
) )
.as_bytes(), .encode(),
self.serialize_event(&event) self.serialize_event(&event)
.map_err(ConflictableTransactionError::Abort)?, .map_err(ConflictableTransactionError::Abort)?,
)?; )?;
@ -493,7 +503,7 @@ impl SledStore {
pub async fn get_presence_event(&self, user_id: &UserId) -> Result<Option<PresenceEvent>> { pub async fn get_presence_event(&self, user_id: &UserId) -> Result<Option<PresenceEvent>> {
Ok(self Ok(self
.presence .presence
.get(user_id.as_bytes())? .get(user_id.encode())?
.map(|e| self.deserialize_event(&e)) .map(|e| self.deserialize_event(&e))
.transpose()?) .transpose()?)
} }
@ -506,7 +516,7 @@ impl SledStore {
) -> Result<Option<AnySyncStateEvent>> { ) -> Result<Option<AnySyncStateEvent>> {
Ok(self Ok(self
.room_state .room_state
.get(format!("{}{}{}", room_id.as_str(), event_type, state_key).as_bytes())? .get((room_id.as_str(), event_type.to_string().as_str(), state_key).encode())?
.map(|e| self.deserialize_event(&e)) .map(|e| self.deserialize_event(&e))
.transpose()?) .transpose()?)
} }
@ -518,7 +528,7 @@ impl SledStore {
) -> Result<Option<MemberEventContent>> { ) -> Result<Option<MemberEventContent>> {
Ok(self Ok(self
.profiles .profiles
.get(format!("{}{}", room_id.as_str(), user_id.as_str()))? .get((room_id.as_str(), user_id.as_str()).encode())?
.map(|p| self.deserialize_event(&p)) .map(|p| self.deserialize_event(&p))
.transpose()?) .transpose()?)
} }
@ -530,7 +540,7 @@ impl SledStore {
) -> Result<Option<MemberEvent>> { ) -> Result<Option<MemberEvent>> {
Ok(self Ok(self
.members .members
.get(format!("{}{}", room_id.as_str(), state_key.as_str()))? .get((room_id.as_str(), state_key.as_str()).encode())?
.map(|v| self.deserialize_event(&v)) .map(|v| self.deserialize_event(&v))
.transpose()?) .transpose()?)
} }
@ -541,7 +551,7 @@ impl SledStore {
) -> impl Stream<Item = Result<UserId>> { ) -> impl Stream<Item = Result<UserId>> {
stream::iter( stream::iter(
self.invited_user_ids self.invited_user_ids
.scan_prefix(room_id.as_str()) .scan_prefix(room_id.encode())
.map(|u| { .map(|u| {
UserId::try_from(String::from_utf8_lossy(&u?.1).to_string()) UserId::try_from(String::from_utf8_lossy(&u?.1).to_string())
.map_err(StoreError::Identifier) .map_err(StoreError::Identifier)
@ -553,7 +563,7 @@ impl SledStore {
&self, &self,
room_id: &RoomId, room_id: &RoomId,
) -> impl Stream<Item = Result<UserId>> { ) -> impl Stream<Item = Result<UserId>> {
stream::iter(self.joined_user_ids.scan_prefix(room_id.as_str()).map(|u| { stream::iter(self.joined_user_ids.scan_prefix(room_id.encode()).map(|u| {
UserId::try_from(String::from_utf8_lossy(&u?.1).to_string()) UserId::try_from(String::from_utf8_lossy(&u?.1).to_string())
.map_err(StoreError::Identifier) .map_err(StoreError::Identifier)
})) }))