/** * BetonQuest - advanced quests for Bukkit * Copyright (C) 2016 Jakub "Co0sh" Sapalski * * This program 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. * * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */ package pl.betoncraft.betonquest.database; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import pl.betoncraft.betonquest.BetonQuest; import pl.betoncraft.betonquest.utils.Debug; /** * Connects to the database and queries it * * @author Jakub Sapalski */ public class Connector { private BetonQuest plugin; private String prefix; private Database db; private Connection connection; /** * Opens a new connection to the database */ public Connector() { plugin = BetonQuest.getInstance(); prefix = plugin.getConfig().getString("mysql.prefix", ""); db = plugin.getDB(); connection = db.getConnection(); refresh(); } /** * This method should be used before any other database operations. */ public void refresh() { try { connection.prepareStatement("SELECT 1").executeQuery(); } catch (SQLException e) { Debug.info("Reconnecting to the database"); db.closeConnection(); connection = db.getConnection(); } } /** * Queries the database with the given type and arguments * * @param type * type of the query * @param args * arguments * @return ResultSet with the requested data */ public ResultSet querySQL(QueryType type, String[] args) { try { PreparedStatement statement; switch (type) { case SELECT_JOURNAL: statement = connection .prepareStatement("SELECT pointer, date FROM " + prefix + "journal WHERE playerID = ?;"); break; case SELECT_POINTS: statement = connection .prepareStatement("SELECT category, count FROM " + prefix + "points WHERE playerID = ?;"); break; case SELECT_OBJECTIVES: statement = connection.prepareStatement( "SELECT objective, instructions FROM " + prefix + "objectives WHERE playerID = ?;"); break; case SELECT_TAGS: statement = connection.prepareStatement("SELECT tag FROM " + prefix + "tags WHERE playerID = ?;"); break; case SELECT_BACKPACK: statement = connection .prepareStatement("SELECT instruction, amount FROM " + prefix + "backpack WHERE playerID = ?;"); break; case SELECT_PLAYER: statement = connection.prepareStatement( "SELECT language, conversation FROM " + prefix + "player WHERE playerID = ?;"); break; case SELECT_PLAYERS_TAGS: statement = connection.prepareStatement("SELECT playerID FROM " + prefix + "tags GROUP BY playerID;"); break; case SELECT_PLAYERS_JOURNAL: statement = connection .prepareStatement("SELECT playerID FROM " + prefix + "journal GROUP BY playerID;"); break; case SELECT_PLAYERS_POINTS: statement = connection.prepareStatement("SELECT playerID FROM " + prefix + "points GROUP BY playerID;"); break; case SELECT_PLAYERS_OBJECTIVES: statement = connection .prepareStatement("SELECT playerID FROM " + prefix + "objectives GROUP BY playerID;"); break; case SELECT_PLAYERS_BACKPACK: statement = connection .prepareStatement("SELECT playerID FROM " + prefix + "backpack GROUP BY playerID;"); break; case LOAD_ALL_JOURNALS: statement = connection.prepareStatement("SELECT * FROM " + prefix + "journal"); break; case LOAD_ALL_OBJECTIVES: statement = connection.prepareStatement("SELECT * FROM " + prefix + "objectives"); break; case LOAD_ALL_POINTS: statement = connection.prepareStatement("SELECT * FROM " + prefix + "points"); break; case LOAD_ALL_TAGS: statement = connection.prepareStatement("SELECT * FROM " + prefix + "tags"); break; case LOAD_ALL_BACKPACK: statement = connection.prepareStatement("SELECT * FROM " + prefix + "backpack"); break; case LOAD_ALL_PLAYER: statement = connection.prepareStatement("SELECT * FROM " + prefix + "player"); break; default: statement = connection.prepareStatement("SELECT 1"); break; } for (int i = 0; i < args.length; i++) { statement.setString(i + 1, args[i]); } return statement.executeQuery(); } catch (SQLException e) { e.printStackTrace(); return null; } } /** * Updates the database with the given type and arguments * * @param type * type of the update * @param args * arguments */ public void updateSQL(UpdateType type, String[] args) { try { PreparedStatement statement; switch (type) { case ADD_OBJECTIVES: statement = connection.prepareStatement( "INSERT INTO " + prefix + "objectives (playerID, objective, instructions) VALUES (?, ?, ?);"); break; case ADD_TAGS: statement = connection .prepareStatement("INSERT INTO " + prefix + "tags (playerID, tag) VALUES (?, ?);"); break; case ADD_POINTS: statement = connection.prepareStatement( "INSERT INTO " + prefix + "points (playerID, category, count) VALUES (?, ?, ?);"); break; case ADD_JOURNAL: statement = connection.prepareStatement( "INSERT INTO " + prefix + "journal (playerID, pointer, date) VALUES (?, ?, ?);"); break; case ADD_BACKPACK: statement = connection.prepareStatement( "INSERT INTO " + prefix + "backpack (playerID, instruction, amount) VALUES (?, ?, ?);"); break; case ADD_PLAYER: statement = connection .prepareStatement("INSERT INTO " + prefix + "player (playerID, language) VALUES (?, ?);"); break; case REMOVE_OBJECTIVES: statement = connection .prepareStatement("DELETE FROM " + prefix + "objectives WHERE playerID = ? AND objective = ?;"); break; case REMOVE_TAGS: statement = connection .prepareStatement("DELETE FROM " + prefix + "tags WHERE playerID = ? AND tag = ?;"); break; case REMOVE_POINTS: statement = connection .prepareStatement("DELETE FROM " + prefix + "points WHERE playerID = ? AND category = ?;"); break; case REMOVE_JOURNAL: statement = connection.prepareStatement( "DELETE FROM " + prefix + "journal WHERE playerID = ? AND pointer = ? AND date = ?;"); break; case DELETE_OBJECTIVES: statement = connection.prepareStatement("DELETE FROM " + prefix + "objectives WHERE playerID = ?;"); break; case DELETE_TAGS: statement = connection.prepareStatement("DELETE FROM " + prefix + "tags WHERE playerID = ?;"); break; case DELETE_POINTS: statement = connection.prepareStatement("DELETE FROM " + prefix + "points WHERE playerID = ?;"); break; case DELETE_JOURNAL: statement = connection.prepareStatement("DELETE FROM " + prefix + "journal WHERE playerID = ?;"); break; case DELETE_BACKPACK: statement = connection.prepareStatement("DELETE FROM " + prefix + "backpack WHERE playerID = ?;"); break; case DELETE_PLAYER: statement = connection.prepareStatement("DELETE FROM " + prefix + "player WHERE playerID = ?;"); break; case UPDATE_PLAYERS_OBJECTIVES: statement = connection .prepareStatement("UPDATE " + prefix + "objectives SET playerID = ? WHERE playerID = ?;"); break; case UPDATE_PLAYERS_TAGS: statement = connection .prepareStatement("UPDATE " + prefix + "tags SET playerID = ? WHERE playerID = ?;"); break; case UPDATE_PLAYERS_POINTS: statement = connection .prepareStatement("UPDATE " + prefix + "points SET playerID = ? WHERE playerID = ?;"); break; case UPDATE_PLAYERS_JOURNAL: statement = connection .prepareStatement("UPDATE " + prefix + "journal SET playerID = ? WHERE playerID = ?;"); break; case UPDATE_PLAYERS_BACKPACK: statement = connection .prepareStatement("UPDATE " + prefix + "backpack SET playerID = ? WHERE playerID = ?;"); break; case DROP_OBJECTIVES: statement = connection.prepareStatement("DROP TABLE " + prefix + "objectives"); break; case DROP_TAGS: statement = connection.prepareStatement("DROP TABLE " + prefix + "tags"); break; case DROP_POINTS: statement = connection.prepareStatement("DROP TABLE " + prefix + "points"); break; case DROP_JOURNALS: statement = connection.prepareStatement("DROP TABLE " + prefix + "journal"); break; case DROP_BACKPACK: statement = connection.prepareStatement("DROP TABLE " + prefix + "backpack"); break; case DROP_PLAYER: statement = connection.prepareStatement("DROP TABLE " + prefix + "player"); break; case INSERT_OBJECTIVE: statement = connection.prepareStatement("INSERT INTO " + prefix + "objectives VALUES (?,?,?,?)"); break; case INSERT_TAG: statement = connection.prepareStatement("INSERT INTO " + prefix + "tags VALUES (?,?,?)"); break; case INSERT_POINT: statement = connection.prepareStatement("INSERT INTO " + prefix + "points VALUES (?,?,?,?)"); break; case INSERT_JOURNAL: statement = connection.prepareStatement("INSERT INTO " + prefix + "journal VALUES (?,?,?,?)"); break; case INSERT_BACKPACK: statement = connection.prepareStatement("INSERT INTO " + prefix + "backpack VALUES (?,?,?,?)"); break; case INSERT_PLAYER: statement = connection.prepareStatement("INSERT INTO " + prefix + "player VALUES (?,?,?,?);"); break; case UPDATE_CONVERSATION: statement = connection .prepareStatement("UPDATE " + prefix + "player SET conversation = ? WHERE playerID = ?"); break; case REMOVE_ALL_TAGS: statement = connection.prepareStatement("DELETE FROM " + prefix + "tags WHERE tag = ?;"); break; case REMOVE_ALL_POINTS: statement = connection.prepareStatement("DELETE FROM " + prefix + "points WHERE category = ?;"); break; case REMOVE_ALL_OBJECTIVES: statement = connection.prepareStatement("DELETE FROM " + prefix + "objectives WHERE objective = ?;"); break; case REMOVE_ALL_ENTRIES: statement = connection.prepareStatement("DELETE FROM " + prefix + "journal WHERE pointer = ?;"); break; case RENAME_ALL_TAGS: statement = connection.prepareStatement("UPDATE " + prefix + "tags SET tag = ? WHERE tag = ?;"); break; case RENAME_ALL_POINTS: statement = connection .prepareStatement("UPDATE " + prefix + "points SET category = ? WHERE category = ?;"); break; case RENAME_ALL_OBJECTIVES: statement = connection .prepareStatement("UPDATE " + prefix + "objectives SET objective = ? WHERE objective = ?;"); break; case RENAME_ALL_ENTRIES: statement = connection .prepareStatement("UPDATE " + prefix + "journal SET pointer = ? WHERE pointer = ?;"); break; default: statement = connection.prepareStatement("SELECT 1"); break; } for (int i = 0; i < args.length; i++) { statement.setString(i + 1, args[i]); } statement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } /** * Type of the query */ public enum QueryType { SELECT_OBJECTIVES, SELECT_TAGS, SELECT_POINTS, SELECT_JOURNAL, SELECT_BACKPACK, SELECT_PLAYER, SELECT_PLAYERS_TAGS, SELECT_PLAYERS_JOURNAL, SELECT_PLAYERS_POINTS, SELECT_PLAYERS_OBJECTIVES, SELECT_PLAYERS_BACKPACK, LOAD_ALL_OBJECTIVES, LOAD_ALL_TAGS, LOAD_ALL_POINTS, LOAD_ALL_JOURNALS, LOAD_ALL_BACKPACK, LOAD_ALL_PLAYER } /** * Type of the update */ public enum UpdateType { /** * Add the single objective to the database. PlayerID, objectiveID, * instruction. */ ADD_OBJECTIVES, /** * Add the single tag to the database. PlayerID, tag. */ ADD_TAGS, /** * Add single point category to the database. PlayerID, category, * amount. */ ADD_POINTS, /** * Add single journal entry to the database. PlayerID, pointer, date. */ ADD_JOURNAL, /** * Add single itemstack to the database. PlayerID, instruction, amount. */ ADD_BACKPACK, /** * Add single player to the database. PlayerID, language. */ ADD_PLAYER, /** * Removes the single objective from the database. PlayerID, * objectiveID. */ REMOVE_OBJECTIVES, /** * Removes the single tag from the database. PlayerID, tag. */ REMOVE_TAGS, /** * Removes single point category from the database. PlayerID, category. */ REMOVE_POINTS, /** * Removes single journal entry from the database. PlayerID, pointer, * date. */ REMOVE_JOURNAL, DELETE_OBJECTIVES, DELETE_TAGS, DELETE_POINTS, DELETE_JOURNAL, DELETE_BACKPACK, DELETE_PLAYER, UPDATE_PLAYERS_OBJECTIVES, UPDATE_PLAYERS_TAGS, UPDATE_PLAYERS_POINTS, UPDATE_PLAYERS_JOURNAL, UPDATE_PLAYERS_BACKPACK, DROP_OBJECTIVES, DROP_TAGS, DROP_POINTS, DROP_JOURNALS, DROP_BACKPACK, DROP_PLAYER, INSERT_OBJECTIVE, INSERT_TAG, INSERT_POINT, INSERT_JOURNAL, INSERT_BACKPACK, INSERT_PLAYER, UPDATE_CONVERSATION, UPDATE_LANGUAGE, REMOVE_ALL_TAGS, REMOVE_ALL_OBJECTIVES, REMOVE_ALL_POINTS, REMOVE_ALL_ENTRIES, RENAME_ALL_TAGS, RENAME_ALL_OBJECTIVES, RENAME_ALL_POINTS, RENAME_ALL_ENTRIES, } }