/* * This file is part of aion-emu <aion-emu.com>. * * aion-emu 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-emu 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-emu. 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.Iterator; import java.util.List; import java.util.Set; 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.ItemStoneListDAO; import com.aionemu.gameserver.model.gameobjects.Item; import com.aionemu.gameserver.model.gameobjects.PersistentState; import com.aionemu.gameserver.model.gameobjects.player.Player; import com.aionemu.gameserver.model.items.GodStone; import com.aionemu.gameserver.model.items.ManaStone; import com.aionemu.gameserver.model.items.ItemStone.ItemStoneType; /** * @author ATracer * */ public class MySQL5ItemStoneListDAO extends ItemStoneListDAO { private static final Logger log = Logger.getLogger(MySQL5ItemStoneListDAO.class); public static final String INSERT_QUERY = "INSERT INTO `item_stones` (`itemUniqueId`, `itemId`, `slot`, `category`) VALUES (?,?,?, ?)"; public static final String DELETE_QUERY = "DELETE FROM `item_stones` WHERE `itemUniqueId`=? AND slot=? AND category=?"; public static final String SELECT_QUERY = "SELECT `itemId`, `slot` FROM `item_stones` WHERE `itemUniqueId`=? AND `category`=?"; @Override public void load(final Item item) { if(item == null) return; DB.select(SELECT_QUERY, new ParamReadStH() { @Override public void setParams(PreparedStatement stmt) throws SQLException { stmt.setInt(1, item.getObjectId()); stmt.setInt(2, ItemStoneType.MANASTONE.ordinal()); } @Override public void handleRead(ResultSet rset) throws SQLException { while(rset.next()) { int itemId = rset.getInt("itemId"); int slot = rset.getInt("slot"); item.getItemStones().add(new ManaStone(item.getObjectId(), itemId, slot, PersistentState.UPDATED)); } } }); } @Override public void save(Player player) { List<Item> allPlayerItems = player.getAllItems(); for(Item item : allPlayerItems) { if(item.hasManaStones()) store(item.getItemStones()); GodStone godStone = item.getGodStone(); store(godStone); } } @Override public void store(final Set<ManaStone> manaStones) { if(manaStones == null) return; Iterator<ManaStone> iterator = manaStones.iterator(); while(iterator.hasNext()) { ManaStone manaStone = iterator.next(); switch(manaStone.getPersistentState()) { case NEW: addItemStone(manaStone.getItemObjId(), manaStone.getItemId(), manaStone.getSlot()); break; case DELETED: deleteItemStone(manaStone.getItemObjId(), manaStone.getSlot()); break; } manaStone.setPersistentState(PersistentState.UPDATED); } } @Override public GodStone loadGodstone(final int itemObjId) { GodStone godStone = null; PreparedStatement stmt = DB.prepareStatement(SELECT_QUERY); try { stmt.setInt(1, itemObjId); stmt.setInt(2, ItemStoneType.GODSTONE.ordinal()); ResultSet rs = stmt.executeQuery(); if(rs.next()) { int itemId = rs.getInt("itemId"); godStone = new GodStone(itemObjId, itemId, PersistentState.UPDATED); } } catch(SQLException e) { log.error("Error while loading godstone" + itemObjId, e); } finally { DB.close(stmt); } return godStone; } /** * * @param godstone */ @Override public void store(GodStone godstone) { if(godstone == null) return; switch(godstone.getPersistentState()) { case NEW: addGodStone(godstone.getItemObjId(), godstone.getItemId(), godstone.getSlot()); break; case DELETED: deleteGodStone(godstone.getItemObjId(), godstone.getSlot()); break; } godstone.setPersistentState(PersistentState.UPDATED); } /** * Adds new item stone to item * * @param itemObjId * @param itemId * @param statEnum * @param statValue * @param slot */ private void addItemStone(final int itemObjId, final int itemId, final int slot) { DB.insertUpdate(INSERT_QUERY, new IUStH() { @Override public void handleInsertUpdate(PreparedStatement stmt) throws SQLException { stmt.setInt(1, itemObjId); stmt.setInt(2, itemId); stmt.setInt(3, slot); stmt.setInt(4, ItemStoneType.MANASTONE.ordinal()); stmt.execute(); } }); } /** * * @param itemObjId * @param itemId * @param slot */ private void addGodStone(final int itemObjId, final int itemId, final int slot) { DB.insertUpdate(INSERT_QUERY, new IUStH() { @Override public void handleInsertUpdate(PreparedStatement stmt) throws SQLException { stmt.setInt(1, itemObjId); stmt.setInt(2, itemId); stmt.setInt(3, slot); stmt.setInt(4, ItemStoneType.GODSTONE.ordinal()); stmt.execute(); } }); } /** * Deleted item stone from selected item * * @param itemObjId * @param slot */ private void deleteItemStone(final int itemObjId, final int slot) { DB.insertUpdate(DELETE_QUERY, new IUStH() { @Override public void handleInsertUpdate(PreparedStatement stmt) throws SQLException { stmt.setInt(1, itemObjId); stmt.setInt(2, slot); stmt.setInt(3, ItemStoneType.MANASTONE.ordinal()); stmt.execute(); } }); } /** * * @param itemObjId * @param slot */ private void deleteGodStone(final int itemObjId, final int slot) { DB.insertUpdate(DELETE_QUERY, new IUStH() { @Override public void handleInsertUpdate(PreparedStatement stmt) throws SQLException { stmt.setInt(1, itemObjId); stmt.setInt(2, slot); stmt.setInt(3, ItemStoneType.GODSTONE.ordinal()); stmt.execute(); } }); } @Override public boolean supports(String s, int i, int i1) { return MySQL5DAOUtils.supports(s, i, i1); } }