use std::time::Duration;
use crate::{SdkError, wit};
use super::{Connection, Transaction};
pub struct PoolOptions(wit::PgPoolOptions);
impl Default for PoolOptions {
fn default() -> Self {
Self(wit::PgPoolOptions {
max_connections: None,
min_connections: None,
idle_timeout_ms: None,
acquisition_timeout_ms: None,
max_lifetime_ms: None,
})
}
}
impl PoolOptions {
pub fn new() -> Self {
Self::default()
}
pub fn max_connections(mut self, max_connections: u32) -> Self {
self.0.max_connections = Some(max_connections);
self
}
pub fn min_connections(mut self, min_connections: u32) -> Self {
self.0.min_connections = Some(min_connections);
self
}
pub fn idle_timeout(mut self, idle_timeout: Duration) -> Self {
self.0.idle_timeout_ms = Some(idle_timeout.as_millis() as u64);
self
}
pub fn acquire_timeout(mut self, acquire_timeout: Duration) -> Self {
self.0.acquisition_timeout_ms = Some(acquire_timeout.as_millis() as u64);
self
}
pub fn max_lifetime(mut self, max_lifetime: Duration) -> Self {
self.0.max_lifetime_ms = Some(max_lifetime.as_millis() as u64);
self
}
}
pub struct Pool(wit::PgPool);
impl Pool {
pub fn connect(identifier: &str, url: &str) -> Result<Self, SdkError> {
Self::connect_with_options(identifier, url, Default::default())
}
pub fn connect_with_options(identifier: &str, url: &str, options: PoolOptions) -> Result<Self, SdkError> {
let pool = wit::PgPool::connect(identifier, url, options.0).map_err(SdkError::from)?;
Ok(Self(pool))
}
pub fn acquire(&self) -> Result<Connection, SdkError> {
self.0.acquire().map(Into::into).map_err(SdkError::from)
}
pub fn begin_transaction(&self) -> Result<Transaction, SdkError> {
self.0.begin_transaction().map(Into::into).map_err(SdkError::from)
}
}