aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Chat/Commands
diff options
context:
space:
mode:
authorMachiavelli <none@none>2010-09-24 22:16:21 +0200
committerMachiavelli <none@none>2010-09-24 22:16:21 +0200
commit3c6dc320308880bde4ef9eddd695db28a74aa0d9 (patch)
treef209e6c487e436fc1cd978487dddf3604ce2b594 /src/server/game/Chat/Commands
parentb46b498141cc167163c6112e8e2bfa32fec2d7dc (diff)
Core/DBLayer:
- Rewrite Field class to be able to store both binary prepared statement data and data from adhoc query resultsets - Buffer the data of prepared statements using ResultSet and Field classes and let go of mysql c api structures after PreparedResultSet constructor. Fixes a race condition and thus a possible crash/data corruption (issue pointed out to Derex, basic suggestion by raczman) - Conform PreparedResultSet and ResultSet to the same design standards, and using Field class as data buffer class for both * NOTE: This means the fetching methods are uniform again, using ¨Field* fields = result->Fetch();¨ and access to elements trough fields[x]. * NOTE: for access to the correct row in prepared statements, ¨Field* fields = result->Fetch();¨ must ALWAYS be called inside the do { }while(result->NextRow()) loop. * NOTE: This means that Field::GetString() returns std::string object and Field::GetCString() returns const char* pointer. Still experimental and all that jazz, not recommended for production servers until feedback is given. --HG-- branch : trunk
Diffstat (limited to 'src/server/game/Chat/Commands')
-rw-r--r--src/server/game/Chat/Commands/Level2.cpp14
-rw-r--r--src/server/game/Chat/Commands/Level3.cpp71
2 files changed, 46 insertions, 39 deletions
diff --git a/src/server/game/Chat/Commands/Level2.cpp b/src/server/game/Chat/Commands/Level2.cpp
index 4c58d7c4775..1916b77bb88 100644
--- a/src/server/game/Chat/Commands/Level2.cpp
+++ b/src/server/game/Chat/Commands/Level2.cpp
@@ -2210,17 +2210,17 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
if (result)
{
Field* fields = result->Fetch();
- username = fields[0].GetCppString();
+ username = fields[0].GetString();
security = fields[1].GetUInt32();
- email = fields[2].GetCppString();
+ email = fields[2].GetString();
if (email.empty())
email = "-";
if (!m_session || m_session->GetSecurity() >= AccountTypes(security))
{
- last_ip = fields[3].GetCppString();
- last_login = fields[4].GetCppString();
+ last_ip = fields[3].GetString();
+ last_login = fields[4].GetString();
}
else
{
@@ -2528,7 +2528,7 @@ bool ChatHandler::HandleWpEventCommand(const char* args)
a4 = fields[2].GetUInt32();
a5 = fields[3].GetUInt32();
a6 = fields[4].GetUInt32();
- a7 = fields[5].GetString();
+ a7 = fields[5].GetCString();
a8 = fields[6].GetFloat();
a9 = fields[7].GetFloat();
a10 = fields[8].GetFloat();
@@ -3856,7 +3856,7 @@ bool ChatHandler::LookupPlayerSearchCommand(QueryResult result, int32 limit)
Field* fields = result->Fetch();
uint32 acc_id = fields[0].GetUInt32();
- std::string acc_name = fields[1].GetCppString();
+ std::string acc_name = fields[1].GetString();
QueryResult chars = CharacterDatabase.PQuery("SELECT guid,name FROM characters WHERE account = '%u'", acc_id);
if (chars)
@@ -3870,7 +3870,7 @@ bool ChatHandler::LookupPlayerSearchCommand(QueryResult result, int32 limit)
{
Field* charfields = chars->Fetch();
guid = charfields[0].GetUInt64();
- name = charfields[1].GetCppString();
+ name = charfields[1].GetString();
PSendSysMessage(LANG_LOOKUP_PLAYER_CHARACTER,name.c_str(),guid);
++i;
diff --git a/src/server/game/Chat/Commands/Level3.cpp b/src/server/game/Chat/Commands/Level3.cpp
index 01f696f9b3b..7be52c0b9ff 100644
--- a/src/server/game/Chat/Commands/Level3.cpp
+++ b/src/server/game/Chat/Commands/Level3.cpp
@@ -324,21 +324,21 @@ bool ChatHandler::HandleReloadCreatureTemplateCommand(const char* args)
const_cast<CreatureInfo*>(cInfo)->Modelid3 = fields[7].GetUInt32();
const_cast<CreatureInfo*>(cInfo)->Modelid4 = fields[8].GetUInt32();
size_t len = 0;
- if (const char* temp = fields[9].GetString())
+ if (const char* temp = fields[9].GetCString())
{
delete[] cInfo->Name;
len = strlen(temp)+1;
const_cast<CreatureInfo*>(cInfo)->Name = new char[len];
strncpy(cInfo->Name, temp, len);
}
- if (const char* temp = fields[10].GetString())
+ if (const char* temp = fields[10].GetCString())
{
delete[] cInfo->SubName;
len = strlen(temp)+1;
const_cast<CreatureInfo*>(cInfo)->SubName = new char[len];
strncpy(cInfo->SubName, temp, len);
}
- if (const char* temp = fields[11].GetString())
+ if (const char* temp = fields[11].GetCString())
{
delete[] cInfo->IconName;
len = strlen(temp)+1;
@@ -397,7 +397,7 @@ bool ChatHandler::HandleReloadCreatureTemplateCommand(const char* args)
const_cast<CreatureInfo*>(cInfo)->VehicleId = fields[61].GetUInt32();
const_cast<CreatureInfo*>(cInfo)->mingold = fields[62].GetUInt32();
const_cast<CreatureInfo*>(cInfo)->maxgold = fields[63].GetUInt32();
- if (const char* temp = fields[64].GetString())
+ if (const char* temp = fields[64].GetCString())
{
delete[] cInfo->AIName;
len = strlen(temp)+1;
@@ -421,7 +421,7 @@ bool ChatHandler::HandleReloadCreatureTemplateCommand(const char* args)
const_cast<CreatureInfo*>(cInfo)->equipmentId = fields[79].GetUInt32();
const_cast<CreatureInfo*>(cInfo)->MechanicImmuneMask = fields[80].GetUInt32();
const_cast<CreatureInfo*>(cInfo)->flags_extra = fields[81].GetUInt32();
- const_cast<CreatureInfo*>(cInfo)->ScriptID = sObjectMgr.GetScriptId(fields[82].GetString());
+ const_cast<CreatureInfo*>(cInfo)->ScriptID = sObjectMgr.GetScriptId(fields[82].GetCString());
sObjectMgr.CheckCreatureTemplate(cInfo);
@@ -2649,7 +2649,7 @@ bool ChatHandler::HandleListItemCommand(const char *args)
uint32 item_slot = fields[2].GetUInt32();
uint32 owner_guid = fields[3].GetUInt32();
uint32 owner_acc = fields[4].GetUInt32();
- std::string owner_name = fields[5].GetCppString();
+ std::string owner_name = fields[5].GetString();
char const* item_pos = 0;
if (Player::IsEquipmentPos(item_bag,item_slot))
@@ -2700,9 +2700,9 @@ bool ChatHandler::HandleListItemCommand(const char *args)
uint32 item_s = fields[1].GetUInt32();
uint32 item_r = fields[2].GetUInt32();
uint32 item_s_acc = fields[3].GetUInt32();
- std::string item_s_name = fields[4].GetCppString();
+ std::string item_s_name = fields[4].GetString();
uint32 item_r_acc = fields[5].GetUInt32();
- std::string item_r_name = fields[6].GetCppString();
+ std::string item_r_name = fields[6].GetString();
char const* item_pos = "[in mail]";
@@ -2743,7 +2743,7 @@ bool ChatHandler::HandleListItemCommand(const char *args)
uint32 item_guid = fields[0].GetUInt32();
uint32 owner = fields[1].GetUInt32();
uint32 owner_acc = fields[2].GetUInt32();
- std::string owner_name = fields[3].GetCppString();
+ std::string owner_name = fields[3].GetString();
char const* item_pos = "[in auction]";
@@ -2770,7 +2770,7 @@ bool ChatHandler::HandleListItemCommand(const char *args)
Field *fields = result->Fetch();
uint32 item_guid = fields[0].GetUInt32();
uint32 guild_guid = fields[1].GetUInt32();
- std::string guild_name = fields[2].GetCppString();
+ std::string guild_name = fields[2].GetString();
char const* item_pos = "[in guild bank]";
@@ -5895,7 +5895,7 @@ bool ChatHandler::HandleBanInfoCharacterCommand(const char *args)
return false;
}
- target_guid = resultCharacter->GetUInt32(0);
+ target_guid = (*resultCharacter)[0].GetUInt32();
}
else
target_guid = target->GetGUIDLow();
@@ -5909,15 +5909,17 @@ bool ChatHandler::HandleBanInfoCharacterCommand(const char *args)
PSendSysMessage(LANG_BANINFO_BANHISTORY, name.c_str());
do
{
- time_t unbandate = time_t(result->GetUInt64(3));
+ Field* fields = result->Fetch();
+ time_t unbandate = time_t(fields[3].GetUInt64());
bool active = false;
- if (result->GetUInt8(2) && (!result->GetUInt64(1) || unbandate >= time(NULL)))
+ if (fields[2].GetUInt8() && (!fields[1].GetUInt64() || unbandate >= time(NULL)))
active = true;
- bool permanent = (result->GetUInt64(1) == uint64(0));
- std::string bantime = permanent ? GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(result->GetUInt64(1), true);
+ bool permanent = (fields[1].GetUInt64() == uint64(0));
+ std::string bantime = permanent ? GetTrinityString(LANG_BANINFO_INFINITE) : secsToTimeString(fields[1].GetUInt64(), true);
PSendSysMessage(LANG_BANINFO_HISTORYENTRY,
- result->GetCString(0), bantime.c_str(), active ? GetTrinityString(LANG_BANINFO_YES) : GetTrinityString(LANG_BANINFO_NO), result->GetCString(4), result->GetCString(5));
- } while (result->NextRow());
+ fields[0].GetCString(), bantime.c_str(), active ? GetTrinityString(LANG_BANINFO_YES) : GetTrinityString(LANG_BANINFO_NO), fields[4].GetCString(), fields[5].GetCString());
+ }
+ while (result->NextRow());
return true;
}
@@ -6006,12 +6008,14 @@ bool ChatHandler::HandleBanListCharacterCommand(const char *args)
{
do
{
+ Field* fields = result->Fetch();
PreparedStatement* stmt2 = CharacterDatabase.GetPreparedStatement(CHAR_GET_BANNED_NAME);
- stmt2->setUInt32(0, result->GetUInt32(0));
+ stmt2->setUInt32(0, fields[0].GetUInt32());
PreparedQueryResult banresult = CharacterDatabase.Query(stmt2);
if (banresult)
- PSendSysMessage("%s", banresult->GetCString(0));
- } while (result->NextRow());
+ PSendSysMessage("%s", (*banresult)[0].GetCString());
+ }
+ while (result->NextRow());
}
// Console wide output
else
@@ -6023,38 +6027,41 @@ bool ChatHandler::HandleBanListCharacterCommand(const char *args)
{
SendSysMessage("-------------------------------------------------------------------------------");
- std::string char_name;
+ Field* fields = result->Fetch();
- char_name = result->GetString(1);
+ std::string char_name = fields[1].GetString();
PreparedStatement* stmt2 = CharacterDatabase.GetPreparedStatement(CHAR_GET_BANINFO_LIST);
- stmt2->setUInt32(0, result->GetUInt32(0));
+ stmt2->setUInt32(0, fields[0].GetUInt32());
PreparedQueryResult banInfo = CharacterDatabase.Query(stmt2);
if (banInfo)
{
+ Field* banFields = banInfo->Fetch();
do
{
- time_t t_ban = banInfo->GetUInt64(0);
+ time_t t_ban = banFields[0].GetUInt64();
tm* aTm_ban = localtime(&t_ban);
- if (banInfo->GetUInt64(0) == banInfo->GetUInt64(1))
+ if (banFields[0].GetUInt64() == banFields[1].GetUInt64())
{
PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d| permanent |%-15.15s|%-15.15s|",
char_name.c_str(), aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min,
- banInfo->GetCString(2), banInfo->GetCString(3));
+ banFields[2].GetCString(), banFields[3].GetCString());
}
else
{
- time_t t_unban = banInfo->GetUInt64(1);
+ time_t t_unban = banFields[1].GetUInt64();
tm* aTm_unban = localtime(&t_unban);
PSendSysMessage("|%-15.15s|%02d-%02d-%02d %02d:%02d|%02d-%02d-%02d %02d:%02d|%-15.15s|%-15.15s|",
char_name.c_str(), aTm_ban->tm_year%100, aTm_ban->tm_mon+1, aTm_ban->tm_mday, aTm_ban->tm_hour, aTm_ban->tm_min,
aTm_unban->tm_year%100, aTm_unban->tm_mon+1, aTm_unban->tm_mday, aTm_unban->tm_hour, aTm_unban->tm_min,
- banInfo->GetCString(2), banInfo->GetCString(3));
+ banFields[2].GetCString(), banFields[3].GetCString());
}
- } while (banInfo->NextRow());
+ }
+ while (banInfo->NextRow());
}
- } while (result->NextRow());
+ }
+ while (result->NextRow());
SendSysMessage(" =============================================================================== ");
}
@@ -6128,7 +6135,7 @@ bool ChatHandler::HandleBanListHelper(QueryResult result)
// "account" case, name can be get in same query
if (result->GetFieldCount() > 1)
- account_name = fields[1].GetCppString();
+ account_name = fields[1].GetString();
// "character" case, name need extract from another DB
else
sAccountMgr.GetName (account_id,account_name);
@@ -7537,7 +7544,7 @@ bool ChatHandler::HandleListFreezeCommand(const char * /*args*/)
do
{
Field *fields = result->Fetch();
- std::string fplayers = fields[0].GetCppString();
+ std::string fplayers = fields[0].GetString();
PSendSysMessage(LANG_COMMAND_FROZEN_PLAYERS,fplayers.c_str());
} while (result->NextRow());