/
NikolayIvkin
/
sqlancer2
Обзор
Документация
Войти
/
NikolayIvkin
/
sqlancer2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/sqlancer/common/query/SQLQueryAdapter.java
150 строк
4 KB
Manuel Rigger
Address various new PMD issues
09 дек 2020, 01:28
09 дек 2020, 01:28
c8e8b9e
Код
Авторство
О чём код?
package sqlancer.common.query; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import sqlancer.GlobalState; import sqlancer.Main; import sqlancer.SQLConnection; public class SQLQueryAdapter extends Query<SQLConnection> { private final String query; private final ExpectedErrors expectedErrors; private final boolean couldAffectSchema; public SQLQueryAdapter(String query) { this(query, new ExpectedErrors()); } public SQLQueryAdapter(String query, boolean couldAffectSchema) { this(query, new ExpectedErrors(), couldAffectSchema); } public SQLQueryAdapter(String query, ExpectedErrors expectedErrors) { this(query, expectedErrors, false); } public SQLQueryAdapter(String query, ExpectedErrors expectedErrors, boolean couldAffectSchema) { this.query = canonicalizeString(query); this.expectedErrors = expectedErrors; this.couldAffectSchema = couldAffectSchema; checkQueryString(); } private String canonicalizeString(String s) { if (s.endsWith(";")) { return s; } else if (!s.contains("--")) { return s + ";"; } else { // query contains a comment return s; } } private void checkQueryString() { if (query.contains("CREATE TABLE") && !couldAffectSchema) { throw new AssertionError("CREATE TABLE statements should set couldAffectSchema to true"); } } @Override public String getQueryString() { return query; } @Override public String getUnterminatedQueryString() { String result; if (query.endsWith(";")) { result = query.substring(0, query.length() - 1); } else { result = query; } assert !result.endsWith(";"); return result; } @Override public <G extends GlobalState<?, ?, SQLConnection>> boolean execute(G globalState, String... fills) throws SQLException { Statement s; if (fills.length > 0) { s = globalState.getConnection().prepareStatement(fills[0]); for (int i = 1; i < fills.length; i++) { ((PreparedStatement) s).setString(i, fills[i]); } } else { s = globalState.getConnection().createStatement(); } try { if (fills.length > 0) { ((PreparedStatement) s).execute(); } else { s.execute(query); } Main.nrSuccessfulActions.addAndGet(1); return true; } catch (Exception e) { Main.nrUnsuccessfulActions.addAndGet(1); checkException(e); return false; } } public void checkException(Exception e) throws AssertionError { if (!expectedErrors.errorIsExpected(e.getMessage())) { throw new AssertionError(query, e); } } @Override public <G extends GlobalState<?, ?, SQLConnection>> SQLancerResultSet executeAndGet(G globalState, String... fills) throws SQLException { Statement s; if (fills.length > 0) { s = globalState.getConnection().prepareStatement(fills[0]); for (int i = 1; i < fills.length; i++) { ((PreparedStatement) s).setString(i, fills[i]); } } else { s = globalState.getConnection().createStatement(); } ResultSet result; try { if (fills.length > 0) { result = ((PreparedStatement) s).executeQuery(); } else { result = s.executeQuery(query); } Main.nrSuccessfulActions.addAndGet(1); if (result == null) { return null; } return new SQLancerResultSet(result); } catch (Exception e) { s.close(); Main.nrUnsuccessfulActions.addAndGet(1); checkException(e); } return null; } @Override public boolean couldAffectSchema() { return couldAffectSchema; } @Override public ExpectedErrors getExpectedErrors() { return expectedErrors; } @Override public String getLogString() { return getQueryString(); } }