Compare commits
3 Commits
93d8f2a0be
...
d25bf59c6f
Author | SHA1 | Date | |
---|---|---|---|
d25bf59c6f | |||
dc84d3f95f | |||
3a38f8828c |
4
TODO.md
4
TODO.md
@ -12,6 +12,6 @@
|
||||
- [x] DBManager
|
||||
- [ ] GuildManager
|
||||
- [ ] ItemAwardManager
|
||||
- [ ] ItemIDRangeManager
|
||||
- [ ] Marriage
|
||||
- [x] ItemIDRangeManager
|
||||
- [x] Marriage
|
||||
- [x] Monarch
|
||||
|
@ -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("[CItemIDRangeManager::BuildRange] Query error: {}", e.what());
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -34,36 +34,32 @@ namespace marriage
|
||||
|
||||
bool CManager::Initialize()
|
||||
{
|
||||
char szQuery[1024];
|
||||
auto pool = CDBManager::instance().GetConnectionPool();
|
||||
auto conn = pool->acquire();
|
||||
|
||||
snprintf(szQuery, sizeof(szQuery),
|
||||
"SELECT pid1, pid2, love_point, time, is_married, p1.name, p2.name FROM marriage, player%s as p1, player%s as p2 WHERE p1.id = pid1 AND p2.id = pid2",
|
||||
GetTablePostfix(), GetTablePostfix());
|
||||
|
||||
unique_ptr<SQLMsg> pmsg_delete(CDBManager::instance().DirectQuery("DELETE FROM marriage WHERE is_married = 0"));
|
||||
unique_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery));
|
||||
|
||||
SQLResult *pRes = pmsg->Get();
|
||||
SPDLOG_DEBUG("MarriageList(size={})", pRes->uiNumRows);
|
||||
|
||||
if (pRes->uiNumRows > 0)
|
||||
try
|
||||
{
|
||||
for (uint uiRow = 0; uiRow != pRes->uiNumRows; ++uiRow)
|
||||
{
|
||||
MYSQL_ROW row = mysql_fetch_row(pRes->pSQLResult);
|
||||
pqxx::work txn{*conn};
|
||||
txn.exec("DELETE FROM player.marriage WHERE is_married = false");
|
||||
pqxx::result result = txn.exec("SELECT player_id_1, player_id_2, love_points, created_at, is_married, p1.name, p2.name FROM player.marriage, player.player as p1, player.player as p2 WHERE p1.id = player_id_1 AND p2.id = player_id_2");
|
||||
|
||||
std::size_t const numRows = std::size(result);
|
||||
SPDLOG_DEBUG("MarriageList(size={})", numRows);
|
||||
|
||||
for (auto row : result)
|
||||
{
|
||||
DWORD pid1 = 0;
|
||||
str_to_number(pid1, row[0]);
|
||||
str_to_number(pid1, row[0].c_str());
|
||||
DWORD pid2 = 0;
|
||||
str_to_number(pid2, row[1]);
|
||||
str_to_number(pid2, row[1].c_str());
|
||||
int love_point = 0;
|
||||
str_to_number(love_point, row[2]);
|
||||
str_to_number(love_point, row[2].c_str());
|
||||
DWORD time = 0;
|
||||
str_to_number(time, row[3]);
|
||||
str_to_number(time, row[3].c_str());
|
||||
BYTE is_married = 0;
|
||||
str_to_number(is_married, row[4]);
|
||||
const char *name1 = row[5];
|
||||
const char *name2 = row[6];
|
||||
str_to_number(is_married, row[4].c_str());
|
||||
const char *name1 = row[5].c_str();
|
||||
const char *name2 = row[6].c_str();
|
||||
|
||||
TMarriage *pMarriage = new TMarriage(pid1, pid2, love_point, time, is_married, name1, name2);
|
||||
m_Marriages.insert(pMarriage);
|
||||
@ -73,6 +69,12 @@ namespace marriage
|
||||
SPDLOG_DEBUG("Marriage {}: LP:{} TM:{} ST:{} {:10}:{:16} {:10}:{:16} ", uiRow, love_point, time, is_married, pid1, name1, pid2, name2);
|
||||
}
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
SPDLOG_ERROR("[CManager::Initialize] Query error: {}", e.what());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -103,15 +105,24 @@ namespace marriage
|
||||
|
||||
Align(dwPID1, dwPID2);
|
||||
|
||||
char szQuery[512];
|
||||
snprintf(szQuery, sizeof(szQuery), "INSERT INTO marriage(pid1, pid2, love_point, time) VALUES (%u, %u, 0, %u)", dwPID1, dwPID2, now);
|
||||
auto pool = CDBManager::instance().GetConnectionPool();
|
||||
auto conn = pool->acquire();
|
||||
|
||||
unique_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery));
|
||||
|
||||
SQLResult *res = pmsg->Get();
|
||||
if (res->uiAffectedRows == 0 || res->uiAffectedRows == (uint32_t)-1)
|
||||
try
|
||||
{
|
||||
SPDLOG_ERROR("cannot insert marriage");
|
||||
pqxx::work txn{*conn};
|
||||
pqxx::result result = txn.exec_params("INSERT INTO player.marriage(player_id_1, player_id_2, love_points, created_at) VALUES ($1, $2, 0, $3) RETURNING id", dwPID1, dwPID2, now);
|
||||
std::size_t const numRows = std::size(result);
|
||||
|
||||
if (numRows == 0)
|
||||
{
|
||||
SPDLOG_ERROR("cannot insert marriage");
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
SPDLOG_ERROR("[CManager::Add] Query error: {}", e.what());
|
||||
return;
|
||||
}
|
||||
|
||||
@ -142,16 +153,24 @@ namespace marriage
|
||||
|
||||
Align(dwPID1, dwPID2);
|
||||
|
||||
char szQuery[512];
|
||||
snprintf(szQuery, sizeof(szQuery), "UPDATE marriage SET love_point = %d, is_married = %d WHERE pid1 = %u AND pid2 = %u",
|
||||
iLovePoint, byMarried, pMarriage->pid1, pMarriage->pid2);
|
||||
auto pool = CDBManager::instance().GetConnectionPool();
|
||||
auto conn = pool->acquire();
|
||||
|
||||
unique_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery));
|
||||
|
||||
SQLResult *res = pmsg->Get();
|
||||
if (res->uiAffectedRows == 0 || res->uiAffectedRows == (uint32_t)-1)
|
||||
try
|
||||
{
|
||||
SPDLOG_ERROR("cannot update marriage : PID:{} {}", dwPID1, dwPID2);
|
||||
pqxx::work txn{*conn};
|
||||
pqxx::result result = txn.exec_params("UPDATE player.marriage SET love_points=$1, is_married=$2 WHERE player_id_1=$3 AND player_id_2=$4 RETURNING id", iLovePoint, byMarried, pMarriage->pid1, pMarriage->pid2);
|
||||
std::size_t const numRows = std::size(result);
|
||||
|
||||
if (numRows == 0)
|
||||
{
|
||||
SPDLOG_ERROR("cannot update marriage : PID:{} {}", dwPID1, dwPID2);
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
SPDLOG_ERROR("[CManager::Update] Query error: {}", e.what());
|
||||
return;
|
||||
}
|
||||
|
||||
@ -189,15 +208,24 @@ namespace marriage
|
||||
|
||||
Align(dwPID1, dwPID2);
|
||||
|
||||
char szQuery[512];
|
||||
snprintf(szQuery, sizeof(szQuery), "DELETE FROM marriage WHERE pid1 = %u AND pid2 = %u", dwPID1, dwPID2);
|
||||
auto pool = CDBManager::instance().GetConnectionPool();
|
||||
auto conn = pool->acquire();
|
||||
|
||||
unique_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery));
|
||||
|
||||
SQLResult *res = pmsg->Get();
|
||||
if (res->uiAffectedRows == 0 || res->uiAffectedRows == (uint32_t)-1)
|
||||
try
|
||||
{
|
||||
SPDLOG_ERROR("cannot delete marriage : PID:{} {}", dwPID1, dwPID2);
|
||||
pqxx::work txn{*conn};
|
||||
pqxx::result result = txn.exec_params("DELETE FROM player.marriage WHERE player_id_1=$1 AND player_id_2=$2", dwPID1, dwPID2);
|
||||
std::size_t const numRows = std::size(result);
|
||||
|
||||
if (numRows == 0)
|
||||
{
|
||||
SPDLOG_ERROR("cannot delete marriage : PID:{} {}", dwPID1, dwPID2);
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
SPDLOG_ERROR("[CManager::Remove] Query error: {}", e.what());
|
||||
return;
|
||||
}
|
||||
|
||||
@ -232,16 +260,24 @@ namespace marriage
|
||||
|
||||
Align(dwPID1, dwPID2);
|
||||
|
||||
char szQuery[512];
|
||||
snprintf(szQuery, sizeof(szQuery), "UPDATE marriage SET is_married = 1 WHERE pid1 = %u AND pid2 = %u",
|
||||
pMarriage->pid1, pMarriage->pid2);
|
||||
auto pool = CDBManager::instance().GetConnectionPool();
|
||||
auto conn = pool->acquire();
|
||||
|
||||
unique_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery));
|
||||
|
||||
SQLResult *res = pmsg->Get();
|
||||
if (res->uiAffectedRows == 0 || res->uiAffectedRows == (uint32_t)-1)
|
||||
try
|
||||
{
|
||||
SPDLOG_ERROR("cannot change engage to marriage : PID:{} {}", dwPID1, dwPID2);
|
||||
pqxx::work txn{*conn};
|
||||
pqxx::result result = txn.exec_params("UPDATE player.marriage SET is_married = 1 WHERE player_id_1=$1 AND player_id_2=$2", pMarriage->pid1, pMarriage->pid2);
|
||||
std::size_t const numRows = std::size(result);
|
||||
|
||||
if (numRows == 0)
|
||||
{
|
||||
SPDLOG_ERROR("cannot change engage to marriage : PID:{} {}", dwPID1, dwPID2);
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
SPDLOG_ERROR("[CManager::EngageToMarriage] Query error: {}", e.what());
|
||||
return;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user