Add custom storage
Add an additional tree to the Store where custom api consumer data may be stored.
This commit is contained in:
parent
623408913c
commit
5be7bb980d
4 changed files with 64 additions and 0 deletions
|
@ -828,6 +828,16 @@ impl Client {
|
||||||
self.base_client.store()
|
self.base_client.store()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Store a value in the custom tree on the store
|
||||||
|
pub async fn store_save_value(&self, key: &[u8], value: Vec<u8>) -> Result<Option<Vec<u8>>> {
|
||||||
|
Ok(self.store().set_custom_value(key, value).await?)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get a value in the custom tree in the store
|
||||||
|
pub async fn store_get_value(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
|
||||||
|
Ok(self.store().get_custom_value(key).await?)
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets the mxc avatar url of the client's owner. The avatar gets unset if
|
/// Sets the mxc avatar url of the client's owner. The avatar gets unset if
|
||||||
/// `url` is `None`.
|
/// `url` is `None`.
|
||||||
pub async fn set_avatar_url(&self, url: Option<&MxcUri>) -> Result<()> {
|
pub async fn set_avatar_url(&self, url: Option<&MxcUri>) -> Result<()> {
|
||||||
|
|
|
@ -66,6 +66,7 @@ pub struct MemoryStore {
|
||||||
room_event_receipts:
|
room_event_receipts:
|
||||||
Arc<DashMap<RoomId, DashMap<String, DashMap<EventId, DashMap<UserId, Receipt>>>>>,
|
Arc<DashMap<RoomId, DashMap<String, DashMap<EventId, DashMap<UserId, Receipt>>>>>,
|
||||||
media: Arc<Mutex<LruCache<String, Vec<u8>>>>,
|
media: Arc<Mutex<LruCache<String, Vec<u8>>>>,
|
||||||
|
custom: Arc<DashMap<Vec<u8>, Vec<u8>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MemoryStore {
|
impl MemoryStore {
|
||||||
|
@ -90,6 +91,7 @@ impl MemoryStore {
|
||||||
room_user_receipts: DashMap::new().into(),
|
room_user_receipts: DashMap::new().into(),
|
||||||
room_event_receipts: DashMap::new().into(),
|
room_event_receipts: DashMap::new().into(),
|
||||||
media: Arc::new(Mutex::new(LruCache::new(100))),
|
media: Arc::new(Mutex::new(LruCache::new(100))),
|
||||||
|
custom: DashMap::new().into(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -407,6 +409,14 @@ impl MemoryStore {
|
||||||
.unwrap_or_else(Vec::new))
|
.unwrap_or_else(Vec::new))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn get_custom_value(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
|
||||||
|
Ok(self.custom.get(key).map(|e| e.value().clone()))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn set_custom_value(&self, key: &[u8], value: Vec<u8>) -> Result<Option<Vec<u8>>> {
|
||||||
|
Ok(self.custom.insert(key.to_vec(), value))
|
||||||
|
}
|
||||||
|
|
||||||
async fn add_media_content(&self, request: &MediaRequest, data: Vec<u8>) -> Result<()> {
|
async fn add_media_content(&self, request: &MediaRequest, data: Vec<u8>) -> Result<()> {
|
||||||
self.media.lock().await.put(request.unique_key(), data);
|
self.media.lock().await.put(request.unique_key(), data);
|
||||||
|
|
||||||
|
@ -563,6 +573,14 @@ impl StateStore for MemoryStore {
|
||||||
self.get_event_room_receipt_events(room_id, receipt_type, event_id).await
|
self.get_event_room_receipt_events(room_id, receipt_type, event_id).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn get_custom_value(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
|
||||||
|
self.get_custom_value(key).await
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn set_custom_value(&self, key: &[u8], value: Vec<u8>) -> Result<Option<Vec<u8>>> {
|
||||||
|
self.set_custom_value(key, value).await
|
||||||
|
}
|
||||||
|
|
||||||
async fn add_media_content(&self, request: &MediaRequest, data: Vec<u8>) -> Result<()> {
|
async fn add_media_content(&self, request: &MediaRequest, data: Vec<u8>) -> Result<()> {
|
||||||
self.add_media_content(request, data).await
|
self.add_media_content(request, data).await
|
||||||
}
|
}
|
||||||
|
|
|
@ -263,6 +263,22 @@ pub trait StateStore: AsyncTraitDeps {
|
||||||
event_id: &EventId,
|
event_id: &EventId,
|
||||||
) -> Result<Vec<(UserId, Receipt)>>;
|
) -> Result<Vec<(UserId, Receipt)>>;
|
||||||
|
|
||||||
|
/// Get arbitrary data from the custom store
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `key` - The key to fetch data for
|
||||||
|
async fn get_custom_value(&self, key: &[u8]) -> Result<Option<Vec<u8>>>;
|
||||||
|
|
||||||
|
/// Put arbitrary data into the custom store
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `key` - The key to insert data into
|
||||||
|
///
|
||||||
|
/// * `value` - The value to insert
|
||||||
|
async fn set_custom_value(&self, key: &[u8], value: Vec<u8>) -> Result<Option<Vec<u8>>>;
|
||||||
|
|
||||||
/// Add a media file's content in the media store.
|
/// Add a media file's content in the media store.
|
||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
|
|
|
@ -189,6 +189,7 @@ pub struct SledStore {
|
||||||
room_user_receipts: Tree,
|
room_user_receipts: Tree,
|
||||||
room_event_receipts: Tree,
|
room_event_receipts: Tree,
|
||||||
media: Tree,
|
media: Tree,
|
||||||
|
custom: Tree,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Debug for SledStore {
|
impl std::fmt::Debug for SledStore {
|
||||||
|
@ -226,6 +227,8 @@ impl SledStore {
|
||||||
|
|
||||||
let media = db.open_tree("media")?;
|
let media = db.open_tree("media")?;
|
||||||
|
|
||||||
|
let custom = db.open_tree("custom")?;
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
path,
|
path,
|
||||||
inner: db,
|
inner: db,
|
||||||
|
@ -247,6 +250,7 @@ impl SledStore {
|
||||||
room_user_receipts,
|
room_user_receipts,
|
||||||
room_event_receipts,
|
room_event_receipts,
|
||||||
media,
|
media,
|
||||||
|
custom,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -762,6 +766,14 @@ impl SledStore {
|
||||||
.map(|m| m.to_vec()))
|
.map(|m| m.to_vec()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn get_custom_value(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
|
||||||
|
Ok(self.custom.get(key)?.map(|v| v.to_vec()))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn set_custom_value(&self, key: &[u8], value: Vec<u8>) -> Result<Option<Vec<u8>>> {
|
||||||
|
Ok(self.custom.insert(key, value)?.map(|v| v.to_vec()))
|
||||||
|
}
|
||||||
|
|
||||||
async fn remove_media_content(&self, request: &MediaRequest) -> Result<()> {
|
async fn remove_media_content(&self, request: &MediaRequest) -> Result<()> {
|
||||||
self.media.remove(
|
self.media.remove(
|
||||||
(request.media_type.unique_key().as_str(), request.format.unique_key().as_str())
|
(request.media_type.unique_key().as_str(), request.format.unique_key().as_str())
|
||||||
|
@ -899,6 +911,14 @@ impl StateStore for SledStore {
|
||||||
self.get_event_room_receipt_events(room_id, receipt_type, event_id).await
|
self.get_event_room_receipt_events(room_id, receipt_type, event_id).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn get_custom_value(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
|
||||||
|
self.get_custom_value(key).await
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn set_custom_value(&self, key: &[u8], value: Vec<u8>) -> Result<Option<Vec<u8>>> {
|
||||||
|
self.set_custom_value(key, value).await
|
||||||
|
}
|
||||||
|
|
||||||
async fn add_media_content(&self, request: &MediaRequest, data: Vec<u8>) -> Result<()> {
|
async fn add_media_content(&self, request: &MediaRequest, data: Vec<u8>) -> Result<()> {
|
||||||
self.add_media_content(request, data).await
|
self.add_media_content(request, data).await
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue