[6865] Improve db access in guild and arena team code.

Note: Using SetUInt32ValueInDB() is still not safe, because it's executed async.
Three possible solutions:
1) remove data field
2) get rid of SetUInt32ValueInDB() calls (probably not possible)
3) make SaveValuesArrayInDB() executed directly
This commit is contained in:
hunuza 2008-11-30 13:15:05 +01:00
parent d0ea9cbb23
commit 1ad9adc467
4 changed files with 29 additions and 16 deletions

View file

@ -138,19 +138,23 @@ bool ArenaTeam::AddMember(uint64 PlayerGuid)
{ {
pl->SetInArenaTeam(Id, GetSlot()); pl->SetInArenaTeam(Id, GetSlot());
pl->SetArenaTeamIdInvited(0); pl->SetArenaTeamIdInvited(0);
// hide promote/remove buttons
if(CaptainGuid != PlayerGuid)
pl->SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 + (GetSlot() * 6), 1);
} }
else else
{ {
Player::SetUInt32ValueInDB(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (GetSlot() * 6), Id, PlayerGuid); Tokens tokens;
} if(Player::LoadValuesArrayFromDB(tokens,PlayerGuid))
{
Player::SetUInt32ValueInArray(tokens,PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (GetSlot() * 6), Id);
// hide promote/remove buttons
if(CaptainGuid != PlayerGuid)
Player::SetUInt32ValueInArray(tokens,PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 + (GetSlot() * 6), 1);
// hide promote/remove buttons Player::SaveValuesArrayInDB(tokens,PlayerGuid);
if(CaptainGuid != PlayerGuid) }
{
if(pl)
pl->SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 + (GetSlot() * 6), 1);
else
Player::SetUInt32ValueInDB(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 + (GetSlot() * 6), 1, PlayerGuid);
} }
return true; return true;
} }

View file

@ -567,8 +567,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
{ {
// remove wrong guild data // remove wrong guild data
sLog.outError("Player %s (GUID: %u) marked as member not existed guild (id: %u), removing guild membership for player.",pCurrChar->GetName(),pCurrChar->GetGUIDLow(),pCurrChar->GetGuildId()); sLog.outError("Player %s (GUID: %u) marked as member not existed guild (id: %u), removing guild membership for player.",pCurrChar->GetName(),pCurrChar->GetGUIDLow(),pCurrChar->GetGuildId());
pCurrChar->SetUInt32Value(PLAYER_GUILDID,0); pCurrChar->SetInGuild(0);
pCurrChar->SetUInt32ValueInDB(PLAYER_GUILDID,0,pCurrChar->GetGUID());
} }
} }

View file

@ -151,8 +151,13 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank)
} }
else else
{ {
Player::SetUInt32ValueInDB(PLAYER_GUILDID, Id, plGuid); Tokens tokens;
Player::SetUInt32ValueInDB(PLAYER_GUILDRANK, newmember.RankId, plGuid); if(Player::LoadValuesArrayFromDB(tokens,plGuid))
{
Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDID, Id);
Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDRANK, newmember.RankId);
Player::SaveValuesArrayInDB(tokens, plGuid);
}
} }
return true; return true;
} }
@ -481,8 +486,13 @@ void Guild::DelMember(uint64 guid, bool isDisbanding)
} }
else else
{ {
Player::SetUInt32ValueInDB(PLAYER_GUILDID, 0, guid); Tokens tokens;
Player::SetUInt32ValueInDB(PLAYER_GUILDRANK, GR_GUILDMASTER, guid); if(Player::LoadValuesArrayFromDB(tokens,guid))
{
Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDID, 0);
Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDRANK, GR_GUILDMASTER);
Player::SaveValuesArrayInDB(tokens, guid);
}
} }
CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", GUID_LOPART(guid)); CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", GUID_LOPART(guid));

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "6864" #define REVISION_NR "6865"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__