diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java index 36ba79b34b..3d79ae121e 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java @@ -127,7 +127,7 @@ public class DatasetDataManage { Map map = JsonUtil.parseObject(datasourceSchemaDTO.getConfiguration(), Map.class); if (!datasourceRequest.getIsCross()) { if (ObjectUtils.isNotEmpty(map.get("schema"))) { - sql = sql.replaceAll(SqlPlaceholderConstants.KEYWORD_PREFIX_REGEX + datasourceSchemaDTO.getSchemaAlias() + SqlPlaceholderConstants.KEYWORD_SUFFIX_REGEX, String.format(format, map.get("schema").toString()) ); + sql = sql.replaceAll(SqlPlaceholderConstants.KEYWORD_PREFIX_REGEX + datasourceSchemaDTO.getSchemaAlias() + SqlPlaceholderConstants.KEYWORD_SUFFIX_REGEX, String.format(format, map.get("schema").toString())); } else { sql = sql.replaceAll(SqlPlaceholderConstants.KEYWORD_PREFIX_REGEX + datasourceSchemaDTO.getSchemaAlias() + SqlPlaceholderConstants.KEYWORD_SUFFIX_REGEX + "\\.", ""); } @@ -185,6 +185,11 @@ public class DatasetDataManage { String sql = TableUtils.tableName2Sql(datasourceSchemaDTO, tableInfoDTO.getTable()) + " LIMIT 0 OFFSET 0"; // replace schema alias, trans dialect sql = Utils.replaceSchemaAlias(sql, datasourceRequest.getDsList()); + + Map map = JsonUtil.parseObject(datasourceSchemaDTO.getConfiguration(), Map.class); + if (ObjectUtils.isNotEmpty(map.get("schema"))) { + sql = sql.replaceAll(SqlPlaceholderConstants.KEYWORD_PREFIX_REGEX + datasourceSchemaDTO.getSchemaAlias() + SqlPlaceholderConstants.KEYWORD_SUFFIX_REGEX, String.format(format, map.get("schema").toString())); + } sql = provider.transSqlDialect(sql, datasourceRequest.getDsList()); datasourceRequest.setQuery(sql); logger.debug("calcite data table field sql: " + datasourceRequest.getQuery()); diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java index cb7565112a..d283c20d1e 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java @@ -537,7 +537,12 @@ public class DatasetSQLManage { } } else { CoreDatasource coreDatasource = engineManage.getDeEngine(); - schemaAlias = String.format(SQLConstants.SCHEMA, coreDatasource.getId()); + Map map = JsonUtil.parseObject(coreDatasource.getConfiguration(), Map.class); + if (!isCross && ObjectUtils.isNotEmpty(map.get("schema"))) { + schemaAlias = (String) map.get("schema"); + } else { + schemaAlias = String.format(SQLConstants.SCHEMA, coreDatasource.getId()); + } if (!dsMap.containsKey(coreDatasource.getId())) { DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO(); BeanUtils.copyBean(datasourceSchemaDTO, coreDatasource); diff --git a/core/core-backend/src/main/java/io/dataease/datasource/manage/DatasourceSyncManage.java b/core/core-backend/src/main/java/io/dataease/datasource/manage/DatasourceSyncManage.java index 85ab34cf48..5ac7fdf1c6 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/manage/DatasourceSyncManage.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/manage/DatasourceSyncManage.java @@ -277,7 +277,7 @@ public class DatasourceSyncManage { totalPage = dataList.size() / pageNumber; } for (int page = 1; page <= totalPage; page++) { - engineRequest.setQuery(engineProvider.insertSql(DatasourceConfiguration.DatasourceType.API.name(), datasourceRequest.getTable(), extractType, dataList, page, pageNumber, tableFields)); + engineRequest.setQuery(engineProvider.insertSql(DatasourceConfiguration.DatasourceType.API.name(), datasourceRequest.getTable(), extractType, dataList, page, pageNumber, tableFields, engine)); calciteProvider.exec(engineRequest); } } @@ -300,7 +300,7 @@ public class DatasourceSyncManage { totalPage = dataList.size() / pageNumber; } for (int page = 1; page <= totalPage; page++) { - engineRequest.setQuery(engineProvider.insertSql(DatasourceConfiguration.DatasourceType.Excel.name(), datasourceRequest.getTable(), extractType, dataList, page, pageNumber, tableFields)); + engineRequest.setQuery(engineProvider.insertSql(DatasourceConfiguration.DatasourceType.Excel.name(), datasourceRequest.getTable(), extractType, dataList, page, pageNumber, tableFields, engine)); calciteProvider.exec(engineRequest); } } @@ -310,7 +310,7 @@ public class DatasourceSyncManage { EngineRequest engineRequest = new EngineRequest(); engineRequest.setEngine(engine); EngineProvider engineProvider = ProviderUtil.getEngineProvider(engine.getType()); - String[] replaceTableSql = engineProvider.replaceTable(tableName).split(";"); + String[] replaceTableSql = engineProvider.replaceTable(tableName, engine).split(";"); for (int i = 0; i < replaceTableSql.length; i++) { if (StringUtils.isNotEmpty(replaceTableSql[i])) { engineRequest.setQuery(replaceTableSql[i]); @@ -344,7 +344,7 @@ public class DatasourceSyncManage { EngineRequest engineRequest = new EngineRequest(); engineRequest.setEngine(engine); EngineProvider engineProvider = ProviderUtil.getEngineProvider(engine.getType()); - engineRequest.setQuery(engineProvider.dropTable(tableName)); + engineRequest.setQuery(engineProvider.dropTable(tableName, engine)); if (engineProvider.needCheckExistTable()) { DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceDTO datasourceDTO = new DatasourceDTO(); @@ -353,7 +353,7 @@ public class DatasourceSyncManage { if (calciteProvider.getTables(datasourceRequest).stream().map(DatasetTableDTO::getTableName).collect(Collectors.toList()).contains(tableName)) { calciteProvider.exec(engineRequest); } - }else { + } else { calciteProvider.exec(engineRequest); } } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/manage/EngineManage.java b/core/core-backend/src/main/java/io/dataease/datasource/manage/EngineManage.java index 26778fb0e0..7b3e1f996e 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/manage/EngineManage.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/manage/EngineManage.java @@ -270,6 +270,45 @@ public class EngineManage { } + public static class SqlserverJdbcUrlParser implements JdbcUrlParser { + private static final Pattern PATTERN = Pattern.compile("jdbc:sqlserver://(.*):(\\d+);(.*)"); + + @Override + public Map parse(String url, Environment env) { + Matcher matcher = PATTERN.matcher(url); + if (!matcher.find()) return null; + Map config = new HashMap<>(); + config.put("host", matcher.group(1)); + config.put("port", matcher.group(2)); + if (matcher.groupCount() == 3) { + String[] params = matcher.group(3).split(";"); + String extraParams = ""; + for (String s : params) { + if (s.startsWith("DatabaseName")) { + config.put("dataBase", s.split("=")[1]); + } else { + if (s.startsWith("currentSchema")) { + config.put("schema", s.split("=")[1]); + } + extraParams = extraParams + s + ";"; + } + } + config.put("extraParams", extraParams); + } + if (StringUtils.isNotEmpty(env.getProperty("spring.datasource.hikari.schema"))) { + config.put("schema", env.getProperty("spring.datasource.hikari.schema")); + } + if (StringUtils.isNotEmpty(env.getProperty("spring.jpa.properties.hibernate.default_schema"))) { + config.put("schema", env.getProperty("spring.jpa.properties.hibernate.default_schema")); + } + config.put("type", "sqlServer"); + config.put("username", env.getProperty("spring.datasource.username")); + config.put("password", env.getProperty("spring.datasource.password")); + return config; + } + } + + /** * Oracle JDBC URL解析器实现 * 支持两种格式的Oracle JDBC URL: @@ -354,6 +393,8 @@ public class EngineManage { parserMap.put("jdbc:oracle:thin:@", new OracleJdbcUrlParser()); } else if (jdbcUrl.startsWith("jdbc:postgresql://")) { parserMap.put("jdbc:postgresql://", new PgJdbcUrlParser()); + } else if (jdbcUrl.startsWith("jdbc:sqlserver://")) { + parserMap.put("jdbc:sqlserver://", new SqlserverJdbcUrlParser()); } } } 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 667fec9bd7..f91c13d3a8 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 @@ -1009,6 +1009,7 @@ public class CalciteProvider extends Provider { dataSource.setMaxTotal(configuration.getMaxPoolSize()); dataSource.setMinIdle(configuration.getMinPoolSize()); dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout())); + dataSource.setDefaultSchema(configuration.getSchema()); startSshSession(configuration, null, ds.getId()); dataSource.setUrl(configuration.getJdbc()); schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getSchema()); diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/EngineProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/EngineProvider.java index 7d30be1bc6..4c4a905170 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/EngineProvider.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/EngineProvider.java @@ -14,17 +14,17 @@ import java.util.List; public abstract class EngineProvider { public abstract String createView(String name, String viewSQL); - public abstract String dropTable(String name); + public abstract String dropTable(String name, CoreDeEngine engine); public abstract boolean needCheckExistTable(); public abstract String dropView(String name); - public abstract String replaceTable(String name); + public abstract String replaceTable(String name, CoreDeEngine engine); public abstract String createTableSql(String name, List tableFields, CoreDeEngine engine); - public abstract String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List dataList, int page, int pageNumber, List tableFields); + public abstract String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List dataList, int page, int pageNumber, List tableFields, CoreDeEngine engine); } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/H2EngineProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/H2EngineProvider.java index 95d52bef49..3845020433 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/H2EngineProvider.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/H2EngineProvider.java @@ -25,7 +25,7 @@ public class H2EngineProvider extends EngineProvider { } @Override - public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List dataList, int page, int pageNumber, List tableFields) { + public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List dataList, int page, int pageNumber, List tableFields, CoreDeEngine engine) { String engineTableName; switch (extractType) { case all_scope: @@ -66,7 +66,7 @@ public class H2EngineProvider extends EngineProvider { @Override - public String dropTable(String name) { + public String dropTable(String name, CoreDeEngine engine) { return "DROP TABLE IF EXISTS `" + name + "`"; } @@ -81,7 +81,7 @@ public class H2EngineProvider extends EngineProvider { } @Override - public String replaceTable(String name) { + public String replaceTable(String name, CoreDeEngine engine) { return "ALTER TABLE `FROM_TABLE` rename to `FROM_TABLE_tmp`; ALTER TABLE `TO_TABLE` rename to `FROM_TABLE`; DROP TABLE IF EXISTS `FROM_TABLE_tmp`;".replace("FROM_TABLE", name).replace("TO_TABLE", TableUtils.tmpName(name)); } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/MysqlEngineProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/MysqlEngineProvider.java index 1201625f8e..1ae465284e 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/MysqlEngineProvider.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/MysqlEngineProvider.java @@ -32,7 +32,7 @@ public class MysqlEngineProvider extends EngineProvider { } @Override - public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List dataList, int page, int pageNumber, List tableFields) { + public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List dataList, int page, int pageNumber, List tableFields, CoreDeEngine engine) { String engineTableName; switch (extractType) { case all_scope: @@ -87,7 +87,7 @@ public class MysqlEngineProvider extends EngineProvider { @Override - public String dropTable(String name) { + public String dropTable(String name, CoreDeEngine engine) { return "DROP TABLE IF EXISTS `" + name + "`"; } @@ -102,7 +102,7 @@ public class MysqlEngineProvider extends EngineProvider { } @Override - public String replaceTable(String name) { + public String replaceTable(String name, CoreDeEngine engine) { String replaceTableSql = "rename table `FROM_TABLE` to `FROM_TABLE_tmp`, `TO_TABLE` to `FROM_TABLE`, `FROM_TABLE_tmp` to `TO_TABLE`" .replace("FROM_TABLE", name).replace("TO_TABLE", TableUtils.tmpName(name)); String dropTableSql = "DROP TABLE IF EXISTS `TABLE_NAME`".replace("TABLE_NAME", TableUtils.tmpName(name)); diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/OracleEngineProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/OracleEngineProvider.java index f8ec40a5c4..5562ad4a6f 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/OracleEngineProvider.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/OracleEngineProvider.java @@ -32,7 +32,7 @@ public class OracleEngineProvider extends EngineProvider { } @Override - public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List dataList, int page, int pageNumber, List tableFields) { + public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List dataList, int page, int pageNumber, List tableFields, CoreDeEngine engine) { String engineTableName; switch (extractType) { case all_scope: @@ -86,7 +86,7 @@ public class OracleEngineProvider extends EngineProvider { @Override - public String dropTable(String name) { + public String dropTable(String name, CoreDeEngine engine) { return "DROP TABLE \"" + name + "\""; } @@ -96,7 +96,7 @@ public class OracleEngineProvider extends EngineProvider { } @Override - public String replaceTable(String name) { + public String replaceTable(String name, CoreDeEngine engine) { String replaceTableSql = "rename \"FROM_TABLE\" to \"FROM_TABLE_tmp\"; rename \"TO_TABLE\" to \"FROM_TABLE\"; rename \"FROM_TABLE_tmp\" to \"TO_TABLE\"".replace("FROM_TABLE", name).replace("TO_TABLE", TableUtils.tmpName(name)); String dropTableSql = "DROP TABLE \"TABLE_NAME\"".replace("TABLE_NAME", TableUtils.tmpName(name)); return replaceTableSql + ";" + dropTableSql; diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/PgEngineProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/PgEngineProvider.java new file mode 100644 index 0000000000..8b624a227f --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/PgEngineProvider.java @@ -0,0 +1,166 @@ +package io.dataease.datasource.provider; + + +import io.dataease.dataset.utils.TableUtils; +import io.dataease.datasource.dao.auto.entity.CoreDeEngine; +import io.dataease.datasource.server.DatasourceServer; +import io.dataease.extensions.datasource.dto.TableField; +import io.dataease.extensions.datasource.vo.DatasourceConfiguration; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author gin + * @Date 2021/5/17 4:27 下午 + */ +@Service("pgEngine") +public class PgEngineProvider extends EngineProvider { + + private static final String creatTableSql = + "CREATE TABLE IF NOT EXISTS TABLE_NAME" + + "Column_Fields;"; + + + @Override + public String createView(String name, String viewSQL) { + return "CREATE or replace view " + name + " AS (" + viewSQL + ")"; + } + + @Override + public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List dataList, int page, int pageNumber, List tableFields, CoreDeEngine engine) { + String engineTableName; + switch (extractType) { + case all_scope: + engineTableName = TableUtils.tmpName(TableUtils.tableName(tableName)); + break; + default: + engineTableName = TableUtils.tableName(tableName); + break; + } + + String insertSql = "INSERT INTO TABLE_NAME VALUES ".replace("TABLE_NAME", engineTableName); + StringBuffer values = new StringBuffer(); + + Integer realSize = page * pageNumber < dataList.size() ? page * pageNumber : dataList.size(); + for (String[] strings : dataList.subList((page - 1) * pageNumber, realSize)) { + int length = 0; + String[] strings1 = new String[tableFields.stream().filter(TableField::isChecked).toList().size()]; + for (int i = 0; i < strings.length; i++) { + if (tableFields.get(i).isChecked()) { + if (StringUtils.isEmpty(strings[i])) { + String type = tableFields.get(i).getType() == null ? tableFields.get(i).getFieldType() : tableFields.get(i).getType(); + if (type.equals("LONG") || type.equals("DOUBLE")) { + strings1[length] = "0"; + } else { + strings1[length] = null; + } + } else { + strings1[length] = strings[i].replace("\\", "\\\\").replace("'", "\\'"); + } + length++; + } + } + values.append("('").append(String.join("','", Arrays.asList(strings1))) + .append("'),"); + } + String insetSql = (insertSql + values.substring(0, values.length() - 1)).replaceAll("'null'", "null"); + if (dsType.contains(DatasourceConfiguration.DatasourceType.API.name())) { + List keys = tableFields.stream().filter(tableField -> tableField.isPrimaryKey() && tableField.isChecked()).toList(); + List notKeys = tableFields.stream().filter(tableField -> tableField.isChecked() && !tableField.isPrimaryKey()).toList(); + if (CollectionUtils.isNotEmpty(keys) && extractType.equals(DatasourceServer.UpdateType.add_scope)) { + insetSql = insetSql + " ON CONFLICT (key) DO UPDATE SET ".replace("key", keys.stream().map(TableField::getName).collect(Collectors.joining(","))); + List updateColumes = new ArrayList<>(); + for (TableField notKey : notKeys) { + updateColumes.add("column = EXCLUDED.column".replace("column", notKey.getName())); + } + insetSql = insetSql + updateColumes.stream().collect(Collectors.joining(",")); + } + } + + return insetSql; + } + + + @Override + public String dropTable(String name, CoreDeEngine engine) { + return "DROP TABLE IF EXISTS " + name + ""; + } + + @Override + public boolean needCheckExistTable() { + return false; + } + + @Override + public String dropView(String name) { + return "DROP VIEW IF EXISTS " + name + ""; + } + + @Override + public String replaceTable(String name, CoreDeEngine engine) { + String replaceTableSql = "ALTER table FROM_TABLE RENAME to FROM_TABLE_tmp; ALTER table TO_TABLE RENAME to FROM_TABLE; ALTER table FROM_TABLE_tmp RENAME to TO_TABLE" + .replace("FROM_TABLE", name).replace("TO_TABLE", TableUtils.tmpName(name)); + String dropTableSql = "DROP TABLE IF EXISTS TABLE_NAME".replace("TABLE_NAME", TableUtils.tmpName(name)); + return replaceTableSql + ";" + dropTableSql; + } + + @Override + public String createTableSql(String tableName, List tableFields, CoreDeEngine engine) { + String dorisTableColumnSql = createTableSql(tableFields); + return creatTableSql.replace("TABLE_NAME", tableName).replace("Column_Fields", dorisTableColumnSql); + } + + private String createTableSql(final List tableFields) { + StringBuilder columnFields = new StringBuilder(""); + StringBuilder key = new StringBuilder(); + for (TableField tableField : tableFields) { + if (!tableField.isChecked()) { + continue; + } + if (tableField.isPrimaryKey()) { + key.append("").append(tableField.getName()).append(", "); + } + columnFields.append(tableField.getName()).append(" "); + int size = tableField.getPrecision() * 4; + switch (tableField.getDeExtractType()) { + case 0: + if (StringUtils.isNotEmpty(tableField.getLength())) { + columnFields.append("varchar(length)".replace("length", tableField.getLength())).append(","); + } else { + columnFields.append("text").append(","); + } + break; + case 1: + columnFields.append("timestamp").append(","); + break; + case 2: + columnFields.append("bigint").append(","); + break; + case 3: + columnFields.append("numeric(27,8)").append(","); + break; + case 4: + columnFields.append("BOOLEAN".replace("length", String.valueOf(tableField.getPrecision()))).append(","); + break; + default: + columnFields.append("text").append(","); + break; + } + } + if (StringUtils.isEmpty(key.toString())) { + columnFields = new StringBuilder(columnFields.substring(0, columnFields.length() - 1)); + } else { + key = new StringBuilder(key.substring(0, key.length() - 2)); + columnFields.append(" PRIMARY KEY (PRIMARYKEY)".replace("PRIMARYKEY", key.toString())); + } + + columnFields = new StringBuilder("(" + columnFields + ")"); + return columnFields.toString(); + } +} diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/SqlServerEngineProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/SqlServerEngineProvider.java new file mode 100644 index 0000000000..d131cad680 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/SqlServerEngineProvider.java @@ -0,0 +1,172 @@ +package io.dataease.datasource.provider; + + +import io.dataease.dataset.utils.TableUtils; +import io.dataease.datasource.dao.auto.entity.CoreDeEngine; +import io.dataease.datasource.server.DatasourceServer; +import io.dataease.datasource.type.Sqlserver; +import io.dataease.extensions.datasource.dto.TableField; +import io.dataease.extensions.datasource.vo.DatasourceConfiguration; +import io.dataease.utils.JsonUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Author gin + * @Date 2021/5/17 4:27 下午 + */ +@Service("sqlServerEngine") +public class SqlServerEngineProvider extends EngineProvider { + + private static final String creatTableSql = + "CREATE TABLE TABLE_NAME" + + "Column_Fields;"; + + + @Override + public String createView(String name, String viewSQL) { + return "CREATE or replace view " + name + " AS (" + viewSQL + ")"; + } + + @Override + public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List dataList, int page, int pageNumber, List tableFields, CoreDeEngine engine) { + Sqlserver sqlserver = JsonUtil.parseObject(engine.getConfiguration(), Sqlserver.class); + String engineTableName; + switch (extractType) { + case all_scope: + engineTableName = TableUtils.tmpName(TableUtils.tableName(tableName)); + break; + default: + engineTableName = TableUtils.tableName(tableName); + break; + } + + String insertSql = "INSERT INTO TABLE_NAME VALUES ".replace("TABLE_NAME", sqlserver.getSchema() + "." + engineTableName); + StringBuffer values = new StringBuffer(); + + Integer realSize = page * pageNumber < dataList.size() ? page * pageNumber : dataList.size(); + for (String[] strings : dataList.subList((page - 1) * pageNumber, realSize)) { + int length = 0; + String[] strings1 = new String[tableFields.stream().filter(TableField::isChecked).toList().size()]; + for (int i = 0; i < strings.length; i++) { + if (tableFields.get(i).isChecked()) { + if (StringUtils.isEmpty(strings[i])) { + String type = tableFields.get(i).getType() == null ? tableFields.get(i).getFieldType() : tableFields.get(i).getType(); + if (type.equals("LONG") || type.equals("DOUBLE")) { + strings1[length] = "0"; + } else { + strings1[length] = null; + } + } else { + strings1[length] = strings[i].replace("\\", "\\\\").replace("'", "\\'"); + } + length++; + } + } + values.append("('").append(String.join("','", Arrays.asList(strings1))) + .append("'),"); + } + String insetSql = (insertSql + values.substring(0, values.length() - 1)).replaceAll("'null'", "null"); + if (dsType.contains(DatasourceConfiguration.DatasourceType.API.name())) { + List keys = tableFields.stream().filter(tableField -> tableField.isPrimaryKey() && tableField.isChecked()).toList(); + List notKeys = tableFields.stream().filter(tableField -> tableField.isChecked() && !tableField.isPrimaryKey()).toList(); + if (CollectionUtils.isNotEmpty(keys) && extractType.equals(DatasourceServer.UpdateType.add_scope)) { + insetSql = insetSql + " ON CONFLICT (key) DO UPDATE SET ".replace("key", keys.stream().map(TableField::getName).collect(Collectors.joining(","))); + List updateColumes = new ArrayList<>(); + for (TableField notKey : notKeys) { + updateColumes.add("column = EXCLUDED.column".replace("column", notKey.getName())); + } + insetSql = insetSql + updateColumes.stream().collect(Collectors.joining(",")); + } + } + + return insetSql; + } + + + @Override + public String dropTable(String name, CoreDeEngine engine) { + Sqlserver sqlserver = JsonUtil.parseObject(engine.getConfiguration(), Sqlserver.class); + return "DROP TABLE " + sqlserver.getSchema() + "." + name + ""; + } + + @Override + public boolean needCheckExistTable() { + return true; + } + + @Override + public String dropView(String name) { + return "DROP VIEW " + name + ""; + } + + @Override + public String replaceTable(String name, CoreDeEngine engine) { + Sqlserver sqlserver = JsonUtil.parseObject(engine.getConfiguration(), Sqlserver.class); + String replaceTableSql = " EXEC sp_rename 'SCHEMA.FROM_TABLE', 'FROM_TABLE_tmp', 'OBJECT'; EXEC sp_rename 'SCHEMA.TO_TABLE', 'FROM_TABLE', 'OBJECT'; EXEC sp_rename 'SCHEMA.FROM_TABLE_tmp', 'TO_TABLE', 'OBJECT' " + .replace("FROM_TABLE", name).replace("TO_TABLE", TableUtils.tmpName(name)).replace("SCHEMA", sqlserver.getSchema()); + String dropTableSql = "DROP TABLE TABLE_NAME".replace("TABLE_NAME", sqlserver.getSchema() + "." + TableUtils.tmpName(name)); + return replaceTableSql + ";" + dropTableSql; + } + + @Override + public String createTableSql(String tableName, List tableFields, CoreDeEngine engine) { + String dorisTableColumnSql = createTableSql(tableFields); + Sqlserver sqlserver = JsonUtil.parseObject(engine.getConfiguration(), Sqlserver.class); + return creatTableSql.replace("TABLE_NAME", sqlserver.getSchema() + "." + tableName).replace("Column_Fields", dorisTableColumnSql); + } + + private String createTableSql(final List tableFields) { + StringBuilder columnFields = new StringBuilder(""); + StringBuilder key = new StringBuilder(); + for (TableField tableField : tableFields) { + if (!tableField.isChecked()) { + continue; + } + if (tableField.isPrimaryKey()) { + key.append("").append(tableField.getName()).append(", "); + } + columnFields.append(tableField.getName()).append(" "); + int size = tableField.getPrecision() * 4; + switch (tableField.getDeExtractType()) { + case 0: + if (StringUtils.isNotEmpty(tableField.getLength())) { + columnFields.append("varchar(length)".replace("length", tableField.getLength())).append(","); + } else { + columnFields.append("varchar(max)").append(","); + } + break; + case 1: + columnFields.append("DATETIME").append(","); + break; + case 2: + columnFields.append("bigint").append(","); + break; + case 3: + columnFields.append("DECIMAL(27,8)").append(","); + break; + case 4: + columnFields.append("TINYINT".replace("length", String.valueOf(tableField.getPrecision()))).append(","); + break; + default: + columnFields.append("varchar(max)").append(","); + break; + } + } + if (StringUtils.isEmpty(key.toString())) { + columnFields = new StringBuilder(columnFields.substring(0, columnFields.length() - 1)); + } else { + key = new StringBuilder(key.substring(0, key.length() - 2)); + columnFields.append(" PRIMARY KEY (PRIMARYKEY)".replace("PRIMARYKEY", key.toString())); + } + + columnFields = new StringBuilder("(" + columnFields + ")"); + return columnFields.toString(); + } +} diff --git a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java index 54c219bd6c..d05cb1c552 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java @@ -31,11 +31,13 @@ import io.dataease.datasource.provider.ExcelUtils; import io.dataease.datasource.type.H2; import io.dataease.datasource.type.Mysql; import io.dataease.datasource.type.Oracle; +import io.dataease.datasource.type.Sqlserver; import io.dataease.exception.DEException; import io.dataease.extensions.datasource.api.PluginManageApi; import io.dataease.extensions.datasource.dto.*; import io.dataease.extensions.datasource.factory.ProviderFactory; import io.dataease.extensions.datasource.provider.Provider; +import io.dataease.extensions.datasource.vo.Configuration; import io.dataease.extensions.datasource.vo.DatasourceConfiguration; import io.dataease.extensions.datasource.vo.XpackPluginsDatasourceVO; import io.dataease.i18n.Translator; @@ -1102,7 +1104,17 @@ public class DatasourceServer implements DatasourceApi { if (ObjectUtils.isEmpty(tableName) || ObjectUtils.isEmpty(id)) { return null; } - String sql = "SELECT * FROM `" + tableName + "`"; + DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO(); + BeanUtils.copyBean(datasourceSchemaDTO, engineManage.getDeEngine()); + + Configuration configuration = JsonUtil.parseObject(datasourceSchemaDTO.getConfiguration(), Configuration.class); + String schema = StringUtils.isNotEmpty(configuration.getSchema()) ? configuration.getSchema() + "." : ""; + String sql = "SELECT * FROM " + schema + tableName; + Provider provider = ProviderFactory.getDefaultProvider(); + Map dsMap = new HashMap<>(); + datasourceSchemaDTO.setSchemaAlias(String.format(SQLConstants.SCHEMA, datasourceSchemaDTO.getId())); + dsMap.put(datasourceSchemaDTO.getId(), datasourceSchemaDTO); + sql = provider.transSqlDialect(sql, dsMap); sql = new String(Base64.getEncoder().encode(sql.getBytes())); PreviewSqlDTO previewSqlDTO = new PreviewSqlDTO(); previewSqlDTO.setSql(sql); @@ -1363,7 +1375,7 @@ public class DatasourceServer implements DatasourceApi { if (hidePw) { Provider provider = ProviderFactory.getProvider(datasourceDTO.getType()); provider.hidePW(datasourceDTO); - }else { + } else { switch (datasourceDTO.getType()) { case "mysql": datasourceDTO.setConfiguration(JsonUtil.toJSONString(JsonUtil.parseObject(datasourceDTO.getConfiguration(), Mysql.class)).toString()); @@ -1374,6 +1386,9 @@ public class DatasourceServer implements DatasourceApi { case "oracle": datasourceDTO.setConfiguration(JsonUtil.toJSONString(JsonUtil.parseObject(datasourceDTO.getConfiguration(), Oracle.class)).toString()); break; + case "sqlServer": + datasourceDTO.setConfiguration(JsonUtil.toJSONString(JsonUtil.parseObject(datasourceDTO.getConfiguration(), Sqlserver.class)).toString()); + break; } } } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/server/EngineServer.java b/core/core-backend/src/main/java/io/dataease/datasource/server/EngineServer.java index d1bd0bab34..3303dfe409 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/server/EngineServer.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/server/EngineServer.java @@ -5,10 +5,7 @@ import io.dataease.datasource.dao.auto.entity.CoreDeEngine; import io.dataease.datasource.dao.auto.repository.CoreDeEngineRepository; import io.dataease.datasource.manage.EngineManage; import io.dataease.datasource.provider.CalciteProvider; -import io.dataease.datasource.type.H2; -import io.dataease.datasource.type.Impala; -import io.dataease.datasource.type.Mysql; -import io.dataease.datasource.type.Oracle; +import io.dataease.datasource.type.*; import io.dataease.exception.DEException; import io.dataease.extensions.datasource.dto.DatasourceDTO; import io.dataease.utils.*; @@ -53,6 +50,9 @@ public class EngineServer implements EngineApi { case "oracle": datasourceDTO.setConfiguration(JsonUtil.toJSONString(JsonUtil.parseObject(datasourceDTO.getConfiguration(), Oracle.class)).toString()); break; + case "sqlServer": + datasourceDTO.setConfiguration(JsonUtil.toJSONString(JsonUtil.parseObject(datasourceDTO.getConfiguration(), Sqlserver.class)).toString()); + break; } datasourceDTO.setConfiguration(RsaUtils.symmetricEncrypt(datasourceDTO.getConfiguration())); return datasourceDTO;