From edc0c4d1b653397d0fdd24ddeaf00d89883aac7f Mon Sep 17 00:00:00 2001 From: giuseppe-g-gelardi Date: Fri, 13 Dec 2024 21:31:28 -0500 Subject: [PATCH 1/3] add list tables method and rename table --- Cargo.toml | 1 - src/database.rs | 72 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 99c5a77..f7d8691 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,6 @@ documentation = "TODO: https://docs.rs/cargobase" readme = "README.md" keywords = ["key-value", "store", "database", "in-memory", "file-based", "utility", "local", "rust"] categories = ["data-management", "development-tools", "utilities", "database"] -edition = "2021" [dependencies] serde = { version = "1.0.215", features = ["derive"] } diff --git a/src/database.rs b/src/database.rs index b70afc7..fdb0644 100644 --- a/src/database.rs +++ b/src/database.rs @@ -176,6 +176,40 @@ impl Database { let view = View::new(self); view.single_table(table_name); } + + pub fn list_tables(&self) -> Vec { + self.tables.keys().cloned().collect() + } + + pub async fn rename_table( + &mut self, + old_name: &str, + new_name: &str, + ) -> Result<(), DatabaseError> { + if old_name == new_name { + return Err(DatabaseError::InvalidData( + "old name and new name are the same".to_string(), + )); + } + + let table = self.tables.remove(old_name).ok_or_else(|| { + DatabaseError::TableNotFound(format!("Table {} not found", old_name.to_string())) + }); + + if self.tables.contains_key(new_name) { + return Err(DatabaseError::TableAlreadyExists(new_name.to_string())); + } + + let mut table = table?; + table.name = new_name.to_string(); + self.tables.insert(new_name.to_string(), table); + + self.save_to_file() + .await + .map_err(DatabaseError::SaveError)?; + + Ok(()) + } } #[cfg(test)] @@ -183,7 +217,7 @@ mod tests { use tracing_test::traced_test; use super::*; - use crate::{setup_temp_db, Columns, Table}; + use crate::{setup_temp_db, Column, Columns, Table}; #[derive(Serialize, Deserialize, Debug, PartialEq, Clone, Default)] struct TestData { @@ -320,4 +354,40 @@ mod tests { assert_eq!(db, loaded_db); } + + #[tokio::test] + async fn test_rename_table_success() { + let mut db = setup_temp_db().await; + + db.rename_table("TestTable", "RenamedTable") + .await + .expect("Failed to rename table"); + + assert!(db.tables.contains_key("RenamedTable")); + assert!(!db.tables.contains_key("TestTable")); + } + + #[tokio::test] + async fn test_rename_table_already_exists() { + let mut db = setup_temp_db().await; + + let mut another_table = Table::new( + "AnotherTable".to_string(), + Columns::new(vec![Column::new("id", true)]), + ); + db.add_table(&mut another_table).await.unwrap(); + + let result = db.rename_table("TestTable", "AnotherTable").await; + + assert!(matches!(result, Err(DatabaseError::TableAlreadyExists(_)))); + } + + #[tokio::test] + async fn test_rename_table_not_found() { + let mut db = setup_temp_db().await; + + let result = db.rename_table("NonExistentTable", "NewTable").await; + + assert!(matches!(result, Err(DatabaseError::TableNotFound(_)))); + } } From dfb0a786d21a379b650041f37c5bb834fac85e1d Mon Sep 17 00:00:00 2001 From: giuseppe-g-gelardi Date: Fri, 13 Dec 2024 21:56:27 -0500 Subject: [PATCH 2/3] add countrows method update cargo toml and move main.rs, hopefully github doesnt complain --- .gitignore | 2 +- Cargo.toml | 6 ++--- src/database.rs | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index e04fdc2..2ba40d3 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,7 @@ cargobase.json cargobase-async.json cargobase-testing.json -main.rs +src/main.rs .env diff --git a/Cargo.toml b/Cargo.toml index f7d8691..805de29 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,6 @@ tracing-test = "0.2.5" [lib] path = "src/lib.rs" -[[bin]] -name = "cargobase" -path = "main.rs" +# [[bin]] +# name = "cargobase" +# path = "main.rs" diff --git a/src/database.rs b/src/database.rs index fdb0644..9dc1d46 100644 --- a/src/database.rs +++ b/src/database.rs @@ -210,10 +210,22 @@ impl Database { Ok(()) } + + pub fn count_rows(&self, table_name: &str) -> Result { + if let Some(table) = self.tables.get(table_name) { + Ok(table.rows.len()) + } else { + Err(DatabaseError::TableNotFound(format!( + "Table {} not found", + table_name.to_string() + ))) + } + } } #[cfg(test)] mod tests { + use serde_json::json; use tracing_test::traced_test; use super::*; @@ -390,4 +402,50 @@ mod tests { assert!(matches!(result, Err(DatabaseError::TableNotFound(_)))); } + + #[tokio::test] + async fn test_count_rows() { + #[derive(Serialize, Deserialize, Debug, PartialEq, Clone, Default)] + pub struct User { + id: String, + name: String, + email: String, + } + let mut db = setup_temp_db().await; + + let user_columns = Columns::from_struct::(true); + // + let mut users_table = Table::new("users".to_string(), user_columns.clone()); + db.add_table(&mut users_table) + .await + .expect("failed to add users table"); + + let user1 = json!({ + "id": "1", + "name": "John Doe", + "email": "johndoe@example.com" + }); + let user2 = json!({ + "id": "2", + "name": "Jane Smith", + "email": "janesmith@example.com" + }); + let user3 = json!({ + "id": "3", + "name": "Alice Johnson", + "email": "alice@example.com" + }); + + users_table.add_row(&mut db, user1).await; + users_table.add_row(&mut db, user2).await; + users_table.add_row(&mut db, user3).await; + + // Count rows in the table + let row_count = db.count_rows("users").unwrap(); + assert_eq!(row_count, 3); + + // Attempt to count rows for a non-existent table + let result = db.count_rows("NonExistentTable"); + assert!(matches!(result, Err(DatabaseError::TableNotFound(_)))); + } } From fc960dc2c53e7bfc5ef9ea941cb4d9f1ff3a9f0a Mon Sep 17 00:00:00 2001 From: giuseppe-g-gelardi Date: Fri, 13 Dec 2024 22:16:36 -0500 Subject: [PATCH 3/3] update test to count rows to insert a vector of data. -- just realizing i have an add_row for both db and table. --- src/database.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/database.rs b/src/database.rs index 9dc1d46..5c3f064 100644 --- a/src/database.rs +++ b/src/database.rs @@ -104,7 +104,6 @@ impl Database { } pub(crate) fn get_table_mut(&mut self, table_name: &str) -> Option<&mut Table> { - // self.tables.get_mut(table_name) tracing::debug!("looking for table: {}", table_name); let table = self.tables.get_mut(table_name); @@ -436,9 +435,15 @@ mod tests { "email": "alice@example.com" }); - users_table.add_row(&mut db, user1).await; - users_table.add_row(&mut db, user2).await; - users_table.add_row(&mut db, user3).await; + let users = vec![user1, user2, user3]; + + // add single rows + // users_table.add_row(&mut db, user1).await; + // users_table.add_row(&mut db, user2).await; + // users_table.add_row(&mut db, user3).await; + + // add array of rows.... .into() converts Vec to Vec??? + users_table.add_row(&mut db, users.into()).await; // Count rows in the table let row_count = db.count_rows("users").unwrap();