forked from nacos-group/nacos-plugin
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(datasource): 添加 OpenGauss 数据库方言和映射 数据源支持
- 实现兼容OpenGauss功能,整理Mapper结果,不在继承Mysql - 添加 GaussDB 函数枚举类 - 创建 OpenGauss 兼容 MySQL 的数据库模式 - 在数据库类型常量中添加 GaussDB
- Loading branch information
1 parent
c60e26a
commit 6a98d8d
Showing
20 changed files
with
2,040 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
85 changes: 85 additions & 0 deletions
85
nacos-datasource-plugin-ext/nacos-opengauss-datasource-plugin-ext/pom.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<project xmlns="http://maven.apache.org/POM/4.0.0" | ||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
<parent> | ||
<artifactId>nacos-datasource-plugin-ext</artifactId> | ||
<groupId>com.alibaba.nacos</groupId> | ||
<version>${revision}</version> | ||
</parent> | ||
<modelVersion>4.0.0</modelVersion> | ||
|
||
<artifactId>nacos-opengauss-datasource-plugin-ext</artifactId> | ||
<version>1.0.0</version> | ||
|
||
<properties> | ||
<maven.compiler.source>8</maven.compiler.source> | ||
<maven.compiler.target>8</maven.compiler.target> | ||
<jdbc.postgresql.version>42.2.19</jdbc.postgresql.version> | ||
</properties> | ||
|
||
|
||
<dependencies> | ||
<dependency> | ||
<groupId>org.opengauss</groupId> | ||
<artifactId>opengauss-jdbc</artifactId> | ||
<version>5.1.0-og</version> | ||
</dependency> | ||
<dependency> | ||
<groupId>com.alibaba.nacos</groupId> | ||
<artifactId>nacos-datasource-plugin-ext-base</artifactId> | ||
<version>${revision}</version> | ||
<scope>compile</scope> | ||
</dependency> | ||
<dependency> | ||
<groupId>com.alibaba.nacos</groupId> | ||
<artifactId>nacos-aes-encryption-plugin</artifactId> | ||
<version>1.0.0-SNAPSHOT</version> | ||
</dependency> | ||
</dependencies> | ||
|
||
<build> | ||
<plugins> | ||
<!--Packaging plug-in--> | ||
<plugin> | ||
<groupId>org.apache.maven.plugins</groupId> | ||
<artifactId>maven-shade-plugin</artifactId> | ||
<version>${maven-shade-plugin.version}</version> | ||
<configuration> | ||
<createDependencyReducedPom>false</createDependencyReducedPom> | ||
</configuration> | ||
<executions> | ||
<execution> | ||
<phase>package</phase> | ||
<goals> | ||
<goal>shade</goal> | ||
</goals> | ||
<configuration> | ||
<transformers> | ||
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> | ||
</transformers> | ||
<filters> | ||
<filter> | ||
<artifact>*:*</artifact> | ||
<excludes> | ||
<exclude>module-info.class</exclude> | ||
<exclude>META-INF/NOTICE.txt</exclude> | ||
<exclude>META-INF/LICENSE</exclude> | ||
<exclude>META-INF/NOTICE</exclude> | ||
<exclude>META-INF/DEPENDENCIES</exclude> | ||
<exclude>META-INF/*.SF</exclude> | ||
<exclude>META-INF/*.DSA</exclude> | ||
<exclude>META-INF/*.RSA</exclude> | ||
<exclude>META-INF/*.MF</exclude> | ||
</excludes> | ||
</filter> | ||
</filters> | ||
</configuration> | ||
</execution> | ||
</executions> | ||
</plugin> | ||
</plugins> | ||
</build> | ||
|
||
|
||
</project> |
52 changes: 52 additions & 0 deletions
52
...ext/src/main/java/com/alibaba/nacos/plugin/datasource/dialect/GaussdbDatabaseDialect.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
/* | ||
* Copyright 1999-2022 Alibaba Group Holding Ltd. | ||
* | ||
* Licensed 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 com.alibaba.nacos.plugin.datasource.dialect; | ||
|
||
import com.alibaba.nacos.plugin.datasource.constants.DatabaseTypeConstant; | ||
|
||
/** | ||
* PostgreSQL database dialect. | ||
* @author Long Yu | ||
*/ | ||
public class GaussdbDatabaseDialect extends AbstractDatabaseDialect { | ||
|
||
@Override | ||
public String getType() { | ||
return DatabaseTypeConstant.GUASSDB; | ||
} | ||
|
||
@Override | ||
public String getLimitTopSqlWithMark(String sql) { | ||
return sql + " LIMIT ? "; | ||
} | ||
|
||
@Override | ||
public String getLimitPageSqlWithMark(String sql) { | ||
return sql + " OFFSET ? LIMIT ? "; | ||
} | ||
|
||
@Override | ||
public String getLimitPageSql(String sql, int pageNo, int pageSize) { | ||
return sql + " OFFSET " + getPagePrevNum(pageNo, pageSize) + " LIMIT " + pageSize; | ||
} | ||
|
||
@Override | ||
public String getLimitPageSqlWithOffset(String sql, int startOffset, int pageSize){ | ||
return sql + " OFFSET " + startOffset + " LIMIT " + pageSize; | ||
} | ||
|
||
} |
66 changes: 66 additions & 0 deletions
66
...ext/src/main/java/com/alibaba/nacos/plugin/datasource/impl/enums/GaussdbFunctionEnum.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
/* | ||
* Copyright 1999-2018 Alibaba Group Holding Ltd. | ||
* | ||
* Licensed 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 com.alibaba.nacos.plugin.datasource.impl.enums; | ||
|
||
import java.util.HashMap; | ||
import java.util.Map; | ||
|
||
/** | ||
* The TrustedSqlFunctionEnum enum class is used to enumerate and manage a list of trusted built-in SQL functions. | ||
* By using this enum, you can verify whether a given SQL function is part of the trusted functions list | ||
* to avoid potential SQL injection risks. | ||
* | ||
* @author blake.qiu | ||
*/ | ||
public enum GaussdbFunctionEnum { | ||
|
||
/** | ||
* NOW(). | ||
*/ | ||
NOW("NOW()", "NOW()"); | ||
|
||
private static final Map<String, GaussdbFunctionEnum> LOOKUP_MAP = new HashMap<>(); | ||
|
||
static { | ||
for (GaussdbFunctionEnum entry : GaussdbFunctionEnum.values()) { | ||
LOOKUP_MAP.put(entry.functionName, entry); | ||
} | ||
} | ||
|
||
private final String functionName; | ||
|
||
private final String function; | ||
|
||
GaussdbFunctionEnum(String functionName, String function) { | ||
this.functionName = functionName; | ||
this.function = function; | ||
} | ||
|
||
/** | ||
* Get the function name. | ||
* | ||
* @param functionName function name | ||
* @return function | ||
*/ | ||
public static String getFunctionByName(String functionName) { | ||
GaussdbFunctionEnum entry = LOOKUP_MAP.get(functionName); | ||
if (entry != null) { | ||
return entry.function; | ||
} | ||
throw new IllegalArgumentException(String.format("Invalid function name: %s", functionName)); | ||
} | ||
} |
52 changes: 52 additions & 0 deletions
52
...main/java/com/alibaba/nacos/plugin/datasource/impl/opengauss/AbstractMapperByGaussdb.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
/* | ||
* Copyright 1999-2022 Alibaba Group Holding Ltd. | ||
* | ||
* Licensed 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 com.alibaba.nacos.plugin.datasource.impl.opengauss; | ||
|
||
import com.alibaba.nacos.plugin.datasource.constants.DatabaseTypeConstant; | ||
import com.alibaba.nacos.plugin.datasource.dialect.DatabaseDialect; | ||
import com.alibaba.nacos.plugin.datasource.impl.enums.GaussdbFunctionEnum; | ||
import com.alibaba.nacos.plugin.datasource.manager.DatabaseDialectManager; | ||
import com.alibaba.nacos.plugin.datasource.mapper.AbstractMapper; | ||
|
||
/** | ||
* The base implementation of ConfigTagsRelationMapper. | ||
* | ||
* @author Long Yu | ||
**/ | ||
public abstract class AbstractMapperByGaussdb extends AbstractMapper { | ||
|
||
private DatabaseDialect databaseDialect; | ||
|
||
public DatabaseDialect getDatabaseDialect() { | ||
return databaseDialect; | ||
} | ||
|
||
public AbstractMapperByGaussdb() { | ||
databaseDialect = DatabaseDialectManager.getInstance().getDialect(getDataSource()); | ||
} | ||
|
||
@Override | ||
public String getDataSource() { | ||
return DatabaseTypeConstant.GUASSDB; | ||
} | ||
|
||
@Override | ||
public String getFunction(String functionName) { | ||
return GaussdbFunctionEnum.getFunctionByName(functionName); | ||
} | ||
|
||
} |
56 changes: 56 additions & 0 deletions
56
...ava/com/alibaba/nacos/plugin/datasource/impl/opengauss/OpenGaussConfigInfoAggrMapper.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
/* | ||
* Copyright 1999-2022 Alibaba Group Holding Ltd. | ||
* | ||
* Licensed 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 com.alibaba.nacos.plugin.datasource.impl.opengauss; | ||
|
||
|
||
import java.util.List; | ||
|
||
import com.alibaba.nacos.common.utils.CollectionUtils; | ||
import com.alibaba.nacos.plugin.datasource.constants.FieldConstant; | ||
import com.alibaba.nacos.plugin.datasource.constants.TableConstant; | ||
import com.alibaba.nacos.plugin.datasource.mapper.ConfigInfoAggrMapper; | ||
import com.alibaba.nacos.plugin.datasource.model.MapperContext; | ||
import com.alibaba.nacos.plugin.datasource.model.MapperResult; | ||
|
||
/** | ||
* The base implementation of ConfigInfoBetaMapper. | ||
* | ||
* @author Long Yu | ||
**/ | ||
public class OpenGaussConfigInfoAggrMapper extends AbstractMapperByGaussdb implements ConfigInfoAggrMapper { | ||
|
||
@Override | ||
public String getTableName() { | ||
return TableConstant.CONFIG_INFO_AGGR; | ||
} | ||
|
||
@Override | ||
public MapperResult findConfigInfoAggrByPageFetchRows(MapperContext context) { | ||
int startRow = context.getStartRow(); | ||
int pageSize = context.getPageSize(); | ||
String dataId = (String) context.getWhereParameter(FieldConstant.DATA_ID); | ||
String groupId = (String) context.getWhereParameter(FieldConstant.GROUP_ID); | ||
String tenantId = (String) context.getWhereParameter(FieldConstant.TENANT_ID); | ||
String sql = getDatabaseDialect().getLimitPageSqlWithOffset( | ||
"SELECT data_id,group_id,tenant_id,datum_id,app_name,content FROM config_info_aggr WHERE data_id= ? AND " | ||
+ "group_id= ? AND tenant_id= ? ORDER BY datum_id ", startRow, pageSize); | ||
List<Object> paramList = CollectionUtils.list(dataId, groupId, tenantId); | ||
return new MapperResult(sql, paramList); | ||
} | ||
|
||
|
||
} |
56 changes: 56 additions & 0 deletions
56
...ava/com/alibaba/nacos/plugin/datasource/impl/opengauss/OpenGaussConfigInfoBetaMapper.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
/* | ||
* Copyright 1999-2022 Alibaba Group Holding Ltd. | ||
* | ||
* Licensed 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 com.alibaba.nacos.plugin.datasource.impl.opengauss; | ||
|
||
|
||
import java.util.Collections; | ||
|
||
import com.alibaba.nacos.plugin.datasource.constants.TableConstant; | ||
import com.alibaba.nacos.plugin.datasource.mapper.ConfigInfoBetaMapper; | ||
import com.alibaba.nacos.plugin.datasource.model.MapperContext; | ||
import com.alibaba.nacos.plugin.datasource.model.MapperResult; | ||
|
||
/** | ||
* The base implementation of ConfigInfoBetaMapper. | ||
* | ||
* @author Long Yu | ||
**/ | ||
public class OpenGaussConfigInfoBetaMapper extends AbstractMapperByGaussdb implements ConfigInfoBetaMapper { | ||
|
||
@Override | ||
public String getTableName() { | ||
return TableConstant.CONFIG_INFO_BETA; | ||
} | ||
|
||
public String getLimitPageSqlWithOffset(String sql, int startRow, int pageSize) { | ||
return getDatabaseDialect().getLimitPageSqlWithOffset(sql, startRow, pageSize); | ||
} | ||
|
||
@Override | ||
public MapperResult findAllConfigInfoBetaForDumpAllFetchRows(MapperContext context) { | ||
int startRow = context.getStartRow(); | ||
int pageSize = context.getPageSize(); | ||
String sqlInner = getLimitPageSqlWithOffset("SELECT id FROM config_info_beta ORDER BY id ", startRow, | ||
pageSize); | ||
String sql = | ||
" SELECT t.id,data_id,group_id,tenant_id,app_name,content,md5,gmt_modified,beta_ips,encrypted_data_key " | ||
+ " FROM ( " + sqlInner + " )" + " g, config_info_beta t WHERE g.id = t.id "; | ||
return new MapperResult(sql, Collections.emptyList()); | ||
} | ||
|
||
|
||
} |
Oops, something went wrong.