aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp93
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp3
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.h3
3 files changed, 26 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());
- }
}
}
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 7e237614f62..fdb71dd8d1a 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -458,6 +458,9 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY, "SELECT gi.item_guid, gi.guildid, g.name FROM guild_bank_item gi INNER JOIN guild g ON g.guildid = gi.guildid INNER JOIN item_instance ii ON ii.guid = gi.item_guid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT, "DELETE FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, "DELETE FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT, "INSERT INTO character_achievement (guid, achievement, date) VALUES (?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA, "DELETE FROM character_achievement_progress WHERE guid = ? AND criteria = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS, "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_REPUTATION_BY_FACTION, "DELETE FROM character_reputation WHERE guid = ? AND faction = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INS_CHAR_REPUTATION_BY_FACTION, "INSERT INTO character_reputation (guid, faction, standing, flags) VALUES (?, ?, ? , ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = (arenaPoints + ?) WHERE guid = ?", CONNECTION_ASYNC);
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index f97dd63064d..4aeee0ac525 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -394,6 +394,9 @@ enum CharacterDatabaseStatements
CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY,
CHAR_DEL_CHAR_ACHIEVEMENT,
CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS,
+ CHAR_INS_CHAR_ACHIEVEMENT,
+ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA,
+ CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS,
CHAR_DEL_CHAR_REPUTATION_BY_FACTION,
CHAR_INS_CHAR_REPUTATION_BY_FACTION,
CHAR_UPD_CHAR_ARENA_POINTS,