Files
Stalwart/crates/common/src/storage/mod.rs
2026-03-11 17:13:14 +01:00

106 lines
2.5 KiB
Rust

/*
* SPDX-FileCopyrightText: 2020 Stalwart Labs LLC <hello@stalw.art>
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
*/
use crate::Server;
use directory::Directory;
use registry::{
schema::{
enums::{StorageQuota, TenantStorageQuota},
prelude::ObjectType,
},
types::EnumImpl,
};
use std::sync::Arc;
use store::{BlobStore, InMemoryStore, RegistryStore, SearchStore, Store};
pub mod archive;
pub mod blob;
pub mod dav;
pub mod document;
pub mod encryption;
pub mod index;
pub mod quota;
pub mod state;
pub mod transaction;
#[derive(Debug, Clone)]
pub struct ObjectQuota([u32; StorageQuota::COUNT - 1]);
#[derive(Debug, Clone)]
pub struct TenantQuota([u32; TenantStorageQuota::COUNT - 1]);
impl Server {
#[inline(always)]
pub fn registry(&self) -> &RegistryStore {
&self.core.storage.registry
}
#[inline(always)]
pub fn store(&self) -> &Store {
&self.core.storage.data
}
#[inline(always)]
pub fn blob_store(&self) -> &BlobStore {
&self.core.storage.blob
}
#[inline(always)]
pub fn search_store(&self) -> &SearchStore {
&self.core.storage.search
}
#[inline(always)]
pub fn in_memory_store(&self) -> &InMemoryStore {
&self.core.storage.memory
}
#[inline(always)]
pub fn tracing_store(&self) -> &Store {
&self.core.storage.tracing
}
#[inline(always)]
pub fn metrics_store(&self) -> &Store {
&self.core.storage.metrics
}
#[inline(always)]
pub fn get_directory(&self, id: &u32) -> Option<&Arc<Directory>> {
self.core.storage.directories.get(id)
}
#[inline(always)]
pub fn get_default_directory(&self) -> Option<&Arc<Directory>> {
self.core.storage.directory.as_ref()
}
#[inline(always)]
pub fn get_lookup_store(&self, name: &str) -> Option<InMemoryStore> {
if !name.is_empty() && name != "*" {
self.inner.data.lookup_stores.load().get(name).cloned()
} else {
self.in_memory_store().clone().into()
}
}
pub async fn total_accounts(&self) -> trc::Result<usize> {
self.registry().count_object(ObjectType::Account).await
}
pub async fn total_domains(&self) -> trc::Result<usize> {
self.registry().count_object(ObjectType::Domain).await
}
#[cfg(not(feature = "enterprise"))]
pub async fn logo_resource(
&self,
_: &str,
) -> trc::Result<Option<crate::manager::application::Resource<Vec<u8>>>> {
Ok(None)
}
}