use super::adapter::ToSqlParams; use super::clients::*; use crate::config::{DatabaseConfig, SupportedDatabaseClient}; use crate::error::StdResult; pub type AnyConnection = Box; pub trait OpenDatabaseConnection: Sized { fn open(connection_string: &str) -> StdResult; } pub trait DatabaseConnection { fn batch_execute(&mut self, query: &str) -> StdResult<()>; fn execute<'b>(&mut self, query: &str, params: ToSqlParams<'b>) -> StdResult; fn query<'b>(&mut self, query: &str, params: ToSqlParams<'b>) -> StdResult>>; } pub(crate) struct DatabaseConnectionManager { conn: AnyConnection, } impl DatabaseConnectionManager { pub fn connect_with_string( config: &DatabaseConfig, connection_string: &str, ) -> StdResult { let conn = match config.client()? { SupportedDatabaseClient::Postgres => PostgresConnection::open(&connection_string)?, }; Ok(DatabaseConnectionManager { conn: Box::new(conn), }) } pub fn connect(config: &DatabaseConfig) -> StdResult { let connection_string = config.connection_string()?; Self::connect_with_string(config, &connection_string) } pub fn connection(&mut self) -> &mut AnyConnection { &mut self.conn } }