PageRenderTime 38ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

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

http://aionxemu.googlecode.com/
Java | 271 lines | 217 code | 32 blank | 22 comment | 23 complexity | 5e41b3bcf5f0c4070a009d9867085e9d 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.IUStH;
  20. import com.aionemu.commons.database.ParamReadStH;
  21. import com.aionemu.commons.database.dao.DAOManager;
  22. import gameserver.dao.ItemStoneListDAO;
  23. import gameserver.dao.MailDAO;
  24. import gameserver.model.gameobjects.Item;
  25. import gameserver.model.gameobjects.Letter;
  26. import gameserver.model.gameobjects.PersistentState;
  27. import gameserver.model.gameobjects.player.Mailbox;
  28. import gameserver.model.gameobjects.player.Player;
  29. import gameserver.model.gameobjects.player.PlayerCommonData;
  30. import gameserver.model.gameobjects.player.StorageType;
  31. import gameserver.services.RentalService;
  32. import org.apache.log4j.Logger;
  33. import java.sql.PreparedStatement;
  34. import java.sql.ResultSet;
  35. import java.sql.SQLException;
  36. import java.sql.Timestamp;
  37. import java.util.ArrayList;
  38. import java.util.Collection;
  39. import java.util.Collections;
  40. import java.util.List;
  41. /**
  42. * @author kosyachok
  43. */
  44. public class MySQL5MailDAO extends MailDAO {
  45. private static final Logger log = Logger.getLogger(MySQL5MailDAO.class);
  46. @Override
  47. public Mailbox loadPlayerMailbox(Player player) {
  48. final Mailbox mailbox = new Mailbox();
  49. final int playerId = player.getObjectId();
  50. DB.select("SELECT * FROM mail WHERE mailRecipientId = ?", new ParamReadStH() {
  51. @Override
  52. public void setParams(PreparedStatement stmt) throws SQLException {
  53. stmt.setInt(1, playerId);
  54. }
  55. @Override
  56. public void handleRead(ResultSet rset) throws SQLException {
  57. List<Item> mailboxItems = loadMailboxItems(playerId);
  58. while (rset.next()) {
  59. int mailUniqueId = rset.getInt("mailUniqueId");
  60. int recipientId = rset.getInt("mailRecipientId");
  61. String senderName = rset.getString("senderName");
  62. String mailTitle = rset.getString("mailTitle");
  63. String mailMessage = rset.getString("mailMessage");
  64. int unread = rset.getInt("unread");
  65. int attachedItemId = rset.getInt("attachedItemId");
  66. long attachedKinahCount = rset.getLong("attachedKinahCount");
  67. int express = rset.getInt("express");
  68. Timestamp recievedTime = rset.getTimestamp("recievedTime");
  69. Item attachedItem = null;
  70. if (attachedItemId != 0)
  71. for (Item item : mailboxItems)
  72. if (item.getObjectId() == attachedItemId) {
  73. if (item.getItemTemplate().isArmor() || item.getItemTemplate().isWeapon())
  74. DAOManager.getDAO(ItemStoneListDAO.class).load(Collections.singletonList(item));
  75. attachedItem = item;
  76. }
  77. Letter letter = new Letter(mailUniqueId, recipientId, attachedItem, attachedKinahCount, mailTitle,
  78. mailMessage, senderName, recievedTime, unread == 1, express == 1);
  79. letter.setPersistState(PersistentState.UPDATED);
  80. mailbox.putLetterToMailbox(letter);
  81. }
  82. }
  83. });
  84. return mailbox;
  85. }
  86. private List<Item> loadMailboxItems(final int playerId) {
  87. final List<Item> mailboxItems = new ArrayList<Item>();
  88. DB.select("SELECT * FROM inventory WHERE `itemOwner` = ? AND `itemLocation` = 127", new ParamReadStH() {
  89. @Override
  90. public void setParams(PreparedStatement stmt) throws SQLException {
  91. stmt.setInt(1, playerId);
  92. }
  93. @Override
  94. public void handleRead(ResultSet rset) throws SQLException {
  95. while (rset.next()) {
  96. int itemUniqueId = rset.getInt("itemUniqueId");
  97. int itemId = rset.getInt("itemId");
  98. long itemCount = rset.getLong("itemCount");
  99. int itemColor = rset.getInt("itemColor");
  100. int isEquiped = rset.getInt("isEquiped");
  101. int isSoulBound = rset.getInt("isSoulBound");
  102. int slot = rset.getInt("slot");
  103. int enchant = rset.getInt("enchant");
  104. String itemCreator = rset.getString("itemCreator");
  105. int itemSkin = rset.getInt("itemSkin");
  106. int fusionedItem = rset.getInt("fusionedItem");
  107. int optionalSocket = rset.getInt("optionalSocket");
  108. int optionalFusionSocket = rset.getInt("optionalFusionSocket");
  109. Timestamp expireTime = rset.getTimestamp("expireTime");
  110. Item item = new Item(itemUniqueId, itemId, itemCount,
  111. itemColor, itemCreator, (isEquiped == 1),
  112. (isSoulBound == 1), slot, StorageType.MAILBOX.getId(),
  113. enchant, itemSkin, fusionedItem, optionalSocket,
  114. optionalFusionSocket, expireTime);
  115. item.setPersistentState(PersistentState.UPDATED);
  116. mailboxItems.add(item);
  117. if (RentalService.getInstance().isRentalItem(item))
  118. RentalService.getInstance().addRentalItem(playerId, item);
  119. }
  120. }
  121. });
  122. return mailboxItems;
  123. }
  124. @Override
  125. public void storeMailbox(Player player) {
  126. Mailbox mailbox = player.getMailbox();
  127. if (mailbox == null)
  128. return;
  129. Collection<Letter> letters = mailbox.getLetters();
  130. for (Letter letter : letters) {
  131. storeLetter(letter.getTimeStamp(), letter);
  132. }
  133. }
  134. @Override
  135. public boolean storeLetter(Timestamp time, Letter letter) {
  136. boolean result = false;
  137. switch (letter.getLetterPersistentState()) {
  138. case NEW:
  139. result = saveLetter(time, letter);
  140. break;
  141. case UPDATE_REQUIRED:
  142. result = updateLetter(time, letter);
  143. break;
  144. /*
  145. case DELETED:
  146. return deleteLetter(letter);*/
  147. }
  148. letter.setPersistState(PersistentState.UPDATED);
  149. return result;
  150. }
  151. private boolean saveLetter(final Timestamp time, final Letter letter) {
  152. int attachedItemId = 0;
  153. if (letter.getAttachedItem() != null)
  154. attachedItemId = letter.getAttachedItem().getObjectId();
  155. final int fAttachedItemId = attachedItemId;
  156. return DB.insertUpdate("INSERT INTO `mail` (`mailUniqueId`, `mailRecipientId`, `senderName`, `mailTitle`, `mailMessage`, `unread`, `attachedItemId`, `attachedKinahCount`, `express`, `recievedTime`) VALUES(?,?,?,?,?,?,?,?,?,?)", new IUStH() {
  157. @Override
  158. public void handleInsertUpdate(PreparedStatement stmt) throws SQLException {
  159. stmt.setInt(1, letter.getObjectId());
  160. stmt.setInt(2, letter.getRecipientId());
  161. stmt.setString(3, letter.getSenderName());
  162. stmt.setString(4, letter.getTitle());
  163. stmt.setString(5, letter.getMessage());
  164. stmt.setBoolean(6, letter.isUnread());
  165. stmt.setInt(7, fAttachedItemId);
  166. stmt.setLong(8, letter.getAttachedKinah());
  167. stmt.setBoolean(9, letter.isExpress());
  168. stmt.setTimestamp(10, time);
  169. stmt.execute();
  170. }
  171. });
  172. }
  173. private boolean updateLetter(final Timestamp time, final Letter letter) {
  174. int attachedItemId = 0;
  175. if (letter.getAttachedItem() != null)
  176. attachedItemId = letter.getAttachedItem().getObjectId();
  177. final int fAttachedItemId = attachedItemId;
  178. return DB.insertUpdate("UPDATE mail SET unread=?, attachedItemId=?, attachedKinahCount=?, recievedTime=? WHERE mailUniqueId=?", new IUStH() {
  179. @Override
  180. public void handleInsertUpdate(PreparedStatement stmt) throws SQLException {
  181. stmt.setBoolean(1, letter.isUnread());
  182. stmt.setInt(2, fAttachedItemId);
  183. stmt.setLong(3, letter.getAttachedKinah());
  184. stmt.setTimestamp(4, time);
  185. stmt.setInt(5, letter.getObjectId());
  186. stmt.execute();
  187. }
  188. });
  189. }
  190. @Override
  191. public boolean deleteLetter(final int letterId) {
  192. return DB.insertUpdate("DELETE FROM mail WHERE mailUniqueId=?", new IUStH() {
  193. @Override
  194. public void handleInsertUpdate(PreparedStatement stmt) throws SQLException {
  195. stmt.setInt(1, letterId);
  196. stmt.execute();
  197. }
  198. });
  199. }
  200. @Override
  201. public void updateOfflineMailCounter(final PlayerCommonData recipientCommonData) {
  202. DB.insertUpdate("UPDATE players SET mailboxLetters=? WHERE name=?", new IUStH() {
  203. @Override
  204. public void handleInsertUpdate(PreparedStatement stmt) throws SQLException {
  205. stmt.setInt(1, recipientCommonData.getMailboxLetters());
  206. stmt.setString(2, recipientCommonData.getName());
  207. stmt.execute();
  208. }
  209. });
  210. }
  211. @Override
  212. public int[] getUsedIDs() {
  213. PreparedStatement statement = DB.prepareStatement("SELECT mailUniqueId FROM mail", ResultSet.TYPE_SCROLL_INSENSITIVE,
  214. ResultSet.CONCUR_READ_ONLY);
  215. try {
  216. ResultSet rs = statement.executeQuery();
  217. rs.last();
  218. int count = rs.getRow();
  219. rs.beforeFirst();
  220. int[] ids = new int[count];
  221. for (int i = 0; i < count; i++) {
  222. rs.next();
  223. ids[i] = rs.getInt("mailUniqueId");
  224. }
  225. return ids;
  226. }
  227. catch (SQLException e) {
  228. log.error("Can't get list of id's from mail table", e);
  229. }
  230. finally {
  231. DB.close(statement);
  232. }
  233. return new int[0];
  234. }
  235. @Override
  236. public boolean supports(String s, int i, int i1) {
  237. return MySQL5DAOUtils.supports(s, i, i1);
  238. }
  239. }