From 5fa84e866ff22fb67c1ef4f0767974bfd6f4a497 Mon Sep 17 00:00:00 2001 From: MassiveAtoms Date: Mon, 1 Jul 2019 14:23:15 -0300 Subject: [PATCH] almost all internals done after i fix segfault --- Customer.cpp | 29 ++++++------------ Park_spot.cpp | 9 +++--- Query.cpp | 70 +++++++++++++++++++++++++++++++++++++------- data.cpp | 9 +++--- headers/Customer.h | 24 +++++++-------- headers/Park_spot.h | 20 +++++-------- headers/Query.h | 8 +++-- main.cpp | 54 ++++++++++++++++------------------ old_test.db3 | Bin 0 -> 16384 bytes test.db3 | Bin 16384 -> 16384 bytes 10 files changed, 127 insertions(+), 96 deletions(-) create mode 100644 old_test.db3 diff --git a/Customer.cpp b/Customer.cpp index 85948ac..d156f3e 100644 --- a/Customer.cpp +++ b/Customer.cpp @@ -1,20 +1,20 @@ #include "headers/Customer.h" // constructors -Customer::Customer(string name_, Verhicle_type verhicle_) - : name{name_}, verhicle{verhicle_}, card_code{gen_cardcode()} { +Customer::Customer(string name_, string password_, Verhicle_type verhicle_) + : name{name_}, verhicle{verhicle_}, password{hash_password(password)} { id = auto_increment_db() + 1; save_db(); } -Customer::Customer(int id_, string name_, string card_code_, +Customer::Customer(int id_, string name_, string password_, Verhicle_type verhicle_, vector instances) - : name{name_}, - card_code{card_code_}, + :id{id_}, + name{name_}, + password{password_}, verhicle{verhicle_}, park_instances{instances} {} -Customer::~Customer() { update_db(); } // clock in/out methods // ==================================================================================== @@ -33,7 +33,7 @@ void Customer::clock_out(int s_id) { // report gen void Customer::gen_monthly() { - cout << "NAME: " << name << " card code: " << card_code << "\n"; + cout << "NAME: " << name << "\n"; cout << "-------------------------------------------------\n"; for (auto& i : park_instances) { // TODO: need some logic to only include from this month. scratch that, @@ -50,7 +50,7 @@ void Customer::save_db() { string statement{"insert into Customer values (, '', '', );"}; // after ( = 28) statement.insert(38, to_string(int(verhicle))); - statement.insert(36, card_code); + statement.insert(36, password); statement.insert(32, name); statement.insert(29, to_string(id)); SQLite::Transaction transaction(data::db); @@ -62,7 +62,7 @@ void Customer::update_db() { string statement = "UPDATE Customer SET name = '', card_code = '' where id = '';"; statement.insert(58, to_string(id)); - statement.insert(44, card_code); + statement.insert(44, password); statement.insert(28, name); data::db.exec(statement); } @@ -84,15 +84,4 @@ int Customer::auto_increment_db() { return id; } -// random helpers============================================================= -std::mt19937 mt(time(0)); -std::uniform_int_distribution dist(65, 127); -string Customer::gen_cardcode() { - string code; - for (int i = 0; i < 20; i++) { - char letter = char(dist(mt)); - code += letter; - } - return code; -} diff --git a/Park_spot.cpp b/Park_spot.cpp index edb30d6..5798683 100644 --- a/Park_spot.cpp +++ b/Park_spot.cpp @@ -13,7 +13,6 @@ Park_spot::Park_spot(Customer* parked_, int id_, bool taken_) taken{taken_} // TODO: think about how init parked? {} -Park_spot::~Park_spot() { update_db(); } // clock in en out, calls de juist(in/out) van de customer aan de hand van // internal state van taken @@ -39,10 +38,10 @@ void Park_spot::update_db() { statement.insert(63, to_string(id)); if (taken) { statement.insert(49, to_string(parked->id)); - statement.insert(30, "true"); + statement.insert(30, "1"); } else { statement.insert(49, "NULL"); - statement.insert(30, "false"); + statement.insert(30, "0"); } data::db.exec(statement); } @@ -52,7 +51,7 @@ void Park_spot::save_db() { string statement{"insert into Park_spot values ( , , );"}; // after ( = 28) statement.insert(34, "NULL"); - statement.insert(32, "false"); + statement.insert(32, "0"); statement.insert(30, to_string(id)); SQLite::Transaction transaction(data::db); data::db.exec(statement); @@ -74,4 +73,4 @@ int Park_spot::auto_increment_db() { id = max_id.getColumn(0); max_id.reset(); return id; -} \ No newline at end of file +} diff --git a/Query.cpp b/Query.cpp index 6cda385..5a2617a 100644 --- a/Query.cpp +++ b/Query.cpp @@ -1,6 +1,7 @@ #include "headers/Query.h" -vector query_Parktime_for_customer(int cid) { + +vector query_parktimes_for_customer(int cid) { /* This is needed to initialize the park_instances for the customer constructor that is supposed to create a customer from data in the db. @@ -31,20 +32,67 @@ vector query_customer_with_name(string name) { 2. multiple customers could be returned with the same name. */ vector result; - SQLite::Statement query(data::db, - "SELECT * FROM Customer WHERE name = '?';"); + SQLite::Statement query( + data::db, + "SELECT id, name, password, verhicle FROM Customer WHERE name = ?;"); query.bind(1, name); while (query.executeStep()) { - // (id integer primary key, name text, card_code varchar(20), verhicle - // int) (int id_, string name_, string card_code_, Verhicle_type - // verhicle_, vector instances) - int id = query.getColumn(0); - string name = query.getColumn(1); + string name_ = query.getColumn(1); string password = query.getColumn(2); - // int verhicle = query.getColumn(3); // cast to verhicle - vector park_instances = query_Parktime_for_customer(id); - // result.push_back(Customer{id, name, password, Verhicle_type(verhicle), park_instances}); + int verhicle = query.getColumn(3); // cast to verhicle + vector park_instances = query_parktimes_for_customer(id); + result.push_back(Customer{ + id, name_, password, Verhicle_type(verhicle), park_instances}); } return result; +} + +Customer query_customer_with_id(int id) { + /* do not call this function if you are not certain a customer with this id + exists. + // the only legitimate caller of this function is query_parkspot_x + // there is no error handling in this function + // for when this function doesn't find the customer with this id !!!! + */ + + SQLite::Statement query(data::db, "SELECT * FROM Customer WHERE id = ?;"); + query.bind(1, id); + while (query.executeStep()) { + string name = query.getColumn(1); + string password = query.getColumn(2); + int verhicle = query.getColumn(3); // cast to verhicle + vector park_instances = query_parktimes_for_customer(id); + Customer result{ + id, name, password, Verhicle_type(verhicle), park_instances}; + // DEBUG + cout << "{" << result.id << "," < ?;"); + query.bind(1, 0); + while (query.executeStep()) { + int id = query.getColumn(0); + int taken = query.getColumn(1); + int cid = query.getColumn(2); + park_customers.push_back(query_customer_with_id(cid)); + parking_spots.push_back( + Park_spot{get_customer_ptr_for_parkspot(cid), id, bool(taken)}); + } +} + +Customer* get_customer_ptr_for_parkspot(int id) { + if (!id) { + return nullptr; + } + for (int i = 0; i < park_customers.size(); i++) { + if (park_customers[i].id == id) { + + return &park_customers[i]; + } + } + return nullptr; } \ No newline at end of file diff --git a/data.cpp b/data.cpp index a7286b8..16610c1 100644 --- a/data.cpp +++ b/data.cpp @@ -2,19 +2,18 @@ namespace data { -SQLite::Database -start_db() { +SQLite::Database start_db() { SQLite::Database db("test.db3", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE); - while (sodium_init()< 0){ + while (sodium_init() < 0) { std::cout << "SODIUM NOT WORKING"; } db.exec( "create table if not exists Customer (id integer primary key, name " - "text, card_code varchar(20), verhicle int)"); + "text, password text, verhicle int)"); db.exec( "create table if not exists Park_spot (id integer primary key, taken " - "boolean, customer_id int)"); + "int, customer_id int)"); db.exec( "create table if not exists Park_time (id integer primary key, " "customer_id int, spot_id int, start int, end int, duration int)"); diff --git a/headers/Customer.h b/headers/Customer.h index fb6e449..c05934d 100644 --- a/headers/Customer.h +++ b/headers/Customer.h @@ -4,8 +4,6 @@ #include "Park_time.h" #include "data.h" - -#include #include using std::vector; @@ -24,16 +22,15 @@ park_time object. Voegt het toe aan een vector. class Customer { public: - Customer(string name_, Verhicle_type verhicle_); - Customer(int id_, string name_, // needed to construct from db - string card_code_, - Verhicle_type verhicle_, // TODO: how init. p_time instances? - vector instances); - ~Customer(); + int id; string name; - string card_code; - + string password; + Customer(string name_, string password_, Verhicle_type verhicle_); + Customer(int id_, string name_, // needed to construct from db + string password_, + Verhicle_type verhicle_, // TODO: how init. p_time instances? + vector instances); void clock_in(int s_id); void clock_out(int s_id); @@ -45,10 +42,13 @@ class Customer { private: Verhicle_type verhicle; vector park_instances; - - string gen_cardcode(); void save_db(); int auto_increment_db(); }; +static vector park_customers; // save the customers that are parked in here +// parking_spot uses pointers, so it's better to save the parked customers here +// where we know they'll be destroyed at the end of this scope, instead of too early +// and end up with dangling pointers + #endif // CUSTOMER_H \ No newline at end of file diff --git a/headers/Park_spot.h b/headers/Park_spot.h index e5dc5d7..be1788c 100644 --- a/headers/Park_spot.h +++ b/headers/Park_spot.h @@ -17,17 +17,13 @@ class Park_spot { Customer* parked; Park_spot(); Park_spot(Customer* parked_, int id_, bool taken_); - ~Park_spot(); - void - clock(Customer* c_customer); + void clock(Customer* c_customer); private: - void - save_db(); - void - update_db(); - void - delete_db(); - int - auto_increment_db(); -}; \ No newline at end of file + void save_db(); + void update_db(); + void delete_db(); + int auto_increment_db(); +}; + +static vector parking_spots; // to save the parking spots in memory \ No newline at end of file diff --git a/headers/Query.h b/headers/Query.h index c618d31..33fb173 100644 --- a/headers/Query.h +++ b/headers/Query.h @@ -4,11 +4,15 @@ #include "Park_spot.h" -#include #include -vector query_Parktime_for_customer(int cid); +vector query_parktimes_for_customer(int cid); + vector query_customer_with_name(string name); +Customer query_customer_with_id(int id); +Customer* get_customer_ptr_for_parkspot(int id); + +void query_all_parking_spots(); // used for initializing the parking spots at start of the program #endif // CUSTOMER_H \ No newline at end of file diff --git a/main.cpp b/main.cpp index c6a9b89..c9ec230 100644 --- a/main.cpp +++ b/main.cpp @@ -3,7 +3,6 @@ #include #include - /* Code strucure like this: class declarations zijn in /headers/class_naam.h, en definitions van de member @@ -19,6 +18,9 @@ record die zegt dat een customer voor x tijd geparkeert heeft bij spot x, enz. De client clockt in en uit bij een spot. */ + + + void Wait(int sec) /* a wait function where 1 sec represents 1 hour irl. @@ -27,35 +29,29 @@ a wait function where 1 sec represents 1 hour irl. std::this_thread::sleep_for(seconds{sec}); } +Customer* get_customer_ptr_for_parkspot(int id); + int main() { - class Customer sagar { - "query", Verhicle_type::bike - }; - sagar.update_db(); - Park_spot p1; - p1.clock(&sagar); // in - Wait(2); - p1.clock(&sagar); - Wait(2); - p1.clock(&sagar); // in - Wait(2); - p1.clock(&sagar); - Wait(2); - p1.clock(&sagar); // in - Wait(2); - p1.clock(&sagar); - Wait(2); + query_all_parking_spots(); - vector test = query_customer_with_name("query"); - if (!test.size()){ - cout << "No customers with this name found;"; - } - else if (test.size()==1) { - cout << "1 customer found;"; - } - else { - cout << "MORE customers found?"; - } + Customer p0 = query_customer_with_name("Shaquile")[0]; + Customer p1 = query_customer_with_name("Sagar Ramsaransing")[0]; + Customer p2 = query_customer_with_name("Joshua karto")[0]; + Customer p3 = query_customer_with_name("Stefan udit")[0]; + + parking_spots[2].clock(&p1); + Wait(2); + parking_spots[2].clock(&p1); + Wait(1); + parking_spots[0].clock(&p2); + Wait(1); + parking_spots[1].clock(&p3); + Wait(1); + parking_spots[0].clock(&p2); + parking_spots[1].clock(&p3); + Wait(1); + parking_spots[1].clock(&p3); -} \ No newline at end of file +} + diff --git a/old_test.db3 b/old_test.db3 new file mode 100644 index 0000000000000000000000000000000000000000..108a7ad5250f75413fabe333ec9836c9061be779 GIT binary patch literal 16384 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 ToGI{2hS_Oyb>VYBx1j$9vXJf= literal 0 HcmV?d00001 diff --git a/test.db3 b/test.db3 index 126855f7f89a7be97fdf08acd460af0157cb43d2..b4fd62744ac3cb41079f11f024ad905f811855ff 100644 GIT binary patch delta 667 zcmaiy&u`Lj7{->AI7Fe-C$-Z!|wKT7s%g&Hh}Q8)_r*GQ!HXK+M%ih=IKLax_nB%AtF zZV75$&g!~0ZI`K{ldf>xrZuRi&g5cCw3PbP9hie^*<&THYEIhTpk5V{HOGvchoXR9 z@S6hEphI?`q6EYBlR}{JD|kslME&lk|zpj%v#Ec-*^z znFkdbr8!LqM3_Duwj55<{qB(Suqb$S6S;1?x(7)UI>`P<)&Fzqs;=-_AZTMDD7-JY zN;AhcMjDj~{Bf_J&mo2pM-xwI(0Y|&XxZzChe-C3-Ig-P&~y1Kd@(!a0EOAk@U}Y#Wnx{ literal 16384 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 C2md4h