diff --git a/Source/Game/Chat/Commands/GuildCommands.cs b/Source/Game/Chat/Commands/GuildCommands.cs index b26ddc016..9bd118089 100644 --- a/Source/Game/Chat/Commands/GuildCommands.cs +++ b/Source/Game/Chat/Commands/GuildCommands.cs @@ -90,7 +90,7 @@ namespace Game.Chat if (targetGuild == null) return false; - targetGuild.AddMember(target.GetGUID()); + targetGuild.AddMember(null, target.GetGUID()); return true; } @@ -111,7 +111,7 @@ namespace Game.Chat if (targetGuild == null) return false; - targetGuild.DeleteMember(targetGuid, false, true, true); + targetGuild.DeleteMember(null, targetGuid, false, true, true); return true; } @@ -141,7 +141,7 @@ namespace Game.Chat if (!byte.TryParse(rankStr, out byte newRank)) return false; - return targetGuild.ChangeMemberRank(targetGuid, newRank); + return targetGuild.ChangeMemberRank(null, targetGuid, newRank); } [Command("rename", RBACPermissions.CommandGuildRename, true)] diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 227894b0f..95a63e585 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -3597,12 +3597,13 @@ namespace Game.Entities charDelete_method = CharDeleteMethod.Remove; } + SQLTransaction trans = new SQLTransaction(); uint guildId = GetGuildIdFromDB(playerGuid); if (guildId != 0) { Guild guild = Global.GuildMgr.GetGuildById(guildId); if (guild) - guild.DeleteMember(playerGuid, false, false, true); + guild.DeleteMember(trans, playerGuid, false, false, true); } // remove from arena teams @@ -3628,8 +3629,6 @@ namespace Game.Entities // Completely remove from the database case CharDeleteMethod.Remove: { - SQLTransaction trans = new SQLTransaction(); - stmt = DB.Characters.GetPreparedStatement(CharStatements.SEL_CHAR_COD_ITEM_MAIL); stmt.AddValue(0, guid); SQLResult resultMail = DB.Characters.Query(stmt); @@ -3949,7 +3948,6 @@ namespace Game.Entities Garrison.DeleteFromDB(guid, trans); - DB.Characters.CommitTransaction(trans); Global.WorldMgr.DeleteCharacterInfo(playerGuid); break; } @@ -3958,16 +3956,21 @@ namespace Game.Entities { stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_DELETE_INFO); stmt.AddValue(0, guid); - DB.Characters.Execute(stmt); + trans.Append(stmt); Global.WorldMgr.UpdateCharacterInfoDeleted(playerGuid, true); break; } default: Log.outError(LogFilter.Player, "Player:DeleteFromDB: Unsupported delete method: {0}.", charDelete_method); + + if (trans.commands.Count > 0) + DB.Characters.CommitTransaction(trans); return; } + DB.Characters.CommitTransaction(trans); + if (updateRealmChars) Global.WorldMgr.UpdateRealmCharCount(accountId); } diff --git a/Source/Game/Guilds/Guild.cs b/Source/Game/Guilds/Guild.cs index 98302feca..1b9fbc946 100644 --- a/Source/Game/Guilds/Guild.cs +++ b/Source/Game/Guilds/Guild.cs @@ -81,10 +81,10 @@ namespace Game.Guilds stmt.AddValue(++index, m_bankMoney); trans.Append(stmt); - DB.Characters.CommitTransaction(trans); - _CreateDefaultGuildRanks(pLeaderSession.GetSessionDbLocaleIndex()); // Create default ranks - bool ret = AddMember(m_leaderGuid, GuildDefaultRanks.Master); // Add guildmaster + _CreateDefaultGuildRanks(trans, pLeaderSession.GetSessionDbLocaleIndex()); // Create default ranks + bool ret = AddMember(trans, m_leaderGuid, GuildDefaultRanks.Master); // Add guildmaster + DB.Characters.CommitTransaction(trans); if (ret) { Member leader = GetMember(m_leaderGuid); @@ -103,14 +103,13 @@ namespace Game.Guilds BroadcastPacket(new GuildEventDisbanded()); + SQLTransaction trans = new SQLTransaction(); while (!m_members.Empty()) { var member = m_members.First(); - DeleteMember(member.Value.GetGUID(), true); + DeleteMember(trans, member.Value.GetGUID(), true); } - SQLTransaction trans = new SQLTransaction(); - PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD); stmt.AddValue(0, m_id); trans.Append(stmt); @@ -421,7 +420,7 @@ namespace Game.Guilds if (newGuildMaster != null) { _SetLeaderGUID(newGuildMaster); - oldGuildMaster.ChangeRank(GuildDefaultRanks.Initiate); + oldGuildMaster.ChangeRank(null, GuildDefaultRanks.Initiate); SendEventNewLeader(newGuildMaster, oldGuildMaster); } @@ -612,7 +611,7 @@ namespace Game.Guilds player.GetTeam() != ObjectManager.GetPlayerTeamByGUID(GetLeaderGUID())) return; - AddMember(player.GetGUID()); + AddMember(null, player.GetGUID()); } public void HandleLeaveMember(WorldSession session) @@ -633,7 +632,7 @@ namespace Game.Guilds } else { - DeleteMember(player.GetGUID(), false, false); + DeleteMember(null, player.GetGUID(), false, false); _LogEvent(GuildEventLogTypes.LeaveGuild, player.GetGUID().GetCounter()); SendEventPlayerLeft(player); @@ -668,7 +667,7 @@ namespace Game.Guilds SendCommandResult(session, GuildCommandType.RemovePlayer, GuildCommandError.RankTooHigh_S, name); else { - DeleteMember(guid, false, true); + DeleteMember(null, guid, false, true); _LogEvent(GuildEventLogTypes.UninvitePlayer, player.GetGUID().GetCounter(), guid.GetCounter()); Player pMember = Global.ObjAccessor.FindConnectedPlayer(guid); @@ -728,7 +727,7 @@ namespace Game.Guilds } uint newRankId = (uint)(member.GetRankId() + (demote ? 1 : -1)); - member.ChangeRank(newRankId); + member.ChangeRank(null, newRankId); _LogEvent(demote ? GuildEventLogTypes.DemotePlayer : GuildEventLogTypes.PromotePlayer, player.GetGUID().GetCounter(), member.GetGUID().GetCounter(), (byte)newRankId); //_BroadcastEvent(demote ? GuildEvents.Demotion : GuildEvents.Promotion, ObjectGuid.Empty, player.GetName(), name, _GetRankName((byte)newRankId)); } @@ -772,7 +771,7 @@ namespace Game.Guilds // Only leader can add new rank if (_IsLeader(session.GetPlayer())) - if (_CreateRank(name, GuildRankRights.GChatListen | GuildRankRights.GChatSpeak)) + if (_CreateRank(null, name, GuildRankRights.GChatListen | GuildRankRights.GChatSpeak)) BroadcastPacket(new GuildEventRanksUpdated()); } @@ -1196,7 +1195,7 @@ namespace Game.Guilds Member member = new Member(m_id, ObjectGuid.Create(HighGuid.Player, lowguid), field.Read(2)); if (!member.LoadFromDB(field)) { - _DeleteMemberFromDB(lowguid); + _DeleteMemberFromDB(null, lowguid); return false; } m_members[member.GetGUID()] = member; @@ -1316,6 +1315,8 @@ namespace Game.Guilds // Min ranks count is 2 and max is 10. bool broken_ranks = false; byte ranks = _GetRanksSize(); + + SQLTransaction trans = new SQLTransaction(); if (ranks < GuildConst.MinRanks || ranks > GuildConst.MaxRanks) { Log.outError(LogFilter.Guild, "Guild {0} has invalid number of ranks, creating new...", m_id); @@ -1333,9 +1334,7 @@ namespace Game.Guilds } else { - SQLTransaction trans = new SQLTransaction(); rankInfo.CreateMissingTabsIfNeeded(_GetPurchasedTabsSize(), trans, true); - DB.Characters.CommitTransaction(trans); } } } @@ -1343,13 +1342,13 @@ namespace Game.Guilds if (broken_ranks) { m_ranks.Clear(); - _CreateDefaultGuildRanks(); + _CreateDefaultGuildRanks(trans, SharedConst.DefaultLocale); } // Validate members' data foreach (var member in m_members.Values) if (member.GetRankId() > _GetRanksSize()) - member.ChangeRank(_GetLowestRankId()); + member.ChangeRank(trans, _GetLowestRankId()); // Repair the structure of the guild. // If the guildmaster doesn't exist or isn't member of the guild @@ -1357,7 +1356,7 @@ namespace Game.Guilds Member pLeader = GetMember(m_leaderGuid); if (pLeader == null) { - DeleteMember(m_leaderGuid); + DeleteMember(trans, m_leaderGuid); // If no more members left, disband guild if (m_members.Empty()) { @@ -1368,6 +1367,8 @@ namespace Game.Guilds else if (!pLeader.IsRank(GuildDefaultRanks.Master)) _SetLeaderGUID(pLeader); + if (trans.commands.Count > 0) + DB.Characters.CommitTransaction(trans); _UpdateAccountsNumber(); return true; } @@ -1468,7 +1469,7 @@ namespace Game.Guilds session.SendPacket(packet); } - public bool AddMember(ObjectGuid guid, byte rankId = GuildConst.RankNone) + public bool AddMember(SQLTransaction trans, ObjectGuid guid, byte rankId = GuildConst.RankNone) { Player player = Global.ObjAccessor.FindPlayer(guid); // Player cannot be in guild @@ -1532,9 +1533,7 @@ namespace Game.Guilds m_members[guid] = member; } - SQLTransaction trans = new SQLTransaction(); member.SaveToDB(trans); - DB.Characters.CommitTransaction(trans); _UpdateAccountsNumber(); _LogEvent(GuildEventLogTypes.JoinGuild, lowguid); @@ -1553,7 +1552,7 @@ namespace Game.Guilds return true; } - public void DeleteMember(ObjectGuid guid, bool isDisbanding = false, bool isKicked = false, bool canDeleteGuild = false) + public void DeleteMember(SQLTransaction trans, ObjectGuid guid, bool isDisbanding = false, bool isKicked = false, bool canDeleteGuild = false) { Player player = Global.ObjAccessor.FindPlayer(guid); @@ -1607,19 +1606,19 @@ namespace Game.Guilds player.RemoveSpell(entry.SpellID, false, false); } - _DeleteMemberFromDB(guid.GetCounter()); + _DeleteMemberFromDB(trans, guid.GetCounter()); if (!isDisbanding) _UpdateAccountsNumber(); } - public bool ChangeMemberRank(ObjectGuid guid, byte newRank) + public bool ChangeMemberRank(SQLTransaction trans, ObjectGuid guid, byte newRank) { if (newRank <= _GetLowestRankId()) // Validate rank (allow only existing ranks) { Member member = GetMember(guid); if (member != null) { - member.ChangeRank(newRank); + member.ChangeRank(trans, newRank); return true; } } @@ -1705,24 +1704,24 @@ namespace Game.Guilds DB.Characters.CommitTransaction(trans); } - void _CreateDefaultGuildRanks(LocaleConstant loc = LocaleConstant.enUS) + void _CreateDefaultGuildRanks(SQLTransaction trans, LocaleConstant loc = LocaleConstant.enUS) { PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_RANKS); stmt.AddValue(0, m_id); - DB.Characters.Execute(stmt); + trans.Append(stmt); stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_BANK_RIGHTS); stmt.AddValue(0, m_id); - DB.Characters.Execute(stmt); + trans.Append(stmt); - _CreateRank(Global.ObjectMgr.GetCypherString( CypherStrings.GuildMaster, loc), GuildRankRights.All); - _CreateRank(Global.ObjectMgr.GetCypherString(CypherStrings.GuildOfficer, loc), GuildRankRights.All); - _CreateRank(Global.ObjectMgr.GetCypherString(CypherStrings.GuildVeteran, loc), GuildRankRights.GChatListen | GuildRankRights.GChatSpeak); - _CreateRank(Global.ObjectMgr.GetCypherString(CypherStrings.GuildMember, loc), GuildRankRights.GChatListen | GuildRankRights.GChatSpeak); - _CreateRank(Global.ObjectMgr.GetCypherString(CypherStrings.GuildInitiate, loc), GuildRankRights.GChatListen | GuildRankRights.GChatSpeak); + _CreateRank(trans, Global.ObjectMgr.GetCypherString( CypherStrings.GuildMaster, loc), GuildRankRights.All); + _CreateRank(trans, Global.ObjectMgr.GetCypherString(CypherStrings.GuildOfficer, loc), GuildRankRights.All); + _CreateRank(trans, Global.ObjectMgr.GetCypherString(CypherStrings.GuildVeteran, loc), GuildRankRights.GChatListen | GuildRankRights.GChatSpeak); + _CreateRank(trans, Global.ObjectMgr.GetCypherString(CypherStrings.GuildMember, loc), GuildRankRights.GChatListen | GuildRankRights.GChatSpeak); + _CreateRank(trans, Global.ObjectMgr.GetCypherString(CypherStrings.GuildInitiate, loc), GuildRankRights.GChatListen | GuildRankRights.GChatSpeak); } - bool _CreateRank(string name, GuildRankRights rights) + bool _CreateRank(SQLTransaction trans, string name, GuildRankRights rights) { byte newRankId = _GetRanksSize(); if (newRankId >= GuildConst.MaxRanks) @@ -1732,11 +1731,17 @@ namespace Game.Guilds RankInfo info = new RankInfo(m_id, newRankId, name, rights, 0); m_ranks.Add(info); - SQLTransaction trans = new SQLTransaction(); + bool isInTransaction = trans != null; + if (!isInTransaction) + trans = new SQLTransaction(); + info.CreateMissingTabsIfNeeded(_GetPurchasedTabsSize(), trans); info.SaveToDB(trans); DB.Characters.CommitTransaction(trans); + if (!isInTransaction) + DB.Characters.CommitTransaction(trans); + return true; } @@ -1795,13 +1800,16 @@ namespace Game.Guilds if (pLeader == null) return; + SQLTransaction trans = new SQLTransaction(); m_leaderGuid = pLeader.GetGUID(); - pLeader.ChangeRank(GuildDefaultRanks.Master); + pLeader.ChangeRank(trans, GuildDefaultRanks.Master); PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_LEADER); stmt.AddValue(0, m_leaderGuid.GetCounter()); stmt.AddValue(1, m_id); - DB.Characters.Execute(stmt); + trans.Append(stmt); + + DB.Characters.CommitTransaction(trans); } void _SetRankBankMoneyPerDay(uint rankId, uint moneyPerDay) @@ -2234,7 +2242,7 @@ namespace Game.Guilds rankChange.Promote = (rank < member.GetRankId()); BroadcastPacket(rankChange); - member.ChangeRank(rank); + member.ChangeRank(null, rank); Log.outDebug(LogFilter.Network, "SMSG_GUILD_RANKS_UPDATE [Broadcast] Target: {0}, Issuer: {1}, RankId: {2}", targetGuid.ToString(), setterGuid.ToString(), rank); } @@ -2361,11 +2369,11 @@ namespace Game.Guilds return null; } - void _DeleteMemberFromDB(ulong lowguid) + void _DeleteMemberFromDB(SQLTransaction trans, ulong lowguid) { PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_MEMBER); stmt.AddValue(0, lowguid); - DB.Characters.Execute(stmt); + DB.Characters.ExecuteOrAppend(trans, stmt); } ulong GetGuildBankTabPrice(byte tabId) @@ -2496,7 +2504,7 @@ namespace Game.Guilds DB.Characters.Execute(stmt); } - public void ChangeRank(uint newRank) + public void ChangeRank(SQLTransaction trans, uint newRank) { m_rankId = (byte)newRank; @@ -2508,7 +2516,7 @@ namespace Game.Guilds PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_GUILD_MEMBER_RANK); stmt.AddValue(0, newRank); stmt.AddValue(1, m_guid.GetCounter()); - DB.Characters.Execute(stmt); + DB.Characters.ExecuteOrAppend(trans, stmt); } public void SaveToDB(SQLTransaction trans) @@ -2736,7 +2744,7 @@ namespace Game.Guilds PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_GUILD_EVENTLOG); stmt.AddValue(0, m_guildId); stmt.AddValue(1, m_guid); - DB.Characters.ExecuteOrAppend(trans, stmt); + trans.Append(stmt); byte index = 0; stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_EVENTLOG); @@ -2747,7 +2755,7 @@ namespace Game.Guilds stmt.AddValue(++index, m_playerGuid2); stmt.AddValue(++index, m_newRank); stmt.AddValue(++index, m_timestamp); - DB.Characters.ExecuteOrAppend(trans, stmt); + trans.Append(stmt); } public void WritePacket(GuildEventLogQueryResults packet) @@ -2816,7 +2824,7 @@ namespace Game.Guilds stmt.AddValue(index, m_guildId); stmt.AddValue(++index, m_guid); stmt.AddValue(++index, m_bankTabId); - DB.Characters.ExecuteOrAppend(trans, stmt); + trans.Append(stmt); index = 0; stmt = DB.Characters.GetPreparedStatement(CharStatements.INS_GUILD_BANK_EVENTLOG); @@ -2829,7 +2837,7 @@ namespace Game.Guilds stmt.AddValue(++index, m_itemStackCount); stmt.AddValue(++index, m_destTabId); stmt.AddValue(++index, m_timestamp); - DB.Characters.ExecuteOrAppend(trans, stmt); + trans.Append(stmt); } public void WritePacket(GuildBankLogQueryResults packet) @@ -3298,7 +3306,7 @@ namespace Game.Guilds stmt.AddValue(0, m_guildId); stmt.AddValue(1, m_tabId); stmt.AddValue(2, slotId); - DB.Characters.ExecuteOrAppend(trans, stmt); + trans.Append(stmt); if (item != null) { @@ -3307,13 +3315,14 @@ namespace Game.Guilds stmt.AddValue(1, m_tabId); stmt.AddValue(2, slotId); stmt.AddValue(3, item.GetGUID().GetCounter()); - DB.Characters.ExecuteOrAppend(trans, stmt); + trans.Append(stmt); item.SetGuidValue(ItemFields.Contained, ObjectGuid.Empty); item.SetGuidValue(ItemFields.Owner, ObjectGuid.Empty); item.FSetState(ItemUpdateState.New); item.SaveToDB(trans); // Not in inventory and can be saved standalone } + return true; } diff --git a/Source/Game/Handlers/CharacterHandler.cs b/Source/Game/Handlers/CharacterHandler.cs index ec0bcd547..da478cfe7 100644 --- a/Source/Game/Handlers/CharacterHandler.cs +++ b/Source/Game/Handlers/CharacterHandler.cs @@ -1706,7 +1706,7 @@ namespace Game { Guild guild = Global.GuildMgr.GetGuildById(result.Read(0)); if (guild) - guild.DeleteMember(factionChangeInfo.Guid, false, false, true); + guild.DeleteMember(trans, factionChangeInfo.Guid, false, false, true); } Player.LeaveAllArenaTeams(factionChangeInfo.Guid); diff --git a/Source/Game/Handlers/PetitionsHandler.cs b/Source/Game/Handlers/PetitionsHandler.cs index a7262d353..9e021b466 100644 --- a/Source/Game/Handlers/PetitionsHandler.cs +++ b/Source/Game/Handlers/PetitionsHandler.cs @@ -482,14 +482,17 @@ namespace Game Guild.SendCommandResult(this, GuildCommandType.CreateGuild, GuildCommandError.Success, name); + SQLTransaction trans = new SQLTransaction(); + // Add members from signatures for (byte i = 0; i < signatures; ++i) { - guild.AddMember(ObjectGuid.Create(HighGuid.Player, result.Read(0))); - result.NextRow(); - } + guild.AddMember(trans, ObjectGuid.Create(HighGuid.Player, result.Read(0))); - SQLTransaction trans = new SQLTransaction(); + // Checking the return value just to be double safe + if (!result.NextRow()) + break; + } stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_PETITION_BY_GUID); stmt.AddValue(0, packet.Item.GetCounter());