package tntrun;
import org.bukkit.Bukkit;
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.Logger;
public class MySQL {
private static final Logger logger = Bukkit.getLogger();
protected boolean connected = false;
public Connection c = null;
private String driver;
private String connectionString;
private TNTRun pl;
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;
}
public MySQL(TNTRun plugin) {
this.pl = plugin;
}
public MySQL(String hostname, int port, String database, String username, String password,
TNTRun plugin) {
driver = "com.mysql.jdbc.Driver";
connectionString = "jdbc:mysql://" + hostname + ":" + port + "/" + database + "?user=" + username
+ "&password=" + password;
this.pl = 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) {
pl.getLogger().info(ex.getMessage());
}
c = null;
}
public boolean isConnected() {
try {
return (((c == null) || c.isClosed())
? false
: true);
} catch (SQLException e) {
return false;
}
}
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...");
pl.getServer().getScheduler().scheduleSyncDelayedTask(pl, new Runnable() {
@Override
public void run() {
query(query, false);
}
}, 20);
}
}
if (statement != null) {
statement.close();
}
} catch (SQLException ex) {
pl.getLogger().info(ex.getMessage());
}
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;
}
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) {}
}
}
}