diff --git a/.dlc.json b/.dlc.json index 2dcead4686..8d1d9ab6ef 100644 --- a/.dlc.json +++ b/.dlc.json @@ -35,5 +35,5 @@ "retryOn429": true, "retryCount": 10, "fallbackRetryDelay": "1000s", - "aliveStatusCodes": [200, 401, 0] + "aliveStatusCodes": [200, 401, 403, 0] } diff --git a/docs/configs/docsdev.js b/docs/configs/docsdev.js index 22968f0c3a..690d9ce883 100644 --- a/docs/configs/docsdev.js +++ b/docs/configs/docsdev.js @@ -303,6 +303,22 @@ export default { title: 'Azure SQL Database', link: '/en-us/docs/dev/user_doc/guide/datasource/azure-sql.html', }, + { + title: 'Trino', + link: '/en-us/docs/dev/user_doc/guide/datasource/trino.html', + }, + { + title: 'StarRocks', + link: '/en-us/docs/dev/user_doc/guide/datasource/starrocks.html', + }, + { + title: 'DAMENG', + link: '/en-us/docs/dev/user_doc/guide/datasource/dameng.html', + }, + { + title: 'OceanBase', + link: '/en-us/docs/dev/user_doc/guide/datasource/oceanbase.html', + }, ], }, { @@ -948,6 +964,30 @@ export default { title: 'Azure SQL Database', link: '/zh-cn/docs/dev/user_doc/guide/datasource/azure-sql.html', }, + { + title: 'Redshift', + link: '/zh-cn/docs/dev/user_doc/guide/datasource/redshift.html', + }, + { + title: 'Oracle', + link: '/zh-cn/docs/dev/user_doc/guide/datasource/oracle.html', + }, + { + title: 'Trino', + link: '/zh-cn/docs/dev/user_doc/guide/datasource/trino.html', + }, + { + title: 'StarRocks', + link: '/zh-cn/docs/dev/user_doc/guide/datasource/starrocks.html', + }, + { + title: 'DAMENG', + link: '/zh-cn/docs/dev/user_doc/guide/datasource/dameng.html', + }, + { + title: 'OceanBase', + link: '/zh-cn/docs/dev/user_doc/guide/datasource/oceanbase.html', + }, ], }, { diff --git a/docs/docs/en/guide/datasource/oceanbase.md b/docs/docs/en/guide/datasource/oceanbase.md new file mode 100644 index 0000000000..57eed20355 --- /dev/null +++ b/docs/docs/en/guide/datasource/oceanbase.md @@ -0,0 +1,24 @@ +# OceanBase + +![oceanbase](../../../../img/new_ui/dev/datasource/oceanbase.png) + +## Datasource Parameters + +| **Datasource** | **Description** | +|----------------------------|--------------------------------------------------------------| +| Datasource | Select OCEANBASE. | +| Datasource name | Enter the name of the DataSource. | +| Description | Enter a description of the DataSource. | +| IP/Host name | Enter the OceanBase service IP. | +| Port | Enter the OceanBase service port. | +| Username | Set the username for OceanBase connection. | +| Password | Set the password for OceanBase connection. | +| Database name | Enter the database name of the OceanBase connection. | +| Compatible mode | Set the compatible mode of the OceanBase connection. | +| Jdbc connection parameters | Parameter settings for OceanBase connection, in JSON format. | + +## Native Supported + +No, you need to import the OceanBase jdbc driver [oceanbase-client](https://mvnrepository.com/artifact/com.oceanbase/oceanbase-client) first, refer to the section example in [datasource-setting](../howto/datasource-setting.md) `DataSource Center` section. + +The compatible mode of the datasource can be 'mysql' or 'oracle', if you only use OceanBase with 'mysql' mode, you can also treat OceanBase as MySQL and manage the datasource referring to [mysql datasource](mysql.md) diff --git a/docs/docs/zh/guide/datasource/oceanbase.md b/docs/docs/zh/guide/datasource/oceanbase.md new file mode 100644 index 0000000000..59caffdb02 --- /dev/null +++ b/docs/docs/zh/guide/datasource/oceanbase.md @@ -0,0 +1,21 @@ +# OceanBase 数据源 + +![oceanbase](../../../../img/new_ui/dev/datasource/oceanbase.png) + +- 数据源:选择 OCEANBASE +- 数据源名称:输入数据源的名称 +- 描述:输入数据源的描述 +- IP 主机名:输入连接 OceanBase 的 IP +- 端口:输入连接 OceanBase 的端口 +- 用户名:设置连接 OceanBase 的用户名 +- 密码:设置连接 OceanBase 的密码 +- 数据库名:输入连接 OceanBase 的数据库名称 +- 兼容模式:输入连接 OceanBase 的兼容模式 +- Jdbc 连接参数:用于 OceanBase 连接的参数设置,以 JSON 形式填写 + +## 是否原生支持 + +否,使用前需要先引入 OceanBase 的 JDBC 驱动 [oceanbase-client](https://mvnrepository.com/artifact/com.oceanbase/oceanbase-client),请参考 [数据源配置](../howto/datasource-setting.md) 中的 "数据源中心" 章节。 + +OceanBase 数据源的兼容模式可以是 'mysql' 或 'oracle',如果你只使用 mysql 模式,你也可以选择将 OceanBase 数据源当作 MySQL 数据源来使用,请参考 [MySQL 数据源](mysql.md) + diff --git a/docs/img/new_ui/dev/datasource/oceanbase.png b/docs/img/new_ui/dev/datasource/oceanbase.png new file mode 100644 index 0000000000..46ef0a592b Binary files /dev/null and b/docs/img/new_ui/dev/datasource/oceanbase.png differ diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/DataSourceConstants.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/DataSourceConstants.java index 58602ba3b2..f2f580a8b8 100644 --- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/DataSourceConstants.java +++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/DataSourceConstants.java @@ -37,6 +37,7 @@ public class DataSourceConstants { public static final String COM_ATHENA_JDBC_DRIVER = "com.simba.athena.jdbc.Driver"; public static final String COM_TRINO_JDBC_DRIVER = "io.trino.jdbc.TrinoDriver"; public static final String COM_DAMENG_JDBC_DRIVER = "dm.jdbc.driver.DmDriver"; + public static final String COM_OCEANBASE_JDBC_DRIVER = "com.oceanbase.jdbc.Driver"; /** * validation Query @@ -71,6 +72,7 @@ public class DataSourceConstants { public static final String JDBC_ATHENA = "jdbc:awsathena://"; public static final String JDBC_TRINO = "jdbc:trino://"; public static final String JDBC_DAMENG = "jdbc:dm://"; + public static final String JDBC_OCEANBASE = "jdbc:oceanbase://"; /** * database type diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-all/pom.xml b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-all/pom.xml index 4030b07bd6..28b2f21ec9 100644 --- a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-all/pom.xml +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-all/pom.xml @@ -47,6 +47,11 @@ dolphinscheduler-datasource-mysql ${project.version} + + org.apache.dolphinscheduler + dolphinscheduler-datasource-oceanbase + ${project.version} + org.apache.dolphinscheduler dolphinscheduler-datasource-oracle diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/pom.xml b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/pom.xml new file mode 100644 index 0000000000..37e228c9e6 --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/pom.xml @@ -0,0 +1,43 @@ + + + + 4.0.0 + + org.apache.dolphinscheduler + dolphinscheduler-datasource-plugin + dev-SNAPSHOT + + + dolphinscheduler-datasource-oceanbase + jar + ${project.artifactId} + + + + org.apache.dolphinscheduler + dolphinscheduler-spi + provided + + + org.apache.dolphinscheduler + dolphinscheduler-datasource-api + ${project.version} + + + diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannel.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannel.java new file mode 100644 index 0000000000..0dac1d768c --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannel.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.dolphinscheduler.plugin.datasource.oceanbase; + +import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam; +import org.apache.dolphinscheduler.spi.datasource.DataSourceChannel; +import org.apache.dolphinscheduler.spi.datasource.DataSourceClient; +import org.apache.dolphinscheduler.spi.enums.DbType; + +public class OceanBaseDataSourceChannel implements DataSourceChannel { + + @Override + public DataSourceClient createDataSourceClient(BaseConnectionParam baseConnectionParam, DbType dbType) { + return new OceanBaseDataSourceClient(baseConnectionParam, dbType); + } +} diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannelFactory.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannelFactory.java new file mode 100644 index 0000000000..a69d6b3ae5 --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceChannelFactory.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.dolphinscheduler.plugin.datasource.oceanbase; + +import org.apache.dolphinscheduler.spi.datasource.DataSourceChannel; +import org.apache.dolphinscheduler.spi.datasource.DataSourceChannelFactory; + +import com.google.auto.service.AutoService; + +@AutoService(DataSourceChannelFactory.class) +public class OceanBaseDataSourceChannelFactory implements DataSourceChannelFactory { + + @Override + public String getName() { + return "oceanbase"; + } + + @Override + public DataSourceChannel create() { + return new OceanBaseDataSourceChannel(); + } +} diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceClient.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceClient.java new file mode 100644 index 0000000000..4097ae47d2 --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/OceanBaseDataSourceClient.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.dolphinscheduler.plugin.datasource.oceanbase; + +import org.apache.dolphinscheduler.plugin.datasource.api.client.CommonDataSourceClient; +import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam; +import org.apache.dolphinscheduler.spi.enums.DbType; + +public class OceanBaseDataSourceClient extends CommonDataSourceClient { + + public OceanBaseDataSourceClient(BaseConnectionParam baseConnectionParam, DbType dbType) { + super(baseConnectionParam, dbType); + } +} diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseConnectionParam.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseConnectionParam.java new file mode 100644 index 0000000000..c645179b64 --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseConnectionParam.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.dolphinscheduler.plugin.datasource.oceanbase.param; + +import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam; + +import lombok.Data; + +@Data +public class OceanBaseConnectionParam extends BaseConnectionParam { + + protected String compatibleMode; +} diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceParamDTO.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceParamDTO.java new file mode 100644 index 0000000000..9758d2d1c7 --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceParamDTO.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.dolphinscheduler.plugin.datasource.oceanbase.param; + +import org.apache.dolphinscheduler.plugin.datasource.api.datasource.BaseDataSourceParamDTO; +import org.apache.dolphinscheduler.spi.enums.DbType; + +public class OceanBaseDataSourceParamDTO extends BaseDataSourceParamDTO { + + protected String compatibleMode; + + public String getCompatibleMode() { + return compatibleMode; + } + + public void setCompatibleMode(String compatibleMode) { + this.compatibleMode = compatibleMode; + } + + @Override + public DbType getType() { + return DbType.OCEANBASE; + } +} diff --git a/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceProcessor.java b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceProcessor.java new file mode 100644 index 0000000000..795dcb35a8 --- /dev/null +++ b/dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-oceanbase/src/main/java/org/apache/dolphinscheduler/plugin/datasource/oceanbase/param/OceanBaseDataSourceProcessor.java @@ -0,0 +1,191 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.dolphinscheduler.plugin.datasource.oceanbase.param; + +import org.apache.dolphinscheduler.common.constants.Constants; +import org.apache.dolphinscheduler.common.constants.DataSourceConstants; +import org.apache.dolphinscheduler.common.utils.JSONUtils; +import org.apache.dolphinscheduler.plugin.datasource.api.datasource.AbstractDataSourceProcessor; +import org.apache.dolphinscheduler.plugin.datasource.api.datasource.BaseDataSourceParamDTO; +import org.apache.dolphinscheduler.plugin.datasource.api.datasource.DataSourceProcessor; +import org.apache.dolphinscheduler.plugin.datasource.api.utils.PasswordUtils; +import org.apache.dolphinscheduler.spi.datasource.ConnectionParam; +import org.apache.dolphinscheduler.spi.enums.DbType; + +import org.apache.commons.collections4.MapUtils; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import lombok.extern.slf4j.Slf4j; + +import com.google.auto.service.AutoService; + +@Slf4j +@AutoService(DataSourceProcessor.class) +public class OceanBaseDataSourceProcessor extends AbstractDataSourceProcessor { + + private static final String ALLOW_LOAD_LOCAL_IN_FILE_NAME = "allowLoadLocalInfile"; + + private static final String AUTO_DESERIALIZE = "autoDeserialize"; + + private static final String ALLOW_LOCAL_IN_FILE_NAME = "allowLocalInfile"; + + private static final String ALLOW_URL_IN_LOCAL_IN_FILE_NAME = "allowUrlInLocalInfile"; + + private static final String APPEND_PARAMS = + "allowLoadLocalInfile=false&autoDeserialize=false&allowLocalInfile=false&allowUrlInLocalInfile=false"; + + @Override + public BaseDataSourceParamDTO castDatasourceParamDTO(String paramJson) { + return JSONUtils.parseObject(paramJson, OceanBaseDataSourceParamDTO.class); + } + + @Override + public BaseDataSourceParamDTO createDatasourceParamDTO(String connectionJson) { + OceanBaseConnectionParam connectionParams = (OceanBaseConnectionParam) createConnectionParams(connectionJson); + OceanBaseDataSourceParamDTO dataSourceParamDTO = new OceanBaseDataSourceParamDTO(); + dataSourceParamDTO.setUserName(connectionParams.getUser()); + dataSourceParamDTO.setDatabase(connectionParams.getDatabase()); + dataSourceParamDTO.setOther(connectionParams.getOther()); + + String address = connectionParams.getAddress(); + String[] hostSeparator = address.split(Constants.DOUBLE_SLASH); + String[] hostPortArray = hostSeparator[hostSeparator.length - 1].split(Constants.COMMA); + dataSourceParamDTO.setPort(Integer.parseInt(hostPortArray[0].split(Constants.COLON)[1])); + dataSourceParamDTO.setHost(hostPortArray[0].split(Constants.COLON)[0]); + return dataSourceParamDTO; + } + + @Override + public ConnectionParam createConnectionParams(BaseDataSourceParamDTO datasourceParam) { + OceanBaseDataSourceParamDTO obDataSourceParamDTO = (OceanBaseDataSourceParamDTO) datasourceParam; + String address = String.format("%s%s:%s", DataSourceConstants.JDBC_OCEANBASE, obDataSourceParamDTO.getHost(), + obDataSourceParamDTO.getPort()); + String jdbcUrl = String.format("%s/%s", address, obDataSourceParamDTO.getDatabase()); + + OceanBaseConnectionParam connectionParam = new OceanBaseConnectionParam(); + connectionParam.setJdbcUrl(jdbcUrl); + connectionParam.setDatabase(obDataSourceParamDTO.getDatabase()); + connectionParam.setAddress(address); + connectionParam.setUser(obDataSourceParamDTO.getUserName()); + connectionParam.setPassword(PasswordUtils.encodePassword(obDataSourceParamDTO.getPassword())); + connectionParam.setCompatibleMode(obDataSourceParamDTO.getCompatibleMode()); + connectionParam.setDriverClassName(getDatasourceDriver()); + connectionParam.setValidationQuery(getValidationQuery(connectionParam.getCompatibleMode())); + connectionParam.setOther(obDataSourceParamDTO.getOther()); + return connectionParam; + } + + @Override + public ConnectionParam createConnectionParams(String connectionJson) { + return JSONUtils.parseObject(connectionJson, OceanBaseConnectionParam.class); + } + + @Override + public String getDatasourceDriver() { + return DataSourceConstants.COM_OCEANBASE_JDBC_DRIVER; + } + + @Override + public String getValidationQuery() { + throw new UnsupportedOperationException("Can't get validation query without compatible mode"); + } + + public String getValidationQuery(String compatibleMode) { + if (compatibleMode != null) { + switch (compatibleMode.trim().toLowerCase()) { + case "mysql": + return DataSourceConstants.MYSQL_VALIDATION_QUERY; + case "oracle": + return DataSourceConstants.ORACLE_VALIDATION_QUERY; + } + } + throw new UnsupportedOperationException("Invalid compatible mode: " + compatibleMode); + + } + + @Override + public String getJdbcUrl(ConnectionParam connectionParam) { + OceanBaseConnectionParam obConnectionParam = (OceanBaseConnectionParam) connectionParam; + String jdbcUrl = obConnectionParam.getJdbcUrl(); + if (MapUtils.isNotEmpty(obConnectionParam.getOther())) { + return String.format("%s?%s&%s", jdbcUrl, transformOther(obConnectionParam.getOther()), APPEND_PARAMS); + } + return String.format("%s?%s", jdbcUrl, APPEND_PARAMS); + } + + private String transformOther(Map paramMap) { + if (MapUtils.isEmpty(paramMap)) { + return null; + } + Map otherMap = new HashMap<>(); + paramMap.forEach((k, v) -> { + if (!checkKeyIsLegitimate(k)) { + return; + } + otherMap.put(k, v); + }); + if (MapUtils.isEmpty(otherMap)) { + return null; + } + List otherList = new ArrayList<>(); + otherMap.forEach((key, value) -> otherList.add(String.format("%s=%s", key, value))); + return String.join("&", otherList); + } + + private static boolean checkKeyIsLegitimate(String key) { + return !key.contains(ALLOW_LOAD_LOCAL_IN_FILE_NAME) + && !key.contains(AUTO_DESERIALIZE) + && !key.contains(ALLOW_LOCAL_IN_FILE_NAME) + && !key.contains(ALLOW_URL_IN_LOCAL_IN_FILE_NAME); + } + + @Override + public Connection getConnection(ConnectionParam connectionParam) throws ClassNotFoundException, SQLException, IOException { + OceanBaseConnectionParam obConnectionParam = (OceanBaseConnectionParam) connectionParam; + Class.forName(getDatasourceDriver()); + String user = obConnectionParam.getUser(); + if (user.contains(AUTO_DESERIALIZE)) { + log.warn("sensitive param : {} in username field is filtered", AUTO_DESERIALIZE); + user = user.replace(AUTO_DESERIALIZE, ""); + } + String password = PasswordUtils.decodePassword(obConnectionParam.getPassword()); + if (password.contains(AUTO_DESERIALIZE)) { + log.warn("sensitive param : {} in password field is filtered", AUTO_DESERIALIZE); + password = password.replace(AUTO_DESERIALIZE, ""); + } + return DriverManager.getConnection(getJdbcUrl(connectionParam), user, password); + } + + @Override + public DbType getDbType() { + return DbType.OCEANBASE; + } + + @Override + public DataSourceProcessor create() { + return new OceanBaseDataSourceProcessor(); + } +} diff --git a/dolphinscheduler-datasource-plugin/pom.xml b/dolphinscheduler-datasource-plugin/pom.xml index f9f82f8736..767d54b449 100644 --- a/dolphinscheduler-datasource-plugin/pom.xml +++ b/dolphinscheduler-datasource-plugin/pom.xml @@ -33,6 +33,7 @@ dolphinscheduler-datasource-db2 dolphinscheduler-datasource-hive dolphinscheduler-datasource-mysql + dolphinscheduler-datasource-oceanbase dolphinscheduler-datasource-oracle dolphinscheduler-datasource-postgresql dolphinscheduler-datasource-spark diff --git a/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/enums/DbType.java b/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/enums/DbType.java index c2d4977bf5..7eb8855b73 100644 --- a/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/enums/DbType.java +++ b/dolphinscheduler-spi/src/main/java/org/apache/dolphinscheduler/spi/enums/DbType.java @@ -43,7 +43,8 @@ public enum DbType { TRINO(12, "trino"), STARROCKS(13, "starrocks"), AZURESQL(14, "azuresql"), - DAMENG(15, "dameng"); + DAMENG(15, "dameng"), + OCEANBASE(16, "oceanbase"); private static final Map DB_TYPE_MAP = Arrays.stream(DbType.values()).collect(toMap(DbType::getCode, Functions.identity())); diff --git a/dolphinscheduler-ui/src/locales/en_US/datasource.ts b/dolphinscheduler-ui/src/locales/en_US/datasource.ts index dfa8e6d01d..f001dc145a 100644 --- a/dolphinscheduler-ui/src/locales/en_US/datasource.ts +++ b/dolphinscheduler-ui/src/locales/en_US/datasource.ts @@ -56,6 +56,8 @@ export default { oracle_connect_type_tips: 'Please select serviceName or SID', oracle_service_name: 'ServiceName', oracle_sid: 'SID', + compatible_mode: 'Compatible Mode', + compatible_mode_tips: 'Please enter compatible mode', jdbc_connect_parameters: 'jdbc connect parameters', principal_tips: 'Please enter Principal', krb5_conf_tips: diff --git a/dolphinscheduler-ui/src/locales/zh_CN/datasource.ts b/dolphinscheduler-ui/src/locales/zh_CN/datasource.ts index 749647270d..702ad9d6dd 100644 --- a/dolphinscheduler-ui/src/locales/zh_CN/datasource.ts +++ b/dolphinscheduler-ui/src/locales/zh_CN/datasource.ts @@ -56,6 +56,8 @@ export default { oracle_connect_type_tips: '请选择服务名或SID', oracle_service_name: '服务名', oracle_sid: 'SID', + compatible_mode: '兼容模式', + compatible_mode_tips: '请输入兼容模式', jdbc_connect_parameters: 'jdbc连接参数', principal_tips: '请输入Principal', krb5_conf_tips: '请输入kerberos认证参数 java.security.krb5.conf', diff --git a/dolphinscheduler-ui/src/service/modules/data-source/types.ts b/dolphinscheduler-ui/src/service/modules/data-source/types.ts index aa43909bc4..4da8d63724 100644 --- a/dolphinscheduler-ui/src/service/modules/data-source/types.ts +++ b/dolphinscheduler-ui/src/service/modules/data-source/types.ts @@ -31,6 +31,7 @@ type IDataBase = | 'AZURESQL' | 'STARROCKS' | 'DAMENG' + | 'OCEANBASE' type IDataBaseLabel = | 'MYSQL' @@ -48,6 +49,7 @@ type IDataBaseLabel = | 'AZURESQL' | 'STARROCKS' | 'DAMENG' +| 'OCEANBASE' interface IDataSource { id?: number @@ -73,6 +75,7 @@ interface IDataSource { endpoint?: string MSIClientId?: string dbUser?: string + compatibleMode?: string } interface ListReq { diff --git a/dolphinscheduler-ui/src/views/datasource/list/detail.tsx b/dolphinscheduler-ui/src/views/datasource/list/detail.tsx index 0d9dd6235a..cef9bab214 100644 --- a/dolphinscheduler-ui/src/views/datasource/list/detail.tsx +++ b/dolphinscheduler-ui/src/views/datasource/list/detail.tsx @@ -158,6 +158,7 @@ const DetailModal = defineComponent({ showHost, showPort, showAwsRegion, + showCompatibleMode, showConnectType, showPrincipal, showMode, @@ -568,6 +569,21 @@ const DetailModal = defineComponent({ + + +