burncloud_database_client/
factory.rs

1use 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}