package IO; import org.joda.time.Period; import org.json.simple.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.sql.*; import java.util.Timer; import java.util.TimerTask; public class MySQL { private final Logger logger = LoggerFactory.getLogger(MySQL.class); //////////////////////Variablen////////////////////////// private Connection conn; private Statement stmt; private ResultSet something; private String driverName = "com.mysql.cj.jdbc.Driver"; private JSONObject config; /** * Creates connection to Database * * Inspired by https://www.vogella.com/tutorials/MySQLJava/article.html * * @param config Bot config for data */ public MySQL(JSONObject config) { this.config = config; try { //load driver / config driver logger.debug("Lade DB Treiber"); Class driver_class = Class.forName(driverName); Driver dbdriver = (Driver) driver_class.newInstance(); DriverManager.registerDriver(dbdriver); try { logger.debug("Create connection to Database"); //Create connection conn = DriverManager.getConnection("jdbc:" + config.get("SQLServerUrl") + config.get("SQLDBNname") + config.get("SQLDBparameter"), (String) config.get("SQLDBUser"), (String) config.get("SQLDBPassword")); } catch (SQLException e) { logger.error(e.getMessage()); } } catch (Exception e){ logger.error(e.getMessage()); } // GetS selfchek going Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { try { stmt = conn.createStatement(); //SQL Command something = stmt.executeQuery("SELECT 1 FROM Guild;"); } catch (Exception e){ logger.error("Database is down! Reconnect!"); reload(); } } }, 1000L, 1000*60*15L); } /** * prepare, execute a SQL query and returns result * * @param pInput SQL Query as String * @return ResultSet Result of query as ResultSet */ public ResultSet mySQLDataQuery(String pInput){ logger.debug("execute SQLQuerry: " + pInput); try { //Create statement stmt = conn.createStatement(); //SQL Command something = stmt.executeQuery(pInput); } catch (SQLNonTransientConnectionException ex) { logger.error(ex.getMessage()); //Something happend reload connection reload(); //redo querry //return mySQLDataQuery(pInput); } catch (SQLException e){ logger.error(e.getMessage()); } return something; } /** * prepare, execute a SQLUpdate query and returns result * checks for simple SQL injection * * @param pInput SQL Query Blueprint as String * @param pParameter Data for Blueprint * @return key ID of created data INDEX */ public int mySQLDataUpdate(String pInput, String[] pParameter){ logger.debug("execute SQLUpdate:" + pInput); int key = -1; PreparedStatement stmt = null; try { conn.setAutoCommit(false); //set Blueprint stmt = conn.prepareStatement(pInput); // Replace Wildcards with Data for(int i = 0; i < pParameter.length; i++){ stmt.setString(i+1, pParameter[i]); } //logger.debug("Execute update"); stmt.executeUpdate(); conn.commit(); //get generated INDEX IDs conn.setAutoCommit(false); Statement stmt2 = null; stmt2 = conn.createStatement(); ResultSet tmp = stmt2.executeQuery("SELECT LAST_INSERT_ID();"); if(tmp.next()){ key = Integer.parseInt(tmp.getString(1)); } } catch (SQLNonTransientConnectionException ex) { logger.error(ex.getMessage()); //Something happend reload connection reload(); //redo querry //return mySQLDataUpdate(pInput, pParameter); } catch (SQLException e ) { logger.error(e.getMessage()); } return key; } /** * closes current connection and reload it */ private void reload(){ cleanUp(); try { //load driver / config driver logger.debug("Lade DB Treiber"); Class driver_class = Class.forName(driverName); Driver dbdriver = (Driver) driver_class.newInstance(); DriverManager.registerDriver(dbdriver); try { logger.debug("Create connection to Database"); //Create connection conn = DriverManager.getConnection("jdbc:" + config.get("SQLServerUrl") + config.get("SQLDBNname") + config.get("SQLDBparameter"), (String) config.get("SQLDBUser"), (String) config.get("SQLDBPassword")); } catch (SQLException e) { logger.error(e.getMessage()); } } catch (Exception e){ logger.error(e.getMessage()); } } /** * Inspired by https://www.vogella.com/tutorials/MySQLJava/article.html * * CleanUp of SQL connection */ public void cleanUp(){ logger.debug("Close database connection"); try { if (something != null) something.close(); if (stmt != null) stmt.close(); conn.setAutoCommit(true); if (conn != null) conn.close(); something = null; stmt = null; conn = null; } catch(SQLException e){ e.printStackTrace(); } } }