use std::{path::Path, time::Duration};
use sea_orm::{DatabaseConnection, SqlxSqliteConnector};
use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode, SqlitePoolOptions, SqliteSynchronous};
use crate::connection::{DbReadConnection, DbWriteConnection};
pub const DEFAULT_BUSY_TIMEOUT_SECS: u64 = 5;
#[derive(Debug)]
pub struct DbPools {
read: DbReadConnection,
write: DbWriteConnection,
}
impl DbPools {
pub async fn open(
db_path: &Path,
max_read_connections: u32,
connect_timeout: Duration,
busy_timeout: Duration,
) -> Result<Self, sqlx::Error> {
let write = DbWriteConnection::open(db_path, connect_timeout, busy_timeout).await?;
let read =
DbReadConnection::open(db_path, max_read_connections, connect_timeout, busy_timeout)
.await?;
Ok(Self { read, write })
}
pub fn read(&self) -> &DbReadConnection {
&self.read
}
pub fn write(&self) -> &DbWriteConnection {
&self.write
}
}
pub(crate) async fn build_pool(
db_path: &Path,
max_connections: u32,
connect_timeout: Duration,
busy_timeout: Duration,
) -> Result<DatabaseConnection, sqlx::Error> {
let connect_options = SqliteConnectOptions::new()
.filename(db_path)
.create_if_missing(true)
.journal_mode(SqliteJournalMode::Wal)
.busy_timeout(busy_timeout)
.foreign_keys(true)
.synchronous(SqliteSynchronous::Normal);
let pool = SqlitePoolOptions::new()
.max_connections(max_connections)
.acquire_timeout(connect_timeout)
.connect_with(connect_options)
.await?;
Ok(SqlxSqliteConnector::from_sqlx_sqlite_pool(pool))
}