use burncloud_database_core::{
DatabaseConfig, DatabaseType, DatabaseConnection, QueryExecutor
};
use burncloud_database_core::error::{DatabaseResult, DatabaseError};
use std::sync::Arc;
#[cfg(feature = "postgres")]
use burncloud_database_impl::PostgresConnection;
#[cfg(feature = "mysql")]
use burncloud_database_impl::MySQLConnection;
#[cfg(feature = "sqlite")]
use burncloud_database_impl::SQLiteConnection;
#[cfg(feature = "mongodb")]
use burncloud_database_impl::MongoDBConnection;
pub struct DatabaseClientFactory;
impl DatabaseClientFactory {
pub fn create_connection(config: &DatabaseConfig) -> DatabaseResult<Box<dyn DatabaseConnection>> {
match config.database_type {
#[cfg(feature = "postgres")]
DatabaseType::Postgres => {
let connection_string = format!(
"postgresql://{}:{}@{}:{}/{}",
config.username, config.password, config.host, config.port, config.database
);
Ok(Box::new(PostgresConnection::new(connection_string)))
}
#[cfg(feature = "mysql")]
DatabaseType::MySQL => {
let connection_string = format!(
"mysql://{}:{}@{}:{}/{}",
config.username, config.password, config.host, config.port, config.database
);
Ok(Box::new(MySQLConnection::new(connection_string)))
}
#[cfg(feature = "sqlite")]
DatabaseType::SQLite => {
Ok(Box::new(SQLiteConnection::new(config.database.clone())))
}
#[cfg(feature = "mongodb")]
DatabaseType::MongoDB => {
let connection_string = format!(
"mongodb://{}:{}@{}:{}",
config.username, config.password, config.host, config.port
);
Ok(Box::new(MongoDBConnection::new(connection_string, config.database.clone())))
}
_ => Err(DatabaseError::ConfigurationError(
format!("Unsupported database type: {:?}", config.database_type)
))
}
}
pub fn create_query_executor(config: &DatabaseConfig) -> DatabaseResult<Box<dyn QueryExecutor>> {
match config.database_type {
#[cfg(feature = "postgres")]
DatabaseType::Postgres => {
let connection_string = format!(
"postgresql://{}:{}@{}:{}/{}",
config.username, config.password, config.host, config.port, config.database
);
Ok(Box::new(PostgresConnection::new(connection_string)))
}
#[cfg(feature = "mysql")]
DatabaseType::MySQL => {
let connection_string = format!(
"mysql://{}:{}@{}:{}/{}",
config.username, config.password, config.host, config.port, config.database
);
Ok(Box::new(MySQLConnection::new(connection_string)))
}
#[cfg(feature = "sqlite")]
DatabaseType::SQLite => {
Ok(Box::new(SQLiteConnection::new(config.database.clone())))
}
#[cfg(feature = "mongodb")]
DatabaseType::MongoDB => {
let connection_string = format!(
"mongodb://{}:{}@{}:{}",
config.username, config.password, config.host, config.port
);
Ok(Box::new(MongoDBConnection::new(connection_string, config.database.clone())))
}
_ => Err(DatabaseError::ConfigurationError(
format!("Unsupported database type: {:?}", config.database_type)
))
}
}
}