bool PreparedStatementTask::Execute() { if (m_has_result) { PreparedResultSet* result = m_conn->Query(m_stmt); if (!result || !result->GetRowCount()) { delete result; m_result.set(PreparedQueryResult(NULL)); return false; } m_result.set(PreparedQueryResult(result)); return true; } return m_conn->Execute(m_stmt); }
PreparedQueryResult DatabaseWorkerPool<T>::Query(PreparedStatement* stmt) { auto connection = GetFreeConnection(); PreparedResultSet* ret = connection->Query(stmt); connection->Unlock(); //! Delete proxy-class. Not needed anymore delete stmt; if (!ret || !ret->GetRowCount()) { delete ret; return PreparedQueryResult(NULL); } return PreparedQueryResult(ret); }
PreparedQueryResult SQLQueryHolder::GetPreparedResult(size_t index) { // Don't call to this function if the index is of a prepared statement if (index < m_queries.size()) return m_queries[index].second; else return PreparedQueryResult(nullptr); }
void SQLQueryHolder::SetPreparedResult(size_t index, PreparedResultSet* result) { if (result && !result->GetRowCount()) { delete result; result = nullptr; } /// store the result in the holder if (index < m_queries.size()) m_queries[index].second = PreparedQueryResult(result); }
static bool HandleListItemCommand(ChatHandler* handler, char const* args) { if (!*args) return false; char* id = handler->extractKeyFromLink((char*)args, "Hitem"); if (!id) return false; uint32 itemId = atol(id); if (!itemId) { handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId); handler->SetSentErrorMessage(true); return false; } ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemId); if (!itemTemplate) { handler->PSendSysMessage(LANG_COMMAND_ITEMIDINVALID, itemId); handler->SetSentErrorMessage(true); return false; } char* countStr = strtok(NULL, " "); uint32 count = countStr ? atol(countStr) : 10; if (count == 0) return false; PreparedQueryResult result; // inventory case uint32 inventoryCount = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_INVENTORY_COUNT_ITEM); stmt->setUInt32(0, itemId); result = CharacterDatabase.Query(stmt); if (result) inventoryCount = (*result)[0].GetUInt64(); stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY); stmt->setUInt32(0, itemId); stmt->setUInt32(1, count); result = CharacterDatabase.Query(stmt); if (result) { do { Field* fields = result->Fetch(); uint32 itemGuid = fields[0].GetUInt32(); uint32 itemBag = fields[1].GetUInt32(); uint8 itemSlot = fields[2].GetUInt8(); uint32 ownerGuid = fields[3].GetUInt32(); uint32 ownerAccountId = fields[4].GetUInt32(); std::string ownerName = fields[5].GetString(); char const* itemPos = 0; if (Player::IsEquipmentPos(itemBag, itemSlot)) itemPos = "[equipped]"; else if (Player::IsInventoryPos(itemBag, itemSlot)) itemPos = "[in inventory]"; else if (Player::IsBankPos(itemBag, itemSlot)) itemPos = "[in bank]"; else itemPos = ""; handler->PSendSysMessage(LANG_ITEMLIST_SLOT, itemGuid, ownerName.c_str(), ownerGuid, ownerAccountId, itemPos); } while (result->NextRow()); uint32 resultCount = uint32(result->GetRowCount()); if (count > resultCount) count -= resultCount; else if (count) count = 0; } // mail case uint32 mailCount = 0; stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL_COUNT_ITEM); stmt->setUInt32(0, itemId); result = CharacterDatabase.Query(stmt); if (result) mailCount = (*result)[0].GetUInt64(); if (count > 0) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL_ITEMS_BY_ENTRY); stmt->setUInt32(0, itemId); stmt->setUInt32(1, count); result = CharacterDatabase.Query(stmt); } else result = PreparedQueryResult(NULL); if (result) { do { Field* fields = result->Fetch(); uint32 itemGuid = fields[0].GetUInt32(); uint32 itemSender = fields[1].GetUInt32(); uint32 itemReceiver = fields[2].GetUInt32(); uint32 itemSenderAccountId = fields[3].GetUInt32(); std::string itemSenderName = fields[4].GetString(); uint32 itemReceiverAccount = fields[5].GetUInt32(); std::string itemReceiverName = fields[6].GetString(); char const* itemPos = "[in mail]"; handler->PSendSysMessage(LANG_ITEMLIST_MAIL, itemGuid, itemSenderName.c_str(), itemSender, itemSenderAccountId, itemReceiverName.c_str(), itemReceiver, itemReceiverAccount, itemPos); } while (result->NextRow()); uint32 resultCount = uint32(result->GetRowCount()); if (count > resultCount) count -= resultCount; else if (count) count = 0; } // auction case uint32 auctionCount = 0; stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_AUCTIONHOUSE_COUNT_ITEM); stmt->setUInt32(0, itemId); result = CharacterDatabase.Query(stmt); if (result) auctionCount = (*result)[0].GetUInt64(); if (count > 0) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_AUCTIONHOUSE_ITEM_BY_ENTRY); stmt->setUInt32(0, itemId); stmt->setUInt32(1, count); result = CharacterDatabase.Query(stmt); } else result = PreparedQueryResult(NULL); if (result) { do { Field* fields = result->Fetch(); uint32 itemGuid = fields[0].GetUInt32(); uint32 owner = fields[1].GetUInt32(); uint32 ownerAccountId = fields[2].GetUInt32(); std::string ownerName = fields[3].GetString(); char const* itemPos = "[in auction]"; handler->PSendSysMessage(LANG_ITEMLIST_AUCTION, itemGuid, ownerName.c_str(), owner, ownerAccountId, itemPos); } while (result->NextRow()); } // guild bank case uint32 guildCount = 0; stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_COUNT_ITEM); stmt->setUInt32(0, itemId); result = CharacterDatabase.Query(stmt); if (result) guildCount = (*result)[0].GetUInt64(); stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY); stmt->setUInt32(0, itemId); stmt->setUInt32(1, count); result = CharacterDatabase.Query(stmt); if (result) { do { Field* fields = result->Fetch(); uint32 itemGuid = fields[0].GetUInt32(); uint32 guildGuid = fields[1].GetUInt32(); std::string guildName = fields[2].GetString(); char const* itemPos = "[in guild bank]"; handler->PSendSysMessage(LANG_ITEMLIST_GUILD, itemGuid, guildName.c_str(), guildGuid, itemPos); } while (result->NextRow()); uint32 resultCount = uint32(result->GetRowCount()); if (count > resultCount) count -= resultCount; else if (count) count = 0; } if (inventoryCount + mailCount + auctionCount + guildCount == 0) { handler->SendSysMessage(LANG_COMMAND_NOITEMFOUND); handler->SetSentErrorMessage(true); return false; } handler->PSendSysMessage(LANG_COMMAND_LISTITEMMESSAGE, itemId, inventoryCount + mailCount + auctionCount + guildCount, inventoryCount, mailCount, auctionCount, guildCount); return true; }