rustbasic_core/
database.rs1use crate::Config;
2use sea_orm::{Database, DatabaseConnection, ConnectOptions};
3use std::time::Duration;
4use colored::Colorize;
5
6pub async fn connect(cfg: &Config) -> DatabaseConnection {
7 let db_url = if cfg.db_connection == "mysql" {
9 format!(
10 "mysql://{}:{}@{}:{}/{}",
11 cfg.db_username, cfg.db_password, cfg.db_host, cfg.db_port, cfg.db_database
12 )
13 } else {
14 format!("sqlite:database/{}.sqlite?mode=rwc", cfg.db_database)
16 };
17
18 let mut opt = ConnectOptions::new(db_url);
20 opt.max_connections(20)
21 .min_connections(5)
22 .connect_timeout(Duration::from_secs(8))
23 .idle_timeout(Duration::from_secs(8))
24 .max_lifetime(Duration::from_secs(8))
25 .sqlx_logging(true);
26
27 match Database::connect(opt.clone()).await {
29 Ok(conn) => conn,
30 Err(e) => {
31 let err_msg = e.to_string();
32 if (err_msg.contains("1049") || err_msg.contains("Unknown database")) && cfg.db_connection == "mysql" {
34 println!("{}", "⚠️ Database tidak ditemukan. Mencoba membuat database baru...".yellow());
35
36 let root_url = format!(
37 "mysql://{}:{}@{}:{}",
38 cfg.db_username, cfg.db_password, cfg.db_host, cfg.db_port
39 );
40
41 if let Ok(pool) = sqlx::MySqlPool::connect(&root_url).await {
42 let create_query = format!("CREATE DATABASE IF NOT EXISTS `{}`", cfg.db_database);
43 if sqlx::query(&create_query).execute(&pool).await.is_ok() {
44 println!("✅ Database '{}' berhasil dibuat.", cfg.db_database.green());
45 return Database::connect(opt).await.expect("Gagal terhubung setelah membuat database");
46 }
47 }
48 }
49 panic!("Gagal terhubung ke database: {:?}", e);
50 }
51 }
52}