diff --git a/src/databases/database.rs b/src/data/databases/database.rs similarity index 59% rename from src/databases/database.rs rename to src/data/databases/database.rs index e29673d..6e9733a 100644 --- a/src/databases/database.rs +++ b/src/data/databases/database.rs @@ -16,34 +16,27 @@ * along with this program. If not, see . */ +use std::collections::HashMap; + use super::tables::table::Table; #[derive(Debug)] -pub struct Database { - pub name: String, - pub tables: Vec, +pub struct Database { + pub tables: HashMap>, } -impl Database { - pub fn create_database(name: String) -> Self { +impl Database { + pub fn create_database() -> Self { Self { - name, - tables: Vec::new(), + tables: HashMap::new(), } } - pub fn add_table(&mut self, name: String) { - self.tables.push(Table::create_table(name)); + pub fn add_table(&mut self, name: &str, table: Table) { + self.tables.insert(name.to_string(), table); } - pub fn delete_table(&mut self, name: String) { - let mut ind = 0; - while ind != self.tables.len() { - if self.tables[ind].name == name { - self.tables.remove(ind); - } else { - ind += 1; - } - } + pub fn delete_table(&mut self, name: &str) { + self.tables.remove(name); } } \ No newline at end of file diff --git a/src/databases/tables/mod.rs b/src/data/databases/mod.rs similarity index 94% rename from src/databases/tables/mod.rs rename to src/data/databases/mod.rs index d583250..c6740c6 100644 --- a/src/databases/tables/mod.rs +++ b/src/data/databases/mod.rs @@ -16,5 +16,5 @@ * along with this program. If not, see . */ -pub(crate) mod table; -pub(crate) mod rows; \ No newline at end of file +pub mod database; +pub mod tables; \ No newline at end of file diff --git a/src/databases/mod.rs b/src/data/databases/tables/mod.rs similarity index 93% rename from src/databases/mod.rs rename to src/data/databases/tables/mod.rs index d1b8d37..0d4fd8b 100644 --- a/src/databases/mod.rs +++ b/src/data/databases/tables/mod.rs @@ -16,5 +16,5 @@ * along with this program. If not, see . */ -pub(crate) mod database; -pub(crate) mod tables; \ No newline at end of file +pub mod table; +pub mod rows; \ No newline at end of file diff --git a/src/databases/tables/rows/mod.rs b/src/data/databases/tables/rows/mod.rs similarity index 97% rename from src/databases/tables/rows/mod.rs rename to src/data/databases/tables/rows/mod.rs index 759536c..8260e80 100644 --- a/src/databases/tables/rows/mod.rs +++ b/src/data/databases/tables/rows/mod.rs @@ -16,4 +16,4 @@ * along with this program. If not, see . */ -pub(crate) mod row; \ No newline at end of file +pub mod row; \ No newline at end of file diff --git a/src/databases/tables/rows/row.rs b/src/data/databases/tables/rows/row.rs similarity index 59% rename from src/databases/tables/rows/row.rs rename to src/data/databases/tables/rows/row.rs index 4d108ac..87d9b3a 100644 --- a/src/databases/tables/rows/row.rs +++ b/src/data/databases/tables/rows/row.rs @@ -16,32 +16,25 @@ * along with this program. If not, see . */ +use std::collections::HashMap; + #[derive(Debug)] -pub struct Row { - pub primary_key: u32, - pub columns: Vec, +pub struct Row { + pub columns: HashMap, } -impl Row { - pub fn create_row(primary_key: u32) -> Self { +impl Row { + pub fn create_row() -> Self { Self { - primary_key, - columns: Vec::new(), + columns: HashMap::new(), } } - pub fn create_column(&mut self, name: String) { - self.columns.push(name); + pub fn create_column(&mut self, name: &str, value: Value) { + self.columns.insert(name.to_string(), value); } - pub fn delete_column(&mut self, name: String) { - let mut ind = 0; - while ind != self.columns.len() { - if self.columns[ind] == name { - self.columns.remove(ind); - } else { - ind += 1; - } - } + pub fn delete_column(&mut self, name: &str) { + self.columns.remove(name); } } \ No newline at end of file diff --git a/src/databases/tables/table.rs b/src/data/databases/tables/table.rs similarity index 60% rename from src/databases/tables/table.rs rename to src/data/databases/tables/table.rs index b880186..c6ce16f 100644 --- a/src/databases/tables/table.rs +++ b/src/data/databases/tables/table.rs @@ -16,34 +16,26 @@ * along with this program. If not, see . */ -use crate::databases::tables::rows::row::Row; +use std::collections::HashMap; +use crate::data::databases::tables::rows::row::Row; #[derive(Debug)] -pub struct Table { - pub name: String, - pub rows: Vec, +pub struct Table { + pub rows: HashMap>, } -impl Table { - pub fn create_table(name: String) -> Self { +impl Table { + pub fn create_table() -> Self { Self { - name, - rows: Vec::new(), + rows: HashMap::new(), } } - pub fn add_row(&mut self, primary_key: u32) { - self.rows.push(Row::create_row(primary_key)); + pub fn add_row(&mut self, primary_key: u32, row: Row) { + self.rows.insert(primary_key, row); } pub fn delete_row(&mut self, primary_key: u32) { - let mut ind = 0; - while ind != self.rows.len() { - if self.rows[ind].primary_key == primary_key { - self.rows.remove(ind); - } else { - ind += 1; - } - } + self.rows.remove(&primary_key); } } \ No newline at end of file diff --git a/src/data/mod.rs b/src/data/mod.rs new file mode 100644 index 0000000..0adda9a --- /dev/null +++ b/src/data/mod.rs @@ -0,0 +1 @@ +pub mod databases; \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 8aeb6e9..5dd1738 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,33 +16,28 @@ * along with this program. If not, see . */ -pub(crate) mod databases; -use crate::databases::database::Database; +pub mod data; +use std::collections::HashMap; + +use crate::data::databases::database::Database; #[derive(Debug)] -pub struct RNSQL { - pub databases: Vec, +pub struct RNSQL { + pub databases: HashMap>, } -impl RNSQL { +impl RNSQL { pub fn new() -> Self { Self { - databases: Vec::new(), + databases: HashMap::new(), } } - pub fn add_database(&mut self, name: String) { - self.databases.push(Database::create_database(name)); + pub fn add_database(&mut self, name: &str, database: Database) { + self.databases.insert(name.to_string(), database); } - pub fn delete_database(&mut self, name: String) { - let mut ind = 0; - while ind != self.databases.len() { - if self.databases[ind].name == name { - self.databases.remove(ind); - } else { - ind += 1; - } - } + pub fn delete_database(&mut self, name: &str) { + self.databases.remove(name); } } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 76ef0b2..3122faa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,42 +15,78 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + use rapid_naive_sql::RNSQL; - +use rapid_naive_sql::data::databases::database::Database; +use rapid_naive_sql::data::databases::tables::table::Table; +use rapid_naive_sql::data::databases::tables::rows::row::Row; + fn main() { + const DB_NAME: &str = "db1"; + const TB_NAME: &str = "tb1"; + const RW_NAME: u32 = 1; + const CL_NAME: &str = "cl1"; + let mut project = RNSQL::new(); println!("{:#?}\n\n", project); - project.add_database(String::from("db1")); + let db1 = Database::create_database(); + project.add_database(DB_NAME, db1); println!("{:#?}\n\n", project); - project.databases[0].add_table(String::from("tb1")); + if let Some(database) = project.databases.get_mut(DB_NAME) { + let tb1 = Table::create_table(); + database.add_table(TB_NAME, tb1); + } println!("{:#?}\n\n", project); - project.databases[0].tables[0].add_row(1); + if let Some(database) = project.databases.get_mut(DB_NAME) { + if let Some(table) = database.tables.get_mut(TB_NAME) { + let rw1 = Row::create_row(); + table.add_row(RW_NAME, rw1); + } + } println!("{:#?}\n\n", project); - project.databases[0].tables[0].rows[0].create_column(String::from("name")); + if let Some(database) = project.databases.get_mut(DB_NAME) { + if let Some(table) = database.tables.get_mut(TB_NAME) { + if let Some(row) = table.rows.get_mut(&RW_NAME) { + row.create_column(CL_NAME, String::from("hello")); + } + } + } println!("{:#?}\n\n", project); - project.databases[0].tables[0].rows[0].delete_column(String::from("name")); + if let Some(database) = project.databases.get_mut(DB_NAME) { + if let Some(table) = database.tables.get_mut(TB_NAME) { + if let Some(row) = table.rows.get_mut(&RW_NAME) { + row.delete_column(CL_NAME); + } + } + } println!("{:#?}\n\n", project); - project.databases[0].tables[0].delete_row(1); + if let Some(database) = project.databases.get_mut(DB_NAME) { + if let Some(table) = database.tables.get_mut(TB_NAME) { + table.delete_row(RW_NAME); + } + } println!("{:#?}\n\n", project); - project.databases[0].delete_table(String::from("tb1")); + if let Some(database) = project.databases.get_mut(DB_NAME) { + database.delete_table(TB_NAME); + } println!("{:#?}\n\n", project); - project.delete_database(String::from("db1")); + project.delete_database(DB_NAME); println!("{:#?}", project); } \ No newline at end of file