PageRenderTime 52ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/GameServer/data/scripts/system/database/mysql5/MySQL5InventoryDAO.java

http://aionxemu.googlecode.com/
Java | 489 lines | 412 code | 35 blank | 42 comment | 28 complexity | 7202213a1f61bd8c3358baf3abddfc69 MD5 | raw file
Possible License(s): GPL-2.0, Apache-2.0, BSD-2-Clause
  1. /**
  2. * This file is part of Aion X Emu <aionxemu.com>
  3. *
  4. * This is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU Lesser Public License as published by
  6. * the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This software is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU Lesser Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser Public License
  15. * along with this software. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. package mysql5;
  18. import com.aionemu.commons.database.DB;
  19. import com.aionemu.commons.database.DatabaseFactory;
  20. import gameserver.dao.InventoryDAO;
  21. import gameserver.model.gameobjects.Item;
  22. import gameserver.model.gameobjects.PersistentState;
  23. import gameserver.model.gameobjects.player.Equipment;
  24. import gameserver.model.gameobjects.player.Player;
  25. import gameserver.model.gameobjects.player.Storage;
  26. import gameserver.model.gameobjects.player.StorageType;
  27. import gameserver.services.ItemService;
  28. import gameserver.services.RentalService;
  29. import org.apache.log4j.Logger;
  30. import java.sql.Connection;
  31. import java.sql.PreparedStatement;
  32. import java.sql.ResultSet;
  33. import java.sql.SQLException;
  34. import java.sql.Timestamp;
  35. import java.sql.Types;
  36. import java.util.ArrayList;
  37. import java.util.List;
  38. /**
  39. * @author ATracer
  40. */
  41. public class MySQL5InventoryDAO extends InventoryDAO {
  42. private static final Logger log = Logger.getLogger(MySQL5InventoryDAO.class);
  43. public static final String SELECT_QUERY = "SELECT `itemUniqueId`, `itemId`, `itemCount`, `itemColor`, `isEquiped`, `isSoulBound`, `slot`, `enchant`, `itemCreator`, `itemSkin`, `fusionedItem`, `optionalSocket`, `optionalFusionSocket`, `expireTime` FROM `inventory` WHERE `itemOwner`=? AND `itemLocation`=? AND `isEquiped`=?";
  44. public static final String INSERT_QUERY = "INSERT INTO `inventory` (`itemUniqueId`, `itemId`, `itemCount`, `itemColor`, `itemOwner`, `isEquiped`, isSoulBound, `slot`, `itemLocation`, `enchant`, `itemCreator`, `itemSkin`, `fusionedItem`, `optionalSocket`, `optionalFusionSocket`, `expireTime`) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
  45. public static final String UPDATE_QUERY = "UPDATE `inventory` SET `itemCount`=?, `itemColor`=?, `itemOwner`=?, `isEquiped`=?, `isSoulBound`=?, `slot`=?, `itemLocation`=?, `enchant`=?, `itemCreator`=?, `itemSkin`=?, `fusionedItem`=?, `optionalSocket`=?, `optionalFusionSocket`=?, `expireTime`=? WHERE `itemUniqueId`=?";
  46. public static final String DELETE_QUERY = "DELETE FROM `inventory` WHERE `itemUniqueId`=?";
  47. public static final String DELETE_CLEAN_QUERY = "DELETE FROM `inventory` WHERE `itemOwner`=? AND (`itemLocation`=0 OR `itemLocation`=1)";
  48. public static final String SELECT_ACCOUNT_QUERY = "SELECT `account_id` FROM `players` WHERE `id`=?";
  49. public static final String SELECT_LEGION_QUERY = "SELECT `legion_id` FROM `legion_members` WHERE `player_id`=?";
  50. @Override
  51. public Storage loadStorage(Player player, StorageType storageType) {
  52. final Storage inventory = new Storage(player, storageType);
  53. int playerId = player.getObjectId();
  54. final int storage = storageType.getId();
  55. final int equipped = 0;
  56. if (storageType == StorageType.ACCOUNT_WAREHOUSE) {
  57. playerId = getPlayerAccountId(playerId);
  58. }
  59. final int owner = playerId;
  60. Connection con = null;
  61. try {
  62. con = DatabaseFactory.getConnection();
  63. PreparedStatement stmt = con.prepareStatement(SELECT_QUERY);
  64. stmt.setInt(1, owner);
  65. stmt.setInt(2, storage);
  66. stmt.setInt(3, equipped);
  67. ResultSet rset = stmt.executeQuery();
  68. while (rset.next()) {
  69. int itemUniqueId = rset.getInt("itemUniqueId");
  70. int itemId = rset.getInt("itemId");
  71. long itemCount = rset.getLong("itemCount");
  72. int itemColor = rset.getInt("itemColor");
  73. int isEquiped = rset.getInt("isEquiped");
  74. int isSoulBound = rset.getInt("isSoulBound");
  75. int slot = rset.getInt("slot");
  76. int enchant = rset.getInt("enchant");
  77. int itemSkin = rset.getInt("itemSkin");
  78. int fusionedItem = rset.getInt("fusionedItem");
  79. int optionalSocket = rset.getInt("optionalSocket");
  80. int optionalFusionSocket = rset.getInt("optionalFusionSocket");
  81. Timestamp expireTime;
  82. try {
  83. expireTime = rset.getTimestamp("expireTime");
  84. }
  85. catch (SQLException e) {
  86. expireTime = null;
  87. }
  88. String itemCreator = rset.getString("itemCreator");
  89. Item item = new Item(itemUniqueId, itemId, itemCount, itemColor,
  90. itemCreator, (isEquiped == 1), (isSoulBound == 1), slot,
  91. storage, enchant, itemSkin, fusionedItem, optionalSocket,
  92. optionalFusionSocket, expireTime);
  93. item.setPersistentState(PersistentState.UPDATED);
  94. inventory.onLoadHandler(item);
  95. if (RentalService.getInstance().isRentalItem(item))
  96. RentalService.getInstance().addRentalItem(owner, item);
  97. }
  98. rset.close();
  99. stmt.close();
  100. }
  101. catch (Exception e) {
  102. log.fatal("Could not restore storage data for player: " + playerId + " from DB: " + e.getMessage(), e);
  103. }
  104. finally {
  105. DatabaseFactory.close(con);
  106. }
  107. return inventory;
  108. }
  109. @Override
  110. public Equipment loadEquipment(Player player) {
  111. final Equipment equipment = new Equipment(player);
  112. int playerId = player.getObjectId();
  113. final int storage = 0;
  114. final int equipped = 1;
  115. final int owner = playerId;
  116. Connection con = null;
  117. try {
  118. con = DatabaseFactory.getConnection();
  119. PreparedStatement stmt = con.prepareStatement(SELECT_QUERY);
  120. stmt.setInt(1, owner);
  121. stmt.setInt(2, storage);
  122. stmt.setInt(3, equipped);
  123. ResultSet rset = stmt.executeQuery();
  124. while (rset.next()) {
  125. int itemUniqueId = rset.getInt("itemUniqueId");
  126. int itemId = rset.getInt("itemId");
  127. long itemCount = rset.getLong("itemCount");
  128. int itemColor = rset.getInt("itemColor");
  129. int isSoulBound = rset.getInt("isSoulBound");
  130. int slot = rset.getInt("slot");
  131. int enchant = rset.getInt("enchant");
  132. int itemSkin = rset.getInt("itemSkin");
  133. int fusionedItem = rset.getInt("fusionedItem");
  134. int optionalSocket = rset.getInt("optionalSocket");
  135. int optionalFusionSocket = rset.getInt("optionalFusionSocket");
  136. Timestamp expireTime;
  137. try {
  138. expireTime = rset.getTimestamp("expireTime");
  139. }
  140. catch (SQLException e) {
  141. expireTime = null;
  142. }
  143. String itemCreator = rset.getString("itemCreator");
  144. Item item = new Item(itemUniqueId, itemId, itemCount, itemColor,
  145. itemCreator, true, (isSoulBound == 1), slot, storage, enchant,
  146. itemSkin, fusionedItem, optionalSocket, optionalFusionSocket, expireTime);
  147. item.setPersistentState(PersistentState.UPDATED);
  148. equipment.onLoadHandler(item);
  149. if (RentalService.getInstance().isRentalItem(item))
  150. RentalService.getInstance().addRentalItem(owner, item);
  151. }
  152. rset.close();
  153. stmt.close();
  154. }
  155. catch (Exception e) {
  156. log.fatal("Could not restore Equipment data for player: " + playerId + " from DB: " + e.getMessage(), e);
  157. }
  158. finally {
  159. DatabaseFactory.close(con);
  160. }
  161. return equipment;
  162. }
  163. @Override
  164. public List<Item> loadEquipment(int playerId) {
  165. final List<Item> items = new ArrayList<Item>();
  166. final int storage = 0;
  167. final int equipped = 1;
  168. final int owner = playerId;
  169. Connection con = null;
  170. try {
  171. con = DatabaseFactory.getConnection();
  172. PreparedStatement stmt = con.prepareStatement(SELECT_QUERY);
  173. stmt.setInt(1, owner);
  174. stmt.setInt(2, storage);
  175. stmt.setInt(3, equipped);
  176. ResultSet rset = stmt.executeQuery();
  177. while (rset.next()) {
  178. int itemUniqueId = rset.getInt("itemUniqueId");
  179. int itemId = rset.getInt("itemId");
  180. long itemCount = rset.getLong("itemCount");
  181. int itemColor = rset.getInt("itemColor");
  182. int isSoulBound = rset.getInt("isSoulBound");
  183. int slot = rset.getInt("slot");
  184. int enchant = rset.getInt("enchant");
  185. int itemSkin = rset.getInt("itemSkin");
  186. int fusionedItem = rset.getInt("fusionedItem");
  187. int optionalSocket = rset.getInt("optionalSocket");
  188. int optionalFusionSocket = rset.getInt("optionalFusionSocket");
  189. Timestamp expireTime;
  190. try {
  191. expireTime = rset.getTimestamp("expireTime");
  192. }
  193. catch (SQLException e) {
  194. expireTime = null;
  195. }
  196. String itemCreator = rset.getString("itemCreator");
  197. Item item = new Item(itemUniqueId, itemId, itemCount, itemColor,
  198. itemCreator, true, (isSoulBound == 1), slot, storage, enchant,
  199. itemSkin, fusionedItem, optionalSocket, optionalFusionSocket, expireTime);
  200. items.add(item);
  201. if (RentalService.getInstance().isRentalItem(item))
  202. RentalService.getInstance().addRentalItem(owner, item);
  203. }
  204. rset.close();
  205. stmt.close();
  206. }
  207. catch (Exception e) {
  208. log.fatal("Could not restore Equipment data for player: " + playerId + " from DB: " + e.getMessage(), e);
  209. }
  210. finally {
  211. DatabaseFactory.close(con);
  212. }
  213. return items;
  214. }
  215. public int getPlayerAccountId(final int playerId) {
  216. Connection con = null;
  217. int accountId = 0;
  218. try {
  219. con = DatabaseFactory.getConnection();
  220. PreparedStatement stmt = con.prepareStatement(SELECT_ACCOUNT_QUERY);
  221. stmt.setInt(1, playerId);
  222. ResultSet rset = stmt.executeQuery();
  223. if (rset.next()) {
  224. accountId = rset.getInt("account_id");
  225. }
  226. rset.close();
  227. stmt.close();
  228. }
  229. catch (Exception e) {
  230. log.fatal("Could not restore accountId data for player: " + playerId + " from DB: " + e.getMessage(), e);
  231. }
  232. finally {
  233. DatabaseFactory.close(con);
  234. }
  235. return accountId;
  236. }
  237. public int getLegionId(final int playerId) {
  238. Connection con = null;
  239. int legionId = 0;
  240. try {
  241. con = DatabaseFactory.getConnection();
  242. PreparedStatement stmt = con.prepareStatement(SELECT_LEGION_QUERY);
  243. stmt.setInt(1, playerId);
  244. ResultSet rset = stmt.executeQuery();
  245. if (rset.next()) {
  246. legionId = rset.getInt("legion_id");
  247. }
  248. rset.close();
  249. stmt.close();
  250. }
  251. catch (Exception e) {
  252. log.fatal("Could not restore legionId data for player: " + playerId + " from DB: " + e.getMessage(), e);
  253. }
  254. finally {
  255. DatabaseFactory.close(con);
  256. }
  257. return legionId;
  258. }
  259. @Override
  260. public boolean store(Player player) {
  261. int playerId = player.getObjectId();
  262. List<Item> allPlayerItems = player.getDirtyItemsToUpdate();
  263. boolean resultSuccess = true;
  264. for (Item item : allPlayerItems) {
  265. if (item != null)
  266. resultSuccess = store(item, playerId);
  267. }
  268. return resultSuccess;
  269. }
  270. /**
  271. * @param item The item that needs to be stored
  272. * @param ownerId The playerObjectId of the owner of the item
  273. * @return true if storing succeeded
  274. */
  275. @Override
  276. public boolean store(final Item item, int ownerId) {
  277. boolean result = false;
  278. if (item.getItemLocation() == StorageType.ACCOUNT_WAREHOUSE.getId()) {
  279. ownerId = getPlayerAccountId(ownerId);
  280. }
  281. if (item.getItemLocation() == StorageType.LEGION_WAREHOUSE.getId()) {
  282. if(getLegionId(ownerId) > 0)
  283. ownerId = getLegionId(ownerId);
  284. }
  285. switch (item.getPersistentState()) {
  286. case NEW:
  287. result = insertItem(item, ownerId);
  288. break;
  289. case UPDATE_REQUIRED:
  290. result = updateItem(item, ownerId);
  291. break;
  292. case DELETED:
  293. result = deleteItem(item);
  294. break;
  295. }
  296. item.setPersistentState(PersistentState.UPDATED);
  297. return result;
  298. }
  299. /**
  300. * @param item
  301. * @param playerId
  302. * @return
  303. */
  304. private boolean insertItem(final Item item, final int ownerId) {
  305. Connection con = null;
  306. try {
  307. con = DatabaseFactory.getConnection();
  308. PreparedStatement stmt = con.prepareStatement(INSERT_QUERY);
  309. stmt.setInt(1, item.getObjectId());
  310. stmt.setInt(2, item.getItemTemplate().getTemplateId());
  311. stmt.setLong(3, item.getItemCount());
  312. stmt.setInt(4, item.getItemColor());
  313. stmt.setInt(5, ownerId);
  314. stmt.setBoolean(6, item.isEquipped());
  315. stmt.setInt(7, item.isSoulBound() ? 1 : 0);
  316. stmt.setInt(8, item.getEquipmentSlot());
  317. stmt.setInt(9, item.getItemLocation());
  318. stmt.setInt(10, item.getEnchantLevel());
  319. stmt.setString(11, item.getItemCreator());
  320. stmt.setInt(12, item.getItemSkinTemplate().getTemplateId());
  321. stmt.setInt(13, item.getFusionedItem());
  322. stmt.setInt(14, item.getOptionalSocket());
  323. stmt.setInt(15, item.getOptionalFusionSocket());
  324. if (item.getExpireTime() == null)
  325. stmt.setNull(16, Types.TIMESTAMP);
  326. else
  327. stmt.setTimestamp(16, item.getExpireTime());
  328. stmt.execute();
  329. stmt.close();
  330. }
  331. catch (Exception e) {
  332. log.error("Error insert item ItemObjId: " + item.getObjectId(), e);
  333. return false;
  334. }
  335. finally {
  336. DatabaseFactory.close(con);
  337. }
  338. return true;
  339. }
  340. /**
  341. * @param item
  342. * @return
  343. */
  344. private boolean updateItem(final Item item, final int ownerId) {
  345. Connection con = null;
  346. try {
  347. con = DatabaseFactory.getConnection();
  348. PreparedStatement stmt = con.prepareStatement(UPDATE_QUERY);
  349. stmt.setLong(1, item.getItemCount());
  350. stmt.setInt(2, item.getItemColor());
  351. stmt.setInt(3, ownerId);
  352. stmt.setBoolean(4, item.isEquipped());
  353. stmt.setInt(5, item.isSoulBound() ? 1 : 0);
  354. stmt.setInt(6, item.getEquipmentSlot());
  355. stmt.setInt(7, item.getItemLocation());
  356. stmt.setInt(8, item.getEnchantLevel());
  357. stmt.setString(9, item.getItemCreator());
  358. stmt.setInt(10, item.getItemSkinTemplate().getTemplateId());
  359. stmt.setInt(11, item.getFusionedItem());
  360. stmt.setInt(12, item.getOptionalSocket());
  361. stmt.setInt(13, item.getOptionalFusionSocket());
  362. if (item.getExpireTime() == null)
  363. stmt.setNull(14, Types.TIMESTAMP);
  364. else
  365. stmt.setTimestamp(14, item.getExpireTime());
  366. stmt.setInt(15, item.getObjectId());
  367. stmt.execute();
  368. stmt.close();
  369. }
  370. catch (Exception e) {
  371. log.error("Error update item ItemObjId: " + item.getObjectId(), e);
  372. return false;
  373. }
  374. finally {
  375. DatabaseFactory.close(con);
  376. }
  377. return true;
  378. }
  379. /**
  380. * @param item
  381. */
  382. private boolean deleteItem(final Item item) {
  383. Connection con = null;
  384. try {
  385. con = DatabaseFactory.getConnection();
  386. PreparedStatement stmt = con.prepareStatement(DELETE_QUERY);
  387. stmt.setInt(1, item.getObjectId());
  388. stmt.execute();
  389. stmt.close();
  390. ItemService.releaseItemId(item);
  391. }
  392. catch (Exception e) {
  393. log.error("Error delete item. ItemObjId: " + item.getObjectId(), e);
  394. return false;
  395. }
  396. finally {
  397. DatabaseFactory.close(con);
  398. }
  399. return true;
  400. }
  401. /**
  402. * Since inventory is not using FK - need to clean items
  403. */
  404. @Override
  405. public boolean deletePlayerItems(final int playerId) {
  406. Connection con = null;
  407. try {
  408. con = DatabaseFactory.getConnection();
  409. PreparedStatement stmt = con.prepareStatement(DELETE_CLEAN_QUERY);
  410. stmt.setInt(1, playerId);
  411. stmt.execute();
  412. stmt.close();
  413. }
  414. catch (Exception e) {
  415. log.error("Error Player all items. PlayerObjId: " + playerId, e);
  416. return false;
  417. }
  418. finally {
  419. DatabaseFactory.close(con);
  420. }
  421. return true;
  422. }
  423. @Override
  424. public int[] getUsedIDs() {
  425. PreparedStatement statement = DB.prepareStatement("SELECT itemUniqueId FROM inventory", ResultSet.TYPE_SCROLL_INSENSITIVE,
  426. ResultSet.CONCUR_READ_ONLY);
  427. try {
  428. ResultSet rs = statement.executeQuery();
  429. rs.last();
  430. int count = rs.getRow();
  431. rs.beforeFirst();
  432. int[] ids = new int[count];
  433. for (int i = 0; i < count; i++) {
  434. rs.next();
  435. ids[i] = rs.getInt("itemUniqueId");
  436. }
  437. return ids;
  438. }
  439. catch (SQLException e) {
  440. log.error("Can't get list of id's from inventory table", e);
  441. }
  442. finally {
  443. DB.close(statement);
  444. }
  445. return new int[0];
  446. }
  447. /**
  448. * {@inheritDoc}
  449. */
  450. @Override
  451. public boolean supports(String s, int i, int i1) {
  452. return MySQL5DAOUtils.supports(s, i, i1);
  453. }
  454. }