mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Auction House: Eliminate blocking db queries for account permissions when expiring auctions that have offline bidders
(cherry picked from commit d0d0f51f32)
This commit is contained in:
@@ -223,6 +223,7 @@ CREATE TABLE `auctionhouse` (
|
||||
`bidAmount` bigint unsigned NOT NULL DEFAULT '0',
|
||||
`startTime` bigint NOT NULL DEFAULT '0',
|
||||
`endTime` bigint NOT NULL DEFAULT '0',
|
||||
`serverFlags` tinyint unsigned NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
@@ -3662,7 +3663,8 @@ INSERT INTO `updates` VALUES
|
||||
('2022_01_15_00_characters.sql','884EFB6592DC8A765E0C0BF8BF907B4E4733BB0C','ARCHIVED','2022-01-15 23:24:58',0),
|
||||
('2022_01_31_00_characters.sql','19551474AA6079F0616B565F254914C5DD9ED1A1','RELEASED','2022-01-31 14:32:49',0),
|
||||
('2022_01_31_01_characters.sql','E0A1FA670F4621AEB594D7ACBA4921CB298F54FF','RELEASED','2022-01-31 20:47:59',0),
|
||||
('2022_01_31_02_characters.sql','6E3A3F02276287DD540BC4C17E246DFB850260D8','RELEASED','2022-01-31 21:43:38',0);
|
||||
('2022_01_31_02_characters.sql','6E3A3F02276287DD540BC4C17E246DFB850260D8','RELEASED','2022-01-31 21:43:38',0),
|
||||
('2022_02_28_00_characters_2020_09_27_00_characters.sql','2292A1ED0E7F46DEC41384F75FA6D9461464EEB8','RELEASED','2022-02-28 12:43:58',0);
|
||||
/*!40000 ALTER TABLE `updates` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
ALTER TABLE `auctionhouse` ADD `serverFlags` tinyint unsigned NOT NULL DEFAULT '0' AFTER `endTime`;
|
||||
@@ -165,15 +165,15 @@ void CharacterDatabaseConnection::DoPrepareStatements()
|
||||
PrepareStatement(CHAR_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 = ?", CONNECTION_BOTH);
|
||||
PrepareStatement(CHAR_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 = ?", CONNECTION_BOTH);
|
||||
PrepareStatement(CHAR_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", CONNECTION_SYNCH);
|
||||
PrepareStatement(CHAR_SEL_AUCTIONS, "SELECT id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime FROM auctionhouse", CONNECTION_SYNCH);
|
||||
PrepareStatement(CHAR_SEL_AUCTIONS, "SELECT id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime, serverFlags FROM auctionhouse", CONNECTION_SYNCH);
|
||||
PrepareStatement(CHAR_INS_AUCTION_ITEMS, "INSERT INTO auction_items (auctionId, itemGuid) VALUES (?, ?)", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_DEL_AUCTION_ITEMS_BY_ITEM, "DELETE FROM auction_items WHERE itemGuid = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_SEL_AUCTION_BIDDERS, "SELECT auctionId, playerGuid FROM auction_bidders", CONNECTION_SYNCH);
|
||||
PrepareStatement(CHAR_INS_AUCTION_BIDDER, "INSERT INTO auction_bidders (auctionId, playerGuid) VALUES (?, ?)", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_DEL_AUCTION_BIDDER_BY_PLAYER, "DELETE FROM auction_bidders WHERE playerGuid = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime, serverFlags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_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 = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_UPD_AUCTION_BID, "UPDATE auctionhouse SET bidder = ?, bidAmount = ? WHERE id = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_UPD_AUCTION_BID, "UPDATE auctionhouse SET bidder = ?, bidAmount = ?, serverFlags = ? WHERE id = ?", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_UPD_AUCTION_EXPIRATION, "UPDATE auctionhouse SET endTime = ? WHERE id = ?", CONNECTION_SYNCH);
|
||||
PrepareStatement(CHAR_INS_MAIL, "INSERT INTO mail(id, messageType, stationery, mailTemplateId, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
|
||||
PrepareStatement(CHAR_DEL_MAIL_BY_ID, "DELETE FROM mail WHERE id = ?", CONNECTION_ASYNC);
|
||||
|
||||
@@ -631,6 +631,7 @@ void AuctionHouseMgr::LoadAuctions()
|
||||
auction.BidAmount = fields[7].GetUInt64();
|
||||
auction.StartTime = std::chrono::system_clock::from_time_t(fields[8].GetInt64());
|
||||
auction.EndTime = std::chrono::system_clock::from_time_t(fields[9].GetInt64());
|
||||
auction.ServerFlags = static_cast<AuctionPostingServerFlag>(fields[10].GetUInt8());
|
||||
|
||||
auto biddersItr = biddersByAuction.find(auction.Id);
|
||||
if (biddersItr != biddersByAuction.end())
|
||||
@@ -1003,6 +1004,7 @@ void AuctionHouseObject::AddAuction(CharacterDatabaseTransaction trans, AuctionP
|
||||
stmt->setUInt64(7, auction.BidAmount);
|
||||
stmt->setInt64(8, std::chrono::system_clock::to_time_t(auction.StartTime));
|
||||
stmt->setInt64(9, std::chrono::system_clock::to_time_t(auction.EndTime));
|
||||
stmt->setUInt8(10, auction.ServerFlags.AsUnderlyingType());
|
||||
trans->Append(stmt);
|
||||
|
||||
for (Item* item : auction.Items)
|
||||
@@ -1854,18 +1856,16 @@ void AuctionHouseObject::SendAuctionWon(AuctionPosting const* auction, Player* b
|
||||
|
||||
// data for gm.log
|
||||
std::string bidderName;
|
||||
bool logGmTrade = false;
|
||||
bool logGmTrade = auction->ServerFlags.HasFlag(AuctionPostingServerFlag::GmLogBuyer);
|
||||
|
||||
if (bidder)
|
||||
{
|
||||
bidderAccId = bidder->GetSession()->GetAccountId();
|
||||
bidderName = bidder->GetName();
|
||||
logGmTrade = bidder->GetSession()->HasPermission(rbac::RBAC_PERM_LOG_GM_TRADE);
|
||||
}
|
||||
else
|
||||
{
|
||||
bidderAccId = sCharacterCache->GetCharacterAccountIdByGuid(auction->Bidder);
|
||||
logGmTrade = AccountMgr::HasPermission(bidderAccId, rbac::RBAC_PERM_LOG_GM_TRADE, realm.Id.Realm);
|
||||
|
||||
if (logGmTrade && !sCharacterCache->GetCharacterNameByGuid(auction->Bidder, bidderName))
|
||||
bidderName = sObjectMgr->GetTrinityStringForDBCLocale(LANG_UNKNOWN);
|
||||
|
||||
@@ -222,6 +222,14 @@ struct AuctionsBucketData
|
||||
class Sorter;
|
||||
};
|
||||
|
||||
enum class AuctionPostingServerFlag : uint8
|
||||
{
|
||||
None = 0x0,
|
||||
GmLogBuyer = 0x1 // write transaction to gm log file for buyer (optimization flag - avoids querying database for offline player permissions)
|
||||
};
|
||||
|
||||
DEFINE_ENUM_FLAG(AuctionPostingServerFlag);
|
||||
|
||||
// This structure represents the result of a single C_AuctionHouse.PostItem/PostCommodity call
|
||||
struct AuctionPosting
|
||||
{
|
||||
@@ -238,6 +246,7 @@ struct AuctionPosting
|
||||
uint64 BidAmount = 0;
|
||||
SystemTimePoint StartTime = SystemTimePoint::min();
|
||||
SystemTimePoint EndTime = SystemTimePoint::min();
|
||||
EnumFlag<AuctionPostingServerFlag> ServerFlags = AuctionPostingServerFlag::None;
|
||||
|
||||
GuidUnorderedSet BidderHistory;
|
||||
|
||||
|
||||
@@ -439,12 +439,14 @@ void AuctionBotBuyer::PlaceBidToEntry(AuctionPosting* auction, AuctionHouseObjec
|
||||
// Set bot as bidder and set new bid amount
|
||||
auction->Bidder = newBidder;
|
||||
auction->BidAmount = bidPrice;
|
||||
auction->ServerFlags &= ~AuctionPostingServerFlag::GmLogBuyer;
|
||||
|
||||
// Update auction to DB
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_AUCTION_BID);
|
||||
stmt->setUInt64(0, auction->Bidder.GetCounter());
|
||||
stmt->setUInt32(1, auction->BidAmount);
|
||||
stmt->setUInt32(2, auction->Id);
|
||||
stmt->setUInt64(1, auction->BidAmount);
|
||||
stmt->setUInt8(2, auction->ServerFlags.AsUnderlyingType());
|
||||
stmt->setUInt32(3, auction->Id);
|
||||
trans->Append(stmt);
|
||||
|
||||
// Run SQLs
|
||||
|
||||
@@ -435,6 +435,10 @@ void WorldSession::HandleAuctionPlaceBid(WorldPackets::AuctionHouse::AuctionPlac
|
||||
player->ModifyMoney(-int64(priceToPay));
|
||||
auction->Bidder = player->GetGUID();
|
||||
auction->BidAmount = placeBid.BidAmount;
|
||||
if (HasPermission(rbac::RBAC_PERM_LOG_GM_TRADE))
|
||||
auction->ServerFlags |= AuctionPostingServerFlag::GmLogBuyer;
|
||||
else
|
||||
auction->ServerFlags &= ~AuctionPostingServerFlag::GmLogBuyer;
|
||||
|
||||
if (canBuyout && placeBid.BidAmount == auction->BuyoutOrUnitPrice)
|
||||
{
|
||||
@@ -450,7 +454,8 @@ void WorldSession::HandleAuctionPlaceBid(WorldPackets::AuctionHouse::AuctionPlac
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_AUCTION_BID);
|
||||
stmt->setUInt64(0, auction->Bidder.GetCounter());
|
||||
stmt->setUInt64(1, auction->BidAmount);
|
||||
stmt->setUInt32(2, auction->Id);
|
||||
stmt->setUInt8(2, auction->ServerFlags.AsUnderlyingType());
|
||||
stmt->setUInt32(3, auction->Id);
|
||||
trans->Append(stmt);
|
||||
|
||||
if (auction->BidderHistory.insert(player->GetGUID()).second)
|
||||
|
||||
Reference in New Issue
Block a user