From 3a38f8828c8ae70a52f705b55bfbf9ac459699eb Mon Sep 17 00:00:00 2001 From: WildEgo Date: Sat, 7 Jun 2025 22:42:01 +0100 Subject: [PATCH] change: Marriage. --- TODO.md | 2 +- src/db/src/Marriage.cpp | 140 +++++++++++++++++++++++++--------------- 2 files changed, 89 insertions(+), 53 deletions(-) diff --git a/TODO.md b/TODO.md index ed324d4..d049e4a 100644 --- a/TODO.md +++ b/TODO.md @@ -13,5 +13,5 @@ - [ ] GuildManager - [ ] ItemAwardManager - [ ] ItemIDRangeManager - - [ ] Marriage + - [x] Marriage - [x] Monarch diff --git a/src/db/src/Marriage.cpp b/src/db/src/Marriage.cpp index e1d0716..d48299e 100644 --- a/src/db/src/Marriage.cpp +++ b/src/db/src/Marriage.cpp @@ -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 pmsg_delete(CDBManager::instance().DirectQuery("DELETE FROM marriage WHERE is_married = 0")); - unique_ptr 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 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 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 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 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; }