package mineplex.hub; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import mineplex.core.common.util.NautHashMap; import org.bukkit.Bukkit; import org.bukkit.entity.Player; public class HubRepository { private static Object _connectionLock = new Object(); private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/Mineplex?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; private String _userName = "root"; private String _password = "tAbechAk3wR7tuTh"; private boolean _us = true; private static String CREATE_NEWS_TABLE = "CREATE TABLE IF NOT EXISTS newsList (id INT NOT NULL AUTO_INCREMENT, newsString VARCHAR(256), newsPosition INT, PRIMARY KEY (id));"; private static String RETRIEVE_NEWS_ENTRIES = "SELECT newsString, newsPosition FROM newsList;"; private static String RETRIEVE_MAX_NEWS_POSITION = "SELECT MAX(newsPosition) AS newsPosition FROM newsList;"; private static String ADD_NEWS_ENTRY = "INSERT INTO newsList (newsString, newsPosition) VALUES(?,?);"; //private static String ADD_NEWS_ENTRY = "SET @max = (SELECT MAX(newsPosition) AS newsPosition FROM newsList);INSERT INTO newsList (newsString, newsPosition) VALUES(?,@max + 1);"; private static String SET_NEWS_ENTRY = "UPDATE newsList SET newsString = ? WHERE newsPosition = ?;"; private static String DELETE_NEWS_ENTRY = "DELETE FROM newsList WHERE newsPosition = ?;"; private static String RECALC_NEWS_POSITIONS = "UPDATE newsList SET newsPosition = newsPosition - 1 WHERE newsPosition > ?;"; //private static String DELETE_RECALC_NEWS_ENTRY = "SET @pos = ?;SET @max = (SELECT MAX(newsPosition) AS newsPosition FROM newsList);DELETE FROM newsList WHERE newsPosition = @pos;UPDATE newsList SET newsPosition = IF(@max <> @pos, newsPosition - 1, newsPosition) WHERE newsPosition > @pos;"; private Connection _connection = null; public void initialize(boolean us) { _us = us; PreparedStatement preparedStatement = null; try { Class.forName("com.mysql.jdbc.Driver"); _connection = DriverManager.getConnection(_connectionString, _userName, _password); // Create table preparedStatement = _connection.prepareStatement(CREATE_NEWS_TABLE); preparedStatement.execute(); } catch (Exception exception) { exception.printStackTrace(); } finally { if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } } } public HashMap retrieveNewsEntries() { ResultSet resultSet = null; PreparedStatement preparedStatement = null; HashMap newsEntries = new HashMap(); try { synchronized (_connectionLock) { if (_connection.isClosed()) { _connection = DriverManager.getConnection(_connectionString, _userName, _password); } preparedStatement = _connection.prepareStatement(RETRIEVE_NEWS_ENTRIES); resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { newsEntries.put(resultSet.getString(2), resultSet.getString(1)); } } } catch (Exception exception) { exception.printStackTrace(); } finally { if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } } return newsEntries; } public boolean setNewsEntry(String newsEntry, int newsPosition) { int result = 0; PreparedStatement preparedStatement = null; try { synchronized (_connectionLock) { if (_connection.isClosed()) { _connection = DriverManager.getConnection(_connectionString, _userName, _password); } preparedStatement = _connection.prepareStatement(SET_NEWS_ENTRY); preparedStatement.setString(1, newsEntry); preparedStatement.setInt(2, newsPosition); result = preparedStatement.executeUpdate(); } } catch (Exception exception) { exception.printStackTrace(); } finally { if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } } return result != 0; } public int retrieveMaxNewsPosition() { int result = 0; ResultSet resultSet = null; PreparedStatement preparedStatement = null; try { synchronized (_connectionLock) { if (_connection.isClosed()) { _connection = DriverManager.getConnection(_connectionString, _userName, _password); } preparedStatement = _connection.prepareStatement(RETRIEVE_MAX_NEWS_POSITION); resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { result = Integer.parseInt(resultSet.getString(1)); } } } catch (Exception exception) { exception.printStackTrace(); } finally { if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } } return result; } public boolean addNewsEntry(String newsEntry) { int result = 0; int maxPos = retrieveMaxNewsPosition(); PreparedStatement preparedStatement = null; try { synchronized (_connectionLock) { if (_connection.isClosed()) { _connection = DriverManager.getConnection(_connectionString, _userName, _password); } preparedStatement = _connection.prepareStatement(ADD_NEWS_ENTRY); preparedStatement.setString(1, newsEntry); preparedStatement.setInt(2, maxPos + 1); result = preparedStatement.executeUpdate(); } } catch (Exception exception) { exception.printStackTrace(); } finally { if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } } return result != 0; } public boolean deleteNewsEntry(int newsPosition) { int result = 0; int maxPos = retrieveMaxNewsPosition(); PreparedStatement preparedStatement = null; try { synchronized (_connectionLock) { if (_connection.isClosed()) { _connection = DriverManager.getConnection(_connectionString, _userName, _password); } //preparedStatement = _connection.prepareStatement(DELETE_RECALC_NEWS_ENTRY); preparedStatement = _connection.prepareStatement(DELETE_NEWS_ENTRY); preparedStatement.setInt(1, newsPosition); result = preparedStatement.executeUpdate(); if (result != 0 && maxPos != newsPosition) { preparedStatement.close(); preparedStatement = _connection.prepareStatement(RECALC_NEWS_POSITIONS); preparedStatement.setInt(1, newsPosition); result = preparedStatement.executeUpdate(); } } } catch (Exception exception) { exception.printStackTrace(); } finally { if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } } return result != 0; } }