This is an automated email from the ASF dual-hosted git repository.

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new e1210e10ead Add SavepointReleaseSQLProvider (#33089)
e1210e10ead is described below

commit e1210e10ead04a4a7bb91f3681d2ad3ae9a0b985
Author: Liang Zhang <[email protected]>
AuthorDate: Tue Oct 1 22:35:08 2024 +0800

    Add SavepointReleaseSQLProvider (#33089)
    
    * Add more test cases on ConnectionSavepointManager
    
    * Add SavepointReleaseSQLProvider
    
    * Add SavepointReleaseSQLProvider
    
    * Add SavepointReleaseSQLProvider
---
 .../DriverDatabaseConnectionManager.java           |  2 +-
 .../ConnectionSavepointManager.java                | 24 ++++++++-------
 .../savepoint/SavepointReleaseSQLProvider.java     | 36 ++++++++++++++++++++++
 .../dialect/MySQLSavepointReleaseSQLProvider.java  | 36 ++++++++++++++++++++++
 ...ansaction.savepoint.SavepointReleaseSQLProvider | 18 +++++++++++
 .../ConnectionSavepointManagerTest.java            | 16 ++++++++--
 .../transaction/BackendTransactionManager.java     |  2 +-
 7 files changed, 118 insertions(+), 16 deletions(-)

diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java
index 91b787e8bca..bc4779a1503 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/DriverDatabaseConnectionManager.java
@@ -31,7 +31,7 @@ import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DatabaseConne
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import 
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
 import org.apache.shardingsphere.mode.manager.ContextManager;
-import org.apache.shardingsphere.transaction.ConnectionSavepointManager;
+import 
org.apache.shardingsphere.transaction.savepoint.ConnectionSavepointManager;
 import org.apache.shardingsphere.transaction.ConnectionTransaction;
 import org.apache.shardingsphere.transaction.api.TransactionType;
 import org.apache.shardingsphere.transaction.rule.TransactionRule;
diff --git 
a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/ConnectionSavepointManager.java
 
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/savepoint/ConnectionSavepointManager.java
similarity index 81%
rename from 
kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/ConnectionSavepointManager.java
rename to 
kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/savepoint/ConnectionSavepointManager.java
index 5206a0d7f65..e003aa02684 100644
--- 
a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/ConnectionSavepointManager.java
+++ 
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/savepoint/ConnectionSavepointManager.java
@@ -15,13 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.transaction;
+package org.apache.shardingsphere.transaction.savepoint;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeFactory;
-import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
 
 import java.sql.Connection;
 import java.sql.SQLException;
@@ -86,16 +86,18 @@ public final class ConnectionSavepointManager {
      */
     public void releaseSavepoint(final Connection connection, final String 
savepointName) throws SQLException {
         Optional<Savepoint> result = lookupSavepoint(connection, 
savepointName);
-        if (result.isPresent()) {
-            DatabaseType databaseType = 
DatabaseTypeFactory.get(connection.getMetaData().getURL());
-            databaseType = 
databaseType.getTrunkDatabaseType().orElse(databaseType);
-            if (databaseType instanceof MySQLDatabaseType) {
-                try (Statement statement = connection.createStatement()) {
-                    statement.execute(String.format("RELEASE SAVEPOINT %s", 
savepointName));
-                }
-            } else {
-                connection.releaseSavepoint(result.get());
+        if (!result.isPresent()) {
+            return;
+        }
+        DatabaseType databaseType = 
DatabaseTypeFactory.get(connection.getMetaData().getURL());
+        databaseType = 
databaseType.getTrunkDatabaseType().orElse(databaseType);
+        Optional<SavepointReleaseSQLProvider> savepointReleaseSQLProvider = 
DatabaseTypedSPILoader.findService(SavepointReleaseSQLProvider.class, 
databaseType);
+        if (savepointReleaseSQLProvider.isPresent()) {
+            try (Statement statement = connection.createStatement()) {
+                
statement.execute(savepointReleaseSQLProvider.get().getSQL(savepointName));
             }
+        } else {
+            connection.releaseSavepoint(result.get());
         }
     }
     
diff --git 
a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/savepoint/SavepointReleaseSQLProvider.java
 
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/savepoint/SavepointReleaseSQLProvider.java
new file mode 100644
index 00000000000..5ffa2ec33c0
--- /dev/null
+++ 
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/savepoint/SavepointReleaseSQLProvider.java
@@ -0,0 +1,36 @@
+/*
+ * 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.shardingsphere.transaction.savepoint;
+
+import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPI;
+import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
+
+/**
+ * Savepoint release SQL provider.
+ */
+@SingletonSPI
+public interface SavepointReleaseSQLProvider extends DatabaseTypedSPI {
+    
+    /**
+     * Get release savepoint SQL.
+     *
+     * @param savepointName savepoint name
+     * @return got SQL
+     */
+    String getSQL(String savepointName);
+}
diff --git 
a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/savepoint/dialect/MySQLSavepointReleaseSQLProvider.java
 
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/savepoint/dialect/MySQLSavepointReleaseSQLProvider.java
new file mode 100644
index 00000000000..e46791a4597
--- /dev/null
+++ 
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/savepoint/dialect/MySQLSavepointReleaseSQLProvider.java
@@ -0,0 +1,36 @@
+/*
+ * 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.shardingsphere.transaction.savepoint.dialect;
+
+import 
org.apache.shardingsphere.transaction.savepoint.SavepointReleaseSQLProvider;
+
+/**
+ * Savepoint release SQL provider for MySQL.
+ */
+public final class MySQLSavepointReleaseSQLProvider implements 
SavepointReleaseSQLProvider {
+    
+    @Override
+    public String getSQL(final String savepointName) {
+        return String.format("RELEASE SAVEPOINT %s", savepointName);
+    }
+    
+    @Override
+    public String getDatabaseType() {
+        return "MySQL";
+    }
+}
diff --git 
a/kernel/transaction/core/src/main/resources/META-INF/services/org.apache.shardingsphere.transaction.savepoint.SavepointReleaseSQLProvider
 
b/kernel/transaction/core/src/main/resources/META-INF/services/org.apache.shardingsphere.transaction.savepoint.SavepointReleaseSQLProvider
new file mode 100644
index 00000000000..f72823ddafb
--- /dev/null
+++ 
b/kernel/transaction/core/src/main/resources/META-INF/services/org.apache.shardingsphere.transaction.savepoint.SavepointReleaseSQLProvider
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.transaction.savepoint.dialect.MySQLSavepointReleaseSQLProvider
diff --git 
a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/ConnectionSavepointManagerTest.java
 
b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/savepoint/ConnectionSavepointManagerTest.java
similarity index 86%
rename from 
kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/ConnectionSavepointManagerTest.java
rename to 
kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/savepoint/ConnectionSavepointManagerTest.java
index 138138d19da..0892ec61dc1 100644
--- 
a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/ConnectionSavepointManagerTest.java
+++ 
b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/savepoint/ConnectionSavepointManagerTest.java
@@ -15,13 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.transaction;
+package org.apache.shardingsphere.transaction.savepoint;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
 
 import java.sql.Connection;
 import java.sql.DatabaseMetaData;
@@ -32,13 +34,15 @@ import java.sql.Statement;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 @ExtendWith(MockitoExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
 class ConnectionSavepointManagerTest {
     
-    private static final String SAVE_POINT = "SavePoint";
+    private static final String SAVE_POINT = "foo_savepoint";
     
     @Mock
     private Connection connection;
@@ -64,6 +68,12 @@ class ConnectionSavepointManagerTest {
         verify(connection).rollback(savepoint);
     }
     
+    @Test
+    void assertRollbackWithoutSavepoint() throws SQLException {
+        
ConnectionSavepointManager.getInstance().rollbackToSavepoint(connection, 
SAVE_POINT);
+        verify(connection, times(0)).rollback(savepoint);
+    }
+    
     @Test
     void assertSaveReleaseSavingPoint() throws SQLException {
         ConnectionSavepointManager.getInstance().setSavepoint(connection, 
SAVE_POINT);
@@ -83,7 +93,7 @@ class ConnectionSavepointManagerTest {
         Statement statement = mock(Statement.class);
         when(connection.createStatement()).thenReturn(statement);
         ConnectionSavepointManager.getInstance().releaseSavepoint(connection, 
SAVE_POINT);
-        verify(statement).execute(String.format("RELEASE SAVEPOINT %s", 
SAVE_POINT));
+        verify(statement).execute("RELEASE SAVEPOINT foo_savepoint");
     }
     
     @Test
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
index 56220e227a3..384c0e34450 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/transaction/BackendTransactionManager.java
@@ -25,7 +25,7 @@ import 
org.apache.shardingsphere.proxy.backend.connector.ProxyDatabaseConnection
 import org.apache.shardingsphere.proxy.backend.connector.TransactionManager;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.util.TransactionUtils;
-import org.apache.shardingsphere.transaction.ConnectionSavepointManager;
+import 
org.apache.shardingsphere.transaction.savepoint.ConnectionSavepointManager;
 import 
org.apache.shardingsphere.transaction.ShardingSphereTransactionManagerEngine;
 import org.apache.shardingsphere.transaction.api.TransactionType;
 import org.apache.shardingsphere.transaction.rule.TransactionRule;

Reply via email to