bool IOLoginData::saveItems(const Player* player, const ItemBlockList& itemList, DBInsert& query_insert) { std::ostringstream stream; typedef std::pair<Container*, int32_t> containerBlock; std::list<containerBlock> stack; int32_t parentId = 0; int32_t runningId = 100; Database* db = Database::getInstance(); for (ItemBlockList::const_iterator it = itemList.begin(); it != itemList.end(); ++it) { int32_t pid = it->first; Item* item = it->second; ++runningId; uint32_t attributesSize = 0; PropWriteStream propWriteStream; item->serializeAttr(propWriteStream); const char* attributes = propWriteStream.getStream(attributesSize); stream << player->getGUID() << ',' << pid << ',' << runningId << ',' << item->getID() << ',' << (int32_t)item->getSubType() << ',' << db->escapeBlob(attributes, attributesSize); if (!query_insert.addRow(stream)) { return false; } if (Container* container = item->getContainer()) { stack.emplace_back(container, runningId); } } while (!stack.empty()) { const containerBlock& cb = stack.front(); Container* container = cb.first; parentId = cb.second; stack.pop_front(); for (Item* item : container->getItemList()) { ++runningId; Container* subContainer = item->getContainer(); if (subContainer) { stack.emplace_back(subContainer, runningId); } uint32_t attributesSize = 0; PropWriteStream propWriteStream; item->serializeAttr(propWriteStream); const char* attributes = propWriteStream.getStream(attributesSize); stream << player->getGUID() << ',' << parentId << ',' << runningId << ',' << item->getID() << ',' << (int32_t)item->getSubType() << ',' << db->escapeBlob(attributes, attributesSize); if (!query_insert.addRow(stream)) { return false; } } } return query_insert.execute(); }
bool IOPlayer::saveItems(Player* player, const ItemBlockList& itemList, DBInsert& query_insert) { std::list<Container*> listContainer; std::stringstream stream; typedef std::pair<Container*, int32_t> containerBlock; std::list<containerBlock> stack; int32_t parentId = 0; int32_t runningId = 100; Database* db = Database::instance(); Item* item; int32_t pid; for(ItemBlockList::const_iterator it = itemList.begin(); it != itemList.end(); ++it){ pid = it->first; item = it->second; ++runningId; uint32_t attributesSize; PropWriteStream propWriteStream; item->serializeAttr(propWriteStream); const char* attributes = propWriteStream.getStream(attributesSize); stream << player->getGUID() << ", " << pid << ", " << runningId << ", " << item->getID() << ", " << (int32_t)item->getSubType() << ", " << db->escapeBlob(attributes, attributesSize); if(!query_insert.addRow(stream)){ return false; } if(Container* container = item->getContainer()){ stack.push_back(containerBlock(container, runningId)); } } while(stack.size() > 0){ const containerBlock& cb = stack.front(); Container* container = cb.first; parentId = cb.second; stack.pop_front(); for(uint32_t i = 0; i < container->size(); ++i){ ++runningId; item = container->getItem(i); if(Container* sub = item->getContainer()){ stack.push_back(containerBlock(sub, runningId)); } uint32_t attributesSize; PropWriteStream propWriteStream; item->serializeAttr(propWriteStream); const char* attributes = propWriteStream.getStream(attributesSize); stream << player->getGUID() << ", " << parentId << ", " << runningId << ", " << item->getID() << ", " << (int32_t)item->getSubType() << ", " << db->escapeBlob(attributes, attributesSize); if(!query_insert.addRow(stream)) return false; } } return true; }