From ae21053f6967554947fcd4915dbbb05452f8fa39 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Mon, 4 May 2026 02:33:57 +0800 Subject: [PATCH] feat: add execute_multi command and update query handling for multiple results --- src-tauri/src/commands/query.rs | 54 +++++++++++++++++++++++++++++++++ src-tauri/src/lib.rs | 1 + src/App.vue | 15 ++++++++- src/i18n/locales/en.ts | 1 + src/i18n/locales/zh-CN.ts | 1 + src/lib/tauri.ts | 4 +++ src/stores/queryStore.ts | 24 ++++++++++++++- src/types/database.ts | 2 ++ 8 files changed, 100 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/commands/query.rs b/src-tauri/src/commands/query.rs index 4639dc7e67..d988902814 100644 --- a/src-tauri/src/commands/query.rs +++ b/src-tauri/src/commands/query.rs @@ -262,6 +262,60 @@ pub async fn execute_query( result } +#[tauri::command] +pub async fn execute_multi( + state: State<'_, Arc>, + connection_id: String, + database: String, + sql: String, + execution_id: Option, +) -> Result, String> { + let registered_query = execution_id + .as_ref() + .filter(|id| !id.trim().is_empty()) + .map(|id| state.running_queries.register(id.clone())); + let cancel_token = registered_query.as_ref().map(|query| query.token()); + + let statements = split_sql_statements(&sql); + if statements.len() <= 1 { + let single_sql = statements.into_iter().next().unwrap_or_default(); + let result = execute_sql_statement( + &state, &connection_id, &database, &single_sql, cancel_token, + ).await?; + return Ok(vec![result]); + } + + let mut results = Vec::with_capacity(statements.len()); + for stmt in &statements { + if is_canceled(&cancel_token) { + results.push(db::QueryResult { + columns: vec!["Error".to_string()], + rows: vec![vec![serde_json::Value::String(canceled_error())]], + affected_rows: 0, + execution_time_ms: 0, + truncated: false, + }); + break; + } + match execute_sql_statement( + &state, &connection_id, &database, stmt, cancel_token.clone(), + ).await { + Ok(r) => results.push(r), + Err(e) => { + results.push(db::QueryResult { + columns: vec!["Error".to_string()], + rows: vec![vec![serde_json::Value::String(e)]], + affected_rows: 0, + execution_time_ms: 0, + truncated: false, + }); + } + } + } + + Ok(results) +} + #[tauri::command] pub async fn cancel_query( state: State<'_, Arc>, diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 0db3e20626..a70203ef47 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -63,6 +63,7 @@ pub fn run() { commands::schema::list_triggers, commands::schema::get_table_ddl, commands::query::execute_query, + commands::query::execute_multi, commands::query::cancel_query, commands::query::execute_batch, commands::query::execute_script, diff --git a/src/App.vue b/src/App.vue index 0c116b066f..1995af72c2 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1320,6 +1320,19 @@ async function setupFileDrop() { > {{ t('tabs.tableData') }} +