diff --git a/Cargo.lock b/Cargo.lock index f48c5dc..b2382fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -276,7 +276,7 @@ checksum = "3b015a331cc64ebd1774ba119538573603427eaace0a1950c423ab971f903796" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -293,7 +293,7 @@ checksum = "b84f9ebcc6c1f5b8cb160f6990096a5c127f423fcb6e1ccc46c370cbdfb75dfc" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -355,7 +355,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn", + "syn 1.0.109", "zbus", "zbus_names", "zvariant", @@ -450,7 +450,7 @@ checksum = "1aca418a974d83d40a0c1f0c5cba6ff4bc28d8df099109ca459a2118d40b6322" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -713,14 +713,11 @@ version = "0.1.0" dependencies = [ "chrono", "csv", - "directories", - "dotenvy", "eframe", "egui", "egui_extras", "grid", "if_chain", - "regex", "rfd", "sqlx", "tokio", @@ -771,7 +768,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn", + "syn 1.0.109", ] [[package]] @@ -788,7 +785,7 @@ checksum = "0b75aed41bb2e6367cae39e6326ef817a851db13c13e4f3263714ca3cfb8de56" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -810,7 +807,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -823,15 +820,6 @@ dependencies = [ "crypto-common", ] -[[package]] -name = "directories" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" -dependencies = [ - "dirs-sys", -] - [[package]] name = "dirs" version = "4.0.0" @@ -1000,7 +988,7 @@ checksum = "f58dc3c5e468259f19f2d46304a6b28f1c3d034442e14b322d2b850e36f6d5ae" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1359,12 +1347,7 @@ dependencies = [ [[package]] name = "grid" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0634107a3a005070dd73e27e74ecb691a94e9e5ba7829f434db7fbf73a6b5c47" -dependencies = [ - "no-std-compat", -] +version = "0.9.1-alpha.0" [[package]] name = "gtk-sys" @@ -1777,12 +1760,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "no-std-compat" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" - [[package]] name = "nohash-hasher" version = "0.2.0" @@ -1886,7 +1863,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1973,7 +1950,7 @@ checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2434,9 +2411,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.156" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "314b5b092c0ade17c00142951e50ced110ec27cea304b1037c6969246c2469a4" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" dependencies = [ "serde_derive", ] @@ -2455,13 +2432,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.156" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7e29c4601e36bcec74a223228dce795f4cd3616341a4af93520ca1a837c087d" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.12", ] [[package]] @@ -2472,7 +2449,7 @@ checksum = "395627de918015623b32e7669714206363a7fc00382bf477e72c1f7533e8eafc" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2667,7 +2644,7 @@ dependencies = [ "sha2", "sqlx-core", "sqlx-rt", - "syn", + "syn 1.0.109", "url", ] @@ -2728,6 +2705,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79d9531f94112cfc3e4c8f5f02cb2b58f72c97b7efd85f70203cc6d8efda5927" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "system-deps" version = "6.0.3" @@ -2780,7 +2768,7 @@ checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2862,7 +2850,7 @@ checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2932,7 +2920,7 @@ checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -3090,7 +3078,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -3124,7 +3112,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3320,7 +3308,7 @@ checksum = "9539b6bd3eadbd9de66c9666b22d802b833da7e996bc06896142e09854a61767" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -3546,7 +3534,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn", + "syn 1.0.109", "zvariant_utils", ] @@ -3590,7 +3578,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "zvariant_utils", ] @@ -3602,5 +3590,5 @@ checksum = "53b22993dbc4d128a17a3b6c92f1c63872dd67198537ee728d8b5d7c40640a8b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] diff --git a/Cargo.toml b/Cargo.toml index a14a497..1cec934 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,14 +11,17 @@ description = "An assistant tool to easily map a CSV spreadsheets collumns to a [dependencies] sqlx = { version = "0.6.2", features = [ "runtime-tokio-native-tls" , "mysql" ] } tokio = { version = "1.25.0", features = ["full"] } -dotenvy = "0.15.6" -directories = "4.0.1" +# ["rt", "io-std", "macros", "parking_lot", "sync" ] +# dotenvy = "0.15.6" +# directories = "4.0.1" csv = "1.1.6" egui = "0.21.0" eframe = "0.21.0" egui_extras = "0.21.0" rfd = "0.11.1" -grid = "0.9.0" -regex = "1.7.1" +# need remove_row() and remove_col(), Change back once pull request accepted +grid = { path = "../grid/grid" } +# regex = "1.7.1" chrono = "0.4.24" if_chain = "1.0.2" +# serde = "1.0.160" diff --git a/mysql-connect.sh b/mysql-connect.sh new file mode 100755 index 0000000..f78ea6b --- /dev/null +++ b/mysql-connect.sh @@ -0,0 +1,3 @@ +sudo systemctl start docker +sleep 1 +sudo docker exec -e IN_DOCKER -it csql-Opencart_dummy_DB-1 /bin/bash -c "mysql -pmauFJcuf5dhRMQrjj" \ No newline at end of file diff --git a/src/backend/backend_manager.rs b/src/backend/backend_manager.rs index a74c6c2..5ca4402 100644 --- a/src/backend/backend_manager.rs +++ b/src/backend/backend_manager.rs @@ -60,8 +60,18 @@ impl BackendManger { let mut csv_data = self.csv_data.lock().await; try_match_headers_to_fields(&mut db_table_data, None, &mut csv_data) } - Communication::ImportDBEntries(usize) => { - todo!() + + Communication::ImportDBEntries => { + let mut db_table_data = self.db_table_data.lock().await; + let mut csv_data = self.csv_data.lock().await; + + if let Some(current_working_table_i) = db_table_data.current_working_table { + if let Some(current_working_table) = + db_table_data.tables.get_mut(current_working_table_i) + { + todo!(); + } + } } Communication::SaveCSV(path) => { todo!() @@ -82,11 +92,13 @@ impl BackendManger { &mut csv_data, ); } - Communication::RemoveRow(usize) => { - todo!() + Communication::RemoveRow(i) => { + let mut csv_data = self.csv_data.lock().await; + csv_data.data.remove_row(i); } - Communication::RemoveCol(usize) => { - todo!() + Communication::RemoveCol(i) => { + let mut csv_data = self.csv_data.lock().await; + csv_data.data.remove_col(i); } Communication::TryParseCol(col_index) => { let mut csv_data = self.csv_data.lock().await; @@ -103,9 +115,48 @@ impl BackendManger { csv_data.is_parsed = true; } } - Communication::StartInserting(table_index, sender, oneshot_sender) => { + Communication::StartInserting(sender, oneshot_sender) => { let csv_data = self.csv_data.lock().await; let db_table_data = self.db_table_data.lock().await; + let table_index = db_table_data.current_working_table.unwrap(); + let table = db_table_data.tables.get(table_index).unwrap(); + + let trans_start = + Table::start_transaction(self.db_connection.as_mut().unwrap()).await; + sender + .send(trans_start) + .await + .unwrap_or_else(|_| println!("db- failed to send Transaction Start")); + + let start_i: usize = csv_data.are_headers.into(); + + let res = table + .truncate_table(self.db_connection.as_mut().unwrap()) + .await; + sender.send(res).await.unwrap_or_else(|_| { + println!("db - failed to send start of insert into table") + }); + for i in start_i..csv_data.data.rows() { + let row: Vec<&DataEntry> = csv_data.data[i].iter().collect(); + let res = table + .insert_into_table(self.db_connection.as_mut().unwrap(), row) + .await; + println!( + " | Query: {}\n > Result: {:?}", + res.query, res.result + ); + sender.send(res).await.unwrap_or_else(|_| { + println!("db - failed to send end of insert into table") + }); + } + oneshot_sender.send(true).unwrap_or_else(|_| { + println!("db - failed to send end of insert into table") + }); + } + Communication::StartAppending(sender, oneshot_sender) => { + let csv_data = self.csv_data.lock().await; + let db_table_data = self.db_table_data.lock().await; + let table_index = db_table_data.current_working_table.unwrap(); let table = db_table_data.tables.get(table_index).unwrap(); let trans_start = Table::start_transaction(self.db_connection.as_mut().unwrap()).await; @@ -113,7 +164,7 @@ impl BackendManger { sender .send(trans_start) .await - .unwrap_or_else(|_| println!("failed to send Transaction Start")); + .unwrap_or_else(|_| println!("db- failed to send Transaction Start")); let start_i: usize = csv_data.are_headers.into(); @@ -129,11 +180,11 @@ impl BackendManger { sender .send(res) .await - .unwrap_or_else(|_| println!("failed to send insert into table")); + .unwrap_or_else(|_| println!("db - failed to send append to table")); } oneshot_sender .send(true) - .unwrap_or_else(|_| println!("Failed to send end of insertin transaction")); + .unwrap_or_else(|_| println!("Failed to send end of append transaction")); } Communication::TryCommit(sender) => { sender @@ -243,12 +294,13 @@ pub enum Communication { ), LoadImportFilePath(String), GetTableDescription(usize), - ImportDBEntries(usize), + ImportDBEntries, RemoveCol(usize), RemoveRow(usize), SaveCSV(String), TryParseCol(usize), - StartInserting(usize, Sender, oneshot::Sender), + StartAppending(Sender, oneshot::Sender), + StartInserting(Sender, oneshot::Sender), TryCommit(oneshot::Sender), TryRollBack(oneshot::Sender), } diff --git a/src/backend/csv_handler.rs b/src/backend/csv_handler.rs index f9758ad..025aea2 100644 --- a/src/backend/csv_handler.rs +++ b/src/backend/csv_handler.rs @@ -1,7 +1,7 @@ -use std::{error::Error, sync::Arc}; - use super::database_handler::FieldDescription; +use std::{error::Error, sync::Arc}; + #[derive(Clone)] pub struct ImportedData { pub data: grid::Grid, @@ -16,6 +16,7 @@ pub struct DataEntry { pub curr_field_description: Option, pub is_parsed: Option>>, } + impl ImportedData { pub fn load_csv(&mut self) -> Result<(), Box> { match csv::Reader::from_path(self.path.as_str()) { diff --git a/src/backend/database_handler.rs b/src/backend/database_handler.rs index 2247e58..535835b 100644 --- a/src/backend/database_handler.rs +++ b/src/backend/database_handler.rs @@ -116,6 +116,42 @@ impl Table { } } } + pub async fn truncate_table(&self, connection: &mut MySqlConnection) -> QueryResult { + match connection + .execute(format!("truncate {}", self.name).as_str()) + .await + { + Ok(res) => { + return QueryResult { + query: format!("truncate {}", self.name), + result: Ok(res), + } + } + Err(e) => { + return QueryResult { + query: format!("truncate {}", self.name), + result: Err(Box::new(e)), + } + } + } + } + pub async fn query_for_table_entries( + &mut self, + connection: &mut MySqlConnection, + ) -> QueryResult { + let res = sqlx::query(format!("select * from {}", self.name).as_str()) + .fetch_all(connection) + .await; + match res { + Ok(rows) => { + for row in rows { + todo!() + } + } + Err(e) => todo!(), + } + todo!(); + } pub async fn insert_into_table( &self, connection: &mut MySqlConnection, diff --git a/src/ui/db_transaction_window.rs b/src/ui/db_transaction_window.rs index 77fbb6c..c7c6829 100644 --- a/src/ui/db_transaction_window.rs +++ b/src/ui/db_transaction_window.rs @@ -15,13 +15,9 @@ pub struct DBTransactionWindow { is_log_finished: bool, is_finished: bool, final_result_receiver: Option>, - working_table_index: usize, } impl DBTransactionWindow { - pub fn default( - sender: Sender, - working_table_index: usize, - ) -> DBTransactionWindow { + pub fn default(sender: Sender) -> DBTransactionWindow { DBTransactionWindow { sender, log_history: vec![], @@ -30,7 +26,6 @@ impl DBTransactionWindow { final_result_receiver: None, is_log_finished_receiver: None, is_log_finished: false, - working_table_index, } } } @@ -92,11 +87,7 @@ impl DBTransactionWindow { 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, - )) + .try_send(Communication::StartAppending(log_sender, finished_sender)) .unwrap_or_else(|_| println!("Failed to send startInserting")); } } @@ -189,3 +180,9 @@ pub struct OptionsDBTransactionWindow { substitute_zero_dates_for_null: bool, remove_id_field_from_insert: bool, } + +pub enum TransactionType { + Append, + Save, + Import, +} diff --git a/src/ui/window_manager.rs b/src/ui/window_manager.rs index c266d11..8137cf9 100644 --- a/src/ui/window_manager.rs +++ b/src/ui/window_manager.rs @@ -100,17 +100,9 @@ impl App for CSQL { } } } else { - println!("No transaction window, creating..."); - if let Ok(db_table_data) = self.db_table_data_handle.try_lock() { - println!("got a db_lock"); - if let Some(cw_table_i) = db_table_data.current_working_table { - println!("Found a current_working _table"); - self.db_transaction_window = Some(DBTransactionWindow::default( - self.sender.clone(), - cw_table_i, - )) - } - }; + println!("Found a current_working _table"); + self.db_transaction_window = + Some(DBTransactionWindow::default(self.sender.clone())) } } });