diff --git a/src/db/ItemIDRangeManager.cpp b/src/db/ItemIDRangeManager.cpp index 838d9ce..d503de5 100644 --- a/src/db/ItemIDRangeManager.cpp +++ b/src/db/ItemIDRangeManager.cpp @@ -4,6 +4,71 @@ #include "DBManager.h" #include "ClientManager.h" #include "Peer.h" +#include "libsql/Statement.h" + +#include + +namespace +{ + bool PrepareItemRangeStmt(CStmt& stmt, const std::string& query) + { + CAsyncSQL* sql = CDBManager::instance().GetDirectSQL(SQL_PLAYER); + + if (!sql) + { + sys_err("player SQL handle is not initialized"); + return false; + } + + return stmt.Prepare(sql, query.c_str()); + } + + bool LoadMaxItemIdInRange(DWORD dwMin, DWORD dwMax, DWORD& itemMaxId) + { + CStmt stmt; + const std::string query = std::string("SELECT COALESCE(MAX(id), 0) FROM item") + GetTablePostfix() + " WHERE id >= ? and id <= ?"; + + itemMaxId = 0; + + if (!PrepareItemRangeStmt(stmt, query)) + return false; + + if (!stmt.BindParam(MYSQL_TYPE_LONG, &dwMin) + || !stmt.BindParam(MYSQL_TYPE_LONG, &dwMax) + || !stmt.BindResult(MYSQL_TYPE_LONG, &itemMaxId) + || !stmt.Execute() + || stmt.iRows == 0 + || !stmt.Fetch()) + { + return false; + } + + return true; + } + + bool LoadItemCountInRange(DWORD dwMin, DWORD dwMax, DWORD& count) + { + CStmt stmt; + const std::string query = std::string("SELECT COUNT(*) FROM item") + GetTablePostfix() + " WHERE id >= ? AND id <= ?"; + + count = 0; + + if (!PrepareItemRangeStmt(stmt, query)) + return false; + + if (!stmt.BindParam(MYSQL_TYPE_LONG, &dwMin) + || !stmt.BindParam(MYSQL_TYPE_LONG, &dwMax) + || !stmt.BindResult(MYSQL_TYPE_LONG, &count) + || !stmt.Execute() + || stmt.iRows == 0 + || !stmt.Fetch()) + { + return false; + } + + return true; + } +} CItemIDRangeManager::CItemIDRangeManager() { @@ -86,22 +151,9 @@ TItemIDRangeTable CItemIDRangeManager::GetRange() bool CItemIDRangeManager::BuildRange(DWORD dwMin, DWORD dwMax, TItemIDRangeTable& range) { - char szQuery[1024]; DWORD dwItemMaxID = 0; - MYSQL_ROW row; - - snprintf(szQuery, sizeof(szQuery), "SELECT MAX(id) FROM item%s WHERE id >= %u and id <= %u", GetTablePostfix(), dwMin, dwMax); - - auto pMsg = CDBManager::instance().DirectQuery(szQuery); - - if (pMsg != NULL) - { - if (pMsg->Get()->uiNumRows > 0) - { - row = mysql_fetch_row(pMsg->Get()->pSQLResult); - str_to_number(dwItemMaxID, row[0]); - } - } + if (!LoadMaxItemIdInRange(dwMin, dwMax, dwItemMaxID)) + return false; if (dwItemMaxID == 0) dwItemMaxID = dwMin; @@ -119,30 +171,17 @@ bool CItemIDRangeManager::BuildRange(DWORD dwMin, DWORD dwMax, TItemIDRangeTable 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); - - auto pMsg2 = CDBManager::instance().DirectQuery(szQuery); - - if (pMsg2 != NULL) + DWORD count = 0; + if (LoadItemCountInRange(range.dwUsableItemIDMin, range.dwMax, count)) { - if (pMsg2->Get()->uiNumRows > 0) + if (count > 0) { - DWORD count = 0; - row = mysql_fetch_row(pMsg2->Get()->pSQLResult); - str_to_number(count, row[0]); - - if (count > 0) - { - sys_err("ItemIDRange: Build: %u ~ %u\thave a item", range.dwUsableItemIDMin, range.dwMax); - return false; - } - else - { - sys_log(0, "ItemIDRange: Build: %u ~ %u start:%u", range.dwMin, range.dwMax, range.dwUsableItemIDMin); - return true; - } + sys_err("ItemIDRange: Build: %u ~ %u\thave a item", range.dwUsableItemIDMin, range.dwMax); + return false; } + + sys_log(0, "ItemIDRange: Build: %u ~ %u start:%u", range.dwMin, range.dwMax, range.dwUsableItemIDMin); + return true; } } @@ -158,4 +197,3 @@ void CItemIDRangeManager::UpdateRange(DWORD dwMin, DWORD dwMax) m_listData.push_back(range); } } -