diff --git a/src/database/rooms.rs b/src/database/rooms.rs index fc01e8ae..400ce386 100644 --- a/src/database/rooms.rs +++ b/src/database/rooms.rs @@ -249,7 +249,10 @@ impl Rooms { /// Checks if a room exists. pub fn exists(&self, room_id: &RoomId) -> Result { - let prefix = self.get_shortroomid(room_id)?.to_be_bytes().to_vec(); + let prefix = match self.get_shortroomid(room_id)? { + Some(b) => b.to_be_bytes().to_vec(), + None => return Ok(false), + }; // Look for PDUs in that room. Ok(self @@ -262,7 +265,7 @@ impl Rooms { /// Checks if a room exists. pub fn first_pdu_in_room(&self, room_id: &RoomId) -> Result>> { - let prefix = self.get_shortroomid(room_id)?.to_be_bytes().to_vec(); + let prefix = self.get_shortroomid(room_id)?.expect("room exists").to_be_bytes().to_vec(); // Look for PDUs in that room. self.pduid_pdu @@ -627,12 +630,12 @@ impl Rooms { }) } - pub fn get_shortroomid(&self, room_id: &RoomId) -> Result { - let bytes = self + pub fn get_shortroomid(&self, room_id: &RoomId) -> Result> { + self .roomid_shortroomid .get(&room_id.as_bytes())? - .expect("every room has a shortroomid"); - utils::u64_from_bytes(&bytes).map_err(|_| Error::bad_database("Invalid shortroomid in db.")) + .map(|bytes| + utils::u64_from_bytes(&bytes).map_err(|_| Error::bad_database("Invalid shortroomid in db."))).transpose() } pub fn get_shortstatekey( @@ -781,7 +784,7 @@ impl Rooms { } pub fn latest_pdu_count(&self, room_id: &RoomId) -> Result { - let prefix = self.get_shortroomid(room_id)?.to_be_bytes().to_vec(); + let prefix = self.get_shortroomid(room_id)?.expect("room exists").to_be_bytes().to_vec(); let mut last_possible_key = prefix.clone(); last_possible_key.extend_from_slice(&u64::MAX.to_be_bytes()); @@ -1021,7 +1024,7 @@ impl Rooms { leaves: &[EventId], db: &Database, ) -> Result> { - let shortroomid = self.get_shortroomid(&pdu.room_id)?; + let shortroomid = self.get_shortroomid(&pdu.room_id)?.expect("room exists"); // Make unsigned fields correct. This is not properly documented in the spec, but state // events need to have previous content in the unsigned field, so clients can easily @@ -1846,7 +1849,7 @@ impl Rooms { room_id: &RoomId, since: u64, ) -> Result, PduEvent)>> + 'a> { - let prefix = self.get_shortroomid(room_id)?.to_be_bytes().to_vec(); + let prefix = self.get_shortroomid(room_id)?.expect("room exists").to_be_bytes().to_vec(); // Skip the first pdu if it's exactly at since, because we sent that last time let mut first_pdu_id = prefix.clone(); @@ -1878,7 +1881,7 @@ impl Rooms { until: u64, ) -> Result, PduEvent)>> + 'a> { // Create the first part of the full pdu id - let prefix = self.get_shortroomid(room_id)?.to_be_bytes().to_vec(); + let prefix = self.get_shortroomid(room_id)?.expect("room exists").to_be_bytes().to_vec(); let mut current = prefix.clone(); current.extend_from_slice(&(until.saturating_sub(1)).to_be_bytes()); // -1 because we don't want event at `until` @@ -1911,7 +1914,7 @@ impl Rooms { from: u64, ) -> Result, PduEvent)>> + 'a> { // Create the first part of the full pdu id - let prefix = self.get_shortroomid(room_id)?.to_be_bytes().to_vec(); + let prefix = self.get_shortroomid(room_id)?.expect("room exists").to_be_bytes().to_vec(); let mut current = prefix.clone(); current.extend_from_slice(&(from + 1).to_be_bytes()); // +1 so we don't send the base event @@ -2462,7 +2465,7 @@ impl Rooms { room_id: &RoomId, search_string: &str, ) -> Result<(impl Iterator> + 'a, Vec)> { - let prefix = self.get_shortroomid(room_id)?.to_be_bytes().to_vec(); + let prefix = self.get_shortroomid(room_id)?.expect("room exists").to_be_bytes().to_vec(); let prefix_clone = prefix.clone(); let words = search_string