change: ItemIDRangeManager

This commit is contained in:
WildEgo 2025-06-07 22:59:09 +01:00
parent 3a38f8828c
commit dc84d3f95f
2 changed files with 39 additions and 53 deletions

View File

@ -12,6 +12,6 @@
- [x] DBManager
- [ ] GuildManager
- [ ] ItemAwardManager
- [ ] ItemIDRangeManager
- [x] ItemIDRangeManager
- [x] Marriage
- [x] Monarch

View File

@ -84,72 +84,58 @@ TItemIDRangeTable CItemIDRangeManager::GetRange()
return ret;
}
#include <pqxx/pqxx>
#include <spdlog/spdlog.h>
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<DWORD>();
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<DWORD>();
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;
}