diff --git a/server/api-service/openblocks-plugins/mssqlPlugin/pom.xml b/server/api-service/openblocks-plugins/mssqlPlugin/pom.xml
index 9e0512df..4dcd3163 100644
--- a/server/api-service/openblocks-plugins/mssqlPlugin/pom.xml
+++ b/server/api-service/openblocks-plugins/mssqlPlugin/pom.xml
@@ -58,6 +58,11 @@
+
+ org.assertj
+ assertj-core
+ test
+
diff --git a/server/api-service/openblocks-plugins/mssqlPlugin/src/main/java/com/openblocks/plugin/mssql/MssqlQueryExecutor.java b/server/api-service/openblocks-plugins/mssqlPlugin/src/main/java/com/openblocks/plugin/mssql/MssqlQueryExecutor.java
index 2a78262c..ef4f58a9 100644
--- a/server/api-service/openblocks-plugins/mssqlPlugin/src/main/java/com/openblocks/plugin/mssql/MssqlQueryExecutor.java
+++ b/server/api-service/openblocks-plugins/mssqlPlugin/src/main/java/com/openblocks/plugin/mssql/MssqlQueryExecutor.java
@@ -1,17 +1,19 @@
package com.openblocks.plugin.mssql;
+import static com.google.common.collect.Lists.newArrayList;
import static com.openblocks.plugin.mssql.util.MssqlStructureParser.parseTableAndColumns;
import static com.openblocks.sdk.exception.PluginCommonError.CONNECTION_ERROR;
import static com.openblocks.sdk.exception.PluginCommonError.DATASOURCE_GET_STRUCTURE_ERROR;
import static com.openblocks.sdk.exception.PluginCommonError.PREPARED_STATEMENT_BIND_PARAMETERS_ERROR;
import static com.openblocks.sdk.exception.PluginCommonError.QUERY_ARGUMENT_ERROR;
import static com.openblocks.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR;
-import static com.openblocks.sdk.plugin.common.QueryExecutionUtils.getIdenticalColumns;
import static com.openblocks.sdk.plugin.common.QueryExecutionUtils.querySharedScheduler;
+import static com.openblocks.sdk.util.ExceptionUtils.wrapException;
import static com.openblocks.sdk.util.JsonUtils.toJson;
import static com.openblocks.sdk.util.MustacheHelper.doPrepareStatement;
import static com.openblocks.sdk.util.MustacheHelper.extractMustacheKeysInOrder;
import static com.openblocks.sdk.util.MustacheHelper.renderMustacheString;
+import static org.apache.commons.lang3.ObjectUtils.firstNonNull;
import java.math.BigDecimal;
import java.sql.Connection;
@@ -30,9 +32,15 @@
import java.util.Map;
import java.util.function.Supplier;
+import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.pf4j.Extension;
+import com.openblocks.plugin.mssql.gui.MssqlBulkInsertCommand;
+import com.openblocks.plugin.mssql.gui.MssqlBulkUpdateCommand;
+import com.openblocks.plugin.mssql.gui.MssqlDeleteCommand;
+import com.openblocks.plugin.mssql.gui.MssqlInsertCommand;
+import com.openblocks.plugin.mssql.gui.MssqlUpdateCommand;
import com.openblocks.plugin.mssql.model.MssqlDatasourceConfig;
import com.openblocks.plugin.mssql.model.MssqlQueryConfig;
import com.openblocks.plugin.mssql.util.MssqlResultParser;
@@ -41,11 +49,12 @@
import com.openblocks.sdk.exception.PluginException;
import com.openblocks.sdk.models.DatasourceStructure;
import com.openblocks.sdk.models.DatasourceStructure.Table;
-import com.openblocks.sdk.models.LocaleMessage;
import com.openblocks.sdk.models.QueryExecutionResult;
import com.openblocks.sdk.plugin.common.QueryExecutor;
-import com.openblocks.sdk.plugin.common.sql.ResultSetParser;
+import com.openblocks.sdk.plugin.common.SqlQueryUtils;
import com.openblocks.sdk.plugin.common.sql.SqlBasedQueryExecutionContext;
+import com.openblocks.sdk.plugin.sqlcommand.GuiSqlCommand;
+import com.openblocks.sdk.plugin.sqlcommand.GuiSqlCommand.GuiSqlCommandRenderResult;
import com.openblocks.sdk.query.QueryVisitorContext;
import com.zaxxer.hikari.HikariDataSource;
@@ -69,11 +78,15 @@ public SqlBasedQueryExecutionContext buildQueryExecutionContext(MssqlDatasourceC
Map requestParams, QueryVisitorContext queryVisitorContext) {
MssqlQueryConfig mssqlQueryConfig = MssqlQueryConfig.from(queryConfig);
- String query = mssqlQueryConfig.getSql().trim();
- if (StringUtils.isBlank(query)) {
- throw new PluginException(QUERY_ARGUMENT_ERROR, "SQL_EMPTY");
+ if (mssqlQueryConfig.isGuiMode()) {
+ GuiSqlCommand sqlCommand = getGuiSqlCommand(mssqlQueryConfig);
+ return SqlBasedQueryExecutionContext.builder()
+ .guiSqlCommand(sqlCommand)
+ .requestParams(requestParams)
+ .build();
}
+ String query = SqlQueryUtils.removeQueryComments(mssqlQueryConfig.getSql().trim());
return SqlBasedQueryExecutionContext.builder()
.query(query)
.requestParams(requestParams)
@@ -86,10 +99,16 @@ public SqlBasedQueryExecutionContext buildQueryExecutionContext(MssqlDatasourceC
public Mono executeQuery(HikariDataSource hikariDataSource, SqlBasedQueryExecutionContext context) {
String query = context.getQuery();
+ GuiSqlCommand guiSqlCommand = context.getGuiSqlCommand();
+ boolean isGuiMode = guiSqlCommand != null;
Map requestParams = context.getRequestParams();
- boolean preparedStatement = !context.isDisablePreparedStatement();
+ if (StringUtils.isBlank(query) && !isGuiMode) {
+ throw new PluginException(QUERY_ARGUMENT_ERROR, "SQL_EMPTY");
+ }
+
+ boolean isPreparedStatement = isGuiMode || !context.isDisablePreparedStatement();
- return Mono.fromSupplier(() -> executeQuery0(hikariDataSource, query, requestParams, preparedStatement))
+ return Mono.fromSupplier(() -> executeQuery0(hikariDataSource, query, requestParams, guiSqlCommand, isPreparedStatement))
.onErrorMap(e -> {
if (e instanceof PluginException) {
return e;
@@ -125,60 +144,103 @@ public Mono getStructure(HikariDataSource hikariDataSource)
}
private QueryExecutionResult executeQuery0(HikariDataSource hikariDataSource, String query, Map requestParams,
- boolean isPreparedStatement) {
-
- List mustacheKeysInOrder = extractMustacheKeysInOrder(query);
+ GuiSqlCommand guiSqlCommand, boolean isPreparedStatement) {
Statement statement = null;
- ResultSet resultSet = null;
PreparedStatement preparedQuery = null;
boolean isResultSet;
-
+ ResultSet generatedKeys = null;
Connection connection = getConnection(hikariDataSource);
try {
- if (isPreparedStatement) {
- String preparedSql = doPrepareStatement(query, mustacheKeysInOrder, requestParams);
-
- preparedQuery = connection.prepareStatement(preparedSql, Statement.RETURN_GENERATED_KEYS);
- bindPreparedStatementParams(preparedQuery,
- mustacheKeysInOrder,
- requestParams
- );
+ if (guiSqlCommand != null) {
+ GuiSqlCommandRenderResult renderResult = guiSqlCommand.render(requestParams);
+ String sql = renderResult.sql();
+ List