/*******************************************************************************
* Copyright 2014 stuntguy3000 (Luke Anderson) and coasterman10.
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
******************************************************************************/
package org.eodsteven.CrafterNexus.manager;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.eodsteven.CrafterNexus.CrafterNexus;
public class DatabaseManager {
private static final Logger logger = Bukkit.getLogger();
protected boolean connected = false;
private String driver;
private String connectionString;
private CrafterNexus plugin;
public Connection c = null;
public DatabaseManager(String hostname, int port, String database, String username, String password, CrafterNexus plugin) {
driver="com.mysql.jdbc.Driver";
connectionString="jdbc:mysql://" + hostname + ":" + port + "/" + database+ "?user=" + username + "&password=" + password;
this.plugin = plugin;
}
public DatabaseManager(CrafterNexus plugin) {
this.plugin = plugin;
}
public Connection open() {
try {
Class.forName(driver);
this.c = DriverManager.getConnection(connectionString);
return c;
} catch (SQLException e) {
System.out.println("Could not connect to Database! because: " + e.getMessage());
} catch (ClassNotFoundException e) {
System.out.println(driver+" not found!");
} catch (Exception e) {
System.out.println(e.getMessage());
}
return this.c;
}
public Connection getConn() {
return this.c;
}
public void close() {
try {
if(c!=null) c.close();
} catch (SQLException ex) {
plugin.log(ex.getMessage(), Level.SEVERE);
}
c = null;
}
public boolean isConnected() {
try {
return((c==null || c.isClosed()) ? false:true);
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
public class Result {
private ResultSet resultSet;
private Statement statement;
public Result(Statement statement, ResultSet resultSet) {
this.statement = statement;
this.resultSet = resultSet;
}
public ResultSet getResultSet() {
return this.resultSet;
}
public void close() {
try {
this.statement.close();
this.resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public Result query(final String query) {
if (!isConnected()) open();
return query(query,true);
}
public Result query(final String query, boolean retry) {
if (!isConnected()) open();
try {
PreparedStatement statement=null;
try {
if (!isConnected()) open();
statement = c.prepareStatement(query);
if (statement.execute())
return new Result(statement, statement.getResultSet());
} catch (final SQLException e) {
final String msg = e.getMessage();
logger.severe("Database query error: " + msg);
if (retry && msg.contains("_BUSY")) {
logger.severe("Retrying query...");
plugin.getServer().getScheduler()
.scheduleSyncDelayedTask(plugin, new Runnable() {
public void run() {
query(query,false);
}
}, 20);
}
}
if (statement != null) statement.close();
} catch (SQLException ex) {
plugin.log(ex.getMessage(), Level.SEVERE);
}
return null;
}
protected Statements getStatement(String query) {
String trimmedQuery = query.trim();
if (trimmedQuery.substring(0, 6).equalsIgnoreCase("SELECT"))
return Statements.SELECT;
if (trimmedQuery.substring(0, 6).equalsIgnoreCase("INSERT"))
return Statements.INSERT;
if (trimmedQuery.substring(0, 6).equalsIgnoreCase("UPDATE"))
return Statements.UPDATE;
if (trimmedQuery.substring(0, 6).equalsIgnoreCase("DELETE"))
return Statements.DELETE;
if (trimmedQuery.substring(0, 6).equalsIgnoreCase("CREATE"))
return Statements.CREATE;
if (trimmedQuery.substring(0, 5).equalsIgnoreCase("ALTER"))
return Statements.ALTER;
if (trimmedQuery.substring(0, 4).equalsIgnoreCase("DROP"))
return Statements.DROP;
if (trimmedQuery.substring(0, 8).equalsIgnoreCase("TRUNCATE"))
return Statements.TRUNCATE;
if (trimmedQuery.substring(0, 6).equalsIgnoreCase("RENAME"))
return Statements.RENAME;
if (trimmedQuery.substring(0, 2).equalsIgnoreCase("DO"))
return Statements.DO;
if (trimmedQuery.substring(0, 7).equalsIgnoreCase("REPLACE"))
return Statements.REPLACE;
if (trimmedQuery.substring(0, 4).equalsIgnoreCase("LOAD"))
return Statements.LOAD;
if (trimmedQuery.substring(0, 7).equalsIgnoreCase("HANDLER"))
return Statements.HANDLER;
if (trimmedQuery.substring(0, 4).equalsIgnoreCase("CALL")) {
return Statements.CALL;
}
return Statements.SELECT;
}
protected static enum Statements
{
SELECT, INSERT, UPDATE, DELETE, DO, REPLACE, LOAD, HANDLER, CALL,
CREATE, ALTER, DROP, TRUNCATE, RENAME, START, COMMIT, ROLLBACK,
SAVEPOINT, LOCK, UNLOCK, PREPARE, EXECUTE, DEALLOCATE, SET, SHOW,
DESCRIBE, EXPLAIN, HELP, USE, ANALYZE, ATTACH, BEGIN, DETACH,
END, INDEXED, ON, PRAGMA, REINDEX, RELEASE, VACUUM;
}
}