Skip to main content

rustbasic_core/
database.rs

1use crate::Config;
2use sea_orm::{Database, DatabaseConnection, ConnectOptions};
3use std::time::Duration;
4use colored::Colorize;
5
6pub async fn connect(cfg: &Config) -> DatabaseConnection {
7    // 1. Susun URL Koneksi berdasarkan pilihan di .env
8    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        // Default ke SQLite
15        format!("sqlite:database/{}.sqlite?mode=rwc", cfg.db_database)
16    };
17
18    // 2. Konfigurasi Opsi Koneksi
19    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    // 3. Hubungkan ke Database dengan deteksi otomatis pembuatan DB (khusus MySQL)
28    match Database::connect(opt.clone()).await {
29        Ok(conn) => conn,
30        Err(e) => {
31            let err_msg = e.to_string();
32            // Jika error 1049 (Unknown Database) dan ini MySQL, coba buat database
33            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}