Refactor for structured insertions
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
8258d16a94
commit
2ed0c267eb
31 changed files with 364 additions and 621 deletions
|
@ -26,10 +26,10 @@ impl crate::Service for Service {
|
|||
}
|
||||
|
||||
#[implement(Service)]
|
||||
pub fn set_public(&self, room_id: &RoomId) { self.db.publicroomids.insert(room_id.as_bytes(), &[]); }
|
||||
pub fn set_public(&self, room_id: &RoomId) { self.db.publicroomids.insert(room_id, []); }
|
||||
|
||||
#[implement(Service)]
|
||||
pub fn set_not_public(&self, room_id: &RoomId) { self.db.publicroomids.remove(room_id.as_bytes()); }
|
||||
pub fn set_not_public(&self, room_id: &RoomId) { self.db.publicroomids.remove(room_id); }
|
||||
|
||||
#[implement(Service)]
|
||||
pub async fn is_public_room(&self, room_id: &RoomId) -> bool { self.db.publicroomids.get(room_id).await.is_ok() }
|
||||
|
|
|
@ -79,17 +79,9 @@ pub fn lazy_load_confirm_delivery(&self, user_id: &UserId, device_id: &DeviceId,
|
|||
return;
|
||||
};
|
||||
|
||||
let mut prefix = user_id.as_bytes().to_vec();
|
||||
prefix.push(0xFF);
|
||||
prefix.extend_from_slice(device_id.as_bytes());
|
||||
prefix.push(0xFF);
|
||||
prefix.extend_from_slice(room_id.as_bytes());
|
||||
prefix.push(0xFF);
|
||||
|
||||
for ll_id in &user_ids {
|
||||
let mut key = prefix.clone();
|
||||
key.extend_from_slice(ll_id.as_bytes());
|
||||
self.db.lazyloadedids.insert(&key, &[]);
|
||||
let key = (user_id, device_id, room_id, ll_id);
|
||||
self.db.lazyloadedids.put_raw(key, []);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -64,9 +64,9 @@ pub fn iter_ids(&self) -> impl Stream<Item = &RoomId> + Send + '_ { self.db.room
|
|||
#[inline]
|
||||
pub fn disable_room(&self, room_id: &RoomId, disabled: bool) {
|
||||
if disabled {
|
||||
self.db.disabledroomids.insert(room_id.as_bytes(), &[]);
|
||||
self.db.disabledroomids.insert(room_id, []);
|
||||
} else {
|
||||
self.db.disabledroomids.remove(room_id.as_bytes());
|
||||
self.db.disabledroomids.remove(room_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -74,9 +74,9 @@ pub fn disable_room(&self, room_id: &RoomId, disabled: bool) {
|
|||
#[inline]
|
||||
pub fn ban_room(&self, room_id: &RoomId, banned: bool) {
|
||||
if banned {
|
||||
self.db.bannedroomids.insert(room_id.as_bytes(), &[]);
|
||||
self.db.bannedroomids.insert(room_id, []);
|
||||
} else {
|
||||
self.db.bannedroomids.remove(room_id.as_bytes());
|
||||
self.db.bannedroomids.remove(room_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use std::sync::Arc;
|
||||
|
||||
use conduit::{implement, Result};
|
||||
use database::{Deserialized, Map};
|
||||
use database::{Deserialized, Json, Map};
|
||||
use ruma::{CanonicalJsonObject, EventId};
|
||||
|
||||
use crate::PduEvent;
|
||||
|
@ -50,8 +50,5 @@ pub async fn get_pdu_outlier(&self, event_id: &EventId) -> Result<PduEvent> {
|
|||
#[implement(Service)]
|
||||
#[tracing::instrument(skip(self, pdu), level = "debug")]
|
||||
pub fn add_pdu_outlier(&self, event_id: &EventId, pdu: &CanonicalJsonObject) {
|
||||
self.db.eventid_outlierpdu.insert(
|
||||
event_id.as_bytes(),
|
||||
&serde_json::to_vec(&pdu).expect("CanonicalJsonObject is valid"),
|
||||
);
|
||||
self.db.eventid_outlierpdu.raw_put(event_id, Json(pdu));
|
||||
}
|
||||
|
|
|
@ -39,9 +39,10 @@ impl Data {
|
|||
}
|
||||
|
||||
pub(super) fn add_relation(&self, from: u64, to: u64) {
|
||||
let mut key = to.to_be_bytes().to_vec();
|
||||
key.extend_from_slice(&from.to_be_bytes());
|
||||
self.tofrom_relation.insert(&key, &[]);
|
||||
const BUFSIZE: usize = size_of::<u64>() * 2;
|
||||
|
||||
let key: &[u64] = &[to, from];
|
||||
self.tofrom_relation.aput_raw::<BUFSIZE, _, _>(key, []);
|
||||
}
|
||||
|
||||
pub(super) fn relations_until<'a>(
|
||||
|
@ -78,9 +79,8 @@ impl Data {
|
|||
|
||||
pub(super) fn mark_as_referenced(&self, room_id: &RoomId, event_ids: &[Arc<EventId>]) {
|
||||
for prev in event_ids {
|
||||
let mut key = room_id.as_bytes().to_vec();
|
||||
key.extend_from_slice(prev.as_bytes());
|
||||
self.referencedevents.insert(&key, &[]);
|
||||
let key = (room_id, prev);
|
||||
self.referencedevents.put_raw(key, []);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -89,9 +89,7 @@ impl Data {
|
|||
self.referencedevents.qry(&key).await.is_ok()
|
||||
}
|
||||
|
||||
pub(super) fn mark_event_soft_failed(&self, event_id: &EventId) {
|
||||
self.softfailedeventids.insert(event_id.as_bytes(), &[]);
|
||||
}
|
||||
pub(super) fn mark_event_soft_failed(&self, event_id: &EventId) { self.softfailedeventids.insert(event_id, []); }
|
||||
|
||||
pub(super) async fn is_event_soft_failed(&self, event_id: &EventId) -> bool {
|
||||
self.softfailedeventids.get(event_id).await.is_ok()
|
||||
|
|
|
@ -5,7 +5,7 @@ use conduit::{
|
|||
utils::{stream::TryIgnore, ReadyExt},
|
||||
Error, Result,
|
||||
};
|
||||
use database::{Deserialized, Map};
|
||||
use database::{Deserialized, Json, Map};
|
||||
use futures::{Stream, StreamExt};
|
||||
use ruma::{
|
||||
events::{receipt::ReceiptEvent, AnySyncEphemeralRoomEvent},
|
||||
|
@ -44,33 +44,19 @@ impl Data {
|
|||
pub(super) async fn readreceipt_update(&self, user_id: &UserId, room_id: &RoomId, event: &ReceiptEvent) {
|
||||
type KeyVal<'a> = (&'a RoomId, u64, &'a UserId);
|
||||
|
||||
let mut prefix = room_id.as_bytes().to_vec();
|
||||
prefix.push(0xFF);
|
||||
|
||||
let mut last_possible_key = prefix.clone();
|
||||
last_possible_key.extend_from_slice(&u64::MAX.to_be_bytes());
|
||||
|
||||
// Remove old entry
|
||||
let last_possible_key = (room_id, u64::MAX);
|
||||
self.readreceiptid_readreceipt
|
||||
.rev_keys_from_raw(&last_possible_key)
|
||||
.rev_keys_from(&last_possible_key)
|
||||
.ignore_err()
|
||||
.ready_take_while(|(r, ..): &KeyVal<'_>| *r == room_id)
|
||||
.ready_filter_map(|(r, c, u): KeyVal<'_>| (u == user_id).then_some((r, c, u)))
|
||||
.ready_for_each(|old: KeyVal<'_>| {
|
||||
// This is the old room_latest
|
||||
self.readreceiptid_readreceipt.del(&old);
|
||||
})
|
||||
.ready_for_each(|old: KeyVal<'_>| self.readreceiptid_readreceipt.del(old))
|
||||
.await;
|
||||
|
||||
let mut room_latest_id = prefix;
|
||||
room_latest_id.extend_from_slice(&self.services.globals.next_count().unwrap().to_be_bytes());
|
||||
room_latest_id.push(0xFF);
|
||||
room_latest_id.extend_from_slice(user_id.as_bytes());
|
||||
|
||||
self.readreceiptid_readreceipt.insert(
|
||||
&room_latest_id,
|
||||
&serde_json::to_vec(event).expect("EduEvent::to_string always works"),
|
||||
);
|
||||
let count = self.services.globals.next_count().unwrap();
|
||||
let latest_id = (room_id, count, user_id);
|
||||
self.readreceiptid_readreceipt.put(latest_id, Json(event));
|
||||
}
|
||||
|
||||
pub(super) fn readreceipts_since<'a>(
|
||||
|
@ -113,15 +99,11 @@ impl Data {
|
|||
}
|
||||
|
||||
pub(super) fn private_read_set(&self, room_id: &RoomId, user_id: &UserId, count: u64) {
|
||||
let mut key = room_id.as_bytes().to_vec();
|
||||
key.push(0xFF);
|
||||
key.extend_from_slice(user_id.as_bytes());
|
||||
let key = (room_id, user_id);
|
||||
let next_count = self.services.globals.next_count().unwrap();
|
||||
|
||||
self.roomuserid_privateread
|
||||
.insert(&key, &count.to_be_bytes());
|
||||
|
||||
self.roomuserid_lastprivatereadupdate
|
||||
.insert(&key, &self.services.globals.next_count().unwrap().to_be_bytes());
|
||||
self.roomuserid_privateread.put(key, count);
|
||||
self.roomuserid_lastprivatereadupdate.put(key, next_count);
|
||||
}
|
||||
|
||||
pub(super) async fn private_read_get(&self, room_id: &RoomId, user_id: &UserId) -> Result<u64> {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use std::sync::Arc;
|
||||
use std::{mem::size_of_val, sync::Arc};
|
||||
|
||||
use conduit::{err, implement, utils, Result};
|
||||
use database::{Deserialized, Map};
|
||||
|
@ -46,6 +46,8 @@ impl crate::Service for Service {
|
|||
|
||||
#[implement(Service)]
|
||||
pub async fn get_or_create_shorteventid(&self, event_id: &EventId) -> u64 {
|
||||
const BUFSIZE: usize = size_of::<u64>();
|
||||
|
||||
if let Ok(shorteventid) = self
|
||||
.db
|
||||
.eventid_shorteventid
|
||||
|
@ -57,12 +59,15 @@ pub async fn get_or_create_shorteventid(&self, event_id: &EventId) -> u64 {
|
|||
}
|
||||
|
||||
let shorteventid = self.services.globals.next_count().unwrap();
|
||||
debug_assert!(size_of_val(&shorteventid) == BUFSIZE, "buffer requirement changed");
|
||||
|
||||
self.db
|
||||
.eventid_shorteventid
|
||||
.insert(event_id.as_bytes(), &shorteventid.to_be_bytes());
|
||||
.raw_aput::<BUFSIZE, _, _>(event_id, shorteventid);
|
||||
|
||||
self.db
|
||||
.shorteventid_eventid
|
||||
.insert(&shorteventid.to_be_bytes(), event_id.as_bytes());
|
||||
.aput_raw::<BUFSIZE, _, _>(shorteventid, event_id);
|
||||
|
||||
shorteventid
|
||||
}
|
||||
|
@ -77,13 +82,17 @@ pub async fn multi_get_or_create_shorteventid(&self, event_ids: &[&EventId]) ->
|
|||
.map(|(i, result)| match result {
|
||||
Ok(ref short) => utils::u64_from_u8(short),
|
||||
Err(_) => {
|
||||
const BUFSIZE: usize = size_of::<u64>();
|
||||
|
||||
let short = self.services.globals.next_count().unwrap();
|
||||
debug_assert!(size_of_val(&short) == BUFSIZE, "buffer requirement changed");
|
||||
|
||||
self.db
|
||||
.eventid_shorteventid
|
||||
.insert(event_ids[i], &short.to_be_bytes());
|
||||
.raw_aput::<BUFSIZE, _, _>(event_ids[i], short);
|
||||
self.db
|
||||
.shorteventid_eventid
|
||||
.insert(&short.to_be_bytes(), event_ids[i]);
|
||||
.aput_raw::<BUFSIZE, _, _>(short, event_ids[i]);
|
||||
|
||||
short
|
||||
},
|
||||
|
@ -103,7 +112,9 @@ pub async fn get_shortstatekey(&self, event_type: &StateEventType, state_key: &s
|
|||
|
||||
#[implement(Service)]
|
||||
pub async fn get_or_create_shortstatekey(&self, event_type: &StateEventType, state_key: &str) -> u64 {
|
||||
let key = (event_type.to_string(), state_key);
|
||||
const BUFSIZE: usize = size_of::<u64>();
|
||||
|
||||
let key = (event_type, state_key);
|
||||
if let Ok(shortstatekey) = self
|
||||
.db
|
||||
.statekey_shortstatekey
|
||||
|
@ -114,17 +125,16 @@ pub async fn get_or_create_shortstatekey(&self, event_type: &StateEventType, sta
|
|||
return shortstatekey;
|
||||
}
|
||||
|
||||
let mut key = event_type.to_string().as_bytes().to_vec();
|
||||
key.push(0xFF);
|
||||
key.extend_from_slice(state_key.as_bytes());
|
||||
|
||||
let shortstatekey = self.services.globals.next_count().unwrap();
|
||||
debug_assert!(size_of_val(&shortstatekey) == BUFSIZE, "buffer requirement changed");
|
||||
|
||||
self.db
|
||||
.statekey_shortstatekey
|
||||
.insert(&key, &shortstatekey.to_be_bytes());
|
||||
.put_aput::<BUFSIZE, _, _>(key, shortstatekey);
|
||||
|
||||
self.db
|
||||
.shortstatekey_statekey
|
||||
.insert(&shortstatekey.to_be_bytes(), &key);
|
||||
.aput_put::<BUFSIZE, _, _>(shortstatekey, key);
|
||||
|
||||
shortstatekey
|
||||
}
|
||||
|
@ -177,6 +187,8 @@ pub async fn get_statekey_from_short(&self, shortstatekey: u64) -> Result<(State
|
|||
/// Returns (shortstatehash, already_existed)
|
||||
#[implement(Service)]
|
||||
pub async fn get_or_create_shortstatehash(&self, state_hash: &[u8]) -> (u64, bool) {
|
||||
const BUFSIZE: usize = size_of::<u64>();
|
||||
|
||||
if let Ok(shortstatehash) = self
|
||||
.db
|
||||
.statehash_shortstatehash
|
||||
|
@ -188,9 +200,11 @@ pub async fn get_or_create_shortstatehash(&self, state_hash: &[u8]) -> (u64, boo
|
|||
}
|
||||
|
||||
let shortstatehash = self.services.globals.next_count().unwrap();
|
||||
debug_assert!(size_of_val(&shortstatehash) == BUFSIZE, "buffer requirement changed");
|
||||
|
||||
self.db
|
||||
.statehash_shortstatehash
|
||||
.insert(state_hash, &shortstatehash.to_be_bytes());
|
||||
.raw_aput::<BUFSIZE, _, _>(state_hash, shortstatehash);
|
||||
|
||||
(shortstatehash, false)
|
||||
}
|
||||
|
@ -208,10 +222,15 @@ pub async fn get_or_create_shortroomid(&self, room_id: &RoomId) -> u64 {
|
|||
.await
|
||||
.deserialized()
|
||||
.unwrap_or_else(|_| {
|
||||
const BUFSIZE: usize = size_of::<u64>();
|
||||
|
||||
let short = self.services.globals.next_count().unwrap();
|
||||
debug_assert!(size_of_val(&short) == BUFSIZE, "buffer requirement changed");
|
||||
|
||||
self.db
|
||||
.roomid_shortroomid
|
||||
.insert(room_id.as_bytes(), &short.to_be_bytes());
|
||||
.raw_aput::<BUFSIZE, _, _>(room_id, short);
|
||||
|
||||
short
|
||||
})
|
||||
}
|
||||
|
|
|
@ -36,12 +36,12 @@ impl Data {
|
|||
_mutex_lock: &RoomMutexGuard, // Take mutex guard to make sure users get the room state mutex
|
||||
) {
|
||||
self.roomid_shortstatehash
|
||||
.insert(room_id.as_bytes(), &new_shortstatehash.to_be_bytes());
|
||||
.raw_put(room_id, new_shortstatehash);
|
||||
}
|
||||
|
||||
pub(super) fn set_event_state(&self, shorteventid: u64, shortstatehash: u64) {
|
||||
self.shorteventid_shortstatehash
|
||||
.insert(&shorteventid.to_be_bytes(), &shortstatehash.to_be_bytes());
|
||||
.put(shorteventid, shortstatehash);
|
||||
}
|
||||
|
||||
pub(super) async fn set_forward_extremities(
|
||||
|
@ -57,12 +57,9 @@ impl Data {
|
|||
.ready_for_each(|key| self.roomid_pduleaves.remove(key))
|
||||
.await;
|
||||
|
||||
let mut prefix = room_id.as_bytes().to_vec();
|
||||
prefix.push(0xFF);
|
||||
for event_id in event_ids {
|
||||
let mut key = prefix.clone();
|
||||
key.extend_from_slice(event_id.as_bytes());
|
||||
self.roomid_pduleaves.insert(&key, event_id.as_bytes());
|
||||
for event_id in &event_ids {
|
||||
let key = (room_id, event_id);
|
||||
self.roomid_pduleaves.put_raw(key, event_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -481,4 +481,10 @@ impl Service {
|
|||
.await
|
||||
.map(|content: RoomEncryptionEventContent| content.algorithm)
|
||||
}
|
||||
|
||||
pub async fn is_encrypted_room(&self, room_id: &RoomId) -> bool {
|
||||
self.room_state_get(room_id, &StateEventType::RoomEncryption, "")
|
||||
.await
|
||||
.is_ok()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ use std::{
|
|||
};
|
||||
|
||||
use conduit::{utils::stream::TryIgnore, Result};
|
||||
use database::{Deserialized, Interfix, Map};
|
||||
use database::{serialize_to_vec, Deserialized, Interfix, Json, Map};
|
||||
use futures::{Stream, StreamExt};
|
||||
use ruma::{
|
||||
events::{AnyStrippedStateEvent, AnySyncStateEvent},
|
||||
|
@ -63,71 +63,62 @@ impl Data {
|
|||
}
|
||||
|
||||
pub(super) fn mark_as_once_joined(&self, user_id: &UserId, room_id: &RoomId) {
|
||||
let mut userroom_id = user_id.as_bytes().to_vec();
|
||||
userroom_id.push(0xFF);
|
||||
userroom_id.extend_from_slice(room_id.as_bytes());
|
||||
self.roomuseroncejoinedids.insert(&userroom_id, &[]);
|
||||
let key = (user_id, room_id);
|
||||
|
||||
self.roomuseroncejoinedids.put_raw(key, []);
|
||||
}
|
||||
|
||||
pub(super) fn mark_as_joined(&self, user_id: &UserId, room_id: &RoomId) {
|
||||
let roomid = room_id.as_bytes().to_vec();
|
||||
let userroom_id = (user_id, room_id);
|
||||
let userroom_id = serialize_to_vec(userroom_id).expect("failed to serialize userroom_id");
|
||||
|
||||
let mut roomuser_id = roomid.clone();
|
||||
roomuser_id.push(0xFF);
|
||||
roomuser_id.extend_from_slice(user_id.as_bytes());
|
||||
let roomuser_id = (room_id, user_id);
|
||||
let roomuser_id = serialize_to_vec(roomuser_id).expect("failed to serialize roomuser_id");
|
||||
|
||||
let mut userroom_id = user_id.as_bytes().to_vec();
|
||||
userroom_id.push(0xFF);
|
||||
userroom_id.extend_from_slice(room_id.as_bytes());
|
||||
self.userroomid_joined.insert(&userroom_id, []);
|
||||
self.roomuserid_joined.insert(&roomuser_id, []);
|
||||
|
||||
self.userroomid_joined.insert(&userroom_id, &[]);
|
||||
self.roomuserid_joined.insert(&roomuser_id, &[]);
|
||||
self.userroomid_invitestate.remove(&userroom_id);
|
||||
self.roomuserid_invitecount.remove(&roomuser_id);
|
||||
|
||||
self.userroomid_leftstate.remove(&userroom_id);
|
||||
self.roomuserid_leftcount.remove(&roomuser_id);
|
||||
|
||||
self.roomid_inviteviaservers.remove(&roomid);
|
||||
self.roomid_inviteviaservers.remove(room_id);
|
||||
}
|
||||
|
||||
pub(super) fn mark_as_left(&self, user_id: &UserId, room_id: &RoomId) {
|
||||
let roomid = room_id.as_bytes().to_vec();
|
||||
let userroom_id = (user_id, room_id);
|
||||
let userroom_id = serialize_to_vec(userroom_id).expect("failed to serialize userroom_id");
|
||||
|
||||
let mut roomuser_id = roomid.clone();
|
||||
roomuser_id.push(0xFF);
|
||||
roomuser_id.extend_from_slice(user_id.as_bytes());
|
||||
let roomuser_id = (room_id, user_id);
|
||||
let roomuser_id = serialize_to_vec(roomuser_id).expect("failed to serialize roomuser_id");
|
||||
|
||||
let mut userroom_id = user_id.as_bytes().to_vec();
|
||||
userroom_id.push(0xFF);
|
||||
userroom_id.extend_from_slice(room_id.as_bytes());
|
||||
// (timo) TODO
|
||||
let leftstate = Vec::<Raw<AnySyncStateEvent>>::new();
|
||||
let count = self.services.globals.next_count().unwrap();
|
||||
|
||||
self.userroomid_leftstate
|
||||
.raw_put(&userroom_id, Json(leftstate));
|
||||
self.roomuserid_leftcount.raw_put(&roomuser_id, count);
|
||||
|
||||
self.userroomid_leftstate.insert(
|
||||
&userroom_id,
|
||||
&serde_json::to_vec(&Vec::<Raw<AnySyncStateEvent>>::new()).unwrap(),
|
||||
); // TODO
|
||||
self.roomuserid_leftcount
|
||||
.insert(&roomuser_id, &self.services.globals.next_count().unwrap().to_be_bytes());
|
||||
self.userroomid_joined.remove(&userroom_id);
|
||||
self.roomuserid_joined.remove(&roomuser_id);
|
||||
|
||||
self.userroomid_invitestate.remove(&userroom_id);
|
||||
self.roomuserid_invitecount.remove(&roomuser_id);
|
||||
|
||||
self.roomid_inviteviaservers.remove(&roomid);
|
||||
self.roomid_inviteviaservers.remove(room_id);
|
||||
}
|
||||
|
||||
/// Makes a user forget a room.
|
||||
#[tracing::instrument(skip(self), level = "debug")]
|
||||
pub(super) fn forget(&self, room_id: &RoomId, user_id: &UserId) {
|
||||
let mut userroom_id = user_id.as_bytes().to_vec();
|
||||
userroom_id.push(0xFF);
|
||||
userroom_id.extend_from_slice(room_id.as_bytes());
|
||||
let userroom_id = (user_id, room_id);
|
||||
let roomuser_id = (room_id, user_id);
|
||||
|
||||
let mut roomuser_id = room_id.as_bytes().to_vec();
|
||||
roomuser_id.push(0xFF);
|
||||
roomuser_id.extend_from_slice(user_id.as_bytes());
|
||||
|
||||
self.userroomid_leftstate.remove(&userroom_id);
|
||||
self.roomuserid_leftcount.remove(&roomuser_id);
|
||||
self.userroomid_leftstate.del(userroom_id);
|
||||
self.roomuserid_leftcount.del(roomuser_id);
|
||||
}
|
||||
|
||||
/// Returns an iterator over all rooms a user was invited to.
|
||||
|
|
|
@ -3,13 +3,13 @@ mod data;
|
|||
use std::{collections::HashSet, sync::Arc};
|
||||
|
||||
use conduit::{
|
||||
err,
|
||||
err, is_not_empty,
|
||||
utils::{stream::TryIgnore, ReadyExt, StreamTools},
|
||||
warn, Result,
|
||||
};
|
||||
use data::Data;
|
||||
use database::{Deserialized, Ignore, Interfix};
|
||||
use futures::{Stream, StreamExt};
|
||||
use database::{serialize_to_vec, Deserialized, Ignore, Interfix, Json};
|
||||
use futures::{stream::iter, Stream, StreamExt};
|
||||
use itertools::Itertools;
|
||||
use ruma::{
|
||||
events::{
|
||||
|
@ -547,50 +547,37 @@ impl Service {
|
|||
.unwrap_or(0),
|
||||
);
|
||||
|
||||
self.db
|
||||
.roomid_joinedcount
|
||||
.insert(room_id.as_bytes(), &joinedcount.to_be_bytes());
|
||||
|
||||
self.db
|
||||
.roomid_invitedcount
|
||||
.insert(room_id.as_bytes(), &invitedcount.to_be_bytes());
|
||||
self.db.roomid_joinedcount.raw_put(room_id, joinedcount);
|
||||
self.db.roomid_invitedcount.raw_put(room_id, invitedcount);
|
||||
|
||||
self.room_servers(room_id)
|
||||
.ready_for_each(|old_joined_server| {
|
||||
if !joined_servers.remove(old_joined_server) {
|
||||
// Server not in room anymore
|
||||
let mut roomserver_id = room_id.as_bytes().to_vec();
|
||||
roomserver_id.push(0xFF);
|
||||
roomserver_id.extend_from_slice(old_joined_server.as_bytes());
|
||||
|
||||
let mut serverroom_id = old_joined_server.as_bytes().to_vec();
|
||||
serverroom_id.push(0xFF);
|
||||
serverroom_id.extend_from_slice(room_id.as_bytes());
|
||||
|
||||
self.db.roomserverids.remove(&roomserver_id);
|
||||
self.db.serverroomids.remove(&serverroom_id);
|
||||
if joined_servers.remove(old_joined_server) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Server not in room anymore
|
||||
let roomserver_id = (room_id, old_joined_server);
|
||||
let serverroom_id = (old_joined_server, room_id);
|
||||
|
||||
self.db.roomserverids.del(roomserver_id);
|
||||
self.db.serverroomids.del(serverroom_id);
|
||||
})
|
||||
.await;
|
||||
|
||||
// Now only new servers are in joined_servers anymore
|
||||
for server in joined_servers {
|
||||
let mut roomserver_id = room_id.as_bytes().to_vec();
|
||||
roomserver_id.push(0xFF);
|
||||
roomserver_id.extend_from_slice(server.as_bytes());
|
||||
for server in &joined_servers {
|
||||
let roomserver_id = (room_id, server);
|
||||
let serverroom_id = (server, room_id);
|
||||
|
||||
let mut serverroom_id = server.as_bytes().to_vec();
|
||||
serverroom_id.push(0xFF);
|
||||
serverroom_id.extend_from_slice(room_id.as_bytes());
|
||||
|
||||
self.db.roomserverids.insert(&roomserver_id, &[]);
|
||||
self.db.serverroomids.insert(&serverroom_id, &[]);
|
||||
self.db.roomserverids.put_raw(roomserver_id, []);
|
||||
self.db.serverroomids.put_raw(serverroom_id, []);
|
||||
}
|
||||
|
||||
self.db
|
||||
.appservice_in_room_cache
|
||||
.write()
|
||||
.unwrap()
|
||||
.expect("locked")
|
||||
.remove(room_id);
|
||||
}
|
||||
|
||||
|
@ -598,44 +585,44 @@ impl Service {
|
|||
&self, user_id: &UserId, room_id: &RoomId, last_state: Option<Vec<Raw<AnyStrippedStateEvent>>>,
|
||||
invite_via: Option<Vec<OwnedServerName>>,
|
||||
) {
|
||||
let mut roomuser_id = room_id.as_bytes().to_vec();
|
||||
roomuser_id.push(0xFF);
|
||||
roomuser_id.extend_from_slice(user_id.as_bytes());
|
||||
let roomuser_id = (room_id, user_id);
|
||||
let roomuser_id = serialize_to_vec(roomuser_id).expect("failed to serialize roomuser_id");
|
||||
|
||||
let mut userroom_id = user_id.as_bytes().to_vec();
|
||||
userroom_id.push(0xFF);
|
||||
userroom_id.extend_from_slice(room_id.as_bytes());
|
||||
let userroom_id = (user_id, room_id);
|
||||
let userroom_id = serialize_to_vec(userroom_id).expect("failed to serialize userroom_id");
|
||||
|
||||
self.db
|
||||
.userroomid_invitestate
|
||||
.raw_put(&userroom_id, Json(last_state.unwrap_or_default()));
|
||||
|
||||
self.db.userroomid_invitestate.insert(
|
||||
&userroom_id,
|
||||
&serde_json::to_vec(&last_state.unwrap_or_default()).expect("state to bytes always works"),
|
||||
);
|
||||
self.db
|
||||
.roomuserid_invitecount
|
||||
.insert(&roomuser_id, &self.services.globals.next_count().unwrap().to_be_bytes());
|
||||
.raw_aput::<8, _, _>(&roomuser_id, self.services.globals.next_count().unwrap());
|
||||
|
||||
self.db.userroomid_joined.remove(&userroom_id);
|
||||
self.db.roomuserid_joined.remove(&roomuser_id);
|
||||
|
||||
self.db.userroomid_leftstate.remove(&userroom_id);
|
||||
self.db.roomuserid_leftcount.remove(&roomuser_id);
|
||||
|
||||
if let Some(servers) = invite_via.as_deref() {
|
||||
if let Some(servers) = invite_via.filter(is_not_empty!()) {
|
||||
self.add_servers_invite_via(room_id, servers).await;
|
||||
}
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(self, servers), level = "debug")]
|
||||
pub async fn add_servers_invite_via(&self, room_id: &RoomId, servers: &[OwnedServerName]) {
|
||||
let mut prev_servers: Vec<_> = self
|
||||
pub async fn add_servers_invite_via(&self, room_id: &RoomId, servers: Vec<OwnedServerName>) {
|
||||
let mut servers: Vec<_> = self
|
||||
.servers_invite_via(room_id)
|
||||
.map(ToOwned::to_owned)
|
||||
.chain(iter(servers.into_iter()))
|
||||
.collect()
|
||||
.await;
|
||||
|
||||
prev_servers.extend(servers.to_owned());
|
||||
prev_servers.sort_unstable();
|
||||
prev_servers.dedup();
|
||||
servers.sort_unstable();
|
||||
servers.dedup();
|
||||
|
||||
let servers = prev_servers
|
||||
let servers = servers
|
||||
.iter()
|
||||
.map(|server| server.as_bytes())
|
||||
.collect_vec()
|
||||
|
|
|
@ -11,7 +11,7 @@ use conduit::{
|
|||
utils::{stream::TryIgnore, u64_from_u8, ReadyExt},
|
||||
Err, PduCount, PduEvent, Result,
|
||||
};
|
||||
use database::{Database, Deserialized, KeyVal, Map};
|
||||
use database::{Database, Deserialized, Json, KeyVal, Map};
|
||||
use futures::{FutureExt, Stream, StreamExt};
|
||||
use ruma::{CanonicalJsonObject, EventId, OwnedRoomId, OwnedUserId, RoomId, UserId};
|
||||
use tokio::sync::Mutex;
|
||||
|
@ -168,10 +168,7 @@ impl Data {
|
|||
}
|
||||
|
||||
pub(super) async fn append_pdu(&self, pdu_id: &[u8], pdu: &PduEvent, json: &CanonicalJsonObject, count: u64) {
|
||||
self.pduid_pdu.insert(
|
||||
pdu_id,
|
||||
&serde_json::to_vec(json).expect("CanonicalJsonObject is always a valid"),
|
||||
);
|
||||
self.pduid_pdu.raw_put(pdu_id, Json(json));
|
||||
|
||||
self.lasttimelinecount_cache
|
||||
.lock()
|
||||
|
@ -183,13 +180,10 @@ impl Data {
|
|||
}
|
||||
|
||||
pub(super) fn prepend_backfill_pdu(&self, pdu_id: &[u8], event_id: &EventId, json: &CanonicalJsonObject) {
|
||||
self.pduid_pdu.insert(
|
||||
pdu_id,
|
||||
&serde_json::to_vec(json).expect("CanonicalJsonObject is always a valid"),
|
||||
);
|
||||
self.pduid_pdu.raw_put(pdu_id, Json(json));
|
||||
|
||||
self.eventid_pduid.insert(event_id.as_bytes(), pdu_id);
|
||||
self.eventid_outlierpdu.remove(event_id.as_bytes());
|
||||
self.eventid_pduid.insert(event_id, pdu_id);
|
||||
self.eventid_outlierpdu.remove(event_id);
|
||||
}
|
||||
|
||||
/// Removes a pdu and creates a new one with the same id.
|
||||
|
@ -328,5 +322,5 @@ pub(super) fn pdu_count(pdu_id: &[u8]) -> PduCount {
|
|||
fn increment(db: &Arc<Map>, key: &[u8]) {
|
||||
let old = db.get_blocking(key);
|
||||
let new = utils::increment(old.ok().as_deref());
|
||||
db.insert(key, &new);
|
||||
db.insert(key, new);
|
||||
}
|
||||
|
|
|
@ -38,20 +38,13 @@ impl Data {
|
|||
}
|
||||
|
||||
pub(super) fn reset_notification_counts(&self, user_id: &UserId, room_id: &RoomId) {
|
||||
let mut userroom_id = user_id.as_bytes().to_vec();
|
||||
userroom_id.push(0xFF);
|
||||
userroom_id.extend_from_slice(room_id.as_bytes());
|
||||
let mut roomuser_id = room_id.as_bytes().to_vec();
|
||||
roomuser_id.push(0xFF);
|
||||
roomuser_id.extend_from_slice(user_id.as_bytes());
|
||||
let userroom_id = (user_id, room_id);
|
||||
self.userroomid_highlightcount.put(userroom_id, 0_u64);
|
||||
self.userroomid_notificationcount.put(userroom_id, 0_u64);
|
||||
|
||||
self.userroomid_notificationcount
|
||||
.insert(&userroom_id, &0_u64.to_be_bytes());
|
||||
self.userroomid_highlightcount
|
||||
.insert(&userroom_id, &0_u64.to_be_bytes());
|
||||
|
||||
self.roomuserid_lastnotificationread
|
||||
.insert(&roomuser_id, &self.services.globals.next_count().unwrap().to_be_bytes());
|
||||
let roomuser_id = (room_id, user_id);
|
||||
let count = self.services.globals.next_count().unwrap();
|
||||
self.roomuserid_lastnotificationread.put(roomuser_id, count);
|
||||
}
|
||||
|
||||
pub(super) async fn notification_count(&self, user_id: &UserId, room_id: &RoomId) -> u64 {
|
||||
|
@ -89,11 +82,8 @@ impl Data {
|
|||
.await
|
||||
.expect("room exists");
|
||||
|
||||
let mut key = shortroomid.to_be_bytes().to_vec();
|
||||
key.extend_from_slice(&token.to_be_bytes());
|
||||
|
||||
self.roomsynctoken_shortstatehash
|
||||
.insert(&key, &shortstatehash.to_be_bytes());
|
||||
let key: &[u64] = &[shortroomid, token];
|
||||
self.roomsynctoken_shortstatehash.put(key, shortstatehash);
|
||||
}
|
||||
|
||||
pub(super) async fn get_token_shortstatehash(&self, room_id: &RoomId, token: u64) -> Result<u64> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue