use crate::api::transaction::TxVisibilityManager;
use crate::core::id::{IdGenerator, TxIdGenerator};
use crate::core::temporal::Timestamp;
use crate::index::temporal::TemporalIndexes;
use crate::query::planner::Statistics;
use crate::storage::current::CurrentStorage;
use crate::storage::historical::HistoricalStorage;
use crate::storage::index_persistence::tracker::PersistenceTracker;
use crate::storage::wal::DurabilityMode;
use crate::storage::wal::concurrent_system::ConcurrentWalSystem;
use parking_lot::RwLock;
use std::sync::{Arc, Mutex};
use std::time::Instant;
pub mod admin;
pub mod config;
pub mod graph_view;
pub mod ops;
pub mod query;
pub mod temporal;
#[cfg(test)]
pub mod tests;
pub mod transaction;
pub mod vector;
pub mod vector_builder;
pub use vector_builder::VectorIndexBuilder;
pub struct AletheiaDB {
pub(crate) current: Arc<CurrentStorage>,
pub(crate) historical: Arc<RwLock<HistoricalStorage>>,
pub(crate) temporal_indexes: Arc<TemporalIndexes>,
pub(crate) wal: Arc<ConcurrentWalSystem>,
pub(crate) current_timestamp: Arc<Mutex<Timestamp>>,
pub(crate) commit_clock_observed_at: Arc<Mutex<Instant>>,
pub(crate) tx_id_gen: Arc<TxIdGenerator>,
pub(crate) visibility_manager: Arc<TxVisibilityManager>,
pub(crate) node_id_gen: Arc<IdGenerator>,
pub(crate) edge_id_gen: Arc<IdGenerator>,
pub(crate) version_id_gen: Arc<IdGenerator>,
pub(crate) default_durability: DurabilityMode,
pub(crate) stats: Arc<Statistics>,
#[allow(dead_code)]
pub(crate) persistence_config: crate::storage::index_persistence::PersistenceConfig,
pub(crate) persistence_manager:
Option<Arc<crate::storage::index_persistence::IndexPersistenceManager>>,
pub(crate) persistence_tracker: Option<Arc<PersistenceTracker>>,
pub(crate) persistence_thread_stopped: Arc<std::sync::atomic::AtomicBool>,
pub(crate) persistence_thread_handle: Option<std::thread::JoinHandle<()>>,
pub(crate) encryption_manager: Option<Arc<crate::encryption::EncryptionManager>>,
}
impl std::fmt::Debug for AletheiaDB {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let current_ts = self
.current_timestamp
.try_lock()
.map(|ts| format!("{:?}", ts))
.unwrap_or_else(|_| "<locked>".to_string());
f.debug_struct("AletheiaDB")
.field("current_timestamp", ¤t_ts)
.field("default_durability", &self.default_durability)
.field("persistence_enabled", &self.persistence_manager.is_some())
.field("encryption_enabled", &self.encryption_manager.is_some())
.field("stats", &self.stats)
.finish_non_exhaustive()
}
}
impl Drop for AletheiaDB {
fn drop(&mut self) {
if let Some(ref tracker) = self.persistence_tracker {
tracker.signal_shutdown();
if let Some(handle) = self.persistence_thread_handle.take() {
let _ = handle.join();
}
}
}
}