diff --git a/pom.xml b/pom.xml index b60921a..f9b32ab 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,7 @@ com.github.SkriptLang Skript - 2.5.3 + 2.6-alpha1 provided diff --git a/src/main/java/com/btk5h/skriptdb/events/SQLQueryCompleteEvent.java b/src/main/java/com/btk5h/skriptdb/events/SQLQueryCompleteEvent.java index 75e613a..969582f 100644 --- a/src/main/java/com/btk5h/skriptdb/events/SQLQueryCompleteEvent.java +++ b/src/main/java/com/btk5h/skriptdb/events/SQLQueryCompleteEvent.java @@ -5,13 +5,18 @@ import org.bukkit.event.HandlerList; public class SQLQueryCompleteEvent extends Event { private final static HandlerList HANDLERS = new HandlerList(); - private String argument; + private final String argument; public SQLQueryCompleteEvent(String argument) { super(true); this.argument = argument; - // this.variables = variables; + // this.variables = variables; } + + public static HandlerList getHandlerList() { + return HANDLERS; + } + @Override public String getEventName() { return super.getEventName(); @@ -21,13 +26,10 @@ public class SQLQueryCompleteEvent extends Event { public HandlerList getHandlers() { return HANDLERS; } - public static HandlerList getHandlerList() { - return HANDLERS; - } public String getQuery() { return argument; } - // public String getVariables() {return;} + // public String getVariables() {return;} } diff --git a/src/main/java/com/btk5h/skriptdb/skript/EffExecuteStatement.java b/src/main/java/com/btk5h/skriptdb/skript/EffExecuteStatement.java index a26e237..796effc 100644 --- a/src/main/java/com/btk5h/skriptdb/skript/EffExecuteStatement.java +++ b/src/main/java/com/btk5h/skriptdb/skript/EffExecuteStatement.java @@ -8,7 +8,6 @@ import ch.njol.util.Kleenean; import ch.njol.util.Pair; import com.btk5h.skriptdb.SkriptDB; import com.btk5h.skriptdb.SkriptUtil; -import com.btk5h.skriptdb.events.SQLQueryCompleteEvent; import com.zaxxer.hikari.HikariDataSource; import org.bukkit.Bukkit; import org.bukkit.event.Event; @@ -42,288 +41,291 @@ import java.util.concurrent.Executors; * @since 0.1.0 */ public class EffExecuteStatement extends Effect { - static { - Skript.registerEffect(EffExecuteStatement.class, - "execute %string% (in|on) %datasource% " + - "[and store [[the] (output|result)[s]] (to|in) [the] [var[iable]] %-objects%]", "quickly execute %string% (in|on) %datasource% " + - "[and store [[the] (output|result)[s]] (to|in) [the] [var[iable]] %-objects%]"); - } + private static final ExecutorService threadPool = + Executors.newCachedThreadPool(); + static String lastError; - static String lastError; - - private static final ExecutorService threadPool = - Executors.newCachedThreadPool(); - - private Expression query; - private Expression dataSource; - private VariableString var; - private boolean isLocal; - private boolean isList; - private boolean isSync; - - private void continueScriptExecution(Event e, Object populatedVariables) { - lastError = null; - if (populatedVariables instanceof String) { - lastError = (String) populatedVariables; - } else { - - if (getNext() != null) { - ((Map) populatedVariables).forEach((name, value) -> setVariable(e, name, value)); - } - } - TriggerItem.walk(getNext(), e); - } - @Override - protected void execute(Event e) { - DataSource ds = dataSource.getSingle(e); - Pair> query = parseQuery(e); - String baseVariable = var != null ? var.toString(e).toLowerCase(Locale.ENGLISH) : null; - //if data source isn't set - if (ds == null) return; - - boolean sync = false; - - //if current thread is not main thread, then make this query to not have delays - - if (!Bukkit.isPrimaryThread()) { - sync = true; - } - Object locals = Variables.removeLocals(e); - - //execute SQL statement - CompletableFuture sql = - CompletableFuture.supplyAsync(() -> executeStatement(ds, baseVariable, query), threadPool); - - //when SQL statement is completed - boolean finalSync = sync; - sql.whenComplete((res, err) -> { - if (err != null) { err.printStackTrace(); } - - //handle last error syntax data - lastError = null; - if (res instanceof String) { - lastError = (String) res; - } - - if (getNext() != null) { - //if local variables are present - if (locals != null) - //bring back local variables - - //populate SQL data into variables - if (!(res instanceof String)) { - - //also set variables in the sql query complete event - - //TEMPORARILY DISABLED, AS THIS WOULD WORSEN PERFORMANCE OF THE QUERIES AND NOT BE USED BY MOST PEOPLE. - //I may add config option to enable this later? - - //SQLQueryCompleteEvent event = new SQLQueryCompleteEvent(this.query.getSingle(e)); - //((Map) res).forEach((name, value) -> setVariable(event, name, value)); - //SkriptDB.getPlugin(SkriptDB.class).getServer().getPluginManager().callEvent(event); - } - if (isSync || finalSync) { - - Variables.setLocalVariables(e, locals); - if (!(res instanceof String)) { ((Map) res).forEach((name, value) -> setVariable(e, name, value)); } - TriggerItem.walk(getNext(), e); - Variables.removeLocals(e); - } else { - Bukkit.getScheduler().runTask(SkriptDB.getInstance(), () -> { - 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); - }); - } - } - }); - } - - @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); - } - execute(e); - return null; - } - - private Pair> parseQuery(Event e) { - if (!(query instanceof VariableString)) { - return new Pair<>(query.getSingle(e), null); - } - VariableString q = (VariableString) query; - if (q.isSimple()) { - return new Pair<>(q.toString(e), null); + static { + Skript.registerEffect(EffExecuteStatement.class, + "execute %string% (in|on) %datasource% " + + "[and store [[the] (output|result)[s]] (to|in) [the] [var[iable]] %-objects%]", "quickly execute %string% (in|on) %datasource% " + + "[and store [[the] (output|result)[s]] (to|in) [the] [var[iable]] %-objects%]"); } - StringBuilder sb = new StringBuilder(); - List parameters = new ArrayList<>(); - Object[] objects = SkriptUtil.getTemplateString(q); + private Expression query; + private Expression dataSource; + private VariableString var; + private boolean isLocal; + private boolean isList; + private boolean isSync; - for (int i = 0; i < objects.length; i++) { - Object o = objects[i]; - if (o instanceof String) { - sb.append(o); - } else { - Expression expr = SkriptUtil.getExpressionFromInfo(o); - - String before = getString(objects, i - 1); - String after = getString(objects, i + 1); - boolean standaloneString = false; - - if (before != null && after != null) { - if (before.endsWith("'") && after.endsWith("'")) { - standaloneString = true; - } - } - - Object expressionValue = expr.getSingle(e); - - if (expr instanceof ExprUnsafe) { - sb.append(expressionValue); - - if (standaloneString && expressionValue instanceof String) { - String rawExpression = ((ExprUnsafe) expr).getRawExpression(); - Skript.warning( - String.format("Unsafe may have been used unnecessarily. Try replacing 'unsafe %1$s' with %1$s", - rawExpression)); - } + private void continueScriptExecution(Event e, Object populatedVariables) { + lastError = null; + if (populatedVariables instanceof String) { + lastError = (String) populatedVariables; } else { - parameters.add(expressionValue); - sb.append('?'); - if (standaloneString) { - Skript.warning("Do not surround expressions with quotes!"); - } + if (getNext() != null) { + ((Map) populatedVariables).forEach((name, value) -> setVariable(e, name, value)); + } } - } + TriggerItem.walk(getNext(), e); } - return new Pair<>(sb.toString(), parameters); - } - private Object executeStatement(DataSource ds, String baseVariable, Pair> query) { - if (ds == null) { - return "Data source is not set"; - } - Map variableList = new HashMap<>(); - try (Connection conn = ds.getConnection(); - PreparedStatement stmt = createStatement(conn, query)) { + @Override + protected void execute(Event e) { + DataSource ds = dataSource.getSingle(e); + Pair> query = parseQuery(e); + String baseVariable = var != null ? var.toString(e).toLowerCase(Locale.ENGLISH) : null; + //if data source isn't set + if (ds == null) return; - boolean hasResultSet = stmt.execute(); + boolean sync = !Bukkit.isPrimaryThread(); - if (baseVariable != null) { - if (isList) { - baseVariable = baseVariable.substring(0, baseVariable.length() - 1); - } + //if current thread is not main thread, then make this query to not have delays - if (hasResultSet) { - CachedRowSet crs = SkriptDB.getRowSetFactory().createCachedRowSet(); - crs.populate(stmt.getResultSet()); + Object locals = Variables.removeLocals(e); - if (isList) { - ResultSetMetaData meta = crs.getMetaData(); - int columnCount = meta.getColumnCount(); + //execute SQL statement + CompletableFuture sql = + CompletableFuture.supplyAsync(() -> executeStatement(ds, baseVariable, query), threadPool); - for (int i = 1; i <= columnCount; i++) { - String label = meta.getColumnLabel(i); - variableList.put(baseVariable + label, label); - } + //when SQL statement is completed + boolean finalSync = sync; + sql.whenComplete((res, err) -> { + if (err != null) { + err.printStackTrace(); + } - int rowNumber = 1; - try { - while (crs.next()) { - for (int i = 1; i <= columnCount; i++) { - variableList.put(baseVariable + meta.getColumnLabel(i).toLowerCase(Locale.ENGLISH) - + Variable.SEPARATOR + rowNumber, crs.getObject(i)); - } - rowNumber++; + //handle last error syntax data + lastError = null; + if (res instanceof String) { + lastError = (String) res; + } + + if (getNext() != null) { + //if local variables are present + if (locals != null) + //bring back local variables + + //populate SQL data into variables + if (!(res instanceof String)) { + + //also set variables in the sql query complete event + + //TEMPORARILY DISABLED, AS THIS WOULD WORSEN PERFORMANCE OF THE QUERIES AND NOT BE USED BY MOST PEOPLE. + //I may add config option to enable this later? + + //SQLQueryCompleteEvent event = new SQLQueryCompleteEvent(this.query.getSingle(e)); + //((Map) res).forEach((name, value) -> setVariable(event, name, value)); + //SkriptDB.getPlugin(SkriptDB.class).getServer().getPluginManager().callEvent(event); + } + if (isSync || finalSync) { + + Variables.setLocalVariables(e, locals); + if (!(res instanceof String)) { + ((Map) res).forEach((name, value) -> setVariable(e, name, value)); + } + TriggerItem.walk(getNext(), e); + Variables.removeLocals(e); + } else { + Bukkit.getScheduler().runTask(SkriptDB.getInstance(), () -> { + 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); + }); } - } catch (SQLException ex) { - return ex.getMessage(); - } - } else { - crs.last(); - variableList.put(baseVariable, crs.getRow()); - } - } else if (!isList) { - //if no results are returned and the specified variable isn't a list variable, put the affected rows count in the variable - variableList.put(baseVariable, stmt.getUpdateCount()); + } + }); + } + + @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); } - } - } catch (SQLException ex) { - return ex.getMessage(); - } - return variableList; - } - - private PreparedStatement createStatement(Connection conn, Pair> query) throws SQLException { - PreparedStatement stmt = conn.prepareStatement(query.getFirst()); - List parameters = query.getSecond(); - - if (parameters != null) { - for (int i = 0; i < parameters.size(); i++) { - stmt.setObject(i + 1, parameters.get(i)); - } + execute(e); + return null; } - return stmt; - } + private Pair> parseQuery(Event e) { + if (!(query instanceof VariableString)) { + return new Pair<>(query.getSingle(e), null); + } + VariableString q = (VariableString) query; + if (q.isSimple()) { + return new Pair<>(q.toString(e), null); + } - private String getString(Object[] objects, int index) { - if (index < 0 || index >= objects.length) { - return null; + StringBuilder sb = new StringBuilder(); + List parameters = new ArrayList<>(); + Object[] objects = SkriptUtil.getTemplateString(q); + + for (int i = 0; i < objects.length; i++) { + Object o = objects[i]; + if (o instanceof String) { + sb.append(o); + } else { + Expression expr = SkriptUtil.getExpressionFromInfo(o); + + String before = getString(objects, i - 1); + String after = getString(objects, i + 1); + boolean standaloneString = false; + + if (before != null && after != null) { + if (before.endsWith("'") && after.endsWith("'")) { + standaloneString = true; + } + } + + Object expressionValue = expr.getSingle(e); + + if (expr instanceof ExprUnsafe) { + sb.append(expressionValue); + + if (standaloneString && expressionValue instanceof String) { + String rawExpression = ((ExprUnsafe) expr).getRawExpression(); + Skript.warning( + String.format("Unsafe may have been used unnecessarily. Try replacing 'unsafe %1$s' with %1$s", + rawExpression)); + } + } else { + parameters.add(expressionValue); + sb.append('?'); + + if (standaloneString) { + Skript.warning("Do not surround expressions with quotes!"); + } + } + } + } + return new Pair<>(sb.toString(), parameters); } - Object object = objects[index]; + private Object executeStatement(DataSource ds, String baseVariable, Pair> query) { + if (ds == null) { + return "Data source is not set"; + } + Map variableList = new HashMap<>(); + try (Connection conn = ds.getConnection(); + PreparedStatement stmt = createStatement(conn, query)) { - if (object instanceof String) { - return (String) object; + boolean hasResultSet = stmt.execute(); + + if (baseVariable != null) { + if (isList) { + baseVariable = baseVariable.substring(0, baseVariable.length() - 1); + } + + if (hasResultSet) { + CachedRowSet crs = SkriptDB.getRowSetFactory().createCachedRowSet(); + crs.populate(stmt.getResultSet()); + + if (isList) { + ResultSetMetaData meta = crs.getMetaData(); + int columnCount = meta.getColumnCount(); + + for (int i = 1; i <= columnCount; i++) { + String label = meta.getColumnLabel(i); + variableList.put(baseVariable + label, label); + } + + int rowNumber = 1; + try { + while (crs.next()) { + for (int i = 1; i <= columnCount; i++) { + variableList.put(baseVariable + meta.getColumnLabel(i).toLowerCase(Locale.ENGLISH) + + Variable.SEPARATOR + rowNumber, crs.getObject(i)); + } + rowNumber++; + } + } catch (SQLException ex) { + return ex.getMessage(); + } + } else { + crs.last(); + variableList.put(baseVariable, crs.getRow()); + } + } else if (!isList) { + //if no results are returned and the specified variable isn't a list variable, put the affected rows count in the variable + variableList.put(baseVariable, stmt.getUpdateCount()); + } + } + } catch (SQLException ex) { + return ex.getMessage(); + } + return variableList; } - return null; - } + private PreparedStatement createStatement(Connection conn, Pair> query) throws SQLException { + PreparedStatement stmt = conn.prepareStatement(query.getFirst()); + List parameters = query.getSecond(); - private void setVariable(Event e, String name, Object obj) { - Variables.setVariable(name.toLowerCase(Locale.ENGLISH), obj, e, isLocal); - } + if (parameters != null) { + for (int i = 0; i < parameters.size(); i++) { + stmt.setObject(i + 1, parameters.get(i)); + } + } - @Override - public String toString(Event e, boolean debug) { - return "execute " + query.toString(e, debug) + " in " + dataSource.toString(e, debug); - } - - @SuppressWarnings("unchecked") - @Override - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, - SkriptParser.ParseResult parseResult) { - Expression statementExpr = (Expression) exprs[0]; - if (statementExpr instanceof VariableString || statementExpr instanceof ExprUnsafe) { - query = statementExpr; - } else { - Skript.error("Database statements must be string literals. If you must use an expression, " + - "you may use \"%unsafe (your expression)%\", but keep in mind, you may be vulnerable " + - "to SQL injection attacks!"); - return false; + return stmt; } - dataSource = (Expression) exprs[1]; - Expression expr = exprs[2]; - isSync = matchedPattern == 1; - if (expr instanceof Variable) { - Variable varExpr = (Variable) expr; - var = varExpr.getName(); - isLocal = varExpr.isLocal(); - isList = varExpr.isList(); - } else if (expr != null) { - Skript.error(expr + " is not a variable"); - return false; + + private String getString(Object[] objects, int index) { + if (index < 0 || index >= objects.length) { + return null; + } + + Object object = objects[index]; + + if (object instanceof String) { + return (String) object; + } + + return null; + } + + private void setVariable(Event e, String name, Object obj) { + Variables.setVariable(name.toLowerCase(Locale.ENGLISH), obj, e, isLocal); + } + + @Override + public String toString(Event e, boolean debug) { + return "execute " + query.toString(e, debug) + " in " + dataSource.toString(e, debug); + } + + @SuppressWarnings("unchecked") + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, + SkriptParser.ParseResult parseResult) { + Expression statementExpr = (Expression) exprs[0]; + if (statementExpr instanceof VariableString || statementExpr instanceof ExprUnsafe) { + query = statementExpr; + } else { + Skript.error("Database statements must be string literals. If you must use an expression, " + + "you may use \"%unsafe (your expression)%\", but keep in mind, you may be vulnerable " + + "to SQL injection attacks!"); + return false; + } + dataSource = (Expression) exprs[1]; + Expression expr = exprs[2]; + isSync = matchedPattern == 1; + if (expr instanceof Variable) { + Variable varExpr = (Variable) expr; + var = varExpr.getName(); + isLocal = varExpr.isLocal(); + isList = varExpr.isList(); + } else if (expr != null) { + Skript.error(expr + " is not a variable"); + return false; + } + return true; } - return true; - } } diff --git a/src/main/java/com/btk5h/skriptdb/skript/EvtSQLQueryComplete.java b/src/main/java/com/btk5h/skriptdb/skript/EvtSQLQueryComplete.java index 98bc531..5dab244 100644 --- a/src/main/java/com/btk5h/skriptdb/skript/EvtSQLQueryComplete.java +++ b/src/main/java/com/btk5h/skriptdb/skript/EvtSQLQueryComplete.java @@ -12,15 +12,16 @@ public class EvtSQLQueryComplete extends SkriptEvent { static { Skript.registerEvent("complete of sql query", EvtSQLQueryComplete.class, SQLQueryCompleteEvent.class, "complete of [(sql|database)] query"); } - @Override - public boolean init(final Literal[] literals, final int i, final SkriptParser.ParseResult parseResult) { - return true; - } - @Override - public boolean check(Event event) { - return (event instanceof SQLQueryCompleteEvent); - } + @Override + public boolean init(final Literal[] literals, final int i, final SkriptParser.ParseResult parseResult) { + return true; + } + + @Override + public boolean check(Event event) { + return (event instanceof SQLQueryCompleteEvent); + } @Override public String toString(@Nullable Event event, boolean debug) { diff --git a/src/main/java/com/btk5h/skriptdb/skript/ExprDBError.java b/src/main/java/com/btk5h/skriptdb/skript/ExprDBError.java index b4f3d45..f334d42 100644 --- a/src/main/java/com/btk5h/skriptdb/skript/ExprDBError.java +++ b/src/main/java/com/btk5h/skriptdb/skript/ExprDBError.java @@ -1,13 +1,12 @@ package com.btk5h.skriptdb.skript; -import org.bukkit.event.Event; - import ch.njol.skript.Skript; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; +import org.bukkit.event.Event; /** * Stores the error from the last executed statement, if there was one. @@ -18,33 +17,33 @@ import ch.njol.util.Kleenean; * @since 0.1.0 */ public class ExprDBError extends SimpleExpression { - static { - Skript.registerExpression(ExprDBError.class, String.class, - ExpressionType.SIMPLE, "[the] [last] (sql|db|data(base|[ ]source)) error"); - } + static { + Skript.registerExpression(ExprDBError.class, String.class, + ExpressionType.SIMPLE, "[the] [last] (sql|db|data(base|[ ]source)) error"); + } - @Override - protected String[] get(Event e) { - return new String[]{EffExecuteStatement.lastError}; - } + @Override + protected String[] get(Event e) { + return new String[]{EffExecuteStatement.lastError}; + } - @Override - public boolean isSingle() { - return true; - } + @Override + public boolean isSingle() { + return true; + } - @Override - public Class getReturnType() { - return String.class; - } + @Override + public Class getReturnType() { + return String.class; + } - @Override - public String toString(Event e, boolean debug) { - return "last database error"; - } + @Override + public String toString(Event e, boolean debug) { + return "last database error"; + } - @Override - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { - return true; - } + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) { + return true; + } } diff --git a/src/main/java/com/btk5h/skriptdb/skript/ExprDataSource.java b/src/main/java/com/btk5h/skriptdb/skript/ExprDataSource.java index 869418d..dd54e8a 100644 --- a/src/main/java/com/btk5h/skriptdb/skript/ExprDataSource.java +++ b/src/main/java/com/btk5h/skriptdb/skript/ExprDataSource.java @@ -1,13 +1,5 @@ package com.btk5h.skriptdb.skript; -import com.btk5h.skriptdb.SkriptDB; -import com.zaxxer.hikari.HikariDataSource; - -import org.bukkit.event.Event; - -import java.util.HashMap; -import java.util.Map; - import ch.njol.skript.Skript; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; @@ -15,11 +7,17 @@ import ch.njol.skript.lang.SkriptParser; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.skript.util.Timespan; import ch.njol.util.Kleenean; +import com.btk5h.skriptdb.SkriptDB; +import com.zaxxer.hikari.HikariDataSource; +import org.bukkit.event.Event; + +import java.util.HashMap; +import java.util.Map; /** * Stores the connection information for a data source. This should be saved to a variable in a * `script load` event or manually through an effect command. - * + *

* The url format for your database may vary! The example provided uses a MySQL database. * * @name Data Source @@ -30,74 +28,74 @@ import ch.njol.util.Kleenean; * @since 0.1.0 */ public class ExprDataSource extends SimpleExpression { - static { - Skript.registerExpression(ExprDataSource.class, HikariDataSource.class, - ExpressionType.COMBINED, "[the] data(base|[ ]source) [(of|at)] %string% " + - "[with [a] [max[imum]] [connection] life[ ]time of %-timespan%]"); - } + private static final Map connectionCache = new HashMap<>(); - private static Map connectionCache = new HashMap<>(); - - private Expression url; - private Expression maxLifetime; - - @Override - protected HikariDataSource[] get(Event e) { - String jdbcUrl = url.getSingle(e); - if (jdbcUrl == null) { - return null; + static { + Skript.registerExpression(ExprDataSource.class, HikariDataSource.class, + ExpressionType.COMBINED, "[the] data(base|[ ]source) [(of|at)] %string% " + + "[with [a] [max[imum]] [connection] life[ ]time of %-timespan%]"); } - if (!jdbcUrl.startsWith("jdbc:")) { - jdbcUrl = "jdbc:" + jdbcUrl; + private Expression url; + private Expression maxLifetime; + + @Override + protected HikariDataSource[] get(Event e) { + String jdbcUrl = url.getSingle(e); + if (jdbcUrl == null) { + return null; + } + + if (!jdbcUrl.startsWith("jdbc:")) { + jdbcUrl = "jdbc:" + jdbcUrl; + } + + if (connectionCache.containsKey(jdbcUrl)) { + return new HikariDataSource[]{connectionCache.get(jdbcUrl)}; + } + + HikariDataSource ds = new HikariDataSource(); + + //allow specifying of own sql driver class name + if (!SkriptDB.getInstance().getConfig().getString("sql-driver-class-name", "default").equals("default")) { + ds.setDriverClassName(SkriptDB.getInstance().getConfig().getString("sql-driver-class-name")); + } + ds.setJdbcUrl(jdbcUrl); + + if (maxLifetime != null) { + Timespan l = maxLifetime.getSingle(e); + + if (l != null) { + ds.setMaxLifetime(l.getMilliSeconds()); + } + } + + connectionCache.put(jdbcUrl, ds); + + return new HikariDataSource[]{ds}; } - if (connectionCache.containsKey(jdbcUrl)) { - return new HikariDataSource[]{connectionCache.get(jdbcUrl)}; + @Override + public boolean isSingle() { + return true; } - HikariDataSource ds = new HikariDataSource(); - - //allow specifying of own sql driver class name - if (!SkriptDB.getInstance().getConfig().getString("sql-driver-class-name", "default").equals("default")) { - ds.setDriverClassName(SkriptDB.getInstance().getConfig().getString("sql-driver-class-name")); - } - ds.setJdbcUrl(jdbcUrl); - - if (maxLifetime != null) { - Timespan l = maxLifetime.getSingle(e); - - if (l != null) { - ds.setMaxLifetime(l.getMilliSeconds()); - } + @Override + public Class getReturnType() { + return HikariDataSource.class; } - connectionCache.put(jdbcUrl, ds); + @Override + public String toString(Event e, boolean debug) { + return "datasource " + url.toString(e, debug); + } - return new HikariDataSource[]{ds}; - } - - @Override - public boolean isSingle() { - return true; - } - - @Override - public Class getReturnType() { - return HikariDataSource.class; - } - - @Override - public String toString(Event e, boolean debug) { - return "datasource " + url.toString(e, debug); - } - - @SuppressWarnings("unchecked") - @Override - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, - SkriptParser.ParseResult parseResult) { - url = (Expression) exprs[0]; - maxLifetime = (Expression) exprs[1]; - return true; - } + @SuppressWarnings("unchecked") + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, + SkriptParser.ParseResult parseResult) { + url = (Expression) exprs[0]; + maxLifetime = (Expression) exprs[1]; + return true; + } } diff --git a/src/main/java/com/btk5h/skriptdb/skript/ExprSQLQuery.java b/src/main/java/com/btk5h/skriptdb/skript/ExprSQLQuery.java index e27e3ec..b44e47b 100644 --- a/src/main/java/com/btk5h/skriptdb/skript/ExprSQLQuery.java +++ b/src/main/java/com/btk5h/skriptdb/skript/ExprSQLQuery.java @@ -20,41 +20,41 @@ import org.bukkit.event.Event; * @since 0.1.0 */ public class ExprSQLQuery extends SimpleExpression { - static { - Skript.registerExpression(ExprSQLQuery.class, String.class, - ExpressionType.SIMPLE, "sql query"); - } - - - @Override - protected String[] get(Event e) { - if (e instanceof SQLQueryCompleteEvent){ - return new String[]{((SQLQueryCompleteEvent) e).getQuery()}; + static { + Skript.registerExpression(ExprSQLQuery.class, String.class, + ExpressionType.SIMPLE, "sql query"); } - return null; - } - @Override - public boolean isSingle() { - return true; - } - @Override - public Class getReturnType() { - return String.class; - } - - @Override - public String toString(Event e, boolean debug) { - return "sql query"; - } - - @Override - public boolean init(final Expression[] expressions, final int matchedPattern, final Kleenean isDelayed, final SkriptParser.ParseResult parseResult) { - if (!ScriptLoader.isCurrentEvent(SQLQueryCompleteEvent.class)) { - Skript.error("Cannot use 'sql query' outside of a complete of sql query event", ErrorQuality.SEMANTIC_ERROR); - return false; + @Override + protected String[] get(Event e) { + if (e instanceof SQLQueryCompleteEvent) { + return new String[]{((SQLQueryCompleteEvent) e).getQuery()}; + } + return null; + } + + @Override + public boolean isSingle() { + return true; + } + + @Override + public Class getReturnType() { + return String.class; + } + + @Override + public String toString(Event e, boolean debug) { + return "sql query"; + } + + @Override + public boolean init(final Expression[] expressions, final int matchedPattern, final Kleenean isDelayed, final SkriptParser.ParseResult parseResult) { + if (!ScriptLoader.isCurrentEvent(SQLQueryCompleteEvent.class)) { + Skript.error("Cannot use 'sql query' outside of a complete of sql query event", ErrorQuality.SEMANTIC_ERROR); + return false; + } + return true; } - return true; - } } diff --git a/src/main/java/com/btk5h/skriptdb/skript/ExprUnsafe.java b/src/main/java/com/btk5h/skriptdb/skript/ExprUnsafe.java index b557d79..44602ab 100644 --- a/src/main/java/com/btk5h/skriptdb/skript/ExprUnsafe.java +++ b/src/main/java/com/btk5h/skriptdb/skript/ExprUnsafe.java @@ -1,13 +1,12 @@ package com.btk5h.skriptdb.skript; -import org.bukkit.event.Event; - import ch.njol.skript.Skript; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; +import org.bukkit.event.Event; /** * Opts out of automatic SQL injection protection for a specific expression in a statement. @@ -20,44 +19,44 @@ import ch.njol.util.Kleenean; * @since 0.1.0 */ public class ExprUnsafe extends SimpleExpression { - static { - Skript.registerExpression(ExprUnsafe.class, String.class, ExpressionType.COMBINED, - "unsafe %string%"); - } + static { + Skript.registerExpression(ExprUnsafe.class, String.class, ExpressionType.COMBINED, + "unsafe %string%"); + } - private Expression stringExpression; - private String rawExpression; + private Expression stringExpression; + private String rawExpression; - public String getRawExpression() { - return rawExpression; - } + public String getRawExpression() { + return rawExpression; + } - @Override - protected String[] get(Event e) { - return stringExpression.getArray(e); - } + @Override + protected String[] get(Event e) { + return stringExpression.getArray(e); + } - @Override - public boolean isSingle() { - return true; - } + @Override + public boolean isSingle() { + return true; + } - @Override - public Class getReturnType() { - return String.class; - } + @Override + public Class getReturnType() { + return String.class; + } - @Override - public String toString(Event e, boolean debug) { - return "unsafe " + stringExpression.toString(e, debug); - } + @Override + public String toString(Event e, boolean debug) { + return "unsafe " + stringExpression.toString(e, debug); + } - @SuppressWarnings("unchecked") - @Override - public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, - SkriptParser.ParseResult parseResult) { - stringExpression = (Expression) exprs[0]; - rawExpression = parseResult.expr.substring("unsafe".length()).trim(); - return true; - } + @SuppressWarnings("unchecked") + @Override + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, + SkriptParser.ParseResult parseResult) { + stringExpression = (Expression) exprs[0]; + rawExpression = parseResult.expr.substring("unsafe".length()).trim(); + return true; + } } diff --git a/src/main/java/com/btk5h/skriptdb/skript/Types.java b/src/main/java/com/btk5h/skriptdb/skript/Types.java index ca70830..6efc304 100644 --- a/src/main/java/com/btk5h/skriptdb/skript/Types.java +++ b/src/main/java/com/btk5h/skriptdb/skript/Types.java @@ -11,58 +11,58 @@ import com.zaxxer.hikari.HikariDataSource; import java.io.StreamCorruptedException; public class Types { - static { - Classes.registerClass(new ClassInfo<>(HikariDataSource.class, "datasource") - .user("datasources?") - .parser(new Parser() { - @Override - public HikariDataSource parse(String s, ParseContext context) { - return null; - } + static { + Classes.registerClass(new ClassInfo<>(HikariDataSource.class, "datasource") + .user("datasources?") + .parser(new Parser() { + @Override + public HikariDataSource parse(String s, ParseContext context) { + return null; + } - @Override - public String toString(HikariDataSource o, int flags) { - return o.getJdbcUrl(); - } + @Override + public String toString(HikariDataSource o, int flags) { + return o.getJdbcUrl(); + } - @Override - public String toVariableNameString(HikariDataSource o) { - return o.getJdbcUrl(); - } + @Override + public String toVariableNameString(HikariDataSource o) { + return o.getJdbcUrl(); + } - @Override - public String getVariableNamePattern() { - return "jdbc:.+"; - } - }) - .serializer(new Serializer() { - @Override - public Fields serialize(HikariDataSource o) { - Fields fields = new Fields(); - fields.putObject("jdbcurl", o.getJdbcUrl()); - return fields; - } + @Override + public String getVariableNamePattern() { + return "jdbc:.+"; + } + }) + .serializer(new Serializer() { + @Override + public Fields serialize(HikariDataSource o) { + Fields fields = new Fields(); + fields.putObject("jdbcurl", o.getJdbcUrl()); + return fields; + } - @Override - public void deserialize(HikariDataSource o, Fields f) { - } + @Override + public void deserialize(HikariDataSource o, Fields f) { + } - @Override - protected HikariDataSource deserialize(Fields fields) throws StreamCorruptedException { - HikariDataSource ds = new HikariDataSource(); - ds.setJdbcUrl((String) fields.getObject("jdbcurl")); - return ds; - } + @Override + protected HikariDataSource deserialize(Fields fields) throws StreamCorruptedException { + HikariDataSource ds = new HikariDataSource(); + ds.setJdbcUrl((String) fields.getObject("jdbcurl")); + return ds; + } - @Override - public boolean mustSyncDeserialization() { - return false; - } + @Override + public boolean mustSyncDeserialization() { + return false; + } - @Override - protected boolean canBeInstantiated() { - return false; - } - })); - } + @Override + protected boolean canBeInstantiated() { + return false; + } + })); + } }