提交 dea9d6af 编写于 作者: S serge-rider

SQL statements parameters formatting improved


Former-commit-id: bde93e4d
上级 23d4a4d8
......@@ -25,10 +25,4 @@ public interface DBCParameterizedStatement extends DBCStatement
String getFormattedQuery();
/**
* Forces parameters save (for script generation).
* Parameters save can be disabled due to performance reasons
*/
void forceParametersSave(boolean force);
}
......@@ -22,17 +22,19 @@ import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
import org.jkiss.dbeaver.model.data.DBDDataReceiver;
import org.jkiss.dbeaver.model.data.DBDDisplayFormat;
import org.jkiss.dbeaver.model.data.DBDValueHandler;
import org.jkiss.dbeaver.model.edit.DBEPersistAction;
import org.jkiss.dbeaver.model.exec.*;
import org.jkiss.dbeaver.model.impl.edit.SQLDatabasePersistAction;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.struct.DBSAttributeBase;
import org.jkiss.dbeaver.model.struct.DBSDataManipulator;
import org.jkiss.dbeaver.model.struct.DBSTypedObject;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.*;
/**
* Execute batch.
......@@ -142,9 +144,6 @@ public abstract class ExecuteBatchImpl implements DBSDataManipulator.ExecuteBatc
}
if (statement == null || !reuse) {
statement = prepareStatement(session, rowValues);
if (actions != null && statement instanceof DBCParameterizedStatement) {
((DBCParameterizedStatement) statement).forceParametersSave(true);
}
statistics.setQueryText(statement.getQueryString());
statistics.addStatementsCount();
}
......@@ -175,12 +174,7 @@ public abstract class ExecuteBatchImpl implements DBSDataManipulator.ExecuteBatc
}
}
} else {
String queryString;
if (statement instanceof DBCParameterizedStatement) {
queryString = ((DBCParameterizedStatement)statement).getFormattedQuery();
} else {
queryString = statement.getQueryString();
}
String queryString = formatQueryParameters(session, statement.getQueryString(), handlers, rowValues);
actions.add(
new SQLDatabasePersistAction(
"Execute statement",
......@@ -210,6 +204,59 @@ public abstract class ExecuteBatchImpl implements DBSDataManipulator.ExecuteBatc
return statistics;
}
private String formatQueryParameters(DBCSession session, String queryString, DBDValueHandler[] handlers, Object[] rowValues) {
if (handlers.length == 0) {
return queryString;
}
if (CommonUtils.isEmpty(queryString)) {
return queryString;
}
int length = queryString.length();
StringBuilder formatted = new StringBuilder(length * 2);
int paramIndex = 0;
for (int i = 0; i < length; i++) {
char c = queryString.charAt(i);
switch (c) {
case '?': {
if (paramIndex >= handlers.length) {
log.error("Parameter index out of range (" + paramIndex + " > " + handlers.length + ")");
continue;
}
Object paramValue = SQLUtils.convertValueToSQL(
session.getDataSource(),
attributes[paramIndex],
handlers[paramIndex],
rowValues[paramIndex]);
formatted.append(paramValue);
paramIndex++;
continue;
}
case ':': {
// FIXME: process named parameters
break;
}
case '\'':
case '"': {
formatted.append(c);
for (int k = i + 1; k < length; k++) {
char c2 = queryString.charAt(k);
if (c2 == c && queryString.charAt(k - 1) != '\\') {
i = k;
c = c2;
break;
} else {
formatted.append(c2);
}
}
break;
}
}
formatted.append(c);
}
return formatted.toString();
}
private void flushBatch(DBCStatistics statistics, DBCStatement statement) throws DBCException {
long startTime = System.currentTimeMillis();
int[] updatedRows = statement.executeStatementBatch();
......
......@@ -52,7 +52,6 @@ public class JDBCPreparedStatementImpl extends JDBCStatementImpl<PreparedStateme
private static final Object NULL_VALUE = new Object();
private Map<Object, Object> paramMap;
private boolean forceParametersSave;
protected static class ContentParameter {
String displayString;
......@@ -73,7 +72,7 @@ public class JDBCPreparedStatementImpl extends JDBCStatementImpl<PreparedStateme
}
}
public JDBCPreparedStatementImpl(
JDBCPreparedStatementImpl(
@NotNull JDBCSession connection,
@NotNull PreparedStatement original,
String query,
......@@ -148,11 +147,6 @@ public class JDBCPreparedStatementImpl extends JDBCStatementImpl<PreparedStateme
}
}
@Override
public void forceParametersSave(boolean force) {
this.forceParametersSave = force;
}
@NotNull
private String formatParameterValue(Object value) {
if (value instanceof CharSequence) {
......@@ -180,7 +174,7 @@ public class JDBCPreparedStatementImpl extends JDBCStatementImpl<PreparedStateme
protected void handleStatementBind(Object parameter, @Nullable Object o)
{
if (forceParametersSave || isQMLoggingEnabled()) {
if (isQMLoggingEnabled()) {
// Save parameters
if (o == null) {
o = NULL_VALUE;
......@@ -192,8 +186,7 @@ public class JDBCPreparedStatementImpl extends JDBCStatementImpl<PreparedStateme
paramMap = new LinkedHashMap<>();
}
paramMap.put(parameter, o);
}
if (isQMLoggingEnabled()) {
QMUtils.getDefaultHandler().handleStatementBind(this, parameter, o);
}
}
......
......@@ -560,10 +560,15 @@ public final class SQLUtils {
}
public static String convertValueToSQL(@NotNull DBPDataSource dataSource, @NotNull DBSAttributeBase attribute, @Nullable Object value) {
DBDValueHandler valueHandler = DBUtils.findValueHandler(dataSource, attribute);
return convertValueToSQL(dataSource, attribute, valueHandler, value);
}
public static String convertValueToSQL(@NotNull DBPDataSource dataSource, @NotNull DBSAttributeBase attribute, @NotNull DBDValueHandler valueHandler, @Nullable Object value) {
if (DBUtils.isNullValue(value)) {
return SQLConstants.NULL_VALUE;
}
DBDValueHandler valueHandler = DBUtils.findValueHandler(dataSource, attribute);
String strValue;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册