diff --git a/TODO.md b/TODO.md index d049e4a..0640fe7 100644 --- a/TODO.md +++ b/TODO.md @@ -12,6 +12,6 @@ - [x] DBManager - [ ] GuildManager - [ ] ItemAwardManager - - [ ] ItemIDRangeManager + - [x] ItemIDRangeManager - [x] Marriage - [x] Monarch diff --git a/src/db/src/ItemIDRangeManager.cpp b/src/db/src/ItemIDRangeManager.cpp index 8e05f2d..8a688b2 100644 --- a/src/db/src/ItemIDRangeManager.cpp +++ b/src/db/src/ItemIDRangeManager.cpp @@ -84,72 +84,58 @@ TItemIDRangeTable CItemIDRangeManager::GetRange() return ret; } +#include +#include bool CItemIDRangeManager::BuildRange(DWORD dwMin, DWORD dwMax, TItemIDRangeTable &range) { - char szQuery[1024]; DWORD dwItemMaxID = 0; - SQLMsg *pMsg = NULL; - MYSQL_ROW row; - snprintf(szQuery, sizeof(szQuery), "SELECT MAX(id) FROM item%s WHERE id >= %u and id <= %u", GetTablePostfix(), dwMin, dwMax); + auto pool = CDBManager::instance().GetConnectionPool(); + auto conn = pool->acquire(); - pMsg = CDBManager::instance().DirectQuery(szQuery); - - if (pMsg != NULL) + try { - if (pMsg->Get()->uiNumRows > 0) + pqxx::work txn(*conn); + + auto maxRow = txn.exec_params1("SELECT MAX(id) FROM item WHERE id >= $1 AND id <= $2", dwMin, dwMax); + + if (!maxRow[0].is_null()) + dwItemMaxID = maxRow[0].as(); + + dwItemMaxID = (dwItemMaxID == 0) ? dwMin : dwItemMaxID + 1; + + if ((dwMax < dwItemMaxID) || (dwMax - dwItemMaxID < cs_dwMinimumRemainCount)) { - row = mysql_fetch_row(pMsg->Get()->pSQLResult); - str_to_number(dwItemMaxID, row[0]); + SPDLOG_DEBUG("ItemIDRange: Build {} ~ {} start: {}\tNOT USE remain count is below {}", + dwMin, dwMax, dwItemMaxID, cs_dwMinimumRemainCount); } - delete pMsg; - } - - if (dwItemMaxID == 0) - dwItemMaxID = dwMin; - else - dwItemMaxID++; - - if ((dwMax < dwItemMaxID) || (dwMax - dwItemMaxID < cs_dwMinimumRemainCount)) - { - SPDLOG_DEBUG("ItemIDRange: Build {} ~ {} start: {}\tNOT USE remain count is below {}", - dwMin, dwMax, dwItemMaxID, cs_dwMinimumRemainCount); - } - else - { - range.dwMin = dwMin; - range.dwMax = dwMax; - range.dwUsableItemIDMin = dwItemMaxID; - - snprintf(szQuery, sizeof(szQuery), "SELECT COUNT(*) FROM item%s WHERE id >= %u AND id <= %u", - GetTablePostfix(), range.dwUsableItemIDMin, range.dwMax); - - pMsg = CDBManager::instance().DirectQuery(szQuery); - - if (pMsg != NULL) + else { - if (pMsg->Get()->uiNumRows > 0) + range.dwMin = dwMin; + range.dwMax = dwMax; + range.dwUsableItemIDMin = dwItemMaxID; + + auto countRow = txn.exec_params1("SELECT COUNT(*) FROM item WHERE id >= $1 AND id <= $2", range.dwUsableItemIDMin, range.dwMax); + + DWORD count = countRow[0].as(); + + if (count > 0) { - DWORD count = 0; - row = mysql_fetch_row(pMsg->Get()->pSQLResult); - str_to_number(count, row[0]); - - if (count > 0) - { - SPDLOG_ERROR("ItemIDRange: Build: {} ~ {}\thave a item", range.dwUsableItemIDMin, range.dwMax); - return false; - } - else - { - SPDLOG_TRACE("ItemIDRange: Build: {} ~ {} start:{}", range.dwMin, range.dwMax, range.dwUsableItemIDMin); - return true; - } + SPDLOG_ERROR("ItemIDRange: Build: {} ~ {}\thave a item", range.dwUsableItemIDMin, range.dwMax); + return false; + } + else + { + SPDLOG_TRACE("ItemIDRange: Build: {} ~ {} start:{}", range.dwMin, range.dwMax, range.dwUsableItemIDMin); + return true; } - - delete pMsg; } } + catch (const std::exception &e) + { + SPDLOG_ERROR("ItemIDRange: DB error: {}", e.what()); + } return false; }