db: prepare item id range queries
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user