From f92b16a09f577445e650207253412630ef50b266 Mon Sep 17 00:00:00 2001 From: Govindas Date: Thu, 8 Dec 2022 18:48:53 +0200 Subject: [PATCH] Code cleanup, better skript 2.6.1 support, update mariadb driver, possible bugfix, add example to README --- README.md | 14 ++++++- pom.xml | 6 +-- .../skriptdb/skript/EffExecuteStatement.java | 41 +++++-------------- .../java/com/btk5h/skriptdb/skript/Types.java | 4 -- 4 files changed, 27 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 9c9b1f0..954d860 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,18 @@ execute "select %unsafe {columns variable}% from %{table variable}%" in {sql} execute unsafe {fully dynamic query} in {sql} ``` +#### FAQ: How to return sql data in a function? +You can't because functions don't allow delays, but you can use skript-reflect sections for this: +``` +on load: + create new section stored in {-section::getPlayersFromDatabase}: + execute "SELECT uuid FROM table" in {-sql} and store the result in {_result::*} + return {_result::uuid::*} +command /showplayers []: + trigger: + run section {-section::getPlayersFromDatabase} async and store result in {_uuids::*} and wait + send "%{_uuids::*}%" +``` --- ### Configuration plugins/skript-db/config.yml @@ -91,4 +103,4 @@ plugins/skript-db/config.yml # Only change this if you wish to use a different driver than Java's default, like MariaDB driver. # If you use MariaDB, its driver is shaded together with skript-db, so you can just specify: "org.mariadb.jdbc.Driver" sql-driver-class-name: "default" -``` \ No newline at end of file +``` diff --git a/pom.xml b/pom.xml index b477439..6befcd0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.btk5h skript-db - 1.3.7 + 1.3.8 jar @@ -93,14 +93,14 @@ com.github.SkriptLang Skript - 2.6-beta3 + 2.6.1 provided org.mariadb.jdbc mariadb-java-client - 3.0.3 + 3.0.9 compile diff --git a/src/main/java/com/btk5h/skriptdb/skript/EffExecuteStatement.java b/src/main/java/com/btk5h/skriptdb/skript/EffExecuteStatement.java index 1d6a59a..4367aad 100644 --- a/src/main/java/com/btk5h/skriptdb/skript/EffExecuteStatement.java +++ b/src/main/java/com/btk5h/skriptdb/skript/EffExecuteStatement.java @@ -83,25 +83,19 @@ public class EffExecuteStatement extends Effect { //if data source isn't set if (ds == null) return; - boolean sync = !Bukkit.isPrimaryThread(); - //if current thread is not main thread, then make this query to not have delays + boolean sync = !Bukkit.isPrimaryThread(); + if (sync) { + isSync = true; + } else if (isSync) { + sync = true; + } Object locals = Variables.removeLocals(e); //execute SQL statement - - CompletableFuture sql = null; - Object resources = null; if (!sync) { - sql = CompletableFuture.supplyAsync(() -> executeStatement(ds, baseVariable, query), threadPool); - } else { - resources = executeStatement(ds, baseVariable, query); - } - - //when SQL statement is completed - boolean finalSync = sync; - if (sql != null) { + CompletableFuture sql = CompletableFuture.supplyAsync(() -> executeStatement(ds, baseVariable, query), threadPool); sql.whenComplete((res, err) -> { if (err != null) { err.printStackTrace(); @@ -115,7 +109,7 @@ public class EffExecuteStatement extends Effect { //if local variables are present //bring back local variables //populate SQL data into variables - if (isSync || finalSync) { + Bukkit.getScheduler().runTask(SkriptDB.getInstance(), () -> { if (locals != null) { Variables.setLocalVariables(e, locals); } @@ -123,26 +117,14 @@ public class EffExecuteStatement extends Effect { ((Map) res).forEach((name, value) -> setVariable(e, name, value)); } TriggerItem.walk(getNext(), e); + //the line below is required to prevent memory leaks Variables.removeLocals(e); - } else { - Bukkit.getScheduler().runTask(SkriptDB.getInstance(), () -> { - if (locals != null) { - Variables.setLocalVariables(e, locals); - } - if (!(res instanceof String)) { - ((Map) res).forEach((name, value) -> setVariable(e, name, value)); - } - TriggerItem.walk(getNext(), e); - //the line below is required to prevent memory leaks - //no functionality difference notice with it being removed from my test, but the memory gets filled with leaks - //so it must be kept - Variables.removeLocals(e); - }); - } + }); } }); // sync executed SQL query, same as above, just sync } else { + Object resources = executeStatement(ds, baseVariable, query); //handle last error syntax data lastError = null; if (resources instanceof String) { @@ -167,7 +149,6 @@ public class EffExecuteStatement extends Effect { @Override protected TriggerItem walk(Event e) { debug(e, true); - //I think no longer needed as of 1.3.0, uncomment if something breaks if (!isSync) { Delay.addDelayedEvent(e); } diff --git a/src/main/java/com/btk5h/skriptdb/skript/Types.java b/src/main/java/com/btk5h/skriptdb/skript/Types.java index 6efc304..d8ad79a 100644 --- a/src/main/java/com/btk5h/skriptdb/skript/Types.java +++ b/src/main/java/com/btk5h/skriptdb/skript/Types.java @@ -30,10 +30,6 @@ public class Types { return o.getJdbcUrl(); } - @Override - public String getVariableNamePattern() { - return "jdbc:.+"; - } }) .serializer(new Serializer() { @Override