use crate::error::{OrmError, OrmResult};
use sqlx::postgres::{PgPool, PgPoolOptions};
use std::time::Duration;
pub struct OrmPool;
impl OrmPool {
pub async fn connect(url: &str) -> OrmResult<PgPool> {
PgPoolOptions::new()
.max_connections(20)
.min_connections(2)
.acquire_timeout(Duration::from_secs(30))
.idle_timeout(Duration::from_secs(600))
.connect(url)
.await
.map_err(OrmError::from_sqlx)
}
pub async fn from_env() -> OrmResult<PgPool> {
let url = std::env::var("DATABASE_URL")
.map_err(|_| OrmError::Config("DATABASE_URL не задан".into()))?;
Self::connect(&url).await
}
pub async fn connect_with_options(url: &str, options: PoolOptions) -> OrmResult<PgPool> {
PgPoolOptions::new()
.max_connections(options.max_connections)
.min_connections(options.min_connections)
.acquire_timeout(Duration::from_secs(options.acquire_timeout_secs))
.idle_timeout(Duration::from_secs(options.idle_timeout_secs))
.connect(url)
.await
.map_err(OrmError::from_sqlx)
}
}
#[derive(Debug, Clone)]
pub struct PoolOptions {
pub max_connections: u32,
pub min_connections: u32,
pub acquire_timeout_secs: u64,
pub idle_timeout_secs: u64,
}
impl Default for PoolOptions {
fn default() -> Self {
Self {
max_connections: 20,
min_connections: 2,
acquire_timeout_secs: 30,
idle_timeout_secs: 600,
}
}
}