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:
@@ -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 = ?");
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user