From 0d93c800cfd7a8fb4f3900417d1a7e2950f15ac5 Mon Sep 17 00:00:00 2001 From: lgrossi Date: Thu, 17 Aug 2023 23:31:08 +0200 Subject: [PATCH] improve: slightly refactor on database tasks --- src/creatures/players/account/account.cpp | 8 ++--- src/creatures/players/management/ban.cpp | 6 ++-- src/database/databasetasks.cpp | 32 ++++++++------------ src/database/databasetasks.h | 3 +- src/game/game.cpp | 6 ++-- src/io/iomarket.cpp | 4 +-- src/lua/functions/core/libs/db_functions.cpp | 4 +-- 7 files changed, 29 insertions(+), 34 deletions(-) diff --git a/src/creatures/players/account/account.cpp b/src/creatures/players/account/account.cpp index b8f881b842c..8f33950feb6 100644 --- a/src/creatures/players/account/account.cpp +++ b/src/creatures/players/account/account.cpp @@ -110,7 +110,7 @@ namespace account { query << "UPDATE `accounts` SET `coins_transferable` = " << (current_coins + amount) << " WHERE `id` = " << id_; - db_tasks_->addTask(query.str()); + db_tasks_->execute(query.str()); return ERROR_NO; } @@ -135,7 +135,7 @@ namespace account { query << "UPDATE `accounts` SET `coins_transferable` = " << (current_coins - amount) << " WHERE `id` = " << id_; - db_tasks_->addTask(query.str()); + db_tasks_->execute(query.str()); return ERROR_NO; } @@ -177,7 +177,7 @@ namespace account { query << "UPDATE `accounts` SET `coins` = " << (current_coins + amount) << " WHERE `id` = " << id_; - db_tasks_->addTask(query.str()); + db_tasks_->execute(query.str()); return ERROR_NO; } @@ -202,7 +202,7 @@ namespace account { query << "UPDATE `accounts` SET `coins` = " << (current_coins - amount) << " WHERE `id` = " << id_; - db_tasks_->addTask(query.str()); + db_tasks_->execute(query.str()); return ERROR_NO; } diff --git a/src/creatures/players/management/ban.cpp b/src/creatures/players/management/ban.cpp index 15f41711957..8a5b28b218c 100644 --- a/src/creatures/players/management/ban.cpp +++ b/src/creatures/players/management/ban.cpp @@ -63,11 +63,11 @@ bool IOBan::isAccountBanned(uint32_t accountId, BanInfo &banInfo) { // Move the ban to history if it has expired query.str(std::string()); query << "INSERT INTO `account_ban_history` (`account_id`, `reason`, `banned_at`, `expired_at`, `banned_by`) VALUES (" << accountId << ',' << db.escapeString(result->getString("reason")) << ',' << result->getNumber("banned_at") << ',' << expiresAt << ',' << result->getNumber("banned_by") << ')'; - g_databaseTasks().addTask(query.str()); + g_databaseTasks().execute(query.str()); query.str(std::string()); query << "DELETE FROM `account_bans` WHERE `account_id` = " << accountId; - g_databaseTasks().addTask(query.str()); + g_databaseTasks().execute(query.str()); return false; } @@ -96,7 +96,7 @@ bool IOBan::isIpBanned(uint32_t clientIP, BanInfo &banInfo) { if (expiresAt != 0 && time(nullptr) > expiresAt) { query.str(std::string()); query << "DELETE FROM `ip_bans` WHERE `ip` = " << clientIP; - g_databaseTasks().addTask(query.str()); + g_databaseTasks().execute(query.str()); return false; } diff --git a/src/database/databasetasks.cpp b/src/database/databasetasks.cpp index f179ac2c08f..bc97884c26e 100644 --- a/src/database/databasetasks.cpp +++ b/src/database/databasetasks.cpp @@ -21,24 +21,18 @@ DatabaseTasks &DatabaseTasks::getInstance() { return inject(); } -void DatabaseTasks::addTask(std::string query, std::function callback /* = nullptr*/, bool store /* = false*/) { - threadPool.addLoad([this, query, callback, store]() { - std::lock_guard lockClass(threadSafetyMutex); - - bool success; - DBResult_ptr result; - if (store) { - result = db.storeQuery(query); - success = true; - } else { - result = nullptr; - success = db.executeQuery(query); - } - - if (callback) { - g_dispatcher().addTask( - [callback, result, success]() { callback(result, success); } - ); - } +void DatabaseTasks::execute(const std::string &query, std::function callback /* nullptr */) { + threadPool.addLoad([this, query, callback]() { + bool success = db.executeQuery(query); + if (callback != nullptr) + g_dispatcher().addTask([callback, success]() { callback(nullptr, success); }); }); } + +void DatabaseTasks::store(const std::string &query, std::function callback /* nullptr */) { + threadPool.addLoad([this, query, callback]() { + DBResult_ptr result = db.storeQuery(query); + if (callback != nullptr) + g_dispatcher().addTask([callback, result]() { callback(result, true); }); + }); +} \ No newline at end of file diff --git a/src/database/databasetasks.h b/src/database/databasetasks.h index b04701490d5..c12bb09ebb3 100644 --- a/src/database/databasetasks.h +++ b/src/database/databasetasks.h @@ -23,7 +23,8 @@ class DatabaseTasks { static DatabaseTasks &getInstance(); - void addTask(std::string query, std::function callback = nullptr, bool store = false); + void execute(const std::string &query, std::function callback = nullptr); + void store(const std::string &query, std::function callback = nullptr); private: Database &db; diff --git a/src/game/game.cpp b/src/game/game.cpp index a3524cdd42f..2896227cb45 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -7829,7 +7829,7 @@ void Game::playerCyclopediaCharacterInfo(Player* player, uint32_t characterID, C } while (result->next()); player->sendCyclopediaCharacterRecentDeaths(page, static_cast(pages), entries); }; - g_databaseTasks().addTask(query.str(), callback, true); + g_databaseTasks().store(query.str(), callback); player->addAsyncOngoingTask(PlayerAsyncTask_RecentDeaths); break; } @@ -7882,7 +7882,7 @@ void Game::playerCyclopediaCharacterInfo(Player* player, uint32_t characterID, C } while (result->next()); player->sendCyclopediaCharacterRecentPvPKills(page, static_cast(pages), entries); }; - g_databaseTasks().addTask(query.str(), callback, true); + g_databaseTasks().store(query.str(), callback); player->addAsyncOngoingTask(PlayerAsyncTask_RecentPvPKills); break; } @@ -8027,7 +8027,7 @@ void Game::playerHighscores(Player* player, HighscoreType_t type, uint8_t catego } while (result->next()); player->sendHighscores(characters, category, vocation, page, static_cast(pages)); }; - g_databaseTasks().addTask(query.str(), callback, true); + g_databaseTasks().store(query.str(), callback); player->addAsyncOngoingTask(PlayerAsyncTask_Highscore); } diff --git a/src/io/iomarket.cpp b/src/io/iomarket.cpp index c34b708fd95..9bad46693ae 100644 --- a/src/io/iomarket.cpp +++ b/src/io/iomarket.cpp @@ -200,7 +200,7 @@ void IOMarket::checkExpiredOffers() { std::ostringstream query; query << "SELECT `id`, `amount`, `price`, `itemtype`, `player_id`, `sale`, `tier` FROM `market_offers` WHERE `created` <= " << lastExpireDate; - g_databaseTasks().addTask(query.str(), IOMarket::processExpiredOffers, true); + g_databaseTasks().store(query.str(), IOMarket::processExpiredOffers); int32_t checkExpiredMarketOffersEachMinutes = g_configManager().getNumber(CHECK_EXPIRED_MARKET_OFFERS_EACH_MINUTES); if (checkExpiredMarketOffersEachMinutes <= 0) { @@ -275,7 +275,7 @@ void IOMarket::appendHistory(uint32_t playerId, MarketAction_t type, uint16_t it query << "INSERT INTO `market_history` (`player_id`, `sale`, `itemtype`, `amount`, `price`, `expires_at`, `inserted`, `state`, `tier`) VALUES (" << playerId << ',' << type << ',' << itemId << ',' << amount << ',' << price << ',' << timestamp << ',' << getTimeNow() << ',' << state << ',' << std::to_string(tier) << ')'; - g_databaseTasks().addTask(query.str()); + g_databaseTasks().execute(query.str()); } bool IOMarket::moveOfferToHistory(uint32_t offerId, MarketOfferState_t state) { diff --git a/src/lua/functions/core/libs/db_functions.cpp b/src/lua/functions/core/libs/db_functions.cpp index 48d07d900b4..8d1166ecde6 100644 --- a/src/lua/functions/core/libs/db_functions.cpp +++ b/src/lua/functions/core/libs/db_functions.cpp @@ -44,7 +44,7 @@ int DBFunctions::luaDatabaseAsyncExecute(lua_State* L) { luaL_unref(luaState, LUA_REGISTRYINDEX, ref); }; } - g_databaseTasks().addTask(getString(L, -1), callback); + g_databaseTasks().execute(getString(L, -1), callback); return 0; } @@ -86,7 +86,7 @@ int DBFunctions::luaDatabaseAsyncStoreQuery(lua_State* L) { luaL_unref(luaState, LUA_REGISTRYINDEX, ref); }; } - g_databaseTasks().addTask(getString(L, -1), callback, true); + g_databaseTasks().store(getString(L, -1), callback); return 0; }