db: prepare login and empire select queries

This commit is contained in:
server
2026-04-13 22:47:06 +02:00
parent 77ba7381b5
commit fd3d8c0746
2 changed files with 54 additions and 38 deletions

View File

@@ -1067,26 +1067,42 @@ void CClientManager::QUERY_SAFEBOX_SAVE(CPeer * pkPeer, TSafeboxTable * pTable)
void CClientManager::QUERY_EMPIRE_SELECT(CPeer * pkPeer, DWORD dwHandle, TEmpireSelectPacket * p)
{
char szQuery[QUERY_MAX_LEN];
CStmt updateEmpireStmt;
const std::string updateEmpireQuery = std::string("UPDATE player_index") + GetTablePostfix() + " SET empire=? WHERE id=?";
snprintf(szQuery, sizeof(szQuery), "UPDATE player_index%s SET empire=%u WHERE id=%u", GetTablePostfix(), p->bEmpire, p->dwAccountID);
CDBManager::instance().DirectQuery(szQuery);
sys_log(0, "EmpireSelect: %s", szQuery);
if (!PrepareClientPlayerStmt(updateEmpireStmt, updateEmpireQuery)
|| !updateEmpireStmt.BindParam(MYSQL_TYPE_TINY, &p->bEmpire)
|| !updateEmpireStmt.BindParam(MYSQL_TYPE_LONG, &p->dwAccountID)
|| !updateEmpireStmt.Execute())
{
snprintf(szQuery, sizeof(szQuery),
"SELECT pid1, pid2, pid3, pid4 FROM player_index%s WHERE id=%u", GetTablePostfix(), p->dwAccountID);
sys_err("EmpireSelect: failed to update empire for account %u", p->dwAccountID);
pkPeer->EncodeHeader(DG::EMPIRE_SELECT, dwHandle, sizeof(BYTE));
pkPeer->EncodeBYTE(p->bEmpire);
return;
}
auto pmsg = CDBManager::instance().DirectQuery(szQuery);
sys_log(0, "EmpireSelect: account %u empire %u", p->dwAccountID, p->bEmpire);
{
CStmt playerIndexStmt;
DWORD pids[PLAYER_PER_ACCOUNT] = {};
const std::string playerIndexQuery = std::string("SELECT pid1, pid2, pid3, pid4 FROM player_index")
+ GetTablePostfix() + " WHERE id=?";
SQLResult * pRes = pmsg->Get();
if (pRes->uiNumRows)
if (!PrepareClientPlayerStmt(playerIndexStmt, playerIndexQuery)
|| !playerIndexStmt.BindParam(MYSQL_TYPE_LONG, &p->dwAccountID)
|| !playerIndexStmt.BindResult(MYSQL_TYPE_LONG, &pids[0])
|| !playerIndexStmt.BindResult(MYSQL_TYPE_LONG, &pids[1])
|| !playerIndexStmt.BindResult(MYSQL_TYPE_LONG, &pids[2])
|| !playerIndexStmt.BindResult(MYSQL_TYPE_LONG, &pids[3])
|| !playerIndexStmt.Execute())
{
sys_log(0, "EMPIRE %lu", pRes->uiNumRows);
MYSQL_ROW row = mysql_fetch_row(pRes->pSQLResult);
DWORD pids[3];
sys_err("EmpireSelect: failed to load player_index for account %u", p->dwAccountID);
}
else if (playerIndexStmt.iRows && playerIndexStmt.Fetch())
{
CStmt moveEmpirePlayerStmt;
const std::string moveEmpirePlayerQuery = std::string("UPDATE player") + GetTablePostfix()
+ " SET map_index=?,x=?,y=? WHERE id=?";
UINT g_start_map[4] =
{
@@ -1105,24 +1121,33 @@ void CClientManager::QUERY_EMPIRE_SELECT(CPeer * pkPeer, DWORD dwHandle, TEmpire
{ 969600, 278400 } // 진노국
};
for (int i = 0; i < 3; ++i)
if (!PrepareClientPlayerStmt(moveEmpirePlayerStmt, moveEmpirePlayerQuery))
{
str_to_number(pids[i], row[i]);
sys_log(0, "EMPIRE PIDS[%d]", pids[i]);
sys_err("EmpireSelect: failed to prepare player move query");
}
else for (int i = 0; i < 3; ++i)
{
sys_log(0, "EMPIRE PIDS[%u]", pids[i]);
if (pids[i])
{
sys_log(0, "EMPIRE move to pid[%d] to villiage of %u, map_index %d",
pids[i], p->bEmpire, g_start_map[p->bEmpire]);
snprintf(szQuery, sizeof(szQuery), "UPDATE player%s SET map_index=%u,x=%u,y=%u WHERE id=%u",
GetTablePostfix(),
g_start_map[p->bEmpire],
g_start_position[p->bEmpire][0],
g_start_position[p->bEmpire][1],
pids[i]);
uint32_t mapIndex = g_start_map[p->bEmpire];
uint32_t x = g_start_position[p->bEmpire][0];
uint32_t y = g_start_position[p->bEmpire][1];
uint32_t playerId = pids[i];
auto pmsg2 = CDBManager::instance().DirectQuery(szQuery);
if (!moveEmpirePlayerStmt.BindParam(MYSQL_TYPE_LONG, &mapIndex)
|| !moveEmpirePlayerStmt.BindParam(MYSQL_TYPE_LONG, &x)
|| !moveEmpirePlayerStmt.BindParam(MYSQL_TYPE_LONG, &y)
|| !moveEmpirePlayerStmt.BindParam(MYSQL_TYPE_LONG, &playerId)
|| !moveEmpirePlayerStmt.Execute())
{
sys_err("EmpireSelect: failed to move pid %u", playerId);
break;
}
}
}
}

View File

@@ -404,22 +404,13 @@ void CClientManager::RESULT_LOGIN_BY_KEY(CPeer * peer, SQLMsg * msg)
if (msg->Get()->uiNumRows == 0)
{
DWORD account_id = info->pAccountTable->id;
char szQuery[QUERY_MAX_LEN];
snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), account_id);
auto pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER);
sys_log(0, "RESULT_LOGIN_BY_KEY FAIL player_index's NULL : ID:%d", account_id);
if (pMsg->Get()->uiNumRows == 0)
{
sys_log(0, "RESULT_LOGIN_BY_KEY FAIL player_index's NULL : ID:%d", account_id);
// PLAYER_INDEX_CREATE_BUG_FIX
//snprintf(szQuery, sizeof(szQuery), "INSERT IGNORE INTO player_index%s (id) VALUES(%lu)", GetTablePostfix(), info->pAccountTable->id);
snprintf(szQuery, sizeof(szQuery), "INSERT INTO player_index%s (id) VALUES(%u)", GetTablePostfix(), info->pAccountTable->id);
CDBManager::instance().ReturnQuery(szQuery, QID_PLAYER_INDEX_CREATE, peer->GetHandle(), info);
// END_PLAYER_INDEX_CREATE_BUF_FIX
}
// PLAYER_INDEX_CREATE_BUG_FIX
snprintf(szQuery, sizeof(szQuery), "INSERT INTO player_index%s (id) VALUES(%u)", GetTablePostfix(), info->pAccountTable->id);
CDBManager::instance().ReturnQuery(szQuery, QID_PLAYER_INDEX_CREATE, peer->GetHandle(), info);
// END_PLAYER_INDEX_CREATE_BUF_FIX
return;
}