PageRenderTime 29ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

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

http://aionxemu.googlecode.com/
Java | 561 lines | 390 code | 65 blank | 106 comment | 16 complexity | cca37d5e1e982e4a2e290ed472bbf7cf 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 gameserver.dao.LegionDAO;
  22. import gameserver.model.gameobjects.Item;
  23. import gameserver.model.gameobjects.PersistentState;
  24. import gameserver.model.gameobjects.player.StorageType;
  25. import gameserver.model.legion.*;
  26. import gameserver.services.RentalService;
  27. import org.apache.log4j.Logger;
  28. import java.sql.PreparedStatement;
  29. import java.sql.ResultSet;
  30. import java.sql.SQLException;
  31. import java.sql.Timestamp;
  32. import java.util.Collection;
  33. import java.util.HashMap;
  34. import java.util.TreeMap;
  35. /**
  36. * Class that that is responsible for loading/storing {@link gameserver.model.legion.Legion} object from
  37. * MySQL 5.
  38. *
  39. * @author Simple
  40. */
  41. public class MySQL5LegionDAO extends LegionDAO {
  42. /**
  43. * Logger
  44. */
  45. private static final Logger log = Logger.getLogger(MySQL5LegionDAO.class);
  46. /**
  47. * Legion Queries
  48. */
  49. private static final String INSERT_LEGION_QUERY = "INSERT INTO legions(id, `name`) VALUES (?, ?)";
  50. private static final String SELECT_LEGION_QUERY1 = "SELECT * FROM legions WHERE id=?";
  51. private static final String SELECT_LEGION_QUERY2 = "SELECT * FROM legions WHERE name=?";
  52. private static final String DELETE_LEGION_QUERY = "DELETE FROM legions WHERE id = ?";
  53. private static final String UPDATE_LEGION_QUERY = "UPDATE legions SET name=?, level=?, contribution_points=?, legionar_permission2=?, centurion_permission1=?, centurion_permission2=?, disband_time=? WHERE id=?";
  54. /**
  55. * Legion Ranking Queries *
  56. */
  57. private static final String SELECT_LEGIONRANKING_QUERY = "SELECT id, contribution_points FROM legions ORDER BY contribution_points DESC;";
  58. /**
  59. * Announcement Queries *
  60. */
  61. private static final String INSERT_ANNOUNCEMENT_QUERY = "INSERT INTO legion_announcement_list(`legion_id`, `announcement`, `date`) VALUES (?, ?, ?)";
  62. private static final String SELECT_ANNOUNCEMENTLIST_QUERY = "SELECT * FROM legion_announcement_list WHERE legion_id=? ORDER BY date ASC LIMIT 0,7;";
  63. private static final String DELETE_ANNOUNCEMENT_QUERY = "DELETE FROM legion_announcement_list WHERE legion_id = ? AND date = ?";
  64. /**
  65. * Emblem Queries *
  66. */
  67. private static final String INSERT_EMBLEM_QUERY = "INSERT INTO legion_emblems(legion_id, emblem_ver, color_r, color_g, color_b, custom, emblem_data) VALUES (?, ?, ?, ?, ?, ?, ?)";
  68. private static final String UPDATE_EMBLEM_QUERY = "UPDATE legion_emblems SET emblem_ver=?, color_r=?, color_g=?, color_b=?, custom=?, emblem_data=? WHERE legion_id=?";
  69. private static final String SELECT_EMBLEM_QUERY = "SELECT * FROM legion_emblems WHERE legion_id=?";
  70. /**
  71. * Storage Queries *
  72. */
  73. private static final String SELECT_STORAGE_QUERY = "SELECT `itemUniqueId`, `itemId`, `itemCount`, `itemColor`, `isEquiped`, `slot`, `enchant`, `itemCreator`, `itemSkin`, `fusionedItem`, `optionalSocket`, `optionalFusionSocket`, `expireTime` FROM `inventory` WHERE `itemOwner`=? AND `itemLocation`=? AND `isEquiped`=?";
  74. /**
  75. * History Queries *
  76. */
  77. private static final String INSERT_HISTORY_QUERY = "INSERT INTO legion_history(`legion_id`, `date`, `history_type`, `name`) VALUES (?, ?, ?, ?)";
  78. private static final String SELECT_HISTORY_QUERY = "SELECT * FROM `legion_history` WHERE legion_id=? ORDER BY date ASC;";
  79. /**
  80. * {@inheritDoc}
  81. */
  82. @Override
  83. public boolean isNameUsed(final String name) {
  84. PreparedStatement s = DB.prepareStatement("SELECT count(id) as cnt FROM legions WHERE ? = legions.name");
  85. try {
  86. s.setString(1, name);
  87. ResultSet rs = s.executeQuery();
  88. rs.next();
  89. return rs.getInt("cnt") > 0;
  90. }
  91. catch (SQLException e) {
  92. log.error("Can't check if name " + name + ", is used, returning possitive result", e);
  93. return true;
  94. }
  95. finally {
  96. DB.close(s);
  97. }
  98. }
  99. /**
  100. * {@inheritDoc}
  101. */
  102. @Override
  103. public boolean saveNewLegion(final Legion legion) {
  104. boolean success = DB.insertUpdate(INSERT_LEGION_QUERY, new IUStH() {
  105. @Override
  106. public void handleInsertUpdate(PreparedStatement preparedStatement) throws SQLException {
  107. log.debug("[DAO: MySQL5LegionDAO] saving new legion: " + legion.getLegionId() + " "
  108. + legion.getLegionName());
  109. preparedStatement.setInt(1, legion.getLegionId());
  110. preparedStatement.setString(2, legion.getLegionName());
  111. preparedStatement.execute();
  112. }
  113. });
  114. return success;
  115. }
  116. /**
  117. * {@inheritDoc}
  118. */
  119. @Override
  120. public void storeLegion(final Legion legion) {
  121. DB.insertUpdate(UPDATE_LEGION_QUERY, new IUStH() {
  122. @Override
  123. public void handleInsertUpdate(PreparedStatement stmt) throws SQLException {
  124. log.debug("[DAO: MySQL5LegionDAO] storing player " + legion.getLegionId() + " "
  125. + legion.getLegionName());
  126. stmt.setString(1, legion.getLegionName());
  127. stmt.setInt(2, legion.getLegionLevel());
  128. stmt.setInt(3, legion.getContributionPoints());
  129. stmt.setInt(4, legion.getLegionarPermission2());
  130. stmt.setInt(5, legion.getCenturionPermission1());
  131. stmt.setInt(6, legion.getCenturionPermission2());
  132. stmt.setInt(7, legion.getDisbandTime());
  133. stmt.setInt(8, legion.getLegionId());
  134. stmt.execute();
  135. }
  136. });
  137. }
  138. /**
  139. * {@inheritDoc}
  140. */
  141. @Override
  142. public Legion loadLegion(final String legionName) {
  143. final Legion legion = new Legion();
  144. boolean success = DB.select(SELECT_LEGION_QUERY2, new ParamReadStH() {
  145. @Override
  146. public void setParams(PreparedStatement stmt) throws SQLException {
  147. stmt.setString(1, legionName);
  148. }
  149. @Override
  150. public void handleRead(ResultSet resultSet) throws SQLException {
  151. while (resultSet.next()) {
  152. legion.setLegionName(legionName);
  153. legion.setLegionId(resultSet.getInt("id"));
  154. legion.setLegionLevel(resultSet.getInt("level"));
  155. legion.addContributionPoints(resultSet.getInt("contribution_points"));
  156. legion.setLegionPermissions(resultSet.getInt("legionar_permission2"), resultSet
  157. .getInt("centurion_permission1"), resultSet.getInt("centurion_permission2"));
  158. legion.setDisbandTime(resultSet.getInt("disband_time"));
  159. }
  160. }
  161. });
  162. log.debug("[MySQL5LegionDAO] Loaded " + legion.getLegionId() + " legion.");
  163. return (success && legion.getLegionId() != 0) ? legion : null;
  164. }
  165. /**
  166. * {@inheritDoc}
  167. */
  168. @Override
  169. public Legion loadLegion(final int legionId) {
  170. final Legion legion = new Legion();
  171. boolean success = DB.select(SELECT_LEGION_QUERY1, new ParamReadStH() {
  172. @Override
  173. public void setParams(PreparedStatement stmt) throws SQLException {
  174. stmt.setInt(1, legionId);
  175. }
  176. @Override
  177. public void handleRead(ResultSet resultSet) throws SQLException {
  178. while (resultSet.next()) {
  179. legion.setLegionId(legionId);
  180. legion.setLegionName(resultSet.getString("name"));
  181. legion.setLegionLevel(resultSet.getInt("level"));
  182. legion.addContributionPoints(resultSet.getInt("contribution_points"));
  183. legion.setLegionPermissions(resultSet.getInt("legionar_permission2"), resultSet
  184. .getInt("centurion_permission1"), resultSet.getInt("centurion_permission2"));
  185. legion.setDisbandTime(resultSet.getInt("disband_time"));
  186. }
  187. }
  188. });
  189. log.debug("[MySQL5LegionDAO] Loaded " + legion.getLegionId() + " legion.");
  190. return (success && legion.getLegionName() != "") ? legion : null;
  191. }
  192. /**
  193. * {@inheritDoc}
  194. */
  195. @Override
  196. public void deleteLegion(int legionId) {
  197. PreparedStatement statement = DB.prepareStatement(DELETE_LEGION_QUERY);
  198. try {
  199. statement.setInt(1, legionId);
  200. }
  201. catch (SQLException e) {
  202. log.error("Some crap, can't set int parameter to PreparedStatement", e);
  203. }
  204. DB.executeUpdateAndClose(statement);
  205. }
  206. /**
  207. * {@inheritDoc}
  208. */
  209. @Override
  210. public int[] getUsedIDs() {
  211. PreparedStatement statement = DB.prepareStatement("SELECT id FROM legions", ResultSet.TYPE_SCROLL_INSENSITIVE,
  212. ResultSet.CONCUR_READ_ONLY);
  213. try {
  214. ResultSet rs = statement.executeQuery();
  215. rs.last();
  216. int count = rs.getRow();
  217. rs.beforeFirst();
  218. int[] ids = new int[count];
  219. for (int i = 0; i < count; i++) {
  220. rs.next();
  221. ids[i] = rs.getInt("id");
  222. }
  223. return ids;
  224. }
  225. catch (SQLException e) {
  226. log.error("Can't get list of id's from legions table", e);
  227. }
  228. finally {
  229. DB.close(statement);
  230. }
  231. return new int[0];
  232. }
  233. /**
  234. * {@inheritDoc}
  235. */
  236. @Override
  237. public boolean supports(String s, int i, int i1) {
  238. return MySQL5DAOUtils.supports(s, i, i1);
  239. }
  240. /**
  241. * {@inheritDoc}
  242. */
  243. @Override
  244. public TreeMap<Timestamp, String> loadAnnouncementList(final int legionId) {
  245. final TreeMap<Timestamp, String> announcementList = new TreeMap<Timestamp, String>();
  246. boolean success = DB.select(SELECT_ANNOUNCEMENTLIST_QUERY, new ParamReadStH() {
  247. @Override
  248. public void setParams(PreparedStatement stmt) throws SQLException {
  249. stmt.setInt(1, legionId);
  250. }
  251. @Override
  252. public void handleRead(ResultSet resultSet) throws SQLException {
  253. while (resultSet.next()) {
  254. String message = resultSet.getString("announcement");
  255. Timestamp date = resultSet.getTimestamp("date");
  256. announcementList.put(date, message);
  257. }
  258. }
  259. });
  260. log.debug("[MySQL5LegionDAO] Loaded announcementList " + legionId + " legion.");
  261. return success ? announcementList : null;
  262. }
  263. /**
  264. * {@inheritDoc}
  265. */
  266. @Override
  267. public boolean saveNewAnnouncement(final int legionId, final Timestamp currentTime, final String message) {
  268. if (!isLegionIdUsed(legionId))
  269. return false;
  270. boolean success = DB.insertUpdate(INSERT_ANNOUNCEMENT_QUERY, new IUStH() {
  271. @Override
  272. public void handleInsertUpdate(PreparedStatement preparedStatement) throws SQLException {
  273. log.debug("[DAO: MySQL5LegionDAO] saving new announcement.");
  274. preparedStatement.setInt(1, legionId);
  275. preparedStatement.setString(2, message);
  276. preparedStatement.setTimestamp(3, currentTime);
  277. preparedStatement.execute();
  278. }
  279. });
  280. return success;
  281. }
  282. /**
  283. * {@inheritDoc}
  284. */
  285. @Override
  286. public void removeAnnouncement(int legionId, Timestamp unixTime) {
  287. PreparedStatement statement = DB.prepareStatement(DELETE_ANNOUNCEMENT_QUERY);
  288. try {
  289. statement.setInt(1, legionId);
  290. statement.setTimestamp(2, unixTime);
  291. }
  292. catch (SQLException e) {
  293. log.error("Some crap, can't set int parameter to PreparedStatement", e);
  294. }
  295. DB.executeUpdateAndClose(statement);
  296. }
  297. /**
  298. * {@inheritDoc}
  299. */
  300. @Override
  301. public void storeLegionEmblem(final int legionId, final LegionEmblem legionEmblem) {
  302. switch (legionEmblem.getPersistentState()) {
  303. case UPDATE_REQUIRED:
  304. updateLegionEmblem(legionId, legionEmblem);
  305. break;
  306. case NEW:
  307. createLegionEmblem(legionId, legionEmblem);
  308. break;
  309. }
  310. legionEmblem.setPersistentState(PersistentState.UPDATED);
  311. }
  312. /**
  313. * @param legionId
  314. * @param legionEmblem
  315. * @return
  316. */
  317. private void createLegionEmblem(final int legionId, final LegionEmblem legionEmblem) {
  318. DB.insertUpdate(INSERT_EMBLEM_QUERY, new IUStH() {
  319. @Override
  320. public void handleInsertUpdate(PreparedStatement preparedStatement) throws SQLException {
  321. preparedStatement.setInt(1, legionId);
  322. preparedStatement.setInt(2, legionEmblem.getEmblemVer());
  323. preparedStatement.setInt(3, legionEmblem.getColor_r());
  324. preparedStatement.setInt(4, legionEmblem.getColor_g());
  325. preparedStatement.setInt(5, legionEmblem.getColor_b());
  326. preparedStatement.setBoolean(6, legionEmblem.getIsCustom());
  327. preparedStatement.setBytes(7, legionEmblem.getCustomEmblemData());
  328. preparedStatement.execute();
  329. }
  330. });
  331. }
  332. /**
  333. * @param legionId
  334. * @param legionEmblem
  335. */
  336. private void updateLegionEmblem(final int legionId, final LegionEmblem legionEmblem) {
  337. DB.insertUpdate(UPDATE_EMBLEM_QUERY, new IUStH() {
  338. @Override
  339. public void handleInsertUpdate(PreparedStatement stmt) throws SQLException {
  340. stmt.setInt(1, legionEmblem.getEmblemVer());
  341. stmt.setInt(2, legionEmblem.getColor_r());
  342. stmt.setInt(3, legionEmblem.getColor_g());
  343. stmt.setInt(4, legionEmblem.getColor_b());
  344. stmt.setBoolean(5, legionEmblem.getIsCustom());
  345. stmt.setBytes(6, legionEmblem.getCustomEmblemData());
  346. stmt.setInt(7, legionId);
  347. stmt.execute();
  348. }
  349. });
  350. }
  351. /**
  352. * {@inheritDoc}
  353. */
  354. @Override
  355. public LegionEmblem loadLegionEmblem(final int legionId) {
  356. final LegionEmblem legionEmblem = new LegionEmblem();
  357. DB.select(SELECT_EMBLEM_QUERY, new ParamReadStH() {
  358. @Override
  359. public void setParams(PreparedStatement stmt) throws SQLException {
  360. stmt.setInt(1, legionId);
  361. }
  362. @Override
  363. public void handleRead(ResultSet resultSet) throws SQLException {
  364. while (resultSet.next()) {
  365. legionEmblem.setEmblem(resultSet.getInt("emblem_ver"), resultSet.getInt("color_r"), resultSet
  366. .getInt("color_g"), resultSet.getInt("color_b"), resultSet.getBoolean("custom"), resultSet.getBytes("emblem_data"));
  367. }
  368. }
  369. });
  370. legionEmblem.setPersistentState(PersistentState.UPDATED);
  371. return legionEmblem;
  372. }
  373. /**
  374. * {@inheritDoc}
  375. */
  376. @Override
  377. public LegionWarehouse loadLegionStorage(Legion legion) {
  378. final LegionWarehouse inventory = new LegionWarehouse(legion);
  379. final int legionId = legion.getLegionId();
  380. final int storage = StorageType.LEGION_WAREHOUSE.getId();
  381. final int equipped = 0;
  382. DB.select(SELECT_STORAGE_QUERY, new ParamReadStH() {
  383. @Override
  384. public void setParams(PreparedStatement stmt) throws SQLException {
  385. stmt.setInt(1, legionId);
  386. stmt.setInt(2, storage);
  387. stmt.setInt(3, equipped);
  388. }
  389. @Override
  390. public void handleRead(ResultSet rset) throws SQLException {
  391. while (rset.next()) {
  392. int itemUniqueId = rset.getInt("itemUniqueId");
  393. int itemId = rset.getInt("itemId");
  394. int itemCount = rset.getInt("itemCount");
  395. int itemColor = rset.getInt("itemColor");
  396. int isEquiped = rset.getInt("isEquiped");
  397. int slot = rset.getInt("slot");
  398. int enchant = rset.getInt("enchant");
  399. int itemSkin = rset.getInt("itemSkin");
  400. int fusionedItem = rset.getInt("fusionedItem");
  401. int optionalSocket = rset.getInt("optionalSocket");
  402. int optionalFusionSocket = rset.getInt("optionalFusionSocket");
  403. Timestamp expireTime = rset.getTimestamp("expireTime");
  404. String itemCreator = rset.getString("itemCreator");
  405. Item item = new Item(itemUniqueId, itemId, itemCount,
  406. itemColor, itemCreator, (isEquiped == 1), false, slot,
  407. storage, enchant, itemSkin, fusionedItem,
  408. optionalSocket, optionalFusionSocket, expireTime);
  409. item.setPersistentState(PersistentState.UPDATED);
  410. inventory.onLoadHandler(item);
  411. }
  412. }
  413. });
  414. return inventory;
  415. }
  416. /**
  417. * {@inheritDoc}
  418. */
  419. @Override
  420. public HashMap<Integer, Integer> loadLegionRanking() {
  421. final HashMap<Integer, Integer> legionRanking = new HashMap<Integer, Integer>();
  422. DB.select(SELECT_LEGIONRANKING_QUERY, new ParamReadStH() {
  423. @Override
  424. public void setParams(PreparedStatement stmt) throws SQLException {
  425. }
  426. @Override
  427. public void handleRead(ResultSet resultSet) throws SQLException {
  428. int i = 1;
  429. while (resultSet.next()) {
  430. if (resultSet.getInt("contribution_points") > 0) {
  431. legionRanking.put(resultSet.getInt("id"), i);
  432. i++;
  433. } else
  434. legionRanking.put(resultSet.getInt("id"), 0);
  435. }
  436. }
  437. });
  438. return legionRanking;
  439. }
  440. /**
  441. * {@inheritDoc}
  442. */
  443. @Override
  444. public void loadLegionHistory(final Legion legion) {
  445. final Collection<LegionHistory> history = legion.getLegionHistory();
  446. DB.select(SELECT_HISTORY_QUERY, new ParamReadStH() {
  447. @Override
  448. public void setParams(PreparedStatement stmt) throws SQLException {
  449. stmt.setInt(1, legion.getLegionId());
  450. }
  451. @Override
  452. public void handleRead(ResultSet resultSet) throws SQLException {
  453. while (resultSet.next()) {
  454. history.add(new LegionHistory(LegionHistoryType.valueOf(resultSet.getString("history_type")),
  455. resultSet.getString("name"), resultSet.getTimestamp("date")));
  456. }
  457. }
  458. });
  459. }
  460. /**
  461. * {@inheritDoc}
  462. */
  463. @Override
  464. public boolean saveNewLegionHistory(final int legionId, final LegionHistory legionHistory) {
  465. boolean success = DB.insertUpdate(INSERT_HISTORY_QUERY, new IUStH() {
  466. @Override
  467. public void handleInsertUpdate(PreparedStatement preparedStatement) throws SQLException {
  468. preparedStatement.setInt(1, legionId);
  469. preparedStatement.setTimestamp(2, legionHistory.getTime());
  470. preparedStatement.setString(3, legionHistory.getLegionHistoryType().toString());
  471. preparedStatement.setString(4, legionHistory.getName());
  472. preparedStatement.execute();
  473. }
  474. });
  475. return success;
  476. }
  477. /**
  478. * {@inheritDoc}
  479. */
  480. private boolean isLegionIdUsed(final int legionId) {
  481. PreparedStatement s = DB.prepareStatement("SELECT id FROM legions WHERE id=?");
  482. try {
  483. s.setInt(1, legionId);
  484. ResultSet rs = s.executeQuery();
  485. rs.next();
  486. return rs.getInt("id") > 0;
  487. }
  488. catch (SQLException e) {
  489. log.error("Can't check if id " + legionId + ", is used. ", e);
  490. return false;
  491. }
  492. finally {
  493. DB.close(s);
  494. }
  495. }
  496. }