diff --git a/Core/src/main/java/com/craftaro/core/database/DatabaseConnector.java b/Core/src/main/java/com/craftaro/core/database/DatabaseConnector.java index a1331473..80d16711 100644 --- a/Core/src/main/java/com/craftaro/core/database/DatabaseConnector.java +++ b/Core/src/main/java/com/craftaro/core/database/DatabaseConnector.java @@ -34,6 +34,16 @@ public interface DatabaseConnector { */ OptionalResult connectOptional(ConnectionOptionalCallback callback); + /** + * Executes a callback with a Connection passed and automatically closes it when finished + * + * @param callback The callback to execute once the connection is retrieved + * @param defaultValue The default value (First value only) to return if the callback fails (Also used to make automatic type inference work) + * + * @return The result of the callback + */ + T connectResult(ConnectResult callback, T... defaultValue); + /** * Executes a callback with a DSLContext passed and automatically closes it when finished * @@ -50,6 +60,16 @@ public interface DatabaseConnector { */ OptionalResult connectDSLOptional(DSLContextOptionalCallback callback); + /** + * Executes a callback with a DSLContext passed and automatically closes it when finished + * + * @param callback The callback to execute once the connection is retrieved + * @param defaultValue The default value (First value only) to return if the callback fails (Also used to make automatic type inference work) + * + * @return The result of the callback + */ + T connectDSLResult(DSLConnectResult callback, T... defaultValue); + /** * Wraps a connection in a callback which will automagically handle catching sql errors */ @@ -82,6 +102,19 @@ interface DSLContextOptionalCallback { OptionalResult accept(DSLContext context) throws SQLException; } + /** + * Wraps a connection in a callback which will + * automagically handle catching sql errors + * Can return a value + */ + interface ConnectResult { + T accept(Connection connection) throws SQLException; + } + + interface DSLConnectResult { + T accept(DSLContext context) throws SQLException; + } + /** * Gets a connection from the database * diff --git a/Core/src/main/java/com/craftaro/core/database/H2Connector.java b/Core/src/main/java/com/craftaro/core/database/H2Connector.java index 958c2b23..3fa559f7 100644 --- a/Core/src/main/java/com/craftaro/core/database/H2Connector.java +++ b/Core/src/main/java/com/craftaro/core/database/H2Connector.java @@ -100,6 +100,20 @@ public OptionalResult connectOptional(ConnectionOptionalCallback callback) { return OptionalResult.empty(); } + @Override + public T connectResult(ConnectResult callback, T... defaultValue) { + try (Connection connection = getConnection()) { + T result = callback.accept(connection); + return result != null ? result : defaultValue.length > 0 ? defaultValue[0] : null; + } catch (Exception ex) { + if (this.plugin != null) { + SongodaCore.getLogger().severe("An error occurred executing a H2 query: " + ex.getMessage()); + } + ex.printStackTrace(); + return defaultValue.length > 0 ? defaultValue[0] : null; + } + } + @Override public void connectDSL(DSLContextCallback callback) { try (Connection connection = getConnection()) { @@ -125,6 +139,20 @@ public OptionalResult connectDSLOptional(DSLContextOptionalCallback callback) { return OptionalResult.empty(); } + @Override + public T connectDSLResult(DSLConnectResult callback, T... defaultValue) { + try (Connection connection = getConnection()) { + T result = callback.accept(DSL.using(connection, SQLDialect.MYSQL)); + return result != null ? result : defaultValue.length > 0 ? defaultValue[0] : null; + } catch (Exception ex) { + if (this.plugin != null) { + SongodaCore.getLogger().severe("An error occurred executing a H2 query: " + ex.getMessage()); + } + ex.printStackTrace(); + return defaultValue.length > 0 ? defaultValue[0] : null; + } + } + @Override public Connection getConnection() throws SQLException { return this.hikari.getConnection(); diff --git a/Core/src/main/java/com/craftaro/core/database/MariaDBConnector.java b/Core/src/main/java/com/craftaro/core/database/MariaDBConnector.java index dcb78bbe..4030d05c 100644 --- a/Core/src/main/java/com/craftaro/core/database/MariaDBConnector.java +++ b/Core/src/main/java/com/craftaro/core/database/MariaDBConnector.java @@ -83,6 +83,18 @@ public OptionalResult connectOptional(ConnectionOptionalCallback callback) { return OptionalResult.empty(); } + @Override + public T connectResult(ConnectResult callback, T... defaultValue) { + try (Connection connection = getConnection()) { + T result = callback.accept(connection); + return result != null ? result : defaultValue.length > 0 ? defaultValue[0] : null; + } catch (Exception ex) { + this.plugin.getLogger().severe("An error occurred executing a MariaDB query: " + ex.getMessage()); + ex.printStackTrace(); + return defaultValue.length > 0 ? defaultValue[0] : null; + } + } + @Override public void connectDSL(DSLContextCallback callback) { try (Connection connection = getConnection()){ @@ -104,6 +116,18 @@ public OptionalResult connectDSLOptional(DSLContextOptionalCallback callback) { return OptionalResult.empty(); } + @Override + public T connectDSLResult(DSLConnectResult callback, T... defaultValue) { + try (Connection connection = getConnection()) { + T result = callback.accept(DSL.using(connection, SQLDialect.MARIADB)); + return result != null ? result : defaultValue.length > 0 ? defaultValue[0] : null; + } catch (Exception ex) { + this.plugin.getLogger().severe("An error occurred executing a MariaDB query: " + ex.getMessage()); + ex.printStackTrace(); + return defaultValue.length > 0 ? defaultValue[0] : null; + } + } + @Override public Connection getConnection() throws SQLException { return this.hikari.getConnection(); diff --git a/Core/src/main/java/com/craftaro/core/database/MySQLConnector.java b/Core/src/main/java/com/craftaro/core/database/MySQLConnector.java index e3a13917..ae32fc03 100644 --- a/Core/src/main/java/com/craftaro/core/database/MySQLConnector.java +++ b/Core/src/main/java/com/craftaro/core/database/MySQLConnector.java @@ -79,6 +79,18 @@ public OptionalResult connectOptional(ConnectionOptionalCallback callback) { return OptionalResult.empty(); } + @Override + public T connectResult(ConnectResult callback, T... defaultValue) { + try (Connection connection = getConnection()) { + T result = callback.accept(connection); + return result != null ? result : defaultValue.length > 0 ? defaultValue[0] : null; + } catch (Exception ex) { + SongodaCore.getLogger().severe("An error occurred executing a MySQL query: " + ex.getMessage()); + ex.printStackTrace(); + return defaultValue.length > 0 ? defaultValue[0] : null; + } + } + @Override public void connectDSL(DSLContextCallback callback) { try (Connection connection = getConnection()) { @@ -100,6 +112,18 @@ public OptionalResult connectDSLOptional(DSLContextOptionalCallback callback) { return OptionalResult.empty(); } + @Override + public T connectDSLResult(DSLConnectResult callback, T... defaultValue) { + try (Connection connection = getConnection()) { + T result = callback.accept(DSL.using(connection, SQLDialect.MYSQL)); + return result != null ? result : defaultValue.length > 0 ? defaultValue[0] : null; + } catch (Exception ex) { + SongodaCore.getLogger().severe("An error occurred executing a MySQL query: " + ex.getMessage()); + ex.printStackTrace(); + return defaultValue.length > 0 ? defaultValue[0] : null; + } + } + @Override public Connection getConnection() throws SQLException { return this.hikari.getConnection(); diff --git a/Core/src/main/java/com/craftaro/core/database/SQLiteConnector.java b/Core/src/main/java/com/craftaro/core/database/SQLiteConnector.java index 6d632413..f607fb8a 100644 --- a/Core/src/main/java/com/craftaro/core/database/SQLiteConnector.java +++ b/Core/src/main/java/com/craftaro/core/database/SQLiteConnector.java @@ -69,6 +69,18 @@ public OptionalResult connectOptional(ConnectionOptionalCallback callback) { return OptionalResult.empty(); } + @Override + public T connectResult(ConnectResult callback, T... defaultValue) { + try (Connection connection = getConnection()) { + T result = callback.accept(connection); + return result != null ? result : defaultValue.length > 0 ? defaultValue[0] : null; + } catch (Exception ex) { + this.plugin.getLogger().severe("An error occurred executing a SQLite query: " + ex.getMessage()); + ex.printStackTrace(); + return defaultValue.length > 0 ? defaultValue[0] : null; + } + } + @Override public void connectDSL(DSLContextCallback callback) { try (Connection connection = getConnection()) { @@ -90,6 +102,18 @@ public OptionalResult connectDSLOptional(DSLContextOptionalCallback callback) { return OptionalResult.empty(); } + @Override + public T connectDSLResult(DSLConnectResult callback, T... defaultValue) { + try (Connection connection = getConnection()) { + T result = callback.accept(DSL.using(connection, SQLDialect.SQLITE)); + return result != null ? result : defaultValue.length > 0 ? defaultValue[0] : null; + } catch (Exception ex) { + this.plugin.getLogger().severe("An error occurred executing a SQLite query: " + ex.getMessage()); + ex.printStackTrace(); + return defaultValue.length > 0 ? defaultValue[0] : null; + } + } + @Override public Connection getConnection() { try {