From 62fa057daf64e76008ea1768eb885122e647a7bf Mon Sep 17 00:00:00 2001 From: djkato Date: Sun, 9 Apr 2023 14:07:46 +0200 Subject: [PATCH] working commits! --- docker-compose.yml | 10 +- src/backend/database_handler.rs | 10 +- src/ui/db_transaction_window.rs | 170 +++++++++++++++----------------- src/ui/window_manager.rs | 17 ++-- 4 files changed, 109 insertions(+), 98 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 9629862..9936093 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,4 +15,12 @@ services: - ./demo-db.sql:/docker-entrypoint-initdb.d/init.sql volumes: db: - driver: local \ No newline at end of file + driver: local + +# To connect to mysql, do: +# sudo docker exec -it csql-Opencart_dummy_DB-1 /bin/bash +# mysql -p +# [password] +# use quotes; +# select * from oc_product; +# clear table: truncate oc_product; \ No newline at end of file diff --git a/src/backend/database_handler.rs b/src/backend/database_handler.rs index 21d4382..26da699 100644 --- a/src/backend/database_handler.rs +++ b/src/backend/database_handler.rs @@ -112,21 +112,25 @@ impl Table { csv_row: Vec<&DataEntry>, ) -> QueryResult { /* Field_name, data_name */ - let fields = csv_row + let mut fields = csv_row .iter() .fold(("".to_owned(), "".to_owned()), |row, next_row| { ( row.0 - + ", " + next_row .curr_field_description .as_ref() .unwrap() .field - .as_str(), + .as_str() + + ", ", row.1 + "\'" + next_row.data.as_str() + "\', ", ) }); + fields.0.pop(); + fields.0.pop(); + fields.1.pop(); + fields.1.pop(); let query = format!( "INSERT INTO {}({}) VALUES({})", self.name, fields.0, fields.1 diff --git a/src/ui/db_transaction_window.rs b/src/ui/db_transaction_window.rs index 634a31f..d175b89 100644 --- a/src/ui/db_transaction_window.rs +++ b/src/ui/db_transaction_window.rs @@ -34,7 +34,7 @@ impl DBTransactionWindow { } } impl DBTransactionWindow { - pub fn show(&mut self, ctx: &Context, ui: &mut Ui) { + pub fn show(&mut self, ctx: &Context, ui: &mut Ui, frame: &mut eframe::Frame) { egui::Window::new("Database Transactions") .id(egui::Id::new("Database Transactions")) .resizable(false) @@ -43,6 +43,10 @@ impl DBTransactionWindow { .movable(false) .scroll2([false, true]) .enabled(true) + .fixed_size(egui::Vec2::new( + frame.info().window_info.size.x / 1.3, + frame.info().window_info.size.y / 1.5, + )) .anchor(egui::Align2::CENTER_CENTER, egui::Vec2::ZERO) .show(ctx, |ui| { self.log(); @@ -57,107 +61,97 @@ impl DBTransactionWindow { } if self.is_log_finished_receiver.is_some() { if let Ok(finished) = self.is_log_finished_receiver.as_mut().unwrap().try_recv() { - //self.result = Some(finished); + self.result = Some(vec![]); println!("FINISHED THE QUERY!!!"); } } - let (log_sender, log_receiver) = channel(2); - let (finished_sender, finished_receiver) = oneshot::channel(); - self.is_log_finished_receiver = Some(finished_receiver); - self.logs_receiver = Some(log_receiver); - self.sender - .try_send(Communication::StartInserting( - self.working_table_index, - log_sender, - finished_sender, - )) - .unwrap_or_else(|_| println!("Failed to send startInserting")); + if self.is_log_finished_receiver.is_none() && self.logs_receiver.is_none() { + let (log_sender, log_receiver) = channel(2); + let (finished_sender, finished_receiver) = oneshot::channel(); + self.is_log_finished_receiver = Some(finished_receiver); + self.logs_receiver = Some(log_receiver); + self.sender + .try_send(Communication::StartInserting( + self.working_table_index, + log_sender, + finished_sender, + )) + .unwrap_or_else(|_| println!("Failed to send startInserting")); + } } pub fn ui(&mut self, ctx: &Context, ui: &mut Ui) { ui.add_enabled_ui(self.result.is_some(), |ui| { - if ui.button("Roll back").clicked() { - if self.final_result_receiver.is_none() { - let (sender, receiver) = oneshot::channel(); - self.final_result_receiver = Some(receiver); - self.sender - .try_send(Communication::TryRollBack(sender)) - .unwrap_or_else(|_| println!("failed sending TryCommit receiver")); + ui.horizontal(|ui| { + if ui.button("Roll back").clicked() { + if self.final_result_receiver.is_none() { + let (sender, receiver) = oneshot::channel(); + self.final_result_receiver = Some(receiver); + self.sender + .try_send(Communication::TryRollBack(sender)) + .unwrap_or_else(|_| println!("failed sending TryCommit receiver")); + } } - } - if ui.button("Commit").clicked() { - if self.final_result_receiver.is_none() { - let (sender, receiver) = oneshot::channel(); - self.final_result_receiver = Some(receiver); - self.sender - .try_send(Communication::TryCommit(sender)) - .unwrap_or_else(|_| println!("failed sending TryCommit receiver")); + if ui.button("Commit").clicked() { + if self.final_result_receiver.is_none() { + let (sender, receiver) = oneshot::channel(); + self.final_result_receiver = Some(receiver); + self.sender + .try_send(Communication::TryCommit(sender)) + .unwrap_or_else(|_| println!("failed sending TryCommit receiver")); + } } - } + }); }); /* DB Output Stuff */ - egui::ScrollArea::vertical() + egui::ScrollArea::both() .auto_shrink([false; 2]) + .stick_to_bottom(true) .show(ui, |ui| { - egui_extras::StripBuilder::new(ui) - .size(egui_extras::Size::remainder().at_least(100.0)) - .size(egui_extras::Size::remainder()) - .vertical(|mut strip| { - strip.cell(|ui| { - egui::ScrollArea::horizontal().show(ui, |ui| { - let mut table = egui_extras::TableBuilder::new(ui) - .striped(true) - .resizable(true) - .cell_layout(egui::Layout::left_to_right(egui::Align::LEFT)) - .column(egui_extras::Column::auto().clip(false)) - .column(egui_extras::Column::auto().clip(false)) - .min_scrolled_height(0.0); - table - .header(20.0, |mut header| { - header.col(|ui| { - ui.strong("Query"); - }); - header.col(|ui| { - ui.strong("Result"); - }); - }) - .body(|mut body| { - body.rows( - 15.0, - self.log_history.len(), - |row_index, mut row| { - let log = self.log_history.get(row_index).unwrap(); - row.col(|ui| { - ui.label(&log.query); - }); - row.col(|ui| { - match &log.result { - Ok(rows) => { - ui.style_mut() - .visuals - .override_text_color = - Some(egui::Color32::RED); - ui.label(format!( - "Success! Rows affected: {}", - rows.rows_affected() - )); - } - Err(e) => { - ui.style_mut() - .visuals - .override_text_color = - Some(egui::Color32::RED); - ui.label(format!("Error! {}", e)); - } - } - ui.reset_style(); - }); - }, - ); - }); - ui.scroll_to_cursor(Some(egui::Align::BOTTOM)); - }); + let mut table = egui_extras::TableBuilder::new(ui) + .striped(true) + .resizable(true) + .cell_layout(egui::Layout::left_to_right(egui::Align::LEFT)) + .column(egui_extras::Column::remainder().clip(true)) + .stick_to_bottom(true) + .column(egui_extras::Column::remainder().clip(true)) + .stick_to_bottom(true); + + table + .header(20.0, |mut header| { + header.col(|ui| { + ui.strong("Query"); + }); + header.col(|ui| { + ui.strong("Result"); }); }) + .body(|mut body| { + body.rows(15.0, self.log_history.len(), |row_index, mut row| { + let log = self.log_history.get(row_index).unwrap(); + row.col(|ui| { + ui.label(&log.query); + }); + row.col(|ui| { + match &log.result { + Ok(rows) => { + ui.style_mut().visuals.override_text_color = + Some(egui::Color32::LIGHT_GREEN); + ui.label(format!( + "Success! Rows affected: {}", + rows.rows_affected() + )); + } + Err(e) => { + ui.style_mut().visuals.override_text_color = + Some(egui::Color32::LIGHT_RED); + ui.label(format!("Error! {}", e)); + } + } + ui.reset_style(); + }); + }); + }); + ui.scroll_to_cursor(Some(egui::Align::BOTTOM)); }); } } diff --git a/src/ui/window_manager.rs b/src/ui/window_manager.rs index 29c1fca..992c1b7 100644 --- a/src/ui/window_manager.rs +++ b/src/ui/window_manager.rs @@ -71,13 +71,18 @@ impl App for CSQL { if let Ok(resp) = self.open_db_transaction_window_receiver.try_recv() { self.should_open_db_transaction_window = Some(resp); } - if self.should_open_db_transaction_window.is_some() { - let db_transaction_window = DBTransactionWindow::default( - self.sender.clone(), - self.should_open_db_transaction_window.unwrap(), - ); + if let Some(db_transaction_window) = self.db_transaction_window.as_mut() { + db_transaction_window.show(ctx, ui, frame) + } + if let Some(working_table_index) = self.should_open_db_transaction_window { + let db_transaction_window = + DBTransactionWindow::default(self.sender.clone(), working_table_index); self.db_transaction_window = Some(db_transaction_window); - self.db_transaction_window.as_mut().unwrap().show(ctx, ui); + self.db_transaction_window + .as_mut() + .unwrap() + .show(ctx, ui, frame); + self.should_open_db_transaction_window = None; } /* Changes self if db connection is verified */