/* * This file is part of aion-unique <aion-unique.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.concurrent.locks.ReentrantLock; 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.PlayerAppearanceDAO; import com.aionemu.gameserver.model.gameobjects.player.PlayerAppearance; import com.aionemu.gameserver.utils.collections.cachemap.CacheMap; import com.aionemu.gameserver.utils.collections.cachemap.CacheMapFactory; /** * Class that is responsible for loading/storing {@link com.aionemu.gameserver.model.gameobjects.player.PlayerAppearance} in mysql5 * * @author SoulKeeper, AEJTester, srx47 */ public class MySQL5PlayerAppearanceDAO extends PlayerAppearanceDAO { private static final Logger log = Logger.getLogger(PlayerAppearanceDAO.class); private CacheMap<Integer, PlayerAppearance> cache = CacheMapFactory.createCacheMap("Appereance", "appereance"); private ReentrantLock lock = new ReentrantLock(); /** * {@inheritDoc} */ @Override public PlayerAppearance load(final int playerId) { PlayerAppearance app = cache.get(playerId); if(app != null) { log.debug("[DAO: MySQL5PlayerAppearanceDAO] obtained appereance from cache "+playerId); return app; } final PlayerAppearance pa = new PlayerAppearance(); boolean success = DB.select("SELECT * FROM player_appearance WHERE player_id = ?", new ParamReadStH() { @Override public void handleRead(ResultSet resultSet) throws SQLException { log.debug("[DAO: MySQL5PlayerAppearanceDAO] loaded appereance for player: "+playerId); resultSet.next(); pa.setFace(resultSet.getInt("face")); pa.setHair(resultSet.getInt("hair")); pa.setDeco(resultSet.getInt("deco")); pa.setTattoo(resultSet.getInt("tattoo")); pa.setSkinRGB(resultSet.getInt("skin_rgb")); pa.setHairRGB(resultSet.getInt("hair_rgb")); pa.setEyeRGB(resultSet.getInt("eye_rgb")); pa.setLipRGB(resultSet.getInt("lip_rgb")); pa.setFaceShape(resultSet.getInt("face_shape")); pa.setForehead(resultSet.getInt("forehead")); pa.setEyeHeight(resultSet.getInt("eye_height")); pa.setEyeSpace(resultSet.getInt("eye_space")); pa.setEyeWidth(resultSet.getInt("eye_width")); pa.setEyeSize(resultSet.getInt("eye_size")); pa.setEyeShape(resultSet.getInt("eye_shape")); pa.setEyeAngle(resultSet.getInt("eye_angle")); pa.setBrowHeight(resultSet.getInt("brow_height")); pa.setBrowAngle(resultSet.getInt("brow_angle")); pa.setBrowShape(resultSet.getInt("brow_shape")); pa.setNose(resultSet.getInt("nose")); pa.setNoseBridge(resultSet.getInt("nose_bridge")); pa.setNoseWidth(resultSet.getInt("nose_width")); pa.setNoseTip(resultSet.getInt("nose_tip")); pa.setCheek(resultSet.getInt("cheek")); pa.setLipHeight(resultSet.getInt("lip_height")); pa.setMouthSize(resultSet.getInt("mouth_size")); pa.setLipSize(resultSet.getInt("lip_size")); pa.setSmile(resultSet.getInt("smile")); pa.setLipShape(resultSet.getInt("lip_shape")); pa.setJawHeigh(resultSet.getInt("jaw_height")); pa.setChinJut(resultSet.getInt("chin_jut")); pa.setEarShape(resultSet.getInt("ear_shape")); pa.setHeadSize(resultSet.getInt("head_size")); pa.setNeck(resultSet.getInt("neck")); pa.setNeckLength(resultSet.getInt("neck_length")); pa.setShoulders(resultSet.getInt("shoulders")); pa.setShoulderSize(resultSet.getInt("shoulder_size")); pa.setTorso(resultSet.getInt("torso")); pa.setChest(resultSet.getInt("chest")); pa.setWaist(resultSet.getInt("waist")); pa.setHips(resultSet.getInt("hips")); pa.setArmThickness(resultSet.getInt("arm_thickness")); pa.setArmLength(resultSet.getInt("arm_length")); pa.setHandSize(resultSet.getInt("hand_size")); pa.setLegThicnkess(resultSet.getInt("leg_thickness")); pa.setLegLength(resultSet.getInt("leg_length")); pa.setFootSize(resultSet.getInt("foot_size")); pa.setFacialRate(resultSet.getInt("facial_rate")); pa.setVoice(resultSet.getInt("voice")); pa.setHeight(resultSet.getFloat("height")); } @Override public void setParams(PreparedStatement preparedStatement) throws SQLException { preparedStatement.setInt(1, playerId); } }); if(success) { try{ lock.lock(); PlayerAppearance cached = cache.get(playerId); if (cached != null) return cached; cache.put(playerId, pa); return pa; } finally { lock.unlock(); } } else return null; } /** * {@inheritDoc} */ @Override public boolean store(final int id, final PlayerAppearance pa) { cache.put(id, pa); return DB.insertUpdate("REPLACE INTO player_appearance (" + "player_id, face, hair, deco, tattoo, skin_rgb, hair_rgb, lip_rgb, eye_rgb, face_shape," + "forehead, eye_height, eye_space, eye_width, eye_size, eye_shape, eye_angle," + "brow_height, brow_angle, brow_shape, nose, nose_bridge, nose_width, nose_tip, " + "cheek, lip_height, mouth_size, lip_size, smile, lip_shape, jaw_height, chin_jut, ear_shape," + "head_size, neck, neck_length, shoulders, shoulder_size , torso, chest, waist, hips, arm_thickness, arm_length, hand_size," + "leg_thickness, leg_length, foot_size, facial_rate, voice, height)" + " VALUES " + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?," + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?, ?, ?" + ")", new IUStH() { @Override public void handleInsertUpdate(PreparedStatement ps) throws SQLException { log.debug("[DAO: MySQL5PlayerAppearanceDAO] storing appereance "+id); ps.setInt(1, id); ps.setInt(2, pa.getFace()); ps.setInt(3, pa.getHair()); ps.setInt(4, pa.getDeco()); ps.setInt(5, pa.getTattoo()); ps.setInt(6, pa.getSkinRGB()); ps.setInt(7, pa.getHairRGB()); ps.setInt(8, pa.getLipRGB()); ps.setInt(9, pa.getEyeRGB()); ps.setInt(10, pa.getFaceShape()); ps.setInt(11, pa.getForehead()); ps.setInt(12, pa.getEyeHeight()); ps.setInt(13, pa.getEyeSpace()); ps.setInt(14, pa.getEyeWidth()); ps.setInt(15, pa.getEyeSize()); ps.setInt(16, pa.getEyeShape()); ps.setInt(17, pa.getEyeAngle()); ps.setInt(18, pa.getBrowHeight()); ps.setInt(19, pa.getBrowAngle()); ps.setInt(20, pa.getBrowShape()); ps.setInt(21, pa.getNose()); ps.setInt(22, pa.getNoseBridge()); ps.setInt(23, pa.getNoseWidth()); ps.setInt(24, pa.getNoseTip()); ps.setInt(25, pa.getCheek()); ps.setInt(26, pa.getLipHeight()); ps.setInt(27, pa.getMouthSize()); ps.setInt(28, pa.getLipSize()); ps.setInt(29, pa.getSmile()); ps.setInt(30, pa.getLipShape()); ps.setInt(31, pa.getJawHeigh()); ps.setInt(32, pa.getChinJut()); ps.setInt(33, pa.getEarShape()); ps.setInt(34, pa.getHeadSize()); ps.setInt(35, pa.getNeck()); ps.setInt(36, pa.getNeckLength()); ps.setInt(37, pa.getShoulders()); ps.setInt(38, pa.getShoulderSize()); ps.setInt(39, pa.getTorso()); ps.setInt(40, pa.getChest()); ps.setInt(41, pa.getWaist()); ps.setInt(42, pa.getHips()); ps.setInt(43, pa.getArmThickness()); ps.setInt(44, pa.getArmLength()); ps.setInt(45, pa.getHandSize()); ps.setInt(46, pa.getLegThicnkess()); ps.setInt(47, pa.getLegLength()); ps.setInt(48, pa.getFootSize()); ps.setInt(49, pa.getFacialRate()); ps.setInt(50, pa.getVoice()); ps.setFloat(51, pa.getHeight()); ps.execute(); } }); } /** * {@inheritDoc} */ @Override public boolean supports(String s, int i, int i1) { return MySQL5DAOUtils.supports(s, i, i1); } }