From 7a619de59c9d83705dc2c547e8424dc7a4e9d3db Mon Sep 17 00:00:00 2001 From: ulleo Date: Fri, 11 Apr 2025 16:54:01 +0800 Subject: [PATCH] =?UTF-8?q?feat(X-Pack):=20[=E6=95=B0=E6=8D=AE=E5=A1=AB?= =?UTF-8?q?=E6=8A=A5]=E6=94=AF=E6=8C=81=E8=B7=9F=E9=9A=8F=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E7=AE=A1=E7=90=86=E9=85=8D=E7=BD=AE=E7=9A=84?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E9=9B=86=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/provider/CalciteProvider.java | 74 ++++++++++++++++--- .../datasource/provider/Provider.java | 2 +- 2 files changed, 64 insertions(+), 12 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java index b10ea487fe..1ac5585d47 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java @@ -457,21 +457,30 @@ public class CalciteProvider extends Provider { // schema ResultSet resultSet = null; + try { + if (StringUtils.isNotEmpty(datasourceConfiguration.getCharset()) && StringUtils.isNotEmpty(datasourceConfiguration.getTargetCharset())) { + datasourceRequest.setQuery(new String(datasourceRequest.getQuery().getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset())); + } + } catch (Exception e) { + e.printStackTrace(); + } try (Connection con = getConnectionFromPool(datasourceRequest.getDatasource().getId()); Statement statement = getPreparedStatement(con, datasourceConfiguration.getQueryTimeout(), datasourceRequest.getQuery(), datasourceRequest.getTableFieldWithValues())) { if (DatasourceConfiguration.DatasourceType.valueOf(value.getType()) == DatasourceConfiguration.DatasourceType.oracle) { if (!CollectionUtils.isNotEmpty(datasourceRequest.getTableFieldWithValues())) { statement.executeUpdate("ALTER SESSION SET CURRENT_SCHEMA = " + datasourceConfiguration.getSchema()); } } - - if (StringUtils.isNotEmpty(datasourceConfiguration.getCharset()) && StringUtils.isNotEmpty(datasourceConfiguration.getTargetCharset())) { - datasourceRequest.setQuery(new String(datasourceRequest.getQuery().getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset())); - } if (CollectionUtils.isNotEmpty(datasourceRequest.getTableFieldWithValues())) { LogUtil.info("execWithPreparedStatement sql: " + datasourceRequest.getQuery()); for (int i = 0; i < datasourceRequest.getTableFieldWithValues().size(); i++) { try { - ((PreparedStatement) statement).setObject(i + 1, datasourceRequest.getTableFieldWithValues().get(i).getValue(), datasourceRequest.getTableFieldWithValues().get(i).getType()); + Object valueObject = datasourceRequest.getTableFieldWithValues().get(i).getValue(); + if (valueObject instanceof String) { + if (StringUtils.isNotEmpty(datasourceConfiguration.getCharset()) && StringUtils.isNotEmpty(datasourceConfiguration.getTargetCharset())) { + valueObject = new String(((String) valueObject).getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset()); + } + } + ((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType()); LogUtil.info("execWithPreparedStatement param[" + (i + 1) + "](" + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName() + "): " + datasourceRequest.getTableFieldWithValues().get(i).getValue()); } catch (SQLException e) { throw new SQLException(e.getMessage() + ". VALUE: " + datasourceRequest.getTableFieldWithValues().get(i).getValue().toString() + " , TARGET TYPE: " + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName()); @@ -509,6 +518,13 @@ public class CalciteProvider extends Provider { DatasourceConfiguration datasourceConfiguration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), DatasourceConfiguration.class); // schema ResultSet resultSet = null; + try { + if (StringUtils.isNotEmpty(datasourceConfiguration.getCharset()) && StringUtils.isNotEmpty(datasourceConfiguration.getTargetCharset())) { + datasourceRequest.setQuery(new String(datasourceRequest.getQuery().getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset())); + } + } catch (Exception e) { + e.printStackTrace(); + } try (Connection con = getConnectionFromPool(datasourceRequest.getDatasource().getId()); Statement statement = getPreparedStatement(con, datasourceConfiguration.getQueryTimeout(), datasourceRequest.getQuery(), datasourceRequest.getTableFieldWithValues())) { if (DatasourceConfiguration.DatasourceType.valueOf(value.getType()) == DatasourceConfiguration.DatasourceType.oracle) { if (!CollectionUtils.isNotEmpty(datasourceRequest.getTableFieldWithValues())) { @@ -519,7 +535,13 @@ public class CalciteProvider extends Provider { LogUtil.info("execWithPreparedStatement sql: " + datasourceRequest.getQuery()); for (int i = 0; i < datasourceRequest.getTableFieldWithValues().size(); i++) { try { - ((PreparedStatement) statement).setObject(i + 1, datasourceRequest.getTableFieldWithValues().get(i).getValue(), datasourceRequest.getTableFieldWithValues().get(i).getType()); + Object valueObject = datasourceRequest.getTableFieldWithValues().get(i).getValue(); + if (valueObject instanceof String) { + if (StringUtils.isNotEmpty(datasourceConfiguration.getCharset()) && StringUtils.isNotEmpty(datasourceConfiguration.getTargetCharset())) { + valueObject = new String(((String) valueObject).getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset()); + } + } + ((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType()); LogUtil.info("execWithPreparedStatement param[" + (i + 1) + "](" + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName() + "): " + datasourceRequest.getTableFieldWithValues().get(i).getValue()); } catch (SQLException e) { throw new SQLException(e.getMessage() + ". VALUE: " + datasourceRequest.getTableFieldWithValues().get(i).getValue().toString() + " , TARGET TYPE: " + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName()); @@ -546,13 +568,20 @@ public class CalciteProvider extends Provider { } @Override - public ExecuteResult executeUpdate(DatasourceRequest datasourceRequest, boolean autoIncrement) throws DEException { + public ExecuteResult executeUpdate(DatasourceRequest datasourceRequest, String autoIncrementPkName) throws DEException { DatasourceSchemaDTO value = datasourceRequest.getDsList().entrySet().iterator().next().getValue(); datasourceRequest.setDatasource(value); DatasourceConfiguration datasourceConfiguration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), DatasourceConfiguration.class); // schema ResultSet resultSet = null; - try (Connection con = getConnectionFromPool(datasourceRequest.getDatasource().getId()); Statement statement = getPreparedStatement(con, datasourceConfiguration.getQueryTimeout(), datasourceRequest.getQuery(), datasourceRequest.getTableFieldWithValues())) { + try { + if (StringUtils.isNotEmpty(datasourceConfiguration.getCharset()) && StringUtils.isNotEmpty(datasourceConfiguration.getTargetCharset())) { + datasourceRequest.setQuery(new String(datasourceRequest.getQuery().getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset())); + } + } catch (Exception e) { + e.printStackTrace(); + } + try (Connection con = getConnectionFromPool(datasourceRequest.getDatasource().getId()); Statement statement = getPreparedStatement(con, datasourceConfiguration.getQueryTimeout(), datasourceRequest.getQuery(), datasourceRequest.getTableFieldWithValues(), autoIncrementPkName, datasourceConfiguration)) { if (DatasourceConfiguration.DatasourceType.valueOf(value.getType()) == DatasourceConfiguration.DatasourceType.oracle) { if (!CollectionUtils.isNotEmpty(datasourceRequest.getTableFieldWithValues())) { statement.executeUpdate("ALTER SESSION SET CURRENT_SCHEMA = " + datasourceConfiguration.getSchema()); @@ -564,7 +593,13 @@ public class CalciteProvider extends Provider { LogUtil.info("execWithPreparedStatement sql: " + datasourceRequest.getQuery()); for (int i = 0; i < datasourceRequest.getTableFieldWithValues().size(); i++) { try { - ((PreparedStatement) statement).setObject(i + 1, datasourceRequest.getTableFieldWithValues().get(i).getValue(), datasourceRequest.getTableFieldWithValues().get(i).getType()); + Object valueObject = datasourceRequest.getTableFieldWithValues().get(i).getValue(); + if (valueObject instanceof String) { + if (StringUtils.isNotEmpty(datasourceConfiguration.getCharset()) && StringUtils.isNotEmpty(datasourceConfiguration.getTargetCharset())) { + valueObject = new String(((String) valueObject).getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset()); + } + } + ((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType()); LogUtil.info("execWithPreparedStatement param[" + (i + 1) + "](" + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName() + "): " + datasourceRequest.getTableFieldWithValues().get(i).getValue()); } catch (SQLException e) { throw new SQLException(e.getMessage() + ". VALUE: " + datasourceRequest.getTableFieldWithValues().get(i).getValue().toString() + " , TARGET TYPE: " + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName()); @@ -578,7 +613,7 @@ public class CalciteProvider extends Provider { ExecuteResult result = new ExecuteResult(); result.setCount(count); - if (autoIncrement) { + if (StringUtils.isNotBlank(autoIncrementPkName)) { List generatedKeys = new ArrayList<>(); ResultSet keys = statement.getGeneratedKeys(); while (keys.next()) { @@ -1400,13 +1435,30 @@ public class CalciteProvider extends Provider { } public Statement getPreparedStatement(Connection connection, int queryTimeout, String sql, List values) throws Exception { + return getPreparedStatement(connection, queryTimeout, sql, values, null, null); + } + + public Statement getPreparedStatement(Connection connection, int queryTimeout, String sql, List values, String autoIncrementPkName, DatasourceConfiguration datasourceConfiguration) throws Exception { if (connection == null) { throw new Exception("Failed to get connection!"); } if (CollectionUtils.isNotEmpty(values)) { PreparedStatement stat = null; + String pkName = autoIncrementPkName; try { - stat = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); + if (StringUtils.isNotEmpty(datasourceConfiguration.getCharset()) && StringUtils.isNotEmpty(datasourceConfiguration.getTargetCharset())) { + pkName = new String(pkName.getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset()); + } + } catch (Exception e) { + e.printStackTrace(); + } + try { + if (StringUtils.isNotBlank(autoIncrementPkName)) { + String[] generatedColumns = {pkName}; + stat = connection.prepareStatement(sql, generatedColumns); + } else { + stat = connection.prepareStatement(sql); + } stat.setQueryTimeout(queryTimeout); } catch (Exception e) { DEException.throwException(e.getMessage()); diff --git a/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/provider/Provider.java b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/provider/Provider.java index 77f0539b50..abca6768b1 100644 --- a/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/provider/Provider.java +++ b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/provider/Provider.java @@ -97,7 +97,7 @@ public abstract class Provider { } - public ExecuteResult executeUpdate(DatasourceRequest datasourceRequest, boolean autoIncrement) { + public ExecuteResult executeUpdate(DatasourceRequest datasourceRequest, String autoIncrementPkName) { return new ExecuteResult(); }