2022-02-03 16:25:05 -08:00
|
|
|
use async_trait::async_trait;
|
|
|
|
|
use bb8::{ManageConnection, PooledConnection};
|
|
|
|
|
|
|
|
|
|
use crate::errors::Error;
|
2022-02-03 17:06:19 -08:00
|
|
|
use crate::server::Server;
|
2022-02-03 16:25:05 -08:00
|
|
|
|
|
|
|
|
pub struct ServerPool {
|
|
|
|
|
host: String,
|
|
|
|
|
port: String,
|
|
|
|
|
user: String,
|
|
|
|
|
password: String,
|
|
|
|
|
database: String,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl ServerPool {
|
|
|
|
|
pub fn new(host: &str, port: &str, user: &str, password: &str, database: &str) -> ServerPool {
|
|
|
|
|
ServerPool {
|
|
|
|
|
host: host.to_string(),
|
|
|
|
|
port: port.to_string(),
|
|
|
|
|
user: user.to_string(),
|
|
|
|
|
password: password.to_string(),
|
|
|
|
|
database: database.to_string(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[async_trait]
|
|
|
|
|
impl ManageConnection for ServerPool {
|
|
|
|
|
type Connection = Server;
|
|
|
|
|
type Error = Error;
|
|
|
|
|
|
2022-02-03 17:06:19 -08:00
|
|
|
/// Attempts to create a new connection.
|
2022-02-03 16:25:05 -08:00
|
|
|
async fn connect(&self) -> Result<Self::Connection, Self::Error> {
|
|
|
|
|
println!(">> Getting connetion from pool");
|
2022-02-03 17:06:19 -08:00
|
|
|
Ok(Server::startup(
|
|
|
|
|
&self.host,
|
|
|
|
|
&self.port,
|
|
|
|
|
&self.user,
|
|
|
|
|
&self.password,
|
|
|
|
|
&self.database,
|
|
|
|
|
)
|
|
|
|
|
.await?)
|
2022-02-03 16:25:05 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Determines if the connection is still connected to the database.
|
2022-02-03 17:32:04 -08:00
|
|
|
async fn is_valid(&self, conn: &mut PooledConnection<'_, Self>) -> Result<(), Self::Error> {
|
|
|
|
|
let server = &mut *conn;
|
|
|
|
|
|
|
|
|
|
// If this fails, the connection will be closed and another will be grabbed from the pool quietly :-).
|
|
|
|
|
// Failover, step 1, complete.
|
|
|
|
|
match tokio::time::timeout(
|
|
|
|
|
tokio::time::Duration::from_millis(1000),
|
|
|
|
|
server.query("SELECT 1"),
|
|
|
|
|
)
|
|
|
|
|
.await
|
|
|
|
|
{
|
|
|
|
|
Ok(_) => Ok(()),
|
|
|
|
|
Err(_err) => Err(Error::ServerTimeout),
|
|
|
|
|
}
|
2022-02-03 16:25:05 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Synchronously determine if the connection is no longer usable, if possible.
|
2022-02-03 17:06:19 -08:00
|
|
|
fn has_broken(&self, conn: &mut Self::Connection) -> bool {
|
|
|
|
|
conn.is_bad()
|
2022-02-03 16:25:05 -08:00
|
|
|
}
|
2022-02-03 17:06:19 -08:00
|
|
|
}
|