summaryrefslogtreecommitdiff
path: root/src/database/key_value/rooms/state.rs
diff options
context:
space:
mode:
authorTimo Kösters <timo@koesters.xyz>2022-07-10 16:28:43 +0200
committerNyaaori <+@nyaaori.cat>2022-10-10 10:46:39 +0200
commitb0029c49b917ccecc06c475db709aeef4671256c (patch)
treea57bf1a87717ca86d76dbf366fc52033611c17fe /src/database/key_value/rooms/state.rs
parent91ad250177f5d9c698fc31248ff20447d22a979d (diff)
downloadconduit-b0029c49b917ccecc06c475db709aeef4671256c.zip
refactor: work on search
Diffstat (limited to 'src/database/key_value/rooms/state.rs')
-rw-r--r--src/database/key_value/rooms/state.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/database/key_value/rooms/state.rs b/src/database/key_value/rooms/state.rs
new file mode 100644
index 0000000..5daf6c6
--- /dev/null
+++ b/src/database/key_value/rooms/state.rs
@@ -0,0 +1,62 @@
+impl service::room::state::Data for KeyValueDatabase {
+ fn get_room_shortstatehash(&self, room_id: &RoomId) -> Result<Option<u64>> {
+ self.roomid_shortstatehash
+ .get(room_id.as_bytes())?
+ .map_or(Ok(None), |bytes| {
+ Ok(Some(utils::u64_from_bytes(&bytes).map_err(|_| {
+ Error::bad_database("Invalid shortstatehash in roomid_shortstatehash")
+ })?))
+ })
+ }
+
+ fn set_room_state(&self, room_id: &RoomId, new_shortstatehash: u64
+ _mutex_lock: &MutexGuard<'_, StateLock>, // Take mutex guard to make sure users get the room state mutex
+ ) -> Result<()> {
+ self.roomid_shortstatehash
+ .insert(room_id.as_bytes(), &new_shortstatehash.to_be_bytes())?;
+ Ok(())
+ }
+
+ fn set_event_state(&self) -> Result<()> {
+ db.shorteventid_shortstatehash
+ .insert(&shorteventid.to_be_bytes(), &shortstatehash.to_be_bytes())?;
+ Ok(())
+ }
+
+ fn get_pdu_leaves(&self, room_id: &RoomId) -> Result<HashSet<Arc<EventId>>> {
+ let mut prefix = room_id.as_bytes().to_vec();
+ prefix.push(0xff);
+
+ self.roomid_pduleaves
+ .scan_prefix(prefix)
+ .map(|(_, bytes)| {
+ EventId::parse_arc(utils::string_from_bytes(&bytes).map_err(|_| {
+ Error::bad_database("EventID in roomid_pduleaves is invalid unicode.")
+ })?)
+ .map_err(|_| Error::bad_database("EventId in roomid_pduleaves is invalid."))
+ })
+ .collect()
+ }
+
+ fn set_forward_extremities(
+ &self,
+ room_id: &RoomId,
+ event_ids: impl IntoIterator<Item = &'a EventId> + Debug,
+ _mutex_lock: &MutexGuard<'_, StateLock>, // Take mutex guard to make sure users get the room state mutex
+ ) -> Result<()> {
+ let mut prefix = room_id.as_bytes().to_vec();
+ prefix.push(0xff);
+
+ for (key, _) in self.roomid_pduleaves.scan_prefix(prefix.clone()) {
+ self.roomid_pduleaves.remove(&key)?;
+ }
+
+ for event_id in event_ids {
+ let mut key = prefix.to_owned();
+ key.extend_from_slice(event_id.as_bytes());
+ self.roomid_pduleaves.insert(&key, event_id.as_bytes())?;
+ }
+
+ Ok(())
+ }
+}