From da1adb632ecfb4e891dd11f8a969ba338fd37cfd Mon Sep 17 00:00:00 2001 From: Xephi Date: Tue, 29 Dec 2015 17:07:33 +0100 Subject: [PATCH] Start a rework of some SQL Queries, add a Query builder --- .../authme/datasource/CacheDataSource.java | 7 + .../xephi/authme/datasource/DataSource.java | 4 + .../fr/xephi/authme/datasource/FlatFile.java | 7 + .../fr/xephi/authme/datasource/MySQL.java | 228 +++++--- .../fr/xephi/authme/datasource/SQLite.java | 493 +++++++++++------- .../authme/datasource/queries/Query.java | 215 ++++++++ 6 files changed, 694 insertions(+), 260 deletions(-) create mode 100644 src/main/java/fr/xephi/authme/datasource/queries/Query.java diff --git a/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java b/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java index 8b26b08c..85c0c50a 100644 --- a/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java +++ b/src/main/java/fr/xephi/authme/datasource/CacheDataSource.java @@ -10,6 +10,8 @@ import com.google.common.cache.RemovalNotification; import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerCache; +import java.sql.Connection; +import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; @@ -478,4 +480,9 @@ public class CacheDataSource implements DataSource { public List getLoggedPlayers() { return new ArrayList<>(PlayerCache.getInstance().getCache().values()); } + + @Override + public Connection getConnection() throws SQLException { + return source.getConnection(); + } } diff --git a/src/main/java/fr/xephi/authme/datasource/DataSource.java b/src/main/java/fr/xephi/authme/datasource/DataSource.java index e43dffa8..1917c91f 100644 --- a/src/main/java/fr/xephi/authme/datasource/DataSource.java +++ b/src/main/java/fr/xephi/authme/datasource/DataSource.java @@ -2,6 +2,8 @@ package fr.xephi.authme.datasource; import fr.xephi.authme.cache.auth.PlayerAuth; +import java.sql.Connection; +import java.sql.SQLException; import java.util.List; /** @@ -215,6 +217,8 @@ public interface DataSource { */ List getLoggedPlayers(); + Connection getConnection() throws SQLException; + enum DataSourceType { MYSQL, FILE, diff --git a/src/main/java/fr/xephi/authme/datasource/FlatFile.java b/src/main/java/fr/xephi/authme/datasource/FlatFile.java index b7fb5517..e97d8f39 100644 --- a/src/main/java/fr/xephi/authme/datasource/FlatFile.java +++ b/src/main/java/fr/xephi/authme/datasource/FlatFile.java @@ -7,6 +7,8 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.sql.Connection; +import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @@ -929,4 +931,9 @@ public class FlatFile implements DataSource { public List getLoggedPlayers() { return new ArrayList<>(); } + + @Override + public Connection getConnection() throws SQLException { + return null; + } } diff --git a/src/main/java/fr/xephi/authme/datasource/MySQL.java b/src/main/java/fr/xephi/authme/datasource/MySQL.java index e779afff..713901bf 100644 --- a/src/main/java/fr/xephi/authme/datasource/MySQL.java +++ b/src/main/java/fr/xephi/authme/datasource/MySQL.java @@ -5,6 +5,7 @@ import com.zaxxer.hikari.pool.HikariPool.PoolInitializationException; import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.cache.auth.PlayerAuth; +import fr.xephi.authme.datasource.queries.Query; import fr.xephi.authme.security.HashAlgorithm; import fr.xephi.authme.settings.Settings; @@ -134,7 +135,8 @@ public class MySQL implements DataSource { * * @return Connection * @throws SQLException */ - private synchronized Connection getConnection() throws SQLException { + @Override + public synchronized Connection getConnection() throws SQLException { return ds.getConnection(); } @@ -254,8 +256,12 @@ public class MySQL implements DataSource { @Override public synchronized boolean isAuthAvailable(String user) { try (Connection con = getConnection()) { - String sql = "SELECT " + columnName + " FROM " + tableName + " WHERE " + columnName + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); + PreparedStatement pst = con.prepareStatement(new Query(this) + .select(columnName) + .from(tableName) + .addWhere(columnName + "=?", null) + .build() + .getQuery()); pst.setString(1, user.toLowerCase()); ResultSet rs = pst.executeQuery(); return rs.next(); @@ -277,8 +283,12 @@ public class MySQL implements DataSource { public synchronized PlayerAuth getAuth(String user) { PlayerAuth pAuth; try (Connection con = getConnection()) { - String sql = "SELECT * FROM " + tableName + " WHERE " + columnName + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); + PreparedStatement pst = con.prepareStatement(new Query(this) + .select("*") + .from(tableName) + .addWhere(columnName + "=?", null) + .build() + .getQuery()); pst.setString(1, user.toLowerCase()); ResultSet rs = pst.executeQuery(); if (!rs.next()) { @@ -304,7 +314,12 @@ public class MySQL implements DataSource { rs.close(); pst.close(); if (Settings.getPasswordHash == HashAlgorithm.XENFORO) { - pst = con.prepareStatement("SELECT data FROM xf_user_authenticate WHERE " + columnID + "=?;"); + pst = con.prepareStatement(new Query(this) + .select("data") + .from("xf_user_authenticate") + .addWhere(columnID + "=?", null) + .build() + .getQuery()); pst.setInt(1, id); rs = pst.executeQuery(); if (rs.next()) { @@ -595,10 +610,16 @@ public class MySQL implements DataSource { */ @Override public synchronized boolean updateSession(PlayerAuth auth) { - try (Connection con = getConnection()) { - String sql = "UPDATE " + tableName + " SET " - + columnIp + "=?, " + columnLastLogin + "=?, " + columnRealName + "=? WHERE " + columnName + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); + try(Connection con = getConnection()) { + PreparedStatement pst = con.prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnIp + "=?") + .addUpdateSet(columnLastLogin + "=?") + .addUpdateSet(columnRealName + "=?") + .addWhere(columnName + "=?", null) + .build() + .getQuery()); pst.setString(1, auth.getIp()); pst.setLong(2, auth.getLastLogin()); pst.setString(3, auth.getRealName()); @@ -624,9 +645,13 @@ public class MySQL implements DataSource { @Override public synchronized int purgeDatabase(long until) { int result = 0; - try (Connection con = getConnection()) { - String sql = "DELETE FROM " + tableName + " WHERE " + columnLastLogin + " autoPurgeDatabase(long until) { List list = new ArrayList<>(); - try (Connection con = getConnection()) { - String sql = "SELECT " + columnName + " FROM " + tableName + " WHERE " + columnLastLogin + "<" + until; - Statement st = con.createStatement(); - ResultSet rs = st.executeQuery(sql); + try(Connection con = getConnection()) { + PreparedStatement st = con.prepareStatement(new Query(this) + .select(columnName) + .from(tableName) + .addWhere(columnLastLogin + "<" + until, null) + .build() + .getQuery()); + ResultSet rs = st.executeQuery(); while (rs.next()) { list.add(rs.getString(columnName)); } rs.close(); - sql = "DELETE FROM " + tableName + " WHERE " + columnLastLogin + "<" + until; - st.executeUpdate(sql); + st.close(); + st = con.prepareStatement(new Query(this) + .delete() + .from(tableName) + .addWhere(columnLastLogin + "<" + until, null) + .build() + .getQuery()); + st.executeUpdate(); st.close(); } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); @@ -718,11 +753,17 @@ public class MySQL implements DataSource { */ @Override public synchronized boolean updateQuitLoc(PlayerAuth auth) { - try (Connection con = getConnection()) { - String sql = "UPDATE " + tableName - + " SET " + lastlocX + " =?, " + lastlocY + "=?, " + lastlocZ + "=?, " + lastlocWorld + "=?" - + " WHERE " + columnName + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); + try(Connection con = getConnection()) { + PreparedStatement pst = con.prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(lastlocX + "=?") + .addUpdateSet(lastlocY + "=?") + .addUpdateSet(lastlocZ + "=?") + .addUpdateSet(lastlocWorld + "=?") + .addWhere(columnName + "=?", null) + .build() + .getQuery()); pst.setDouble(1, auth.getQuitLocX()); pst.setDouble(2, auth.getQuitLocY()); pst.setDouble(3, auth.getQuitLocZ()); @@ -751,8 +792,12 @@ public class MySQL implements DataSource { public synchronized int getIps(String ip) { int countIp = 0; try (Connection con = getConnection()) { - String sql = "SELECT COUNT(*) FROM " + tableName + " WHERE " + columnIp + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); + PreparedStatement pst = con.prepareStatement(new Query(this) + .select("COUNT(*)") + .from(tableName) + .addWhere(columnIp + "=?", null) + .build() + .getQuery()); pst.setString(1, ip); ResultSet rs = pst.executeQuery(); while (rs.next()) { @@ -779,8 +824,13 @@ public class MySQL implements DataSource { @Override public synchronized boolean updateEmail(PlayerAuth auth) { try (Connection con = getConnection()) { - String sql = "UPDATE " + tableName + " SET " + columnEmail + " =? WHERE " + columnName + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); + PreparedStatement pst = con.prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnEmail + "=?") + .addWhere(columnName + "=?", null) + .build() + .getQuery()); pst.setString(1, auth.getEmail()); pst.setString(2, auth.getNickname()); pst.executeUpdate(); @@ -808,8 +858,13 @@ public class MySQL implements DataSource { return false; } try (Connection con = getConnection()) { - String sql = "UPDATE " + tableName + " SET " + columnSalt + " =? WHERE " + columnName + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); + PreparedStatement pst = con.prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnSalt + "=?") + .addWhere(columnName + "=?", null) + .build() + .getQuery()); pst.setString(1, auth.getSalt()); pst.setString(2, auth.getNickname()); pst.executeUpdate(); @@ -864,9 +919,12 @@ public class MySQL implements DataSource { public synchronized List getAllAuthsByName(PlayerAuth auth) { List result = new ArrayList<>(); try (Connection con = getConnection()) { - String sql = "SELECT " + columnName + " FROM " + tableName + " WHERE " + columnIp + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); - pst.setString(1, auth.getIp()); + PreparedStatement pst = con.prepareStatement(new Query(this) + .select(columnName) + .from(tableName) + .addWhere(columnIp + "='" + auth.getIp() + "'", null) + .build() + .getQuery()); ResultSet rs = pst.executeQuery(); while (rs.next()) { result.add(rs.getString(columnName)); @@ -893,9 +951,12 @@ public class MySQL implements DataSource { public synchronized List getAllAuthsByIp(String ip) { List result = new ArrayList<>(); try (Connection con = getConnection()) { - String sql = "SELECT " + columnName + " FROM " + tableName + " WHERE " + columnIp + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); - pst.setString(1, ip); + PreparedStatement pst = con.prepareStatement(new Query(this) + .select(columnName) + .from(tableName) + .addWhere(columnIp + "='" + ip + "'", null) + .build() + .getQuery()); ResultSet rs = pst.executeQuery(); while (rs.next()) { result.add(rs.getString(columnName)); @@ -922,9 +983,12 @@ public class MySQL implements DataSource { public synchronized List getAllAuthsByEmail(String email){ List countEmail = new ArrayList<>(); try (Connection con = getConnection()) { - String sql = "SELECT " + columnName + " FROM " + tableName + " WHERE " + columnEmail + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); - pst.setString(1, email); + PreparedStatement pst = con.prepareStatement(new Query(this) + .select(columnName) + .from(tableName) + .addWhere(columnEmail + "='" + email + "'", null) + .build() + .getQuery()); ResultSet rs = pst.executeQuery(); while (rs.next()) { countEmail.add(rs.getString(columnName)); @@ -948,7 +1012,12 @@ public class MySQL implements DataSource { @Override public synchronized void purgeBanned(List banned) { try (Connection con = getConnection()) { - PreparedStatement pst = con.prepareStatement("DELETE FROM " + tableName + " WHERE " + columnName + "=?;"); + PreparedStatement pst = con.prepareStatement(new Query(this) + .delete() + .from(tableName) + .addWhere(columnName + "=?", null) + .build() + .getQuery()); for (String name : banned) { pst.setString(1, name); pst.executeUpdate(); @@ -981,9 +1050,12 @@ public class MySQL implements DataSource { public boolean isLogged(String user) { boolean isLogged = false; try (Connection con = getConnection()) { - String sql = "SELECT " + columnLogged + " FROM " + tableName + " WHERE " + columnName + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); - pst.setString(1, user); + PreparedStatement pst = con.prepareStatement(new Query(this) + .select(columnLogged) + .from(tableName) + .addWhere(columnName + "='" + user + "'", null) + .build() + .getQuery()); ResultSet rs = pst.executeQuery(); isLogged = rs.next() && (rs.getInt(columnLogged) == 1); } catch (SQLException ex) { @@ -1003,10 +1075,13 @@ public class MySQL implements DataSource { @Override public void setLogged(String user) { try (Connection con = getConnection()) { - String sql = "UPDATE " + tableName + " SET " + columnLogged + "=? WHERE " + columnName + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); - pst.setInt(1, 1); - pst.setString(2, user.toLowerCase()); + PreparedStatement pst = con.prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnLogged + "=" + 1) + .addWhere(columnName + "='" + user.toLowerCase() + "'", null) + .build() + .getQuery()); pst.executeUpdate(); pst.close(); } catch (SQLException ex) { @@ -1025,10 +1100,13 @@ public class MySQL implements DataSource { @Override public void setUnlogged(String user) { try (Connection con = getConnection()) { - String sql = "UPDATE " + tableName + " SET " + columnLogged + "=? WHERE " + columnName + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); - pst.setInt(1, 0); - pst.setString(2, user.toLowerCase()); + PreparedStatement pst = con.prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnLogged + "=" + 0) + .addWhere(columnName + "='" + user.toLowerCase() + "'", null) + .build() + .getQuery()); pst.executeUpdate(); pst.close(); } catch (SQLException ex) { @@ -1045,10 +1123,13 @@ public class MySQL implements DataSource { @Override public void purgeLogged() { try (Connection con = getConnection()) { - String sql = "UPDATE " + tableName + " SET " + columnLogged + "=? WHERE " + columnLogged + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); - pst.setInt(1, 0); - pst.setInt(2, 1); + PreparedStatement pst = con.prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnLogged + "=" + 0) + .addWhere(columnLogged + "=" + 1, null) + .build() + .getQuery()); pst.executeUpdate(); pst.close(); } catch (Exception ex) { @@ -1068,8 +1149,12 @@ public class MySQL implements DataSource { public int getAccountsRegistered() { int result = 0; try (Connection con = getConnection()) { - Statement st = con.createStatement(); - ResultSet rs = st.executeQuery("SELECT COUNT(*) FROM " + tableName); + PreparedStatement st = con.prepareStatement(new Query(this) + .select("COUNT(*)") + .from(tableName) + .build() + .getQuery()); + ResultSet rs = st.executeQuery(); if (rs.next()) { result = rs.getInt(1); } @@ -1093,11 +1178,16 @@ public class MySQL implements DataSource { @Override public void updateName(String oldOne, String newOne) { try (Connection con = getConnection()) { - String sql = "UPDATE " + tableName + " SET " + columnName + "=? WHERE " + columnName + "=?;"; - PreparedStatement pst = con.prepareStatement(sql); - pst.setString(1, newOne); - pst.setString(2, oldOne); + PreparedStatement pst = + con.prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnName + "='" + newOne + "'") + .addWhere(columnName + "='" + oldOne + "'", null) + .build() + .getQuery()); pst.executeUpdate(); + pst.close(); } catch (Exception ex) { ConsoleLogger.showError(ex.getMessage()); ConsoleLogger.writeStackTrace(ex); @@ -1115,9 +1205,19 @@ public class MySQL implements DataSource { public List getAllAuths() { List auths = new ArrayList<>(); try (Connection con = getConnection()) { - Statement st = con.createStatement(); - ResultSet rs = st.executeQuery("SELECT * FROM " + tableName); - PreparedStatement pst = con.prepareStatement("SELECT data FROM xf_user_authenticate WHERE " + columnID + "=?;"); + PreparedStatement st = con.prepareStatement(new Query(this) + .select("*") + .from(tableName) + .build() + .getQuery()); + ResultSet rs = st + .executeQuery(); + PreparedStatement pst = con.prepareStatement(new Query(this) + .select("data") + .from("xf_user_authenticate") + .addWhere(columnID + "=?", null) + .build() + .getQuery()); while (rs.next()) { String salt = !columnSalt.isEmpty() ? rs.getString(columnSalt) : ""; int group = !salt.isEmpty() && !columnGroup.isEmpty() ? rs.getInt(columnGroup) : -1; diff --git a/src/main/java/fr/xephi/authme/datasource/SQLite.java b/src/main/java/fr/xephi/authme/datasource/SQLite.java index 9c4301ae..b753ba24 100644 --- a/src/main/java/fr/xephi/authme/datasource/SQLite.java +++ b/src/main/java/fr/xephi/authme/datasource/SQLite.java @@ -2,6 +2,8 @@ package fr.xephi.authme.datasource; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.cache.auth.PlayerAuth; +import fr.xephi.authme.datasource.queries.Query; +import fr.xephi.authme.security.HashAlgorithm; import fr.xephi.authme.settings.Settings; import java.sql.*; @@ -74,6 +76,23 @@ public class SQLite implements DataSource { } + private synchronized void reconnect() throws ClassNotFoundException, SQLException { + Class.forName("org.sqlite.JDBC"); + this.con = DriverManager.getConnection("jdbc:sqlite:plugins/AuthMe/" + database + ".db"); + } + + @Override + public synchronized Connection getConnection() throws SQLException + { + if (this.con.isClosed()) + try { + reconnect(); + } catch (ClassNotFoundException e) { + ConsoleLogger.writeStackTrace(e); + } + return this.con; + } + /** * Method setup. * @@ -145,7 +164,12 @@ public class SQLite implements DataSource { PreparedStatement pst = null; ResultSet rs = null; try { - pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE LOWER(" + columnName + ")=LOWER(?);"); + pst = getConnection().prepareStatement(new Query(this) + .select("*") + .from(tableName) + .addWhere("LOWER(" + columnName + ")=LOWER(?)", null) + .build() + .getQuery()); pst.setString(1, user); rs = pst.executeQuery(); return rs.next(); @@ -170,7 +194,12 @@ public class SQLite implements DataSource { PreparedStatement pst = null; ResultSet rs = null; try { - pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE LOWER(" + columnName + ")=LOWER(?);"); + pst = getConnection().prepareStatement(new Query(this) + .select("*") + .from(tableName) + .addWhere("LOWER(" + columnName + ")=LOWER(?)", null) + .build() + .getQuery()); pst.setString(1, user); rs = pst.executeQuery(); if (rs.next()) { @@ -242,8 +271,14 @@ public class SQLite implements DataSource { */ @Override public synchronized boolean updatePassword(PlayerAuth auth) { - PreparedStatement pst = null; try { + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnPassword + "=?") + .addWhere(columnName + "=?", null) + .build() + .getQuery()); pst = con.prepareStatement("UPDATE " + tableName + " SET " + columnPassword + "=? WHERE " + columnName + "=?;"); pst.setString(1, auth.getHash()); pst.setString(2, auth.getNickname()); @@ -251,8 +286,6 @@ public class SQLite implements DataSource { } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); return false; - } finally { - close(pst); } return true; } @@ -262,25 +295,32 @@ public class SQLite implements DataSource { * * @param auth PlayerAuth * - * @return boolean * @see fr.xephi.authme.datasource.DataSource#updateSession(PlayerAuth) + * @return boolean + * + * @see fr.xephi.authme.datasource.DataSource#updateSession(PlayerAuth) */ @Override - public boolean updateSession(PlayerAuth auth) { - PreparedStatement pst = null; + public synchronized boolean updateSession(PlayerAuth auth) { try { - pst = con.prepareStatement("UPDATE " + tableName + " SET " + columnIp + "=?, " + columnLastLogin + "=?, " + columnRealName + "=? WHERE " + columnName + "=?;"); + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnIp + "=?") + .addUpdateSet(columnLastLogin + "=?") + .addUpdateSet(columnRealName + "=?") + .addWhere(columnName + "=?", null) + .build() + .getQuery()); pst.setString(1, auth.getIp()); pst.setLong(2, auth.getLastLogin()); pst.setString(3, auth.getRealName()); pst.setString(4, auth.getNickname()); pst.executeUpdate(); + return true; } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); - return false; - } finally { - close(pst); } - return true; + return false; } /** @@ -288,22 +328,27 @@ public class SQLite implements DataSource { * * @param until long * - * @return int * @see fr.xephi.authme.datasource.DataSource#purgeDatabase(long) + * @return int + * + * @see fr.xephi.authme.datasource.DataSource#purgeDatabase(long) */ @Override - public int purgeDatabase(long until) { - PreparedStatement pst = null; + public synchronized int purgeDatabase(long until) { + int result = 0; try { - - pst = con.prepareStatement("DELETE FROM " + tableName + " WHERE " + columnLastLogin + " * @see fr.xephi.authme.datasource.DataSource#autoPurgeDatabase(long) + * @return List + * + * @see fr.xephi.authme.datasource.DataSource#autoPurgeDatabase(long) */ @Override - public List autoPurgeDatabase(long until) { - PreparedStatement pst = null; - ResultSet rs = null; + public synchronized List autoPurgeDatabase(long until) { List list = new ArrayList<>(); try { - pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " + columnLastLogin + "(); - } finally { - close(rs); - close(pst); + ConsoleLogger.writeStackTrace(ex); } + return list; } /** @@ -363,26 +417,35 @@ public class SQLite implements DataSource { * * @param auth PlayerAuth * - * @return boolean * @see fr.xephi.authme.datasource.DataSource#updateQuitLoc(PlayerAuth) + * @return boolean + * + * @see fr.xephi.authme.datasource.DataSource#updateQuitLoc(PlayerAuth) */ @Override - public boolean updateQuitLoc(PlayerAuth auth) { - PreparedStatement pst = null; + public synchronized boolean updateQuitLoc(PlayerAuth auth) { try { - pst = con.prepareStatement("UPDATE " + tableName + " SET " + lastlocX + "=?, " + lastlocY + "=?, " + lastlocZ + "=?, " + lastlocWorld + "=? WHERE " + columnName + "=?;"); + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(lastlocX + "=?") + .addUpdateSet(lastlocY + "=?") + .addUpdateSet(lastlocZ + "=?") + .addUpdateSet(lastlocWorld + "=?") + .addWhere(columnName + "=?", null) + .build() + .getQuery()); pst.setDouble(1, auth.getQuitLocX()); pst.setDouble(2, auth.getQuitLocY()); pst.setDouble(3, auth.getQuitLocZ()); pst.setString(4, auth.getWorld()); pst.setString(5, auth.getNickname()); pst.executeUpdate(); + return true; } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); - return false; - } finally { - close(pst); + ConsoleLogger.writeStackTrace(ex); } - return true; + return false; } /** @@ -390,28 +453,31 @@ public class SQLite implements DataSource { * * @param ip String * - * @return int * @see fr.xephi.authme.datasource.DataSource#getIps(String) + * @return int + * + * @see fr.xephi.authme.datasource.DataSource#getIps(String) */ @Override - public int getIps(String ip) { - PreparedStatement pst = null; - ResultSet rs = null; + public synchronized int getIps(String ip) { int countIp = 0; try { - pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " + columnIp + "=?;"); + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .select("COUNT(*)") + .from(tableName) + .addWhere(columnIp + "=?", null) + .build() + .getQuery()); pst.setString(1, ip); - rs = pst.executeQuery(); + ResultSet rs = pst.executeQuery(); while (rs.next()) { - countIp++; + countIp = rs.getInt(1); } - return countIp; + rs.close(); } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); - return 0; - } finally { - close(rs); - close(pst); + ConsoleLogger.writeStackTrace(ex); } + return countIp; } /** @@ -419,23 +485,29 @@ public class SQLite implements DataSource { * * @param auth PlayerAuth * - * @return boolean * @see fr.xephi.authme.datasource.DataSource#updateEmail(PlayerAuth) + * @return boolean + * + * @see fr.xephi.authme.datasource.DataSource#updateEmail(PlayerAuth) */ @Override - public boolean updateEmail(PlayerAuth auth) { - PreparedStatement pst = null; + public synchronized boolean updateEmail(PlayerAuth auth) { try { - pst = con.prepareStatement("UPDATE " + tableName + " SET " + columnEmail + "=? WHERE " + columnName + "=?;"); + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnEmail + "=?") + .addWhere(columnName + "=?", null) + .build() + .getQuery()); pst.setString(1, auth.getEmail()); pst.setString(2, auth.getNickname()); pst.executeUpdate(); + return true; } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); - return false; - } finally { - close(pst); + ConsoleLogger.writeStackTrace(ex); } - return true; + return false; } /** @@ -443,26 +515,32 @@ public class SQLite implements DataSource { * * @param auth PlayerAuth * - * @return boolean * @see fr.xephi.authme.datasource.DataSource#updateSalt(PlayerAuth) + * @return boolean + * + * @see fr.xephi.authme.datasource.DataSource#updateSalt(PlayerAuth) */ @Override - public boolean updateSalt(PlayerAuth auth) { + public synchronized boolean updateSalt(PlayerAuth auth) { if (columnSalt.isEmpty()) { return false; } - PreparedStatement pst = null; try { - pst = con.prepareStatement("UPDATE " + tableName + " SET " + columnSalt + "=? WHERE " + columnName + "=?;"); + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnSalt + "=?") + .addWhere(columnName + "=?", null) + .build() + .getQuery()); pst.setString(1, auth.getSalt()); pst.setString(2, auth.getNickname()); pst.executeUpdate(); + return true; } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); - return false; - } finally { - close(pst); + ConsoleLogger.writeStackTrace(ex); } - return true; + return false; } /** @@ -523,30 +601,30 @@ public class SQLite implements DataSource { * * @param auth PlayerAuth * - * @return List * @see fr.xephi.authme.datasource.DataSource#getAllAuthsByName(PlayerAuth) + * @return List + * + * @see fr.xephi.authme.datasource.DataSource#getAllAuthsByName(PlayerAuth) */ @Override - public List getAllAuthsByName(PlayerAuth auth) { - PreparedStatement pst = null; - ResultSet rs = null; - List countIp = new ArrayList<>(); - try { - pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " + columnIp + "=?;"); - pst.setString(1, auth.getIp()); - rs = pst.executeQuery(); + public synchronized List getAllAuthsByName(PlayerAuth auth) { + List result = new ArrayList<>(); + try (Connection con = getConnection()) { + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .select(columnName) + .from(tableName) + .addWhere(columnIp + "='" + auth.getIp() + "'", null) + .build() + .getQuery()); + ResultSet rs = pst.executeQuery(); while (rs.next()) { - countIp.add(rs.getString(columnName)); + result.add(rs.getString(columnName)); } - return countIp; + rs.close(); } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); - return new ArrayList<>(); - } catch (NullPointerException npe) { - return new ArrayList<>(); - } finally { - close(rs); - close(pst); + ConsoleLogger.writeStackTrace(ex); } + return result; } /** @@ -554,30 +632,30 @@ public class SQLite implements DataSource { * * @param ip String * - * @return List * @see fr.xephi.authme.datasource.DataSource#getAllAuthsByIp(String) + * @return List + * + * @see fr.xephi.authme.datasource.DataSource#getAllAuthsByIp(String) */ @Override - public List getAllAuthsByIp(String ip) { - PreparedStatement pst = null; - ResultSet rs = null; - List countIp = new ArrayList<>(); + public synchronized List getAllAuthsByIp(String ip) { + List result = new ArrayList<>(); try { - pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " + columnIp + "=?;"); - pst.setString(1, ip); - rs = pst.executeQuery(); + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .select(columnName) + .from(tableName) + .addWhere(columnIp + "='" + ip + "'", null) + .build() + .getQuery()); + ResultSet rs = pst.executeQuery(); while (rs.next()) { - countIp.add(rs.getString(columnName)); + result.add(rs.getString(columnName)); } - return countIp; + rs.close(); } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); - return new ArrayList<>(); - } catch (NullPointerException npe) { - return new ArrayList<>(); - } finally { - close(rs); - close(pst); + ConsoleLogger.writeStackTrace(ex); } + return result; } /** @@ -585,30 +663,30 @@ public class SQLite implements DataSource { * * @param email String * - * @return List * @see fr.xephi.authme.datasource.DataSource#getAllAuthsByEmail(String) + * @return List + * + * @see fr.xephi.authme.datasource.DataSource#getAllAuthsByEmail(String) */ @Override - public List getAllAuthsByEmail(String email) { - PreparedStatement pst = null; - ResultSet rs = null; + public synchronized List getAllAuthsByEmail(String email){ List countEmail = new ArrayList<>(); try { - pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " + columnEmail + "=?;"); - pst.setString(1, email); - rs = pst.executeQuery(); + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .select(columnName) + .from(tableName) + .addWhere(columnEmail + "='" + email + "'", null) + .build() + .getQuery()); + ResultSet rs = pst.executeQuery(); while (rs.next()) { countEmail.add(rs.getString(columnName)); } - return countEmail; + rs.close(); } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); - return new ArrayList<>(); - } catch (NullPointerException npe) { - return new ArrayList<>(); - } finally { - close(rs); - close(pst); + ConsoleLogger.writeStackTrace(ex); } + return countEmail; } /** @@ -616,21 +694,24 @@ public class SQLite implements DataSource { * * @param banned List * - * @see fr.xephi.authme.datasource.DataSource#purgeBanned(List) + * @see fr.xephi.authme.datasource.DataSource#purgeBanned(List) */ @Override - public void purgeBanned(List banned) { - PreparedStatement pst = null; + public synchronized void purgeBanned(List banned) { try { + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .delete() + .from(tableName) + .addWhere(columnName + "=?", null) + .build() + .getQuery()); for (String name : banned) { - pst = con.prepareStatement("DELETE FROM " + tableName + " WHERE " + columnName + "=?;"); pst.setString(1, name); pst.executeUpdate(); } } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); - } finally { - close(pst); + ConsoleLogger.writeStackTrace(ex); } } @@ -653,22 +734,21 @@ public class SQLite implements DataSource { */ @Override public boolean isLogged(String user) { - PreparedStatement pst = null; - ResultSet rs = null; + boolean isLogged = false; try { - pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE LOWER(" + columnName + ")=?;"); - pst.setString(1, user); - rs = pst.executeQuery(); - if (rs.next()) - return (rs.getInt(columnLogged) == 1); + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .select(columnLogged) + .from(tableName) + .addWhere(columnName + "='" + user + "'", null) + .build() + .getQuery()); + ResultSet rs = pst.executeQuery(); + isLogged = rs.next() && (rs.getInt(columnLogged) == 1); } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); - return false; - } finally { - close(rs); - close(pst); + ConsoleLogger.writeStackTrace(ex); } - return false; + return isLogged; } /** @@ -680,16 +760,18 @@ public class SQLite implements DataSource { */ @Override public void setLogged(String user) { - PreparedStatement pst = null; try { - pst = con.prepareStatement("UPDATE " + tableName + " SET " + columnLogged + "=? WHERE LOWER(" + columnName + ")=?;"); - pst.setInt(1, 1); - pst.setString(2, user); + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnLogged + "='1'") + .addWhere(columnName + "='" + user.toLowerCase() + "'", null) + .build() + .getQuery()); pst.executeUpdate(); } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); - } finally { - close(pst); + ConsoleLogger.writeStackTrace(ex); } } @@ -702,18 +784,19 @@ public class SQLite implements DataSource { */ @Override public void setUnlogged(String user) { - PreparedStatement pst = null; - if (user != null) - try { - pst = con.prepareStatement("UPDATE " + tableName + " SET " + columnLogged + "=? WHERE LOWER(" + columnName + ")=?;"); - pst.setInt(1, 0); - pst.setString(2, user); - pst.executeUpdate(); - } catch (SQLException ex) { - ConsoleLogger.showError(ex.getMessage()); - } finally { - close(pst); - } + try { + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnLogged + "='0'") + .addWhere(columnName + "='" + user.toLowerCase() + "'", null) + .build() + .getQuery()); + pst.executeUpdate(); + } catch (SQLException ex) { + ConsoleLogger.showError(ex.getMessage()); + ConsoleLogger.writeStackTrace(ex); + } } /** @@ -723,40 +806,45 @@ public class SQLite implements DataSource { */ @Override public void purgeLogged() { - PreparedStatement pst = null; try { - pst = con.prepareStatement("UPDATE " + tableName + " SET " + columnLogged + "=? WHERE " + columnLogged + "=?;"); - pst.setInt(1, 0); - pst.setInt(2, 1); + PreparedStatement pst = getConnection().prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnLogged + "='0'") + .addWhere(columnLogged + "='1'", null) + .build() + .getQuery()); pst.executeUpdate(); - } catch (SQLException ex) { + } catch (Exception ex) { ConsoleLogger.showError(ex.getMessage()); - } finally { - close(pst); + ConsoleLogger.writeStackTrace(ex); } } /** * Method getAccountsRegistered. * - * @return int * @see fr.xephi.authme.datasource.DataSource#getAccountsRegistered() + * @return int + * + * @see fr.xephi.authme.datasource.DataSource#getAccountsRegistered() */ @Override public int getAccountsRegistered() { int result = 0; - PreparedStatement pst = null; - ResultSet rs; try { - pst = con.prepareStatement("SELECT COUNT(*) FROM " + tableName + ";"); - rs = pst.executeQuery(); - if (rs != null && rs.next()) { + PreparedStatement st = getConnection().prepareStatement(new Query(this) + .select("COUNT(*)") + .from(tableName) + .build() + .getQuery()); + ResultSet rs = st.executeQuery(); + if (rs.next()) { result = rs.getInt(1); } - } catch (SQLException ex) { + rs.close(); + } catch (Exception ex) { ConsoleLogger.showError(ex.getMessage()); - return result; - } finally { - close(pst); + ConsoleLogger.writeStackTrace(ex); } return result; } @@ -771,50 +859,63 @@ public class SQLite implements DataSource { */ @Override public void updateName(String oldOne, String newOne) { - PreparedStatement pst = null; try { - pst = con.prepareStatement("UPDATE " + tableName + " SET " + columnName + "=? WHERE " + columnName + "=?;"); - pst.setString(1, newOne); - pst.setString(2, oldOne); + PreparedStatement pst = + getConnection().prepareStatement(new Query(this) + .update() + .from(tableName) + .addUpdateSet(columnName + "='" + newOne + "'") + .addWhere(columnName + "='" + oldOne + "'", null) + .build() + .getQuery()); pst.executeUpdate(); - } catch (SQLException ex) { + } catch (Exception ex) { ConsoleLogger.showError(ex.getMessage()); - } finally { - close(pst); + ConsoleLogger.writeStackTrace(ex); } } /** * Method getAllAuths. * - * @return List * @see fr.xephi.authme.datasource.DataSource#getAllAuths() + * @return List + * + * @see fr.xephi.authme.datasource.DataSource#getAllAuths() */ @Override public List getAllAuths() { List auths = new ArrayList<>(); - PreparedStatement pst = null; - ResultSet rs; try { - pst = con.prepareStatement("SELECT * FROM " + tableName + ";"); - rs = pst.executeQuery(); + PreparedStatement st = getConnection().prepareStatement(new Query(this) + .select("*") + .from(tableName) + .build() + .getQuery()); + ResultSet rs = st + .executeQuery(); while (rs.next()) { - PlayerAuth pAuth; - if (rs.getString(columnIp).isEmpty()) { - pAuth = new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), "127.0.0.1", rs.getLong(columnLastLogin), rs.getDouble(lastlocX), rs.getDouble(lastlocY), rs.getDouble(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), rs.getString(columnRealName)); - } else { - if (!columnSalt.isEmpty()) { - pAuth = new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnSalt), rs.getInt(columnGroup), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getDouble(lastlocX), rs.getDouble(lastlocY), rs.getDouble(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), rs.getString(columnRealName)); - } else { - pAuth = new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getDouble(lastlocX), rs.getDouble(lastlocY), rs.getDouble(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), rs.getString(columnRealName)); - } - } + String salt = !columnSalt.isEmpty() ? rs.getString(columnSalt) : ""; + int group = !salt.isEmpty() && !columnGroup.isEmpty() ? rs.getInt(columnGroup) : -1; + PlayerAuth pAuth = PlayerAuth.builder() + .name(rs.getString(columnName)) + .realName(rs.getString(columnRealName)) + .hash(rs.getString(columnPassword)) + .lastLogin(rs.getLong(columnLastLogin)) + .ip(rs.getString(columnIp)) + .locWorld(rs.getString(lastlocWorld)) + .locX(rs.getDouble(lastlocX)) + .locY(rs.getDouble(lastlocY)) + .locZ(rs.getDouble(lastlocZ)) + .email(rs.getString(columnEmail)) + .salt(salt) + .groupId(group) + .build(); auths.add(pAuth); } - } catch (SQLException ex) { + rs.close(); + } catch (Exception ex) { ConsoleLogger.showError(ex.getMessage()); - return auths; - } finally { - close(pst); + ConsoleLogger.writeStackTrace(ex); } return auths; } diff --git a/src/main/java/fr/xephi/authme/datasource/queries/Query.java b/src/main/java/fr/xephi/authme/datasource/queries/Query.java new file mode 100644 index 00000000..08511e00 --- /dev/null +++ b/src/main/java/fr/xephi/authme/datasource/queries/Query.java @@ -0,0 +1,215 @@ +package fr.xephi.authme.datasource.queries; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.datasource.DataSource; + +public class Query { + + private DataSource source; + private String selector = null; + private String from = null; + private HashMap where = new HashMap(); + private List into = new ArrayList(); + private List values = new ArrayList(); + private List updateSet = new ArrayList(); + private boolean isSelect = false; + private boolean isDelete = false; + private boolean isUpdate = false; + private boolean isInsert = false; + private String buildQuery = ""; + + /** + * + * @param source + */ + public Query(DataSource source) + { + this.source = source; + } + + /** + * + * @param selector + * @return Query instance + */ + public Query select(String selector) + { + this.selector = selector; + isSelect = true; + isDelete = false; + isUpdate = false; + isInsert = false; + return this; + } + + /** + * + * @return Query instance + */ + public Query update() + { + isSelect = false; + isDelete = false; + isUpdate = true; + isInsert = false; + return this; + } + + /** + * + * @return Query instance + */ + public Query delete() + { + isSelect = false; + isDelete = true; + isUpdate = false; + isInsert = false; + return this; + } + + /** + * + * @param selector + * @return Query instance + */ + public Query insert() + { + isSelect = false; + isDelete = false; + isUpdate = false; + isInsert = true; + return this; + } + + /** + * + * @param column + * @return + */ + public Query addInsertInto(String column) + { + into.add(column); + return this; + } + + /** + * + * @param value + * @return + */ + public Query addInsertValue(String value) + { + values.add(value); + return this; + } + + /** + * + * @param set + * @return + */ + public Query addUpdateSet(String set) + { + updateSet.add(set); + return this; + } + + /** + * + * @param from + * @return Query instance + */ + public Query from(String from) + { + this.from = from; + return this; + } + + /** + * + * @param where + * @param String and/or/null + * @return Query instance + */ + public Query addWhere(String where, String logic) + { + this.where.put(where, logic); + return this; + } + + public Query build(){ + StringBuilder str = new StringBuilder(); + if (isSelect) + { + str.append("SELECT ").append(selector).append(" FROM ").append(from); + } + else if (isDelete) + { + str.append("DELETE FROM ").append(from); + } + else if (isUpdate) + { + str.append("UPDATE ").append(from).append(" SET "); + Iterator iter = updateSet.iterator(); + while (iter.hasNext()) + { + String s = iter.next(); + str.append(s); + if (iter.hasNext()) + str.append(", "); + } + } + else if (isInsert) + { + str.append("INSERT INTO ").append(from).append(" ('"); + Iterator iter = into.iterator(); + while (iter.hasNext()) + { + String s = iter.next(); + str.append(s); + if (iter.hasNext()) + str.append("', '"); + else + str.append("')"); + } + str.append(" VALUES ('"); + iter = values.iterator(); + while (iter.hasNext()) + { + String s = iter.next(); + str.append(s); + if (iter.hasNext()) + str.append("', '"); + else + str.append("')"); + } + } + if (!where.isEmpty()) + { + str.append(" WHERE"); + for (String key : where.keySet()) + { + if (where.get(key) != null) + str.append(" ").append(where.get(key)); + str.append(" ").append(key); + } + } + str.append(";"); + this.buildQuery = str.toString(); + return this; + } + + public String getQuery() { + return this.buildQuery; + } +}