Skip to content

Commit

Permalink
feature: support Dameng database (apache#3672)
Browse files Browse the repository at this point in the history
  • Loading branch information
iquanzhan authored Sep 22, 2023
1 parent 26d8cdb commit ecb7ef7
Show file tree
Hide file tree
Showing 45 changed files with 3,450 additions and 15 deletions.
5 changes: 5 additions & 0 deletions all/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -586,6 +586,11 @@
<artifactId>postgresql</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
Expand Down
2 changes: 2 additions & 0 deletions common/src/main/java/io/seata/common/util/PageUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ public static String pageSql(String sourceSql, String dbType, int pageNum, int p
case "h2":
case "postgresql":
case "oceanbase":
case "dm":
return LIMIT_TEMPLATE.replace(SOURCE_SQL_PLACE_HOLD, sourceSql)
.replace(LIMIT_PLACE_HOLD, String.valueOf(pageSize))
.replace(OFFSET_PLACE_HOLD, String.valueOf((pageNum - 1) * pageSize));
Expand All @@ -130,6 +131,7 @@ public static String countSql(String sourceSql, String dbType) {
case "h2":
case "oceanbase":
case "oracle":
case "dm":
return sourceSql.replaceAll("(?i)(?<=select)(.*)(?=from)", " count(1) ");
case "postgresql":
int lastIndexOfOrderBy = sourceSql.toLowerCase().lastIndexOf("order by");
Expand Down
2 changes: 2 additions & 0 deletions common/src/test/java/io/seata/common/util/PageUtilTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public void testPageSql() {
assertEquals(PageUtil.pageSql(sourceSql, "h2", 1, 5), mysqlTargetSql);
assertEquals(PageUtil.pageSql(sourceSql, "postgresql", 1, 5), mysqlTargetSql);
assertEquals(PageUtil.pageSql(sourceSql, "oceanbase", 1, 5), mysqlTargetSql);
assertEquals(PageUtil.pageSql(sourceSql, "dm", 1, 5), mysqlTargetSql);
assertEquals(PageUtil.pageSql(sourceSql, "oracle", 1, 5), oracleTargetSql);

assertThrows(NotSupportYetException.class, () -> PageUtil.pageSql(sourceSql, "xxx", 1, 5));
Expand All @@ -57,6 +58,7 @@ void testCountSql() {
assertEquals(PageUtil.countSql(sourceSql, "h2"), targetSql);
assertEquals(PageUtil.countSql(sourceSql, "postgresql"), targetSql);
assertEquals(PageUtil.countSql(sourceSql, "oceanbase"), targetSql);
assertEquals(PageUtil.countSql(sourceSql, "dm"), targetSql);
assertEquals(PageUtil.countSql(sourceSql, "oracle"), targetSql);

assertThrows(NotSupportYetException.class, () -> PageUtil.countSql(sourceSql, "xxx"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class DistributedLockSqlFactory {
/**
* get the lock store sql
*
* @param dbType the dbType, support mysql/oracle/h2/postgre/oceanbase, it's useless now, but maybe useful later
* @param dbType the dbType, support mysql/oracle/h2/postgre/oceanbase/dm, it's useless now, but maybe useful later
* @return lock store sql
*/
public static DistributedLockSql getDistributedLogStoreSql(String dbType) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* Copyright 1999-2019 Seata.io Group.
*
* 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 io.seata.core.store.db.sql.lock;

import io.seata.common.loader.LoadLevel;

/**
* the database lock store DaMeng sql
*
* @author wang.liang
* @since 1.8.0
*/
@LoadLevel(name = "dm")
public class DmLockStoreSql extends MysqlLockStoreSql {
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public class LockStoreSqlFactory {
/**
* get the lock store sql
*
* @param dbType the dbType, support mysql/oracle/h2/postgre/oceanbase
* @param dbType the dbType, support mysql/oracle/h2/postgre/oceanbase/dm
* @return lock store sql
*/
public static LockStoreSql getLogStoreSql(String dbType) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* Copyright 1999-2019 Seata.io Group.
*
* 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 io.seata.core.store.db.sql.log;

import io.seata.common.loader.LoadLevel;

/**
* Database log store DaMeng sql
*
* @author wang.liang
* @since 1.8.0
*/
@LoadLevel(name = "dm")
public class DmLogStoreSqls extends MysqlLogStoreSqls {
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ io.seata.core.store.db.sql.lock.MariadbLockStoreSql
io.seata.core.store.db.sql.lock.OracleLockStoreSql
io.seata.core.store.db.sql.lock.OceanbaseLockStoreSql
io.seata.core.store.db.sql.lock.PostgresqlLockStoreSql
io.seata.core.store.db.sql.lock.H2LockStoreSql
io.seata.core.store.db.sql.lock.H2LockStoreSql
io.seata.core.store.db.sql.lock.DmLockStoreSql
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ io.seata.core.store.db.sql.log.MariadbLogStoreSqls
io.seata.core.store.db.sql.log.OracleLogStoreSqls
io.seata.core.store.db.sql.log.PostgresqlLogStoreSqls
io.seata.core.store.db.sql.log.OceanbaseLogStoreSqls
io.seata.core.store.db.sql.log.H2LogStoreSqls
io.seata.core.store.db.sql.log.H2LogStoreSqls
io.seata.core.store.db.sql.log.DmLogStoreSqls
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ public class LockStoreSqlFactoryTest {

private static LockStoreSql OCEANBASE_LOCK_STORE = LockStoreSqlFactory.getLogStoreSql("oceanbase");

private static LockStoreSql DM_LOCK_STORE = LockStoreSqlFactory.getLogStoreSql("dm");

private static String GLOBAL_TABLE = "global_table";

private static String BRANCH_TABLE = "branch_table";
Expand Down Expand Up @@ -331,4 +333,50 @@ public void oceanbaseLockTest() {
sql = OCEANBASE_LOCK_STORE.getCheckLockableSql(BRANCH_TABLE, 3);
Assertions.assertEquals(EXPECT_CHECK_BRANCH_LOCKABLE_SQL,sql);
}

@Test
public void dmLockTest() {
String sql;
// Get insert lock sql string.
sql = DM_LOCK_STORE.getInsertLockSQL(GLOBAL_TABLE);
Assertions.assertNotNull(sql);
sql = DM_LOCK_STORE.getInsertLockSQL(BRANCH_TABLE);
Assertions.assertNotNull(sql);

// Get delete lock sql string.
sql = DM_LOCK_STORE.getDeleteLockSql(GLOBAL_TABLE);
Assertions.assertNotNull(sql);
sql = DM_LOCK_STORE.getDeleteLockSql(BRANCH_TABLE);
Assertions.assertNotNull(sql);

// Get batch delete lock sql string.
sql = DM_LOCK_STORE.getBatchDeleteLockSql(GLOBAL_TABLE, 3);
Assertions.assertEquals(EXPECT_BATCH_GLOBAL_DELETE_LOCK_SQL,sql);
sql = DM_LOCK_STORE.getBatchDeleteLockSql(BRANCH_TABLE, 3);
Assertions.assertEquals(EXPECT_BATCH_BRANCH_DELETE_LOCK_SQL,sql);

// Get batch delete lock sql string.
sql = DM_LOCK_STORE.getBatchDeleteLockSqlByBranchId(GLOBAL_TABLE);
Assertions.assertNotNull(sql);
sql = DM_LOCK_STORE.getBatchDeleteLockSqlByBranchId(BRANCH_TABLE);
Assertions.assertNotNull(sql);

// Get batch delete lock sql string.
sql = DM_LOCK_STORE.getBatchDeleteLockSqlByXid(GLOBAL_TABLE);
Assertions.assertEquals(EXPECT_BATCH_GLOBAL_DELETE_LOCK_BY_BRANCHS_SQL,sql);
sql = DM_LOCK_STORE.getBatchDeleteLockSqlByXid(BRANCH_TABLE);
Assertions.assertEquals(EXPECT_BATCH_BRANCH_DELETE_LOCK_BY_BRANCHS_SQL,sql);

// Get query lock sql string.
sql = DM_LOCK_STORE.getQueryLockSql(GLOBAL_TABLE);
Assertions.assertNotNull(sql);
sql = DM_LOCK_STORE.getQueryLockSql(BRANCH_TABLE);
Assertions.assertNotNull(sql);

// Get check lock sql string.
sql = DM_LOCK_STORE.getCheckLockableSql(GLOBAL_TABLE, 3);
Assertions.assertEquals(EXPECT_CHECK_GLOBAL_LOCKABLE_SQL,sql);
sql = DM_LOCK_STORE.getCheckLockableSql(BRANCH_TABLE, 3);
Assertions.assertEquals(EXPECT_CHECK_BRANCH_LOCKABLE_SQL,sql);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ public class LogStoreSqlsFactoryTest {

private static LogStoreSqls oceanbase = LogStoreSqlsFactory.getLogStoreSqls("oceanbase");

private static LogStoreSqls dmLog = LogStoreSqlsFactory.getLogStoreSqls("dm");

private static String globalTable = "global_table";

private static String branchTable = "branch_table";
Expand Down Expand Up @@ -211,4 +213,38 @@ public void oceanbaseLogTest() {
sql = oceanbase.getQueryBranchMax(branchTable);
Assertions.assertNotNull(sql);
}

@Test
public void dmLogTest() {
String sql = dmLog.getInsertGlobalTransactionSQL(globalTable);
Assertions.assertNotNull(sql);
sql = dmLog.getUpdateGlobalTransactionStatusSQL(globalTable);
Assertions.assertNotNull(sql);
sql = dmLog.getDeleteGlobalTransactionSQL(globalTable);
Assertions.assertNotNull(sql);
sql = dmLog.getQueryGlobalTransactionSQL(globalTable);
Assertions.assertNotNull(sql);
sql = dmLog.getQueryGlobalTransactionSQLByTransactionId(globalTable);
Assertions.assertNotNull(sql);
sql = dmLog.getQueryGlobalTransactionSQLByStatus(globalTable, "1");
Assertions.assertNotNull(sql);
sql = dmLog.getQueryGlobalTransactionForRecoverySQL(globalTable);
Assertions.assertNotNull(sql);
sql = dmLog.getInsertBranchTransactionSQL(branchTable);
Assertions.assertNotNull(sql);
sql = dmLog.getUpdateBranchTransactionStatusSQL(branchTable);
Assertions.assertNotNull(sql);
sql = dmLog.getDeleteBranchTransactionByBranchIdSQL(branchTable);
Assertions.assertNotNull(sql);
sql = dmLog.getDeleteBranchTransactionByXId(branchTable);
Assertions.assertNotNull(sql);
sql = dmLog.getQueryBranchTransaction(branchTable);
Assertions.assertNotNull(sql);
sql = dmLog.getQueryBranchTransaction(branchTable, "1");
Assertions.assertNotNull(sql);
sql = dmLog.getQueryGlobalMax(globalTable);
Assertions.assertNotNull(sql);
sql = dmLog.getQueryBranchMax(branchTable);
Assertions.assertNotNull(sql);
}
}
6 changes: 6 additions & 0 deletions dependencies/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
<postgresql.version>42.3.3</postgresql.version>
<h2.version>1.4.181</h2.version>
<mariadb.version>2.7.2</mariadb.version>
<dm.version>8.1.2.192</dm.version>
<!-- db connection pool -->
<druid.version>1.2.7</druid.version>
<commons-dbcp2.version>2.9.0</commons-dbcp2.version>
Expand Down Expand Up @@ -215,6 +216,11 @@
<artifactId>mariadb-java-client</artifactId>
<version>${mariadb.version}</version>
</dependency>
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>${dm.version}</version>
</dependency>
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>sofa-rpc-all</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,8 @@ private void initResourceId() {
initOracleResourceId();
} else if (JdbcConstants.MYSQL.equals(dbType)) {
initMysqlResourceId();
} else if (JdbcConstants.DM.equals(dbType)) {
initDMResourceId();
} else {
initDefaultResourceId();
}
Expand Down Expand Up @@ -244,6 +246,36 @@ private void initPGResourceId() {
}
}

private void initDMResourceId() {
LOGGER.warn("support for the dameng database is currently an experimental feature ");
if (jdbcUrl.contains("?")) {
StringBuilder jdbcUrlBuilder = new StringBuilder();
jdbcUrlBuilder.append(jdbcUrl, 0, jdbcUrl.indexOf('?'));

StringBuilder paramsBuilder = new StringBuilder();
String paramUrl = jdbcUrl.substring(jdbcUrl.indexOf('?') + 1);
String[] urlParams = paramUrl.split("&");
for (String urlParam : urlParams) {
if (urlParam.contains("schema")) {
// remove the '"'
if (urlParam.contains("\"")) {
urlParam = urlParam.replaceAll("\"", "");
}
paramsBuilder.append(urlParam);
break;
}
}

if (paramsBuilder.length() > 0) {
jdbcUrlBuilder.append("?");
jdbcUrlBuilder.append(paramsBuilder);
}
resourceId = jdbcUrlBuilder.toString();
} else {
resourceId = jdbcUrl;
}
}

@Override
public BranchType getBranchType() {
return BranchType.AT;
Expand Down
Loading

0 comments on commit ecb7ef7

Please sign in to comment.