db: prepare item id range queries

This commit is contained in:
server
2026-04-13 22:17:01 +02:00
parent 08badc3c7a
commit 8a8aa54f02

View File

@@ -4,6 +4,71 @@
#include "DBManager.h"
#include "ClientManager.h"
#include "Peer.h"
#include "libsql/Statement.h"
#include <string>
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);
}
}