burncloud_database_client/
factory.rs1use burncloud_database_core::{
2 DatabaseConfig, DatabaseType, DatabaseConnection, QueryExecutor
3};
4use burncloud_database_core::error::{DatabaseResult, DatabaseError};
5use std::sync::Arc;
6
7#[cfg(feature = "postgres")]
8use burncloud_database_impl::PostgresConnection;
9
10#[cfg(feature = "mysql")]
11use burncloud_database_impl::MySQLConnection;
12
13#[cfg(feature = "sqlite")]
14use burncloud_database_impl::SQLiteConnection;
15
16#[cfg(feature = "mongodb")]
17use burncloud_database_impl::MongoDBConnection;
18
19pub struct DatabaseClientFactory;
20
21impl DatabaseClientFactory {
22 pub fn create_connection(config: &DatabaseConfig) -> DatabaseResult<Box<dyn DatabaseConnection>> {
23 match config.database_type {
24 #[cfg(feature = "postgres")]
25 DatabaseType::Postgres => {
26 let connection_string = format!(
27 "postgresql://{}:{}@{}:{}/{}",
28 config.username, config.password, config.host, config.port, config.database
29 );
30 Ok(Box::new(PostgresConnection::new(connection_string)))
31 }
32
33 #[cfg(feature = "mysql")]
34 DatabaseType::MySQL => {
35 let connection_string = format!(
36 "mysql://{}:{}@{}:{}/{}",
37 config.username, config.password, config.host, config.port, config.database
38 );
39 Ok(Box::new(MySQLConnection::new(connection_string)))
40 }
41
42 #[cfg(feature = "sqlite")]
43 DatabaseType::SQLite => {
44 Ok(Box::new(SQLiteConnection::new(config.database.clone())))
45 }
46
47 #[cfg(feature = "mongodb")]
48 DatabaseType::MongoDB => {
49 let connection_string = format!(
50 "mongodb://{}:{}@{}:{}",
51 config.username, config.password, config.host, config.port
52 );
53 Ok(Box::new(MongoDBConnection::new(connection_string, config.database.clone())))
54 }
55
56 _ => Err(DatabaseError::ConfigurationError(
57 format!("Unsupported database type: {:?}", config.database_type)
58 ))
59 }
60 }
61
62 pub fn create_query_executor(config: &DatabaseConfig) -> DatabaseResult<Box<dyn QueryExecutor>> {
63 match config.database_type {
64 #[cfg(feature = "postgres")]
65 DatabaseType::Postgres => {
66 let connection_string = format!(
67 "postgresql://{}:{}@{}:{}/{}",
68 config.username, config.password, config.host, config.port, config.database
69 );
70 Ok(Box::new(PostgresConnection::new(connection_string)))
71 }
72
73 #[cfg(feature = "mysql")]
74 DatabaseType::MySQL => {
75 let connection_string = format!(
76 "mysql://{}:{}@{}:{}/{}",
77 config.username, config.password, config.host, config.port, config.database
78 );
79 Ok(Box::new(MySQLConnection::new(connection_string)))
80 }
81
82 #[cfg(feature = "sqlite")]
83 DatabaseType::SQLite => {
84 Ok(Box::new(SQLiteConnection::new(config.database.clone())))
85 }
86
87 #[cfg(feature = "mongodb")]
88 DatabaseType::MongoDB => {
89 let connection_string = format!(
90 "mongodb://{}:{}@{}:{}",
91 config.username, config.password, config.host, config.port
92 );
93 Ok(Box::new(MongoDBConnection::new(connection_string, config.database.clone())))
94 }
95
96 _ => Err(DatabaseError::ConfigurationError(
97 format!("Unsupported database type: {:?}", config.database_type)
98 ))
99 }
100 }
101}