package com.alta189.sqlLibrary.SQL;
import com.alta189.sqlLibrary.SQL.SQLCore.SQLMode;
import java.io.File;
import java.net.MalformedURLException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DatabaseHandler {
/*
* @author: alta189
*
*/
private SQLCore core;
private Connection connection;
private File SQLFile;
// Method to setup MySQL
public DatabaseHandler(SQLCore core) {
this.core = core;
}
// Method to set up SQLite
public DatabaseHandler(SQLCore core, File SQLFile) {
this.core = core;
this.SQLFile = SQLFile;
}
public boolean openConnection() {
boolean connected = false;
if (core.mode == SQLMode.MySQL) {
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://" + core.dbHost + "/" + core.dbName, core.dbUser, core.dbPass);
connected = true;
} catch (ClassNotFoundException cnfe) {
core.writeError("MySQL class not found " + cnfe, true);
} catch (SQLException se) {
core.writeError("MySQL exception on initilaize " + se, true);
}
} else if (core.mode == SQLMode.SQLite) {
try {
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite:" + SQLFile.getAbsolutePath());
connected = true;
} catch (ClassNotFoundException cnfe) {
core.writeError("You need the SQLite library " + cnfe, true);
} catch (SQLException se) {
core.writeError("SQLite exception on initialize " + se, true);
}
}
return connected;
}
public Boolean checkConnection() {
boolean connected = false;
if (core.mode == SQLMode.MySQL) {
if (connection == null) {
openConnection();
connected = true;
}
} else if (core.mode == SQLMode.SQLite) {
connected = connection != null;
}
return connected;
}
public Connection getConnection() {
return connection;
}
public boolean closeConnection() {
boolean closed = false;
if (this.connection != null) {
try {
this.connection.close();
closed = true;
} catch (Exception ex) {
this.core.writeError("Error on connection close: " + ex, true);
}
}
return closed;
}
public boolean createTable(String query) {
try {
if (query == null) {
core.writeError("SQL Create Table query empty.", true);
return false;
}
Statement statement = connection.createStatement();
statement.execute(query);
return true;
} catch (SQLException ex) {
core.writeError(ex.getMessage(), true);
return false;
}
}
public ResultSet sqlQuery(String query) {
try {
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery(query);
return result;
} catch (SQLException ex) {
if (ex.getMessage().toLowerCase().contains("locking") || ex.getMessage().toLowerCase().contains("locked")) {
return retryResult(query);
} else {
core.writeError("Error at SQL Query: " + ex.getMessage(), false);
}
}
return null;
}
public boolean insertQuery(String query) {
boolean success = false;
try {
Statement statement = connection.createStatement();
statement.executeUpdate(query);
success = true;
} catch (SQLException ex) {
if (ex.getMessage().toLowerCase().contains("locking") || ex.getMessage().toLowerCase().contains("locked")) {
retry(query);
} else {
if (!ex.toString().contains("not return ResultSet")) {
core.writeError("Error at SQL INSERT Query: " + ex, false);
}
}
}
return success;
}
public boolean updateQuery(String query) {
boolean success = false;
try {
Statement statement = connection.createStatement();
statement.executeUpdate(query);
success = true;
} catch (SQLException ex) {
if (ex.getMessage().toLowerCase().contains("locking") || ex.getMessage().toLowerCase().contains("locked")) {
retry(query);
} else {
if (!ex.toString().contains("not return ResultSet")) {
core.writeError("Error at SQL UPDATE Query: " + ex, false);
}
}
}
return success;
}
public boolean deleteQuery(String query) {
boolean success = false;
try {
Statement statement = connection.createStatement();
statement.executeQuery(query);
success = true;
} catch (SQLException ex) {
if (ex.getMessage().toLowerCase().contains("locking") || ex.getMessage().toLowerCase().contains("locked")) {
retry(query);
} else {
if (!ex.toString().contains("not return ResultSet")) {
core.writeError("Error at SQL DELETE Query: " + ex, false);
}
}
}
return success;
}
public boolean wipeTable(String table) {
try {
if (!core.checkTable(table)) {
core.writeError("Error at Wipe Table: table, " + table + ", does not exist", true);
return false;
}
Statement statement = connection.createStatement();
String query = "DELETE FROM '" + table + "'";
statement.executeQuery(query);
return true;
} catch (SQLException ex) {
if (ex.getMessage().toLowerCase().contains("locking") || ex.getMessage().toLowerCase().contains("locked")) {
//retryWipe(query);
} else {
if (!ex.toString().contains("not return ResultSet")) {
core.writeError("Error at SQL WIPE TABLE Query: " + ex, false);
}
}
return false;
}
}
public boolean checkTable(String table) {
DatabaseMetaData dbm;
try {
dbm = connection.getMetaData();
ResultSet tables = dbm.getTables(null, null, table, null);
if (tables.next()) {
return true;
} else {
return false;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
core.writeError("Failed to check if table \"" + table + "\" exists: " + e.getMessage(), true);
return false;
}
}
public boolean checkField(String table, String column) {
DatabaseMetaData dbm;
boolean exists = false;
try {
dbm = connection.getMetaData();
ResultSet columns = dbm.getColumns(null, null, table, column);
while (columns.next()) {
String columnName = columns.getString("COLUMN_NAME");
if (columnName.equals(column)) {
exists = true;
break;
}
}
} catch (SQLException se) {
core.writeError("Failed to check if column \"" + column + "\" exists: " + se.getMessage(), true);
exists = false;
}
return exists;
}
private ResultSet retryResult(String query) {
Boolean passed = false;
while (!passed) {
try {
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery(query);
passed = true;
return result;
} catch (SQLException ex) {
if (ex.getMessage().toLowerCase().contains("locking") || ex.getMessage().toLowerCase().contains("locked")) {
passed = false;
} else {
core.writeError("Error at SQL Query: " + ex.getMessage(), false);
}
}
}
return null;
}
private void retry(String query) {
boolean passed = false;
while (!passed) {
try {
Statement statement = connection.createStatement();
statement.executeQuery(query);
passed = true;
return;
} catch (SQLException ex) {
if (ex.getMessage().toLowerCase().contains("locking") || ex.getMessage().toLowerCase().contains("locked")) {
passed = false;
} else {
core.writeError("Error at SQL Query: " + ex.getMessage(), false);
}
}
}
}
}