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 d470419222..3dad5cc9bd 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 @@ -39,6 +39,8 @@ import java.math.BigDecimal; import java.net.URL; import java.sql.*; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -731,6 +733,7 @@ public class CalciteProvider { List tableSqls = new ArrayList<>(); DatasourceConfiguration.DatasourceType datasourceType = DatasourceConfiguration.DatasourceType.valueOf(datasourceRequest.getDatasource().getType()); DatasourceConfiguration configuration = null; + String database = ""; switch (datasourceType) { case mysql: case mongo: @@ -739,7 +742,16 @@ public class CalciteProvider { case StarRocks: case doris: configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), Mysql.class); - tableSqls.add(String.format("SELECT TABLE_NAME,TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '%s' ;", configuration.getDataBase())); + if (configuration.getUrlType().equalsIgnoreCase("")) { + database = configuration.getDataBase(); + } else { + Pattern WITH_SQL_FRAGMENT = Pattern.compile("jdbc:mysql://(.*):(\\d+)/(.*)"); + Matcher matcher = WITH_SQL_FRAGMENT.matcher(configuration.getJdbcUrl()); + matcher.find(); + String[] databasePrams = matcher.group(3).split("\\?"); + database = databasePrams[0]; + } + tableSqls.add(String.format("SELECT TABLE_NAME,TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '%s' ;", database)); break; case oracle: configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), Oracle.class); @@ -781,7 +793,17 @@ public class CalciteProvider { break; case ck: configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), CK.class); - tableSqls.add("SELECT name FROM system.tables where database='DATABASE';".replace("DATABASE", configuration.getDataBase())); + if (configuration.getUrlType().equalsIgnoreCase("")) { + database = configuration.getDataBase(); + } else { + Pattern WITH_SQL_FRAGMENT = Pattern.compile("jdbc:clickhouse://(.*):(\\d+)/(.*)"); + Matcher matcher = WITH_SQL_FRAGMENT.matcher(configuration.getJdbcUrl()); + matcher.find(); + String[] databasePrams = matcher.group(3).split("\\?"); + database = databasePrams[0]; + } + tableSqls.add("SELECT name FROM system.tables where database='DATABASE';".replace("DATABASE", database)); + break; default: tableSqls.add("show tables"); diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/CK.java b/core/core-backend/src/main/java/io/dataease/datasource/type/CK.java index bff89b8014..9604c48d36 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/CK.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/CK.java @@ -12,6 +12,9 @@ public class CK extends DatasourceConfiguration { private String extraParams = ""; public String getJdbc() { + if(StringUtils.isNoneEmpty(getUrlType()) && !getUrlType().equalsIgnoreCase("hostName")){ + return getJdbcUrl(); + } if(StringUtils.isEmpty(extraParams.trim())){ return "jdbc:clickhouse://HOSTNAME:PORT/DATABASE" .replace("HOSTNAME", getHost().trim()) diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/Db2.java b/core/core-backend/src/main/java/io/dataease/datasource/type/Db2.java index 44ba37706d..3b1a9e9b30 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/Db2.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/Db2.java @@ -12,6 +12,9 @@ public class Db2 extends DatasourceConfiguration { private String extraParams = ""; public String getJdbc() { + if(StringUtils.isNoneEmpty(getUrlType()) && !getUrlType().equalsIgnoreCase("hostName")){ + return getJdbcUrl(); + } if(StringUtils.isEmpty(extraParams.trim())){ if (StringUtils.isEmpty(getSchema())) { return "jdbc:db2://HOSTNAME:PORT/DATABASE" diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/Impala.java b/core/core-backend/src/main/java/io/dataease/datasource/type/Impala.java index 27b4cb9187..a362724b7f 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/Impala.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/Impala.java @@ -17,6 +17,9 @@ public class Impala extends DatasourceConfiguration { private List showTableSqls = Arrays.asList("show tables"); public String getJdbc() { + if(StringUtils.isNoneEmpty(getUrlType()) && !getUrlType().equalsIgnoreCase("hostName")){ + return getJdbcUrl(); + } if(StringUtils.isEmpty(extraParams.trim())){ return "jdbc:impala://HOSTNAME:PORT/DATABASE" .replace("HOSTNAME", getHost().trim()) diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/Mongo.java b/core/core-backend/src/main/java/io/dataease/datasource/type/Mongo.java index 49a0887a4c..a602f761bf 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/Mongo.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/Mongo.java @@ -17,6 +17,9 @@ public class Mongo extends DatasourceConfiguration { private List showTableSqls = Arrays.asList("show tables"); public String getJdbc() { + if(StringUtils.isNoneEmpty(getUrlType()) && !getUrlType().equalsIgnoreCase("hostName")){ + return getJdbcUrl(); + } if (StringUtils.isEmpty(extraParams.trim())) { return "jdbc:mysql://HOSTNAME:PORT/DATABASE" .replace("HOSTNAME", getHost().trim()) diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/Mysql.java b/core/core-backend/src/main/java/io/dataease/datasource/type/Mysql.java index b6e0e8e6e4..3429d20980 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/Mysql.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/Mysql.java @@ -19,6 +19,9 @@ public class Mysql extends DatasourceConfiguration { private List showTableSqls = Arrays.asList("show tables"); public String getJdbc() { + if(StringUtils.isNoneEmpty(getUrlType()) && !getUrlType().equalsIgnoreCase("hostName")){ + return getJdbcUrl(); + } if (StringUtils.isEmpty(extraParams.trim())) { return "jdbc:mysql://HOSTNAME:PORT/DATABASE" .replace("HOSTNAME", getHost().trim()) diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/Oracle.java b/core/core-backend/src/main/java/io/dataease/datasource/type/Oracle.java index 13041c9d76..8058e0f37d 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/Oracle.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/Oracle.java @@ -12,6 +12,9 @@ public class Oracle extends DatasourceConfiguration { private String extraParams = ""; public String getJdbc() { + if(StringUtils.isNoneEmpty(getUrlType()) && !getUrlType().equalsIgnoreCase("hostName")){ + return getJdbcUrl(); + } if (StringUtils.isNotEmpty(getConnectionType()) && getConnectionType().equalsIgnoreCase("serviceName")) { return "jdbc:oracle:thin:@HOSTNAME:PORT/DATABASE" .replace("HOSTNAME", getHost().trim()) diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/Pg.java b/core/core-backend/src/main/java/io/dataease/datasource/type/Pg.java index 7c3e690fc1..9b66bd3a4d 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/Pg.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/Pg.java @@ -12,6 +12,9 @@ public class Pg extends DatasourceConfiguration { private String extraParams = ""; public String getJdbc() { + if(StringUtils.isNoneEmpty(getUrlType()) && !getUrlType().equalsIgnoreCase("hostName")){ + return getJdbcUrl(); + } if(StringUtils.isEmpty(extraParams.trim())){ if (StringUtils.isEmpty(getSchema())) { return "jdbc:postgresql://HOSTNAME:PORT/DATABASE" diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/Redshift.java b/core/core-backend/src/main/java/io/dataease/datasource/type/Redshift.java index 8c2a37f39e..6d81242106 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/Redshift.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/Redshift.java @@ -12,6 +12,9 @@ public class Redshift extends DatasourceConfiguration { private String extraParams = ""; public String getJdbc() { + if(StringUtils.isNoneEmpty(getUrlType()) && !getUrlType().equalsIgnoreCase("hostName")){ + return getJdbcUrl(); + } return "jdbc:redshift://HOSTNAME:PORT/DATABASE" .replace("HOSTNAME", getHost().trim()) .replace("PORT", getPort().toString().trim()) diff --git a/core/core-backend/src/main/java/io/dataease/datasource/type/Sqlserver.java b/core/core-backend/src/main/java/io/dataease/datasource/type/Sqlserver.java index f14ac32c19..24e5327514 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/type/Sqlserver.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/type/Sqlserver.java @@ -17,6 +17,9 @@ public class Sqlserver extends DatasourceConfiguration { private List showTableSqls = Arrays.asList("show tables"); public String getJdbc() { + if(StringUtils.isNoneEmpty(getUrlType()) && !getUrlType().equalsIgnoreCase("hostName")){ + return getJdbcUrl(); + } if (StringUtils.isEmpty(extraParams.trim())) { return "jdbc:sqlserver://HOSTNAME:PORT;DatabaseName=DATABASE" .replace("HOSTNAME", getHost().trim()) diff --git a/core/core-frontend/src/locales/zh-CN.ts b/core/core-frontend/src/locales/zh-CN.ts index 08cc0e679d..8fbb691753 100644 --- a/core/core-frontend/src/locales/zh-CN.ts +++ b/core/core-frontend/src/locales/zh-CN.ts @@ -284,6 +284,7 @@ export default { datasource_url: '地址', please_input_datasource_url: '请输入 Elasticsearch 地址,如: http://es_host:es_port', please_input_data_base: '请输入数据库名称', + please_input_jdbc_url: '请输入JDBC 连接', please_select_oracle_type: '选择连接类型', please_input_user_name: '请输入用户名', please_input_password: '请输入密码', diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue b/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue index 3b6123fbe8..21bcf77727 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/EditorDetail.vue @@ -5,7 +5,7 @@ import type { FormInstance, FormRules } from 'element-plus-secondary' import EmptyBackground from '@/components/empty-background/src/EmptyBackground.vue' import { cloneDeep } from 'lodash-es' import ApiHttpRequestDraw from './ApiHttpRequestDraw.vue' -import { Configuration, ApiConfiguration, SyncSetting } from './index.vue' +import type { Configuration, ApiConfiguration, SyncSetting } from './option' import { Icon } from '@/components/icon-custom' import { getSchema } from '@/api/datasource' import { Base64 } from 'js-base64' @@ -102,6 +102,8 @@ const initForm = type => { if (type !== 'API') { form.value.configuration = { dataBase: '', + jdbcUrl: '', + urlType: 'hostName', extraParams: '', username: '', password: '', @@ -153,6 +155,13 @@ const authMethodList = [ ] const setRules = () => { const configRules = { + 'configuration.jdbcUrl': [ + { + required: true, + message: t('datasource.please_input_jdbc_url'), + trigger: 'blur' + } + ], 'configuration.dataBase': [ { required: true, @@ -602,14 +611,41 @@ defineExpose({