use rusqlite::Connection;
use std::path::Path;
use std::sync::Arc;
use std::sync::RwLock;
use crate::database::Database;
use crate::database::DatabaseError;
use crate::database::DatabaseOpeningError;
use crate::database::DatabaseTransaction;
use crate::database::id_cache::EntityGenerationUuidCache;
pub struct SummaryDatabaseCache {
pub entity_generation_id: Arc<RwLock<EntityGenerationUuidCache>>,
}
pub struct SummaryDatabase {
base_db: Database,
pub cache: SummaryDatabaseCache,
}
pub struct SummaryDatabaseTransaction<'a> {
pub base_transaction: DatabaseTransaction<'a>,
pub cache: &'a mut SummaryDatabaseCache,
}
impl SummaryDatabase {
pub fn initalize_from_base(db: Database) -> Result<Self, DatabaseError> {
let summary_db = Self {
base_db: db,
cache: Default::default()
};
summary_db.initalize_summary_database()?;
Ok(summary_db)
}
pub fn open_writable(
path: impl AsRef<Path>
) -> Result<Self, DatabaseOpeningError> {
let database = Database::open_writable(&path)?;
Self::initalize_from_base(database)
.map_err(|e| e.while_initlizing(path))
}
pub fn open_read_only(
path: impl AsRef<Path>
) -> Result<Self, DatabaseOpeningError> {
let database = Database::open_read_only(&path)?;
Ok(Self {
base_db: database,
cache: Default::default()
})
}
pub fn base(&self) -> &Database {
&self.base_db
}
pub fn base_mut(&mut self) -> &mut Database {
&mut self.base_db
}
pub fn start_transaction(
&mut self
) -> Result<SummaryDatabaseTransaction, DatabaseError> {
return Ok(SummaryDatabaseTransaction{
base_transaction: self.base_db.start_transaction()?,
cache: &mut self.cache
})
}
pub fn connection(&self) -> &Connection {
&self.base_db.connection
}
}
impl<'a> SummaryDatabaseTransaction<'a> {
pub fn connection(&self) -> &Connection {
&self.base_transaction.transaction
}
pub fn commit(self) -> Result<(), DatabaseError> {
return self.base_transaction.commit();
}
}
impl Default for SummaryDatabaseCache {
fn default() -> Self {
Self {
entity_generation_id:
Arc::new(EntityGenerationUuidCache::new().into()),
}
}
}