Core/Auction House: Eliminate blocking db queries for account permissions when expiring auctions that have offline bidders

Port From (https://github.com/TrinityCore/TrinityCore/commit/569b5d6f04548cd874cc161cb67a62dcad792fb0)
This commit is contained in:
hondacrx
2022-05-24 10:23:12 -04:00
parent 9f7db1d08b
commit 334ea523c3
4 changed files with 23 additions and 11 deletions
@@ -98,4 +98,10 @@ namespace Framework.Constants
Commodities = 1,
Items = 2
}
public enum AuctionPostingServerFlag
{
None = 0x0,
GmLogBuyer = 0x1 // write transaction to gm log file for buyer (optimization flag - avoids querying database for offline player permissions)
}
}
@@ -162,15 +162,15 @@ namespace Framework.Database
PrepareStatement(CharStatements.SEL_MAILITEMS_AZERITE_UNLOCKED_ESSENCE, "SELECT iaue.itemGuid, iaue.azeriteEssenceId, iaue.`rank` FROM item_instance_azerite_unlocked_essence iaue INNER JOIN mail_items mi ON iaue.itemGuid = mi.item_guid INNER JOIN mail m ON mi.mail_id = m.id WHERE m.receiver = ?");
PrepareStatement(CharStatements.SEL_MAILITEMS_AZERITE_EMPOWERED, "SELECT iae.itemGuid, iae.azeritePowerId1, iae.azeritePowerId2, iae.azeritePowerId3, iae.azeritePowerId4, iae.azeritePowerId5 FROM item_instance_azerite_empowered iae INNER JOIN mail_items mi ON iae.itemGuid = mi.item_guid INNER JOIN mail m ON mi.mail_id = m.id WHERE m.receiver = ?");
PrepareStatement(CharStatements.SEL_AUCTION_ITEMS, "SELECT " + SelectItemInstanceContent + ", ii.owner_guid, ai.auctionId FROM auction_items ai INNER JOIN item_instance ii ON ai.itemGuid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid LEFT JOIN item_instance_transmog iit ON ii.guid = iit.itemGuid LEFT JOIN item_instance_modifiers im ON ii.guid = im.itemGuid");
PrepareStatement(CharStatements.SEL_AUCTIONS, "SELECT id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime FROM auctionhouse");
PrepareStatement(CharStatements.SEL_AUCTIONS, "SELECT id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime, serverFlags FROM auctionhouse");
PrepareStatement(CharStatements.INS_AUCTION_ITEMS, "INSERT INTO auction_items (auctionId, itemGuid) VALUES (?, ?)");
PrepareStatement(CharStatements.DEL_AUCTION_ITEMS_BY_ITEM, "DELETE FROM auction_items WHERE itemGuid = ?");
PrepareStatement(CharStatements.SEL_AUCTION_BIDDERS, "SELECT auctionId, playerGuid FROM auction_bidders");
PrepareStatement(CharStatements.INS_AUCTION_BIDDER, "INSERT INTO auction_bidders (auctionId, playerGuid) VALUES (?, ?)");
PrepareStatement(CharStatements.DEL_AUCTION_BIDDER_BY_PLAYER, "DELETE FROM auction_bidders WHERE playerGuid = ?");
PrepareStatement(CharStatements.INS_AUCTION, "INSERT INTO auctionhouse (id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.INS_AUCTION, "INSERT INTO auctionhouse (id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime, serverFlags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.DEL_AUCTION, "DELETE a, ab, ai FROM auctionhouse a LEFT JOIN auction_items ai ON a.id = ai.auctionId LEFT JOIN auction_bidders ab ON a.id = ab.auctionId WHERE a.id = ?");
PrepareStatement(CharStatements.UPD_AUCTION_BID, "UPDATE auctionhouse SET bidder = ?, bidAmount = ? WHERE id = ?");
PrepareStatement(CharStatements.UPD_AUCTION_BID, "UPDATE auctionhouse SET bidder = ?, bidAmount = ?, serverFlags = ? WHERE id = ?");
PrepareStatement(CharStatements.UPD_AUCTION_EXPIRATION, "UPDATE auctionhouse SET endTime = ? WHERE id = ?");
PrepareStatement(CharStatements.INS_MAIL, "INSERT INTO mail(id, messageType, stationery, mailTemplateId, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.DEL_MAIL_BY_ID, "DELETE FROM mail WHERE id = ?");
+8 -7
View File
@@ -252,6 +252,7 @@ namespace Game
auction.BidAmount = result.Read<ulong>(7);
auction.StartTime = Time.UnixTimeToDateTime(result.Read<long>(8));
auction.EndTime = Time.UnixTimeToDateTime(result.Read<long>(9));
auction.ServerFlags = (AuctionPostingServerFlag)result.Read<byte>(10);
if (biddersByAuction.ContainsKey(auction.Id))
auction.BidderHistory = biddersByAuction[auction.Id];
@@ -654,6 +655,7 @@ namespace Game
stmt.AddValue(7, auction.BidAmount);
stmt.AddValue(8, Time.DateTimeToUnixTime(auction.StartTime));
stmt.AddValue(9, Time.DateTimeToUnixTime(auction.EndTime));
stmt.AddValue(10, (byte)auction.ServerFlags);
trans.Append(stmt);
foreach (Item item in auction.Items)
@@ -1405,18 +1407,16 @@ namespace Game
// data for gm.log
string bidderName = "";
bool logGmTrade;
bool logGmTrade= auction.ServerFlags.HasFlag(AuctionPostingServerFlag.GmLogBuyer);
if (bidder)
{
bidderAccId = bidder.GetSession().GetAccountId();
bidderName = bidder.GetName();
logGmTrade = bidder.GetSession().HasPermission(RBACPermissions.LogGmTrade);
}
else
{
bidderAccId = Global.CharacterCacheStorage.GetCharacterAccountIdByGuid(auction.Bidder);
logGmTrade = Global.AccountMgr.HasPermission(bidderAccId, RBACPermissions.LogGmTrade, Global.WorldMgr.GetRealmId().Index);
if (logGmTrade && !Global.CharacterCacheStorage.GetCharacterNameByGuid(auction.Bidder, out bidderName))
bidderName = Global.ObjectMgr.GetCypherString(CypherStrings.Unknown);
@@ -1623,12 +1623,13 @@ namespace Game
public ObjectGuid Owner;
public ObjectGuid OwnerAccount;
public ObjectGuid Bidder;
public ulong MinBid = 0;
public ulong BuyoutOrUnitPrice = 0;
public ulong Deposit = 0;
public ulong BidAmount = 0;
public ulong MinBid;
public ulong BuyoutOrUnitPrice;
public ulong Deposit;
public ulong BidAmount;
public DateTime StartTime = DateTime.MinValue;
public DateTime EndTime = DateTime.MinValue;
public AuctionPostingServerFlag ServerFlags;
public List<ObjectGuid> BidderHistory = new();
+6 -1
View File
@@ -395,6 +395,10 @@ namespace Game
player.ModifyMoney(-(long)priceToPay);
auction.Bidder = player.GetGUID();
auction.BidAmount = placeBid.BidAmount;
if (HasPermission(RBACPermissions.LogGmTrade))
auction.ServerFlags |= AuctionPostingServerFlag.GmLogBuyer;
else
auction.ServerFlags &= ~AuctionPostingServerFlag.GmLogBuyer;
if (canBuyout && placeBid.BidAmount == auction.BuyoutOrUnitPrice)
{
@@ -410,7 +414,8 @@ namespace Game
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_AUCTION_BID);
stmt.AddValue(0, auction.Bidder.GetCounter());
stmt.AddValue(1, auction.BidAmount);
stmt.AddValue(2, auction.Id);
stmt.AddValue(2, (byte)auction.ServerFlags);
stmt.AddValue(3, auction.Id);
trans.Append(stmt);
auction.BidderHistory.Add(player.GetGUID());