use std::path::PathBuf;
use std::sync::Arc;
use async_once_cell::OnceCell;
use bon::Builder;
use deadpool::managed::Object;
use deadpool::managed::PoolConfig;
use snafu::Backtrace;
use snafu::ResultExt;
use snafu::Snafu;
use sqlx::SqliteConnection;
use sqlx::migrate::Migrator;
use sqlx::sqlite::SqliteConnectOptions;
use crate::databases::sqlite::database::pool::PoolInitError;
use crate::databases::sqlite::pool::SqlitePool;
use crate::databases::sqlite::pool::SqlitePoolConnection;
use crate::databases::sqlite::pool::SqlitePoolError;
pub mod pool;
pub type ArcSqliteDatabase = Arc<SqliteDatabase>;
#[derive(Debug, Builder)]
pub struct SqliteDatabase {
pub path: Option<PathBuf>,
pub connection_config: SqliteConnectOptions,
pub pool_config: Option<PoolConfig>,
migrations: Option<Migrator>,
#[builder(skip)]
pool: OnceCell<SqlitePool>,
}
impl SqliteDatabase {
pub async fn get_conn(&self) -> Result<SqlitePoolConnection, GetConnectionError> {
self.get_pool_or_init()
.await
.context(PoolInitSnafu)?
.get()
.await
.context(ConnectionSnafu)
}
pub async fn get_conn_owned(&self) -> Result<SqliteConnection, GetConnectionError> {
self.get_conn().await.map(Object::take)
}
}
#[derive(Debug, Snafu)]
pub enum GetConnectionError {
#[snafu(display("Could not create the pool for the database"))]
PoolInitError {
#[snafu(backtrace)]
source: PoolInitError,
},
#[snafu(display("Could not get a connection from the database"))]
ConnectionError {
backtrace: Backtrace,
source: SqlitePoolError,
},
}