use sqlx::postgres::PgPoolOptions;
use std::time::Duration;
use crate::client::config::PoolConfig;
use crate::features::connection_pooler::{ConnectionPool, ConnectionPoolManager};
impl Default for ConnectionPoolManager {
fn default() -> Self {
Self {
config: PoolConfig::default(),
max_lifetime: Duration::from_secs(1800),
test_before_acquire: false,
}
}
}
impl ConnectionPoolManager {
pub fn new(config: PoolConfig) -> Self {
Self {
config,
..Default::default()
}
}
pub fn with_max_lifetime(mut self, max_lifetime: Duration) -> Self {
self.max_lifetime = max_lifetime;
self
}
pub fn with_test_before_acquire(mut self, test_before_acquire: bool) -> Self {
self.test_before_acquire = test_before_acquire;
self
}
pub fn build_options(&self) -> PgPoolOptions {
PgPoolOptions::new()
.max_connections(self.config.max_connections)
.min_connections(self.config.min_connections)
.acquire_timeout(self.config.connection_timeout)
.idle_timeout(Some(self.config.idle_timeout))
.max_lifetime(Some(self.max_lifetime))
.test_before_acquire(self.test_before_acquire)
}
pub async fn open(
&self,
client_name: String,
uri: &str,
) -> Result<ConnectionPool, sqlx::Error> {
let pool = self.build_options().connect(uri).await?;
Ok(ConnectionPool::wrap(client_name, pool, self.clone()))
}
}