use crate::{
Error, Result, TimeoutKind,
client::{Config, ExclusiveClient, IntoConfig},
commands::ConnectionCommands,
network::timeout,
};
use bb8::ManageConnection;
use std::future::IntoFuture;
pub struct PooledClientManager {
config: Config,
}
impl PooledClientManager {
pub fn new(config: impl IntoConfig) -> Result<Self> {
Ok(Self {
config: config.into_config()?,
})
}
}
impl ManageConnection for PooledClientManager {
type Connection = ExclusiveClient;
type Error = Error;
async fn connect(&self) -> Result<ExclusiveClient> {
let config = self.config.clone();
ExclusiveClient::connect(config).await
}
async fn is_valid(&self, client: &mut ExclusiveClient) -> Result<()> {
let budget = if self.config.command_timeout.is_zero() {
self.config.connect_timeout
} else {
self.config.command_timeout
};
if budget.is_zero() {
client.ping::<()>(()).await?;
} else {
timeout(
budget,
TimeoutKind::Connect,
client.ping::<()>(()).into_future(),
)
.await??;
}
Ok(())
}
fn has_broken(&self, client: &mut ExclusiveClient) -> bool {
client.inner().is_terminated()
}
}