/*
* This file is part of aion-unique <aionu-unique.com>.
*
* aion-unique is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* aion-unique is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with aion-unique. If not, see <http://www.gnu.org/licenses/>.
*/
package mysql5;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import com.aionemu.commons.database.DB;
import com.aionemu.commons.database.IUStH;
import com.aionemu.commons.database.ParamReadStH;
import com.aionemu.gameserver.dao.InventoryDAO;
import com.aionemu.gameserver.model.gameobjects.Item;
import com.aionemu.gameserver.model.gameobjects.PersistentState;
import com.aionemu.gameserver.model.gameobjects.player.Equipment;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.gameobjects.player.Storage;
import com.aionemu.gameserver.model.gameobjects.player.StorageType;
/**
* @author ATracer
*
*/
public class MySQL5InventoryDAO extends InventoryDAO
{
private static final Logger log = Logger.getLogger(MySQL5InventoryDAO.class);
public static final String SELECT_QUERY = "SELECT `itemUniqueId`, `itemId`, `itemCount`, `itemColor`, `isEquiped`, `slot`, `enchant` FROM `inventory` WHERE `itemOwner`=? AND `itemLocation`=? AND `isEquiped`=?";
public static final String INSERT_QUERY = "INSERT INTO `inventory` (`itemUniqueId`, `itemId`, `itemCount`, `itemColor`, `itemOwner`, `isEquiped`, `slot`, `itemLocation`, `enchant`) VALUES(?,?,?,?,?,?,?,?,?)";
public static final String UPDATE_QUERY = "UPDATE inventory SET itemCount=?, itemColor=?, itemOwner=?, isEquiped=?, slot=?, itemLocation=?, enchant=? WHERE itemUniqueId=?";
public static final String DELETE_QUERY = "DELETE FROM inventory WHERE itemUniqueId=?";
public static final String DELETE_CLEAN_QUERY = "DELETE FROM inventory WHERE itemOwner=? AND (itemLocation=0 OR itemLocation=1)";
public static final String SELECT_ACCOUNT_QUERY = "SELECT `account_id` FROM `players` WHERE `id`=?";
@Override
public Storage loadStorage(Player player, StorageType storageType)
{
final Storage inventory = new Storage(player, storageType);
int playerId = player.getObjectId();
final int storage = storageType.getId();
final int equipped = 0;
if(storageType == StorageType.ACCOUNT_WAREHOUSE)
{
playerId = getPlayerAccountId(playerId);
}
final int owner = playerId;
DB.select(SELECT_QUERY, new ParamReadStH()
{
@Override
public void setParams(PreparedStatement stmt) throws SQLException
{
stmt.setInt(1, owner);
stmt.setInt(2, storage);
stmt.setInt(3, equipped);
}
@Override
public void handleRead(ResultSet rset) throws SQLException
{
while(rset.next())
{
int itemUniqueId = rset.getInt("itemUniqueId");
int itemId = rset.getInt("itemId");
int itemCount = rset.getInt("itemCount");
int itemColor = rset.getInt("itemColor");
int isEquiped = rset.getInt("isEquiped");
int slot = rset.getInt("slot");
int enchant = rset.getInt("enchant");
Item item = new Item(itemUniqueId, itemId, itemCount, itemColor, isEquiped == 1, slot, storage, enchant);
item.setPersistentState(PersistentState.UPDATED);
inventory.onLoadHandler(item);
}
}
});
return inventory;
}
@Override
public Equipment loadEquipment(Player player)
{
final Equipment equipment = new Equipment(player);
int playerId = player.getObjectId();
final int storage = 0;
final int equipped = 1;
final int owner = playerId;
DB.select(SELECT_QUERY, new ParamReadStH()
{
@Override
public void setParams(PreparedStatement stmt) throws SQLException
{
stmt.setInt(1, owner);
stmt.setInt(2, storage);
stmt.setInt(3, equipped);
}
@Override
public void handleRead(ResultSet rset) throws SQLException
{
while(rset.next())
{
int itemUniqueId = rset.getInt("itemUniqueId");
int itemId = rset.getInt("itemId");
int itemCount = rset.getInt("itemCount");
int itemColor = rset.getInt("itemColor");
int slot = rset.getInt("slot");
int enchant = rset.getInt("enchant");
Item item = new Item(itemUniqueId, itemId, itemCount, itemColor, true, slot, storage, enchant);
item.setPersistentState(PersistentState.UPDATED);
equipment.onLoadHandler(item);
}
}
});
return equipment;
}
public int getPlayerAccountId(final int playerId)
{
final List<Integer> owner = new ArrayList<Integer>();
DB.select(SELECT_ACCOUNT_QUERY, new ParamReadStH()
{
@Override
public void setParams(PreparedStatement stmt) throws SQLException
{
stmt.setInt(1, playerId);
}
@Override
public void handleRead(ResultSet rset) throws SQLException
{
while(rset.next())
{
owner.add(rset.getInt("account_id"));
}
}
});
return owner.get(0);
}
@Override
public boolean store(Player player)
{
int playerId = player.getObjectId();
List<Item> allPlayerItems = player.getDirtyItemsToUpdate();
boolean resultSuccess = true;
for(Item item : allPlayerItems)
{
if(item != null)
resultSuccess = store(item, playerId);
}
return resultSuccess;
}
/**
* @param item The item that needs to be stored
* @param ownerId The playerObjectId of the owner of the item
* @return true if storing succeeded
*/
@Override
public boolean store(final Item item, int ownerId)
{
boolean result = false;
if(item.getItemLocation() == StorageType.ACCOUNT_WAREHOUSE.getId())
{
ownerId = getPlayerAccountId(ownerId);
}
switch(item.getPersistentState())
{
case NEW:
result = insertItem(item, ownerId);
break;
case UPDATE_REQUIRED:
result = updateItem(item, ownerId);
break;
case DELETED:
result = deleteItem(item);
break;
}
item.setPersistentState(PersistentState.UPDATED);
return result;
}
/**
* @param item
* @param playerId
* @return
*/
private boolean insertItem(final Item item, final int ownerId)
{
return DB.insertUpdate(INSERT_QUERY, new IUStH() {
@Override
public void handleInsertUpdate(PreparedStatement stmt) throws SQLException
{
stmt.setInt(1, item.getObjectId());
stmt.setInt(2, item.getItemTemplate().getTemplateId());
stmt.setInt(3, item.getItemCount());
stmt.setInt(4, item.getItemColor());
stmt.setInt(5, ownerId);
stmt.setBoolean(6, item.isEquipped());
stmt.setInt(7, item.getEquipmentSlot());
stmt.setInt(8, item.getItemLocation());
stmt.setInt(9, item.getEchantLevel());
stmt.execute();
}
});
}
/**
* @param item
* @return
*/
private boolean updateItem(final Item item, final int ownerId)
{
return DB.insertUpdate(UPDATE_QUERY, new IUStH() {
@Override
public void handleInsertUpdate(PreparedStatement stmt) throws SQLException
{
stmt.setInt(1, item.getItemCount());
stmt.setInt(2, item.getItemColor());
stmt.setInt(3, ownerId);
stmt.setBoolean(4, item.isEquipped());
stmt.setInt(5, item.getEquipmentSlot());
stmt.setInt(6, item.getItemLocation());
stmt.setInt(7, item.getEchantLevel());
stmt.setInt(8, item.getObjectId());
stmt.execute();
}
});
}
/**
*
* @param item
*/
private boolean deleteItem(final Item item)
{
return DB.insertUpdate(DELETE_QUERY, new IUStH() {
@Override
public void handleInsertUpdate(PreparedStatement stmt) throws SQLException
{
stmt.setInt(1, item.getObjectId());
stmt.execute();
}
});
}
/**
* Since inventory is not using FK - need to clean items
*/
@Override
public boolean deletePlayerItems(final int playerId)
{
return DB.insertUpdate(DELETE_CLEAN_QUERY, new IUStH() {
@Override
public void handleInsertUpdate(PreparedStatement stmt) throws SQLException
{
stmt.setInt(1, playerId);
stmt.execute();
}
});
}
@Override
public int[] getUsedIDs()
{
PreparedStatement statement = DB.prepareStatement("SELECT itemUniqueId FROM inventory", ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
try
{
ResultSet rs = statement.executeQuery();
rs.last();
int count = rs.getRow();
rs.beforeFirst();
int[] ids = new int[count];
for(int i = 0; i < count; i++)
{
rs.next();
ids[i] = rs.getInt("itemUniqueId");
}
return ids;
}
catch(SQLException e)
{
log.error("Can't get list of id's from inventory table", e);
}
finally
{
DB.close(statement);
}
return new int[0];
}
/**
* {@inheritDoc}
*/
@Override
public boolean supports(String s, int i, int i1)
{
return MySQL5DAOUtils.supports(s, i, i1);
}
}