use akar_catalog::Catalog;
use akar_common::file_system::VirtualFileSystemRegistry;
use akar_storage::{BufferInfo, FileInfo, FsmInfo, StorageInfo, StorageManager};
use std::path::Path;
use std::sync::{Arc, Mutex};
pub struct StorageDriver {
storage_manager: Arc<StorageManager>,
catalog: Arc<Mutex<Catalog>>,
vfs: Arc<VirtualFileSystemRegistry>,
}
impl StorageDriver {
pub(crate) fn new(
storage_manager: Arc<StorageManager>,
catalog: Arc<Mutex<Catalog>>,
vfs: Arc<VirtualFileSystemRegistry>,
) -> Self {
Self {
storage_manager,
catalog,
vfs,
}
}
pub fn db_path(&self) -> &Path {
self.storage_manager.db_path()
}
pub fn storage_info(&self) -> StorageInfo {
self.storage_manager.storage_info()
}
pub fn buffer_info(&self) -> BufferInfo {
self.storage_manager.buffer_info()
}
pub fn file_info(&self) -> FileInfo {
self.storage_manager.file_info()
}
pub fn fsm_info(&self) -> FsmInfo {
self.storage_manager.fsm_info()
}
pub fn wal_size(&self) -> usize {
self.storage_manager.wal_size()
}
pub fn table_catalog(&self) -> Arc<akar_storage::TableCatalog> {
self.storage_manager.table_catalog()
}
pub fn catalog(&self) -> &Arc<Mutex<Catalog>> {
&self.catalog
}
pub fn vfs(&self) -> &Arc<VirtualFileSystemRegistry> {
&self.vfs
}
pub fn num_tables(&self) -> usize {
self.catalog.lock().unwrap().all_entries().count()
}
pub fn num_node_tables(&self) -> usize {
self.catalog
.lock()
.unwrap()
.all_entries()
.filter(|e| e.is_node_table())
.count()
}
pub fn num_rel_tables(&self) -> usize {
self.catalog
.lock()
.unwrap()
.all_entries()
.filter(|e| !e.is_node_table())
.count()
}
pub fn total_pages(&self) -> u64 {
self.storage_info().total_pages
}
pub fn total_file_size(&self) -> u64 {
self.file_info().total_file_size
}
pub fn pinned_frames(&self) -> usize {
self.buffer_info().num_pinned
}
}