use sea_orm::{ConnectOptions, Database, DatabaseConnection, DbErr};
use sea_orm_migration::MigratorTrait;
use std::time::Duration;
const DEFAULT_MIN_CONNECTIONS: u32 = 2;
const DEFAULT_MAX_CONNECTIONS: u32 = 10;
const DEFAULT_IDLE_TIMEOUT: Duration = Duration::from_secs(60);
const DEFAULT_MAX_LIFETIME: Duration = Duration::from_secs(300);
pub async fn init_db<M: MigratorTrait>(database_url: &str) -> Result<DatabaseConnection, DbErr> {
let db = Database::connect(database_url).await?;
M::up(&db, None).await?;
tracing::info!("Database migrations completed");
Ok(db)
}
pub async fn connect(database_url: &str) -> Result<DatabaseConnection, DbErr> {
Database::connect(database_url).await
}
pub async fn connect_with_pool(
database_url: &str,
min_connections: u32,
max_connections: u32,
) -> Result<DatabaseConnection, DbErr> {
let mut opt = ConnectOptions::new(database_url);
opt.min_connections(min_connections)
.max_connections(max_connections)
.idle_timeout(DEFAULT_IDLE_TIMEOUT)
.max_lifetime(DEFAULT_MAX_LIFETIME)
.sqlx_logging(false);
Database::connect(opt).await
}
pub fn default_connect_options(database_url: &str) -> ConnectOptions {
let mut opt = ConnectOptions::new(database_url);
opt.min_connections(DEFAULT_MIN_CONNECTIONS)
.max_connections(DEFAULT_MAX_CONNECTIONS)
.idle_timeout(DEFAULT_IDLE_TIMEOUT)
.max_lifetime(DEFAULT_MAX_LIFETIME)
.sqlx_logging(false);
opt
}
#[derive(Debug, Clone)]
pub struct PoolConfig {
pub min_connections: u32,
pub max_connections: u32,
pub idle_timeout: Duration,
pub max_lifetime: Duration,
pub sqlx_logging: bool,
}
impl Default for PoolConfig {
fn default() -> Self {
Self {
min_connections: DEFAULT_MIN_CONNECTIONS,
max_connections: DEFAULT_MAX_CONNECTIONS,
idle_timeout: DEFAULT_IDLE_TIMEOUT,
max_lifetime: DEFAULT_MAX_LIFETIME,
sqlx_logging: false,
}
}
}
impl PoolConfig {
pub fn new(min: u32, max: u32) -> Self {
Self {
min_connections: min,
max_connections: max,
..Default::default()
}
}
pub fn to_connect_options(&self, database_url: &str) -> ConnectOptions {
let mut opt = ConnectOptions::new(database_url);
opt.min_connections(self.min_connections)
.max_connections(self.max_connections)
.idle_timeout(self.idle_timeout)
.max_lifetime(self.max_lifetime)
.sqlx_logging(self.sqlx_logging);
opt
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_pool_config_default() {
let config = PoolConfig::default();
assert_eq!(config.min_connections, 2);
assert_eq!(config.max_connections, 10);
}
#[test]
fn test_pool_config_custom() {
let config = PoolConfig::new(5, 20);
assert_eq!(config.min_connections, 5);
assert_eq!(config.max_connections, 20);
}
}