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

panjuan 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 35f378c  Add ExtraTextProtocolBackendHandler to extend process via SPI 
(#9465)
35f378c is described below

commit 35f378c3227f3441d3de1b8bd67b55f98db2f25c
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Feb 22 13:09:00 2021 +0800

    Add ExtraTextProtocolBackendHandler to extend process via SPI (#9465)
---
 .../text/TextProtocolBackendHandlerFactory.java    | 14 +++++++++
 .../extra/ExtraTextProtocolBackendHandler.java     | 35 ++++++++++++++++++++++
 2 files changed, 49 insertions(+)

diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
index c702453..e6d3f11 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
@@ -24,11 +24,13 @@ import org.apache.shardingsphere.infra.audit.SQLCheckEngine;
 import org.apache.shardingsphere.infra.context.metadata.MetaDataContexts;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
+import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandlerFactory;
 import 
org.apache.shardingsphere.proxy.backend.text.data.DatabaseBackendHandlerFactory;
 import 
org.apache.shardingsphere.proxy.backend.text.distsql.DistSQLBackendHandlerFactory;
+import 
org.apache.shardingsphere.proxy.backend.text.extra.ExtraTextProtocolBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.text.sctl.ShardingCTLBackendHandlerFactory;
 import org.apache.shardingsphere.proxy.backend.text.sctl.utils.SCTLUtils;
 import org.apache.shardingsphere.proxy.backend.text.skip.SkipBackendHandler;
@@ -46,6 +48,10 @@ import java.util.Optional;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class TextProtocolBackendHandlerFactory {
     
+    static {
+        
ShardingSphereServiceLoader.register(ExtraTextProtocolBackendHandler.class);
+    }
+    
     /**
      * Create new instance of text protocol backend handler.
      *
@@ -65,6 +71,10 @@ public final class TextProtocolBackendHandlerFactory {
             return ShardingCTLBackendHandlerFactory.newInstance(trimSQL, 
backendConnection);
         }
         SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine(getBackendDatabaseType(databaseType, 
backendConnection).getName()).parse(sql, false);
+        Optional<ExtraTextProtocolBackendHandler> extraHandler = 
findExtraTextProtocolBackendHandler(sqlStatement);
+        if (extraHandler.isPresent()) {
+            return extraHandler.get();
+        }
         sqlCheck(backendConnection, sqlStatement);
         if (sqlStatement instanceof TCLStatement) {
             return TransactionBackendHandlerFactory.newInstance((TCLStatement) 
sqlStatement, sql, backendConnection);
@@ -86,4 +96,8 @@ public final class TextProtocolBackendHandlerFactory {
         return Strings.isNullOrEmpty(backendConnection.getSchemaName())
                 ? defaultDatabaseType : 
ProxyContext.getInstance().getMetaDataContexts().getMetaData(backendConnection.getSchemaName()).getResource().getDatabaseType();
     }
+    
+    private static Optional<ExtraTextProtocolBackendHandler> 
findExtraTextProtocolBackendHandler(final SQLStatement sqlStatement) {
+        return 
ShardingSphereServiceLoader.newServiceInstances(ExtraTextProtocolBackendHandler.class).stream().filter(each
 -> each.accept(sqlStatement)).findFirst();
+    }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/extra/ExtraTextProtocolBackendHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/extra/ExtraTextProtocolBackendHandler.java
new file mode 100644
index 0000000..cd2be4d
--- /dev/null
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/extra/ExtraTextProtocolBackendHandler.java
@@ -0,0 +1,35 @@
+/*
+ * 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.proxy.backend.text.extra;
+
+import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
+
+/**
+ * Extra text protocol backend handler.
+ */
+public interface ExtraTextProtocolBackendHandler extends 
TextProtocolBackendHandler {
+    
+    /**
+     * Whether accept to process SQL statement.
+     * 
+     * @param sqlStatement SQL statement to be judge
+     * @return accept or not
+     */
+    boolean accept(SQLStatement sqlStatement);
+}

Reply via email to