DB Schema/Characters: removed columns auctionhouse.item_template, character_inventory.item_template, guild_bank_item.item_entry and mail_items.item_template and created item_instance.itemEntry column instead of them.
As a side effect moved related queries to prepared statements. As one more side effect fixed not shown and lost mail items in returned expired mail (patch by Quriq14). --HG-- branch : trunk
This commit is contained in:
@@ -305,75 +305,62 @@ void Item::SaveToDB(SQLTransaction& trans)
|
||||
switch (uState)
|
||||
{
|
||||
case ITEM_NEW:
|
||||
{
|
||||
std::string text = m_text;
|
||||
CharacterDatabase.escape_string(text);
|
||||
std::ostringstream ss;
|
||||
ss << "REPLACE INTO item_instance (guid,owner_guid,creatorGuid,giftCreatorGuid,count,duration,charges,flags,enchantments,randomPropertyId,durability,playedTime,text) VALUES (";
|
||||
ss << guid << ",";
|
||||
ss << GUID_LOPART(GetOwnerGUID()) << ",";
|
||||
ss << GUID_LOPART(GetUInt64Value(ITEM_FIELD_CREATOR)) << ",";
|
||||
ss << GUID_LOPART(GetUInt64Value(ITEM_FIELD_GIFTCREATOR)) << ",";
|
||||
ss << GetCount() << ",";
|
||||
ss << GetUInt32Value(ITEM_FIELD_DURATION) << ",'";
|
||||
for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
|
||||
ss << GetSpellCharges(i) << " ";
|
||||
|
||||
ss << "'," << GetUInt32Value(ITEM_FIELD_FLAGS) << ",'";
|
||||
for (uint8 i = 0; i < MAX_ENCHANTMENT_SLOT; ++i)
|
||||
{
|
||||
ss << GetEnchantmentId(EnchantmentSlot(i)) << " ";
|
||||
ss << GetEnchantmentDuration(EnchantmentSlot(i)) << " ";
|
||||
ss << GetEnchantmentCharges(EnchantmentSlot(i)) << " ";
|
||||
}
|
||||
|
||||
ss << "'," << GetItemRandomPropertyId() << ",";
|
||||
ss << GetUInt32Value(ITEM_FIELD_DURABILITY) << ",";
|
||||
ss << GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME) << ",'";
|
||||
ss << text << "')";
|
||||
|
||||
trans->Append(ss.str().c_str());
|
||||
}break;
|
||||
case ITEM_CHANGED:
|
||||
{
|
||||
std::string text = m_text;
|
||||
CharacterDatabase.escape_string(text);
|
||||
uint8 index = 0;
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(uState == ITEM_NEW ? CHAR_ADD_ITEM_INSTANCE : CHAR_UPDATE_ITEM_INSTANCE);
|
||||
stmt->setUInt32( index, GetEntry());
|
||||
stmt->setUInt32(++index, GUID_LOPART(GetOwnerGUID()));
|
||||
stmt->setUInt32(++index, GUID_LOPART(GetUInt64Value(ITEM_FIELD_CREATOR)));
|
||||
stmt->setUInt32(++index, GUID_LOPART(GetUInt64Value(ITEM_FIELD_GIFTCREATOR)));
|
||||
stmt->setUInt32(++index, GetCount());
|
||||
stmt->setUInt32(++index, GetUInt32Value(ITEM_FIELD_DURATION));
|
||||
|
||||
std::ostringstream ss;
|
||||
ss << "UPDATE item_instance SET owner_guid = " << GUID_LOPART(GetOwnerGUID());
|
||||
ss << ", creatorGuid = " << GUID_LOPART(GetUInt64Value(ITEM_FIELD_CREATOR));
|
||||
ss << ", giftCreatorGuid = " << GUID_LOPART(GetUInt64Value(ITEM_FIELD_GIFTCREATOR));
|
||||
ss << ", count = " << GetCount();
|
||||
ss << ", duration = " << GetUInt32Value(ITEM_FIELD_DURATION);
|
||||
ss << ", charges = '";
|
||||
for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
|
||||
ss << GetSpellCharges(i) << " ";
|
||||
stmt->setString(++index, ss.str());
|
||||
|
||||
ss << "', flags = " << GetUInt32Value(ITEM_FIELD_FLAGS);
|
||||
ss << ", enchantments = '";
|
||||
stmt->setUInt32(++index, GetUInt32Value(ITEM_FIELD_FLAGS));
|
||||
|
||||
ss.clear();
|
||||
for (uint8 i = 0; i < MAX_ENCHANTMENT_SLOT; ++i)
|
||||
{
|
||||
ss << GetEnchantmentId(EnchantmentSlot(i)) << " ";
|
||||
ss << GetEnchantmentDuration(EnchantmentSlot(i)) << " ";
|
||||
ss << GetEnchantmentCharges(EnchantmentSlot(i)) << " ";
|
||||
}
|
||||
stmt->setString(++index, ss.str());
|
||||
|
||||
ss << "', randomPropertyId = " << GetItemRandomPropertyId();
|
||||
ss << ", durability = " << GetUInt32Value(ITEM_FIELD_DURABILITY);
|
||||
ss << ", playedTime = " << GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME);
|
||||
ss << ", text = '" << text << "' WHERE guid = " << guid;
|
||||
stmt->setInt32 (++index, GetItemRandomPropertyId());
|
||||
stmt->setUInt32(++index, GetUInt32Value(ITEM_FIELD_DURABILITY));
|
||||
stmt->setUInt32(++index, GetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME));
|
||||
stmt->setString(++index, m_text);
|
||||
stmt->setUInt32(++index, guid);
|
||||
|
||||
trans->Append(ss.str().c_str());
|
||||
trans->Append(stmt);
|
||||
|
||||
if (HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_WRAPPED))
|
||||
trans->PAppend("UPDATE character_gifts SET guid = '%u' WHERE item_guid = '%u'", GUID_LOPART(GetOwnerGUID()),GetGUIDLow());
|
||||
}break;
|
||||
if ((uState == ITEM_CHANGED) && HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_WRAPPED))
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPDATE_GIFT_OWNER);
|
||||
stmt->setUInt32(0, GUID_LOPART(GetOwnerGUID()));
|
||||
stmt->setUInt32(1, guid);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ITEM_REMOVED:
|
||||
{
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
|
||||
stmt->setUInt32(0, guid);
|
||||
trans->Append(stmt);
|
||||
|
||||
if (HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_WRAPPED))
|
||||
trans->PAppend("DELETE FROM character_gifts WHERE item_guid = '%u'", GetGUIDLow());
|
||||
{
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GIFT);
|
||||
stmt->setUInt32(0, guid);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
delete this;
|
||||
return;
|
||||
}
|
||||
@@ -453,13 +440,12 @@ bool Item::LoadFromDB(uint32 guid, uint64 owner_guid, Field* fields, uint32 entr
|
||||
|
||||
if (need_save) // normal item changed state set not work at loading
|
||||
{
|
||||
std::ostringstream ss;
|
||||
ss << "UPDATE item_instance SET duration = " << GetUInt32Value(ITEM_FIELD_DURABILITY)
|
||||
<< ", flags = " << GetUInt32Value(ITEM_FIELD_FLAGS)
|
||||
<< ", durability = " << GetUInt32Value(ITEM_FIELD_DURABILITY)
|
||||
<< " WHERE guid = " << guid;
|
||||
|
||||
CharacterDatabase.Execute(ss.str().c_str());
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPDATE_ITEM_INSTANCE_ON_LOAD);
|
||||
stmt->setUInt32(0, GetUInt32Value(ITEM_FIELD_DURABILITY));
|
||||
stmt->setUInt32(1, GetUInt32Value(ITEM_FIELD_FLAGS));
|
||||
stmt->setUInt32(2, GetUInt32Value(ITEM_FIELD_DURABILITY));
|
||||
stmt->setUInt32(3, guid);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user