From 9ead94b0644912d41cc5d8f325ff26b71e2e6aa9 Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Thu, 14 Dec 2023 04:44:37 +0000 Subject: [PATCH] fix: fix many bug --- backend/include/database.h | 1 + backend/include/engine.h | 30 ++++++++-------- backend/src/builtin-cli.cpp | 2 +- backend/src/database.cpp | 7 ++++ backend/src/engine.cpp | 71 +++++++++++++++++++------------------ 5 files changed, 60 insertions(+), 51 deletions(-) diff --git a/backend/include/database.h b/backend/include/database.h index fd6f43b..83428d9 100644 --- a/backend/include/database.h +++ b/backend/include/database.h @@ -37,6 +37,7 @@ class BookDataBase { const std::string &name, const std::string &author, const std::string &keyword, double price, int quantity_remain); + std::string GetISBN(int bid); }; class LogDataBase { DriveArray finance_data; diff --git a/backend/include/engine.h b/backend/include/engine.h index 0340655..5b1ece6 100644 --- a/backend/include/engine.h +++ b/backend/include/engine.h @@ -20,48 +20,48 @@ class BookStoreEngineClass { BookStoreEngineClass(std::string __config_dir, bool __is_server); std::vector Execute( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecuteSu( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecuteLogout( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecuteRegister( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecutePasswd( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecuteUserAdd( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecuteDelete( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecuteShow( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecuteBuy( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecuteSelect( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecuteMOdify( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecuteImport( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecuteShowFinance( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecuteLog( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); std::vector ExecuteReport( const std::string &cmd, - std::stack> &login_stack); + std::stack> &login_stack); }; #endif // PROTECTOR_ENGINE_H \ No newline at end of file diff --git a/backend/src/builtin-cli.cpp b/backend/src/builtin-cli.cpp index 361c0e7..8867c53 100644 --- a/backend/src/builtin-cli.cpp +++ b/backend/src/builtin-cli.cpp @@ -13,7 +13,7 @@ void BookStoreMain(bool is_server, std::string config_dir) { BookStoreEngineClass engine(config_dir, is_server); std::ios::sync_with_stdio(false); if (!is_server) { - std::stack> login_stack; + std::stack> login_stack; std::string cmd; while (std::getline(std::cin, cmd)) { auto result = std::move(engine.Execute(cmd, login_stack)); diff --git a/backend/src/database.cpp b/backend/src/database.cpp index 764c002..ce2d7b6 100644 --- a/backend/src/database.cpp +++ b/backend/src/database.cpp @@ -96,6 +96,7 @@ void BookDataBase::CreateEmptyBook(const std::string &ISBN) { tmp.keyword[0] = 0; int idx = full_book_data.write(tmp); tmp.bid = idx; + // debugPrint("CreateEmptyBook: ", ISBN, " ", idx); full_book_data.update(tmp, idx); ISBN2index.Insert(ISBN, idx); name2index.Insert("", idx); @@ -269,4 +270,10 @@ std::pair LogDataBase::QueryFinance(int count) { total_import -= tmp.total_price; } return std::make_pair(total_sell, total_import); +} + +std::string BookDataBase::GetISBN(int bid) { + BookItemClass tmp; + full_book_data.read(tmp, bid); + return std::string(tmp.ISBN); } \ No newline at end of file diff --git a/backend/src/engine.cpp b/backend/src/engine.cpp index f5ada9c..6d9b1f9 100644 --- a/backend/src/engine.cpp +++ b/backend/src/engine.cpp @@ -24,7 +24,7 @@ BookStoreEngineClass::BookStoreEngineClass(std::string __config_dir, } std::vector BookStoreEngineClass::Execute( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { for (int i = 0; i < cmd.length(); i++) if (std::isspace(cmd[i]) && cmd[i] != ' ') return std::vector({"Invalid"}); @@ -111,7 +111,7 @@ std::vector BookStoreEngineClass::Execute( std::vector BookStoreEngineClass::ExecuteSu( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { std::string user_id, password; if (!CommandSuLexer(cmd, user_id, password)) return std::vector({"Invalid"}); @@ -121,13 +121,13 @@ std::vector BookStoreEngineClass::ExecuteSu( // debugPrint("has root previlege"); if (user_data_base.GetPrevilege(user_id) == -1) return std::vector({"Invalid"}); - login_stack.push(std::make_pair(user_id, "")); + login_stack.push(std::make_pair(user_id, 0)); login_count[user_id]++; return std::vector(); } // debugPrint("Examining", user_id, password); if (user_data_base.PAM(user_id, password)) { - login_stack.push(std::make_pair(user_id, "")); + login_stack.push(std::make_pair(user_id, 0)); login_count[user_id]++; return std::vector(); } @@ -136,7 +136,7 @@ std::vector BookStoreEngineClass::ExecuteSu( std::vector BookStoreEngineClass::ExecuteLogout( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { if (login_stack.empty()) return std::vector({"Invalid"}); if (user_data_base.GetPrevilege(login_stack.top().first) < 1) { return std::vector({"Invalid"}); @@ -148,7 +148,7 @@ std::vector BookStoreEngineClass::ExecuteLogout( std::vector BookStoreEngineClass::ExecuteRegister( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { std::string user_id, password, user_name; if (!CommandRegisterLexer(cmd, user_id, password, user_name)) return std::vector({"Invalid"}); @@ -160,7 +160,7 @@ std::vector BookStoreEngineClass::ExecuteRegister( std::vector BookStoreEngineClass::ExecutePasswd( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { std::string user_id, current_password, new_password; if (!CommandPasswdLexer(cmd, user_id, current_password, new_password)) return std::vector({"Invalid"}); @@ -185,7 +185,7 @@ std::vector BookStoreEngineClass::ExecutePasswd( std::vector BookStoreEngineClass::ExecuteUserAdd( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { int own_previlege = 0; if (login_stack.size() > 0) own_previlege = user_data_base.GetPrevilege(login_stack.top().first); @@ -204,7 +204,7 @@ std::vector BookStoreEngineClass::ExecuteUserAdd( std::vector BookStoreEngineClass::ExecuteDelete( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { if (login_stack.empty() || user_data_base.GetPrevilege(login_stack.top().first) < 7) return std::vector({"Invalid"}); @@ -220,7 +220,7 @@ std::vector BookStoreEngineClass::ExecuteDelete( std::vector BookStoreEngineClass::ExecuteShow( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { if (login_stack.empty() || user_data_base.GetPrevilege(login_stack.top().first) < 1) return std::vector({"Invalid"}); @@ -255,7 +255,7 @@ std::vector BookStoreEngineClass::ExecuteShow( std::vector BookStoreEngineClass::ExecuteBuy( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { std::string ISBN; int quantity; if (!CommandBuyLexer(cmd, ISBN, quantity)) @@ -283,37 +283,44 @@ std::vector BookStoreEngineClass::ExecuteBuy( std::vector BookStoreEngineClass::ExecuteSelect( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { std::string ISBN; if (!CommandSelectLexer(cmd, ISBN)) return std::vector({"Invalid"}); if (login_stack.empty() || user_data_base.GetPrevilege(login_stack.top().first) < 3) return std::vector({"Invalid"}); - if (!book_data_base.HaveISBN(ISBN)) book_data_base.CreateEmptyBook(ISBN); - std::pair tmp; + BookItemClass BI_tmp; + if (!book_data_base.HaveISBN(ISBN, BI_tmp)) { + book_data_base.CreateEmptyBook(ISBN); + book_data_base.HaveISBN(ISBN, BI_tmp); + } + std::pair tmp; tmp = login_stack.top(); login_stack.pop(); - tmp.second = ISBN; + tmp.second = BI_tmp.bid; + // debugPrint("selected bid=", tmp.second); login_stack.push(tmp); return std::vector(); } std::vector BookStoreEngineClass::ExecuteMOdify( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { std::string new_ISBN, name, author, keyword; double price; if (!CommandModifyLexer(cmd, new_ISBN, name, author, keyword, price)) return std::vector({"Invalid"}); // debugPrint("successfully lexed modify"); // debugPrint("modify", new_ISBN, ' ', name, ' ', author, ' ', keyword, ' ', - // price); + // price); if (login_stack.empty() || user_data_base.GetPrevilege(login_stack.top().first) < 3) return std::vector({"Invalid"}); // debugPrint("successfully checked authority"); - if (login_stack.top().second == "" || login_stack.top().second == new_ISBN) + // debugPrint("selected book's bid=", login_stack.top().second); + if (login_stack.top().second == 0 || + book_data_base.GetISBN(login_stack.top().second) == new_ISBN) return std::vector({"Invalid"}); // debugPrint("successfully checked ISBN"); if (new_ISBN != "" && book_data_base.HaveISBN(new_ISBN)) @@ -330,21 +337,14 @@ std::vector BookStoreEngineClass::ExecuteMOdify( } } // debugPrint("successfully checked keyword"); - book_data_base.ModifyInfo(login_stack.top().second, new_ISBN, name, author, - keyword, price, -1); - if (new_ISBN != "") { - std::pair tmp; - tmp = login_stack.top(); - login_stack.pop(); - tmp.second = new_ISBN; - login_stack.push(tmp); - } + book_data_base.ModifyInfo(book_data_base.GetISBN(login_stack.top().second), + new_ISBN, name, author, keyword, price, -1); return std::vector(); } std::vector BookStoreEngineClass::ExecuteImport( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { int quantity; double total_cost; if (!CommandImportLexer(cmd, quantity, total_cost)) @@ -352,21 +352,22 @@ std::vector BookStoreEngineClass::ExecuteImport( if (login_stack.empty() || user_data_base.GetPrevilege(login_stack.top().first) < 3) return std::vector({"Invalid"}); - if (login_stack.top().second == "") + if (login_stack.top().second == 0) return std::vector({"Invalid"}); if (quantity <= 0) return std::vector({"Invalid"}); if (total_cost <= 0) return std::vector({"Invalid"}); BookItemClass tmp; - book_data_base.HaveISBN(login_stack.top().second, tmp); - book_data_base.ModifyInfo(login_stack.top().second, "", "", "", "", -1, - tmp.quantity_remain + quantity); + book_data_base.HaveISBN(book_data_base.GetISBN(login_stack.top().second), + tmp); + book_data_base.ModifyInfo(book_data_base.GetISBN(login_stack.top().second), + "", "", "", "", -1, tmp.quantity_remain + quantity); log_data_base.AddImport(tmp.bid, quantity, total_cost); return std::vector(); } std::vector BookStoreEngineClass::ExecuteShowFinance( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { int count; if (!CommandShowfinanceLexer(cmd, count)) return std::vector({"Invalid"}); @@ -390,12 +391,12 @@ std::vector BookStoreEngineClass::ExecuteShowFinance( std::vector BookStoreEngineClass::ExecuteLog( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { return std::vector(); } std::vector BookStoreEngineClass::ExecuteReport( const std::string &cmd, - std::stack> &login_stack) { + std::stack> &login_stack) { return std::vector(); } \ No newline at end of file