use crate::error::{OrmError, OrmResult};
use deadpool_postgres::{Manager, ManagerConfig, Pool, PoolBuilder, RecyclingMethod};
use tokio_postgres::NoTls;
use tokio_postgres::Socket;
use tokio_postgres::tls::{MakeTlsConnect, TlsConnect};
pub fn create_pool(database_url: &str) -> OrmResult<Pool> {
create_pool_with_config(database_url, 16)
}
pub fn create_pool_with_config(database_url: &str, max_size: usize) -> OrmResult<Pool> {
create_pool_with_manager_config(database_url, NoTls, default_manager_config(), |builder| {
builder.max_size(max_size)
})
}
pub fn create_pool_with_tls<T>(database_url: &str, tls: T) -> OrmResult<Pool>
where
T: MakeTlsConnect<Socket> + Clone + Sync + Send + 'static,
T::Stream: Sync + Send,
T::TlsConnect: Sync + Send,
<T::TlsConnect as TlsConnect<Socket>>::Future: Send,
{
create_pool_with_manager_config(database_url, tls, default_manager_config(), |b| {
b.max_size(16)
})
}
pub fn create_pool_with_manager_config<T>(
database_url: &str,
tls: T,
manager_config: ManagerConfig,
configure_pool: impl FnOnce(PoolBuilder) -> PoolBuilder,
) -> OrmResult<Pool>
where
T: MakeTlsConnect<Socket> + Clone + Sync + Send + 'static,
T::Stream: Sync + Send,
T::TlsConnect: Sync + Send,
<T::TlsConnect as TlsConnect<Socket>>::Future: Send,
{
let pg_config: tokio_postgres::Config = database_url
.parse()
.map_err(|e: tokio_postgres::Error| OrmError::Connection(e.to_string()))?;
let mgr = Manager::from_config(pg_config, tls, manager_config);
configure_pool(Pool::builder(mgr))
.build()
.map_err(|e| OrmError::Pool(e.to_string()))
}
fn default_manager_config() -> ManagerConfig {
ManagerConfig {
recycling_method: RecyclingMethod::Fast,
}
}