From f4413f7a4d98356753ca5d7f8d6a504d0b7b85c2 Mon Sep 17 00:00:00 2001 From: Daniel Boros Date: Fri, 29 Dec 2023 14:26:21 +0100 Subject: [PATCH] feat: add sql query parseing --- src/query_editor.rs | 8 ++++++- src/store/query.rs | 55 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/query_editor.rs b/src/query_editor.rs index 96d457c..5ce82f2 100644 --- a/src/query_editor.rs +++ b/src/query_editor.rs @@ -6,7 +6,7 @@ use monaco::{ api::{CodeEditor, CodeEditorOptions}, sys::editor::{IDimension, IEditorMinimapOptions}, }; -use wasm_bindgen::JsCast; +use wasm_bindgen::{closure::Closure, JsCast}; use crate::store::{editor::EditorState, query::QueryState}; @@ -42,6 +42,12 @@ pub fn query_editor() -> impl IntoView { options.set_minimap(Some(&minimap_settings)); let e = CodeEditor::create(html_element, Some(options)); + let keycode = monaco::sys::KeyMod::win_ctrl() as u32 | monaco::sys::KeyCode::Enter.to_value(); + e.as_ref().add_command( + keycode.into(), + Closure::::new(|| ()).as_ref().unchecked_ref(), + None, + ); editor.update(|prev| { prev.replace(Some(e)); }); diff --git a/src/store/query.rs b/src/store/query.rs index 2602b8f..416c6c4 100644 --- a/src/store/query.rs +++ b/src/store/query.rs @@ -39,8 +39,24 @@ impl QueryState { *prev = true; }); let editor_state = use_context::().unwrap(); + let position: monaco::sys::Position = editor_state + .editor + .get_untracked() + .borrow() + .as_ref() + .unwrap() + .as_ref() + .get_position() + .unwrap(); let sql = editor_state.get_value(); - let args = serde_wasm_bindgen::to_value(&InvokeQueryArgs { sql }).unwrap(); + let sql = match self.find_query_for_line(&sql, position.line_number()) { + Some(query) => Some(query), + None => None, + }; + let args = serde_wasm_bindgen::to_value(&InvokeQueryArgs { + sql: sql.unwrap().query, + }) + .unwrap(); let data = invoke(&Invoke::select_sql_result.to_string(), args).await; let data = serde_wasm_bindgen::from_value::<(Vec, Vec>)>(data).unwrap(); self.sql_result.set(Some(data)); @@ -86,4 +102,41 @@ impl QueryState { let editor_state = use_context::().unwrap(); editor_state.set_value(&query); } + + fn find_query_for_line(&self, queries: &str, line_number: f64) -> Option { + let mut start_line = 1f64; + let mut end_line = 1f64; + let mut current_query = String::new(); + + for line in queries.lines() { + if !current_query.is_empty() { + current_query.push('\n'); + } + current_query.push_str(line); + end_line += 1f64; + + if line.ends_with(';') { + if line_number >= start_line && line_number < end_line { + return Some(QueryInfo { + query: current_query.clone(), + start_line, + end_line: end_line - 1f64, + }); + } + start_line = end_line; + current_query.clear(); + } + } + + None + } +} + +#[derive(Clone, Debug)] +struct QueryInfo { + query: String, + #[allow(dead_code)] + start_line: f64, + #[allow(dead_code)] + end_line: f64, }