Added additional arguments info in prepared statement warning
This commit is contained in:
parent
0670f88a4e
commit
99be47d4d3
@ -21,8 +21,10 @@ import java.sql.Connection;
|
|||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSetMetaData;
|
import java.sql.ResultSetMetaData;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.CompletionException;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@ -52,7 +54,7 @@ public class EffExecuteStatement extends Effect {
|
|||||||
static {
|
static {
|
||||||
Skript.registerEffect(EffExecuteStatement.class,
|
Skript.registerEffect(EffExecuteStatement.class,
|
||||||
"[quickly:quickly] execute %string% (in|on) %datasource% " +
|
"[quickly:quickly] execute %string% (in|on) %datasource% " +
|
||||||
"[with arg[ument][s] %-objects%] [and store [[the] (output|result)[s]] (to|in) [the] [var[iable]] %-objects%]");
|
"[with arg[ument][s] %-objects%] [and store [[the] [keys:generated keys] (output|result)[s]] (to|in) [the] [var[iable]] %-objects%]");
|
||||||
}
|
}
|
||||||
|
|
||||||
private Expression<String> query;
|
private Expression<String> query;
|
||||||
@ -62,6 +64,7 @@ public class EffExecuteStatement extends Effect {
|
|||||||
private boolean isLocal;
|
private boolean isLocal;
|
||||||
private boolean isList;
|
private boolean isList;
|
||||||
private boolean quickly;
|
private boolean quickly;
|
||||||
|
private boolean generatedKeys;
|
||||||
private boolean isSync = false;
|
private boolean isSync = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -82,8 +85,8 @@ public class EffExecuteStatement extends Effect {
|
|||||||
.whenComplete((resources, err) -> {
|
.whenComplete((resources, err) -> {
|
||||||
//handle last error syntax data
|
//handle last error syntax data
|
||||||
resetLastSQLError();
|
resetLastSQLError();
|
||||||
if (err instanceof SkriptDBQueryException) {
|
if (err instanceof CompletionException && err.getCause() instanceof SkriptDBQueryException) {
|
||||||
setLastSQLError(err.getMessage());
|
setLastSQLError(err.getCause().getMessage());
|
||||||
}
|
}
|
||||||
//if local variables are present
|
//if local variables are present
|
||||||
//bring back local variables
|
//bring back local variables
|
||||||
@ -99,9 +102,9 @@ public class EffExecuteStatement extends Effect {
|
|||||||
} else {
|
} else {
|
||||||
isSync = true;
|
isSync = true;
|
||||||
Map<String, Object> resources = null;
|
Map<String, Object> resources = null;
|
||||||
|
resetLastSQLError();
|
||||||
try {
|
try {
|
||||||
resources = executeStatement(ds, baseVariable, parsedQuery);
|
resources = executeStatement(ds, baseVariable, parsedQuery);
|
||||||
resetLastSQLError();
|
|
||||||
} catch (SkriptDBQueryException err) {
|
} catch (SkriptDBQueryException err) {
|
||||||
//handle last error syntax data
|
//handle last error syntax data
|
||||||
setLastSQLError(err.getMessage());
|
setLastSQLError(err.getMessage());
|
||||||
@ -141,10 +144,16 @@ public class EffExecuteStatement extends Effect {
|
|||||||
String queryString = query.getSingle(e);
|
String queryString = query.getSingle(e);
|
||||||
int queryArgCount = (int) ARGUMENT_PLACEHOLDER.matcher(queryString).results().count();
|
int queryArgCount = (int) ARGUMENT_PLACEHOLDER.matcher(queryString).results().count();
|
||||||
if (queryArgCount != args.length) {
|
if (queryArgCount != args.length) {
|
||||||
Skript.warning("Your query has %d question marks, but you provided %d arguments.");
|
Skript.warning(String.format("Your query has %d question marks, but you provided %d arguments. (%s) [%s]",
|
||||||
|
queryArgCount,
|
||||||
|
args.length,
|
||||||
|
queryArguments.toString(e, true),
|
||||||
|
Optional.ofNullable(getTrigger())
|
||||||
|
.map(Trigger::getDebugLabel)
|
||||||
|
.orElse("unknown")));
|
||||||
args = Arrays.copyOf(args, queryArgCount);
|
args = Arrays.copyOf(args, queryArgCount);
|
||||||
}
|
}
|
||||||
return new Pair<>(query.getSingle(e), List.of(args));
|
return new Pair<>(query.getSingle(e), Arrays.asList(args));
|
||||||
} else if (query instanceof VariableString && !((VariableString) query).isSimple()) {
|
} else if (query instanceof VariableString && !((VariableString) query).isSimple()) {
|
||||||
return parseVariableQuery(e, (VariableString) query);
|
return parseVariableQuery(e, (VariableString) query);
|
||||||
}
|
}
|
||||||
@ -209,20 +218,19 @@ public class EffExecuteStatement extends Effect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, Object> processBaseVariable(String baseVariable, PreparedStatement stmt, boolean hasResultSet) throws SQLException {
|
private Map<String, Object> processBaseVariable(String baseVariable, PreparedStatement stmt, boolean hasResultSet) throws SQLException {
|
||||||
Map<String, Object> variableList = new HashMap<>();
|
|
||||||
if (isList) {
|
if (isList) {
|
||||||
baseVariable = baseVariable.substring(0, baseVariable.length() - 1);
|
baseVariable = baseVariable.substring(0, baseVariable.length() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasResultSet) {
|
if (hasResultSet) {
|
||||||
CachedRowSet crs = SkriptDB.getRowSetFactory().createCachedRowSet();
|
CachedRowSet crs = SkriptDB.getRowSetFactory().createCachedRowSet();
|
||||||
crs.populate(stmt.getResultSet());
|
crs.populate(generatedKeys ? stmt.getGeneratedKeys() : stmt.getResultSet());
|
||||||
|
|
||||||
if (isList) {
|
if (isList) {
|
||||||
return fetchQueryResultSet(crs, baseVariable);
|
return fetchQueryResultSet(crs, baseVariable);
|
||||||
} else {
|
} else {
|
||||||
crs.last();
|
crs.last();
|
||||||
variableList.put(baseVariable, crs.getRow());
|
return Map.of(baseVariable, crs.getRow());
|
||||||
}
|
}
|
||||||
} else if (!isList) {
|
} 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
|
//if no results are returned and the specified variable isn't a list variable, put the affected rows count in the variable
|
||||||
@ -253,7 +261,9 @@ public class EffExecuteStatement extends Effect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private PreparedStatement createStatement(Connection conn, Pair<String, List<Object>> query) throws SQLException {
|
private PreparedStatement createStatement(Connection conn, Pair<String, List<Object>> query) throws SQLException {
|
||||||
PreparedStatement stmt = conn.prepareStatement(query.getFirst());
|
PreparedStatement stmt = generatedKeys ?
|
||||||
|
conn.prepareStatement(query.getFirst(), Statement.RETURN_GENERATED_KEYS)
|
||||||
|
: conn.prepareStatement(query.getFirst(), Statement.NO_GENERATED_KEYS);
|
||||||
if (query.getSecond() != null) {
|
if (query.getSecond() != null) {
|
||||||
Iterator<Object> iter = query.getSecond().iterator();
|
Iterator<Object> iter = query.getSecond().iterator();
|
||||||
for (int i = 1; iter.hasNext(); i++) {
|
for (int i = 1; iter.hasNext(); i++) {
|
||||||
@ -328,6 +338,7 @@ public class EffExecuteStatement extends Effect {
|
|||||||
}
|
}
|
||||||
queryArguments = (Expression<Object>) exprs[2];
|
queryArguments = (Expression<Object>) exprs[2];
|
||||||
}
|
}
|
||||||
|
;
|
||||||
Expression<?> resultHolder = exprs[3];
|
Expression<?> resultHolder = exprs[3];
|
||||||
quickly = parseResult.hasTag("quickly");
|
quickly = parseResult.hasTag("quickly");
|
||||||
if (resultHolder instanceof Variable) {
|
if (resultHolder instanceof Variable) {
|
||||||
@ -335,6 +346,7 @@ public class EffExecuteStatement extends Effect {
|
|||||||
resultVariableName = varExpr.getName();
|
resultVariableName = varExpr.getName();
|
||||||
isLocal = varExpr.isLocal();
|
isLocal = varExpr.isLocal();
|
||||||
isList = varExpr.isList();
|
isList = varExpr.isList();
|
||||||
|
generatedKeys = parseResult.hasTag("keys");
|
||||||
} else if (resultHolder != null) {
|
} else if (resultHolder != null) {
|
||||||
Skript.error(resultHolder + " is not a variable");
|
Skript.error(resultHolder + " is not a variable");
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
Reference in New Issue
Block a user