From 557897f428f56925e1d983f422e1c1facdb5d4d6 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Fri, 1 May 2026 19:36:17 +0800 Subject: [PATCH] feat: enhance MySQL connection handling and update connection dialog for Doris, SelectDB, and StarRocks --- src-tauri/src/commands/connection.rs | 15 ++++++++++++--- src-tauri/src/db/mysql.rs | 15 +++++++++++++++ src-tauri/src/models/connection.rs | 5 ++++- src/components/connection/ConnectionDialog.vue | 6 +++--- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/commands/connection.rs b/src-tauri/src/commands/connection.rs index 92d554532c..4169127342 100644 --- a/src-tauri/src/commands/connection.rs +++ b/src-tauri/src/commands/connection.rs @@ -86,7 +86,8 @@ impl AppState { let (host, port) = self.connection_host_port(connection_id, &db_config).await?; let url = connection_url_for_endpoint(&db_config, &host, port); let pool = match db_config.db_type { - DatabaseType::Mysql | DatabaseType::Doris | DatabaseType::StarRocks => PoolKind::Mysql(db::mysql::connect(&url).await?), + DatabaseType::Mysql => PoolKind::Mysql(db::mysql::connect(&url).await?), + DatabaseType::Doris | DatabaseType::StarRocks => PoolKind::Mysql(db::mysql::connect_bare(&url).await?), DatabaseType::Postgres | DatabaseType::Redshift => PoolKind::Postgres(db::postgres::connect(&url).await?), DatabaseType::Sqlite => PoolKind::Sqlite(db::sqlite::connect(&url).await?), DatabaseType::Redis => { @@ -266,7 +267,14 @@ pub async fn test_connection( target ); let result = match config.db_type { - DatabaseType::Mysql | DatabaseType::Doris | DatabaseType::StarRocks => match db::mysql::connect(&url).await { + DatabaseType::Mysql => match db::mysql::connect(&url).await { + Ok(pool) => { + pool.close().await; + Ok("Connection successful".to_string()) + } + Err(e) => Err(e), + }, + DatabaseType::Doris | DatabaseType::StarRocks => match db::mysql::connect_bare(&url).await { Ok(pool) => { pool.close().await; Ok("Connection successful".to_string()) @@ -359,7 +367,8 @@ pub async fn connect_db( let url = connection_url_for_endpoint(&config, &host, port); let pool = match config.db_type { - DatabaseType::Mysql | DatabaseType::Doris | DatabaseType::StarRocks => PoolKind::Mysql(db::mysql::connect(&url).await?), + DatabaseType::Mysql => PoolKind::Mysql(db::mysql::connect(&url).await?), + DatabaseType::Doris | DatabaseType::StarRocks => PoolKind::Mysql(db::mysql::connect_bare(&url).await?), DatabaseType::Postgres | DatabaseType::Redshift => PoolKind::Postgres(db::postgres::connect(&url).await?), DatabaseType::Sqlite => PoolKind::Sqlite(db::sqlite::connect(&url).await?), DatabaseType::Redis => { diff --git a/src-tauri/src/db/mysql.rs b/src-tauri/src/db/mysql.rs index 853d1c39e8..82a09fff8a 100644 --- a/src-tauri/src/db/mysql.rs +++ b/src-tauri/src/db/mysql.rs @@ -116,6 +116,21 @@ pub async fn connect(url: &str) -> Result { .map_err(|e| format!("MySQL connection failed: {e}")) } +pub async fn connect_bare(url: &str) -> Result { + let options: sqlx::mysql::MySqlConnectOptions = url.parse() + .map_err(|e: sqlx::Error| format!("Invalid MySQL URL: {e}"))?; + let options = options + .no_engine_substitution(false) + .set_names(false); + MySqlPoolOptions::new() + .max_connections(5) + .acquire_timeout(Duration::from_secs(10)) + .idle_timeout(Duration::from_secs(300)) + .connect_with(options) + .await + .map_err(|e| format!("MySQL connection failed: {e}")) +} + pub async fn list_databases(pool: &MySqlPool) -> Result, String> { let rows: Vec = sqlx::query("SELECT SCHEMA_NAME FROM information_schema.SCHEMATA ORDER BY SCHEMA_NAME") .fetch_all(pool) diff --git a/src-tauri/src/models/connection.rs b/src-tauri/src/models/connection.rs index 381e817ba8..eace8b3268 100644 --- a/src-tauri/src/models/connection.rs +++ b/src-tauri/src/models/connection.rs @@ -202,7 +202,10 @@ impl ConnectionConfig { } DatabaseType::Doris | DatabaseType::StarRocks => { let v = value.trim_start_matches('?'); - if v.is_empty() { "ssl-mode=disabled".to_string() } else { v.to_string() } + let filtered: Vec<&str> = v.split('&') + .filter(|p| !p.is_empty() && !p.starts_with("charset=") && !p.starts_with("ssl-mode=preferred")) + .collect(); + if filtered.is_empty() { "ssl-mode=disabled".to_string() } else { format!("ssl-mode=disabled&{}", filtered.join("&")) } } DatabaseType::Postgres | DatabaseType::Redshift => value.trim_start_matches('?').to_string(), _ => value.trim_start_matches('?').to_string(), diff --git a/src/components/connection/ConnectionDialog.vue b/src/components/connection/ConnectionDialog.vue index c785beff06..7f39683a37 100644 --- a/src/components/connection/ConnectionDialog.vue +++ b/src/components/connection/ConnectionDialog.vue @@ -93,9 +93,9 @@ const driverProfiles: Record