2021-02-23 18:44:37 +03:00
|
|
|
use super::adapter::ToSqlParams;
|
|
|
|
use super::clients::*;
|
2021-02-18 12:29:09 +03:00
|
|
|
use crate::config::{DatabaseConfig, SupportedDatabaseClient};
|
|
|
|
use crate::error::StdResult;
|
|
|
|
|
2021-03-02 00:44:54 +03:00
|
|
|
pub type AnyConnection = Box<dyn DatabaseConnection>;
|
|
|
|
|
2021-02-23 18:44:37 +03:00
|
|
|
pub trait OpenDatabaseConnection: Sized {
|
|
|
|
fn open(connection_string: &str) -> StdResult<Self>;
|
|
|
|
}
|
|
|
|
|
2021-04-08 00:49:38 +03:00
|
|
|
pub trait DatabaseStatements {
|
|
|
|
fn create_migration_table_stmt(&self) -> &'static str;
|
|
|
|
}
|
2021-03-26 02:10:41 +03:00
|
|
|
|
2021-04-24 22:48:10 +03:00
|
|
|
pub trait SupportsTransactionalDdl {
|
2021-04-24 22:39:42 +03:00
|
|
|
#[inline]
|
|
|
|
fn supports_transactional_ddl(&self) -> bool {
|
|
|
|
false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-24 22:48:10 +03:00
|
|
|
pub trait DatabaseConnection: DatabaseStatements + SupportsTransactionalDdl {
|
2021-02-23 18:44:37 +03:00
|
|
|
fn batch_execute(&mut self, query: &str) -> StdResult<()>;
|
|
|
|
|
|
|
|
fn execute<'b>(&mut self, query: &str, params: ToSqlParams<'b>) -> StdResult<u64>;
|
|
|
|
|
|
|
|
fn query<'b>(&mut self, query: &str, params: ToSqlParams<'b>) -> StdResult<Vec<Vec<String>>>;
|
|
|
|
}
|
|
|
|
|
2021-02-18 12:29:09 +03:00
|
|
|
pub(crate) struct DatabaseConnectionManager {
|
2021-03-02 00:44:54 +03:00
|
|
|
conn: AnyConnection,
|
2021-02-18 12:29:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
impl DatabaseConnectionManager {
|
2021-02-19 22:17:01 +03:00
|
|
|
pub fn connect_with_string(
|
2021-03-02 00:44:54 +03:00
|
|
|
config: &DatabaseConfig,
|
2021-02-19 22:17:01 +03:00
|
|
|
connection_string: &str,
|
2021-03-02 00:44:54 +03:00
|
|
|
) -> StdResult<Self> {
|
2021-03-26 02:10:41 +03:00
|
|
|
let conn: AnyConnection = match config.client() {
|
|
|
|
#[cfg(feature = "postgres")]
|
|
|
|
SupportedDatabaseClient::Postgres => {
|
|
|
|
Box::new(PostgresConnection::open(&connection_string)?)
|
|
|
|
}
|
|
|
|
#[cfg(feature = "mysql")]
|
|
|
|
SupportedDatabaseClient::Mysql => Box::new(MySqlConnection::open(&connection_string)?),
|
2021-02-18 12:29:09 +03:00
|
|
|
};
|
|
|
|
|
2021-03-26 02:10:41 +03:00
|
|
|
Ok(DatabaseConnectionManager { conn })
|
2021-03-02 00:44:54 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn connect(config: &DatabaseConfig) -> StdResult<Self> {
|
|
|
|
let connection_string = config.connection_string()?;
|
|
|
|
Self::connect_with_string(config, &connection_string)
|
2021-02-18 12:29:09 +03:00
|
|
|
}
|
|
|
|
|
2021-03-02 00:44:54 +03:00
|
|
|
pub fn connection(&mut self) -> &mut AnyConnection {
|
|
|
|
&mut self.conn
|
2021-02-18 12:29:09 +03:00
|
|
|
}
|
|
|
|
}
|