diff --git a/src-tauri/src/commands/query.rs b/src-tauri/src/commands/query.rs index 4639dc7e6..d98890281 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 0db3e2062..a70203ef4 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 0c116b066..1995af72c 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1320,6 +1320,19 @@ async function setupFileDrop() { > {{ t('tabs.tableData') }} +