use std::time::Duration;
use sqlx::migrate::Migrator;
use sqlx::sqlite::{
SqliteConnectOptions, SqliteJournalMode, SqlitePool, SqlitePoolOptions, SqliteSynchronous,
};
use sqlx::ConnectOptions;
use tracing::log::LevelFilter;
use url::Url;
use crate::database::DatabaseSetupError;
static MIGRATOR: Migrator = sqlx::migrate!("./migrations");
pub async fn connect_sqlite(url: &Url) -> Result<SqlitePool, DatabaseSetupError> {
let connection_options = SqliteConnectOptions::from_url(url)
.map_err(DatabaseSetupError::Unavailable)?
.create_if_missing(true)
.journal_mode(SqliteJournalMode::Wal)
.log_statements(LevelFilter::Trace)
.log_slow_statements(LevelFilter::Warn, Duration::from_millis(100))
.statement_cache_capacity(2_500)
.synchronous(SqliteSynchronous::Normal);
SqlitePoolOptions::new()
.idle_timeout(Duration::from_secs(90))
.max_lifetime(Duration::from_secs(1_800))
.min_connections(1)
.max_connections(16)
.connect_with(connection_options)
.await
.map_err(DatabaseSetupError::Unavailable)
}
pub async fn migrate_sqlite(pool: &SqlitePool) -> Result<(), DatabaseSetupError> {
MIGRATOR
.run(pool)
.await
.map_err(DatabaseSetupError::MigrationFailed)
}