diff options
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 93 |
1 files changed, 20 insertions, 73 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 3d2eaffc15d..1fe9a08bfdc 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -508,103 +508,50 @@ void AchievementMgr::SaveToDB(SQLTransaction& trans) { if (!m_completedAchievements.empty()) { - bool need_execute = false; - std::ostringstream ssdel; - std::ostringstream ssins; for (CompletedAchievementMap::iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter) { if (!iter->second.changed) continue; - /// first new/changed record prefix - if (!need_execute) - { - ssdel << "DELETE FROM character_achievement WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND achievement IN ("; - ssins << "INSERT INTO character_achievement (guid, achievement, date) VALUES "; - need_execute = true; - } - /// next new/changed record prefix - else - { - ssdel << ','; - ssins << ','; - } + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT); + stmt->setUInt16(0, iter->first); + stmt->setUInt32(1, GetPlayer()->GetGUID()); + trans->Append(stmt); - // new/changed record data - ssdel << iter->first; - ssins << '(' << GetPlayer()->GetGUIDLow() << ',' << iter->first << ',' << uint64(iter->second.date) << ')'; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT); + stmt->setUInt32(0, GetPlayer()->GetGUID()); + stmt->setUInt16(1, iter->first); + stmt->setUInt32(2, uint32(iter->second.date)); + trans->Append(stmt); - /// mark as saved in db iter->second.changed = false; } - - if (need_execute) - { - ssdel << ')'; - trans->Append(ssdel.str().c_str()); - trans->Append(ssins.str().c_str()); - } } if (!m_criteriaProgress.empty()) { - /// prepare deleting and insert - bool need_execute_del = false; - bool need_execute_ins = false; - std::ostringstream ssdel; - std::ostringstream ssins; for (CriteriaProgressMap::iterator iter = m_criteriaProgress.begin(); iter != m_criteriaProgress.end(); ++iter) { if (!iter->second.changed) continue; - // deleted data (including 0 progress state) - { - /// first new/changed record prefix (for any counter value) - if (!need_execute_del) - { - ssdel << "DELETE FROM character_achievement_progress WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND criteria IN ("; - need_execute_del = true; - } - /// next new/changed record prefix - else - ssdel << ','; - - // new/changed record data - ssdel << iter->first; - } + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA); + stmt->setUInt32(0, GetPlayer()->GetGUID()); + stmt->setUInt16(1, iter->first); + trans->Append(stmt); - // store data only for real progress - if (iter->second.counter != 0) + if (iter->second.counter) { - /// first new/changed record prefix - if (!need_execute_ins) - { - ssins << "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES "; - need_execute_ins = true; - } - /// next new/changed record prefix - else - ssins << ','; - - // new/changed record data - ssins << '(' << GetPlayer()->GetGUIDLow() << ',' << iter->first << ',' << iter->second.counter << ',' << iter->second.date << ')'; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS); + stmt->setUInt32(0, GetPlayer()->GetGUID()); + stmt->setUInt16(1, iter->first); + stmt->setUInt32(2, iter->second.counter); + stmt->setUInt32(3, uint32(iter->second.date)); + trans->Append(stmt); } - /// mark as updated in db iter->second.changed = false; } - - if (need_execute_del) // DELETE ... IN (.... _)_ - ssdel << ')'; - - if (need_execute_del || need_execute_ins) - { - if (need_execute_del) - trans->Append(ssdel.str().c_str()); - if (need_execute_ins) - trans->Append(ssins.str().c_str()); - } } } |
