diff --git a/src/db/src/ClientManager.cpp b/src/db/src/ClientManager.cpp index acc0ec1..fe323f5 100644 --- a/src/db/src/ClientManager.cpp +++ b/src/db/src/ClientManager.cpp @@ -747,6 +747,21 @@ void CClientManager::RESULT_SAFEBOX_LOAD(CPeer *pkPeer, ClientHandleInfo *pi, pq typeof(pSet->begin()) it = pSet->begin(); + auto pool = CDBManager::instance().GetConnectionPool(); + auto conn = pool->acquire(); + + pqxx::work txn{*conn}; + + static bool prepared = false; + if (!prepared) + { + conn->prepare("result_safebox_load_insert_item", + "INSERT INTO player.item (id, owner_id, window, position, vnum, count, socket_0, socket_1, socket_2) " + "VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING id"); + + prepared = true; + } + while (it != pSet->end()) { TItemAward *pItemAward = *(it++); @@ -847,17 +862,20 @@ void CClientManager::RESULT_SAFEBOX_LOAD(CPeer *pkPeer, ClientHandleInfo *pi, pq { itertype(m_map_itemTableByVnum) it = m_map_itemTableByVnum.find(dwItemVnum); + if (it == m_map_itemTableByVnum.end()) { SPDLOG_ERROR("Invalid item(vnum : {}). It is not in m_map_itemTableByVnum.", dwItemVnum); continue; } + TItemTable *item_table = it->second; if (item_table == NULL) { SPDLOG_ERROR("Invalid item_table (vnum : {}). It's value is NULL in m_map_itemTableByVnum.", dwItemVnum); continue; } + if (0 == pItemAward->dwSocket0) { for (int i = 0; i < ITEM_LIMIT_MAX_NUM; i++) @@ -884,21 +902,15 @@ void CClientManager::RESULT_SAFEBOX_LOAD(CPeer *pkPeer, ClientHandleInfo *pi, pq } } - auto pool = CDBManager::instance().GetConnectionPool(); - auto conn = pool->acquire(); - try { - pqxx::work txn{*conn}; - pqxx::result res = txn.exec_params( - "INSERT INTO player.item (id, owner_id, window, position, vnum, count, socket_0, socket_1, socket_2) " - "VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING id", - pqxx::params{ - GainItemID(), - pi->account_id, - pi->ip[0] == 0 ? "SAFEBOX" : "MALL", - iPos, - pItemAward->dwVnum, pItemAward->dwCount, pItemAward->dwSocket0, pItemAward->dwSocket1, dwSocket2}); + pqxx::result res = txn.exec_prepared( + "result_safebox_load_insert_item", + GainItemID(), + pi->account_id, + pi->ip[0] == 0 ? "SAFEBOX" : "MALL", + iPos, + pItemAward->dwVnum, pItemAward->dwCount, pItemAward->dwSocket0, pItemAward->dwSocket1, dwSocket2); SPDLOG_DEBUG("SAFEBOX Query"); @@ -917,8 +929,6 @@ void CClientManager::RESULT_SAFEBOX_LOAD(CPeer *pkPeer, ClientHandleInfo *pi, pq vec_dwFinishedAwardID.push_back(std::make_pair(pItemAward->dwID, item.id)); grid.Put(iPos, 1, it->second->bSize); - - txn.commit(); } catch (const std::exception &e) { @@ -927,6 +937,8 @@ void CClientManager::RESULT_SAFEBOX_LOAD(CPeer *pkPeer, ClientHandleInfo *pi, pq } } + txn.commit(); + for (DWORD i = 0; i < vec_dwFinishedAwardID.size(); ++i) ItemAwardManager::instance().Taken(vec_dwFinishedAwardID[i].first, vec_dwFinishedAwardID[i].second); }