This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 f7d7ce2cbb2 Refactor SQLAuditEngine (#31529)
f7d7ce2cbb2 is described below
commit f7d7ce2cbb2988ff4879dde1230581e1a0b30df4
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Jun 2 20:32:39 2024 +0800
Refactor SQLAuditEngine (#31529)
* Refactor ShardingSphereStatement
* Rename DriverExecutor.getResultSet()
* Refactor SQLAuditEngine
* Refactor SQLAuditEngine
---
.../shardingsphere/sharding/auditor/ShardingSQLAuditor.java | 12 +++++-------
.../sharding/auditor/ShardingSQLAuditorTest.java | 9 +++++----
.../shardingsphere/infra/executor/audit/SQLAuditEngine.java | 13 ++++---------
.../shardingsphere/infra/executor/audit/SQLAuditor.java | 12 +++---------
.../shardingsphere/driver/executor/DriverExecutor.java | 2 +-
.../core/statement/ShardingSpherePreparedStatement.java | 7 +++----
.../proxy/backend/handler/ProxyBackendHandlerFactory.java | 3 +--
.../query/text/query/MySQLMultiStatementsHandler.java | 2 +-
.../query/extended/PostgreSQLBatchedStatementsExecutor.java | 2 +-
9 files changed, 24 insertions(+), 38 deletions(-)
diff --git
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditor.java
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditor.java
index 3e99f844669..2ea20303b2a 100644
---
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditor.java
+++
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditor.java
@@ -19,17 +19,16 @@ package org.apache.shardingsphere.sharding.auditor;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.executor.audit.SQLAuditor;
-import org.apache.shardingsphere.infra.hint.HintValueContext;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.infra.metadata.user.Grantee;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
import
org.apache.shardingsphere.sharding.api.config.strategy.audit.ShardingAuditStrategyConfiguration;
import org.apache.shardingsphere.sharding.constant.ShardingOrder;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.List;
/**
* Sharding SQL auditor.
@@ -37,17 +36,16 @@ import java.util.List;
public final class ShardingSQLAuditor implements SQLAuditor<ShardingRule> {
@Override
- public void audit(final SQLStatementContext sqlStatementContext, final
List<Object> params, final Grantee grantee, final RuleMetaData
globalRuleMetaData,
- final ShardingSphereDatabase database, final
ShardingRule rule, final HintValueContext hintValueContext) {
- Collection<ShardingAuditStrategyConfiguration> auditStrategies =
getShardingAuditStrategies(sqlStatementContext, rule);
+ public void audit(final QueryContext queryContext, final Grantee grantee,
final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database,
final ShardingRule rule) {
+ Collection<ShardingAuditStrategyConfiguration> auditStrategies =
getShardingAuditStrategies(queryContext.getSqlStatementContext(), rule);
if (auditStrategies.isEmpty()) {
return;
}
- Collection<String> disableAuditNames =
hintValueContext.getDisableAuditNames();
+ Collection<String> disableAuditNames =
queryContext.getHintValueContext().getDisableAuditNames();
for (ShardingAuditStrategyConfiguration auditStrategy :
auditStrategies) {
for (String auditorName : auditStrategy.getAuditorNames()) {
if (!auditStrategy.isAllowHintDisable() ||
!disableAuditNames.contains(auditorName.toLowerCase())) {
-
rule.getAuditors().get(auditorName).check(sqlStatementContext, params, grantee,
globalRuleMetaData, database);
+
rule.getAuditors().get(auditorName).check(queryContext.getSqlStatementContext(),
queryContext.getParameters(), grantee, globalRuleMetaData, database);
}
}
}
diff --git
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditorTest.java
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditorTest.java
index bbb550440f6..f3b268e7a2b 100644
---
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditorTest.java
+++
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/auditor/ShardingSQLAuditorTest.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.sharding.auditor;
import
org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
import
org.apache.shardingsphere.sharding.exception.audit.DMLWithoutShardingKeyException;
import org.apache.shardingsphere.infra.hint.HintValueContext;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -81,7 +82,7 @@ class ShardingSQLAuditorTest {
@Test
void assertCheckSuccess() {
RuleMetaData globalRuleMetaData = mock(RuleMetaData.class);
- new ShardingSQLAuditor().audit(sqlStatementContext,
Collections.emptyList(), grantee, globalRuleMetaData, databases.get("foo_db"),
rule, hintValueContext);
+ new ShardingSQLAuditor().audit(new QueryContext(sqlStatementContext,
"", Collections.emptyList(), hintValueContext), grantee, globalRuleMetaData,
databases.get("foo_db"), rule);
verify(rule.getAuditors().get("auditor_1")).check(sqlStatementContext,
Collections.emptyList(), grantee, globalRuleMetaData, databases.get("foo_db"));
}
@@ -89,7 +90,7 @@ class ShardingSQLAuditorTest {
void assertCheckSuccessByDisableAuditNames() {
when(auditStrategy.isAllowHintDisable()).thenReturn(true);
RuleMetaData globalRuleMetaData = mock(RuleMetaData.class);
- new ShardingSQLAuditor().audit(sqlStatementContext,
Collections.emptyList(), grantee, globalRuleMetaData, databases.get("foo_db"),
rule, hintValueContext);
+ new ShardingSQLAuditor().audit(new QueryContext(sqlStatementContext,
"", Collections.emptyList(), hintValueContext), grantee, globalRuleMetaData,
databases.get("foo_db"), rule);
verify(rule.getAuditors().get("auditor_1"),
times(0)).check(sqlStatementContext, Collections.emptyList(), grantee,
globalRuleMetaData, databases.get("foo_db"));
}
@@ -98,8 +99,8 @@ class ShardingSQLAuditorTest {
ShardingAuditAlgorithm auditAlgorithm =
rule.getAuditors().get("auditor_1");
RuleMetaData globalRuleMetaData = mock(RuleMetaData.class);
doThrow(new
DMLWithoutShardingKeyException()).when(auditAlgorithm).check(sqlStatementContext,
Collections.emptyList(), grantee, globalRuleMetaData, databases.get("foo_db"));
- DMLWithoutShardingKeyException ex =
assertThrows(DMLWithoutShardingKeyException.class,
- () -> new ShardingSQLAuditor().audit(sqlStatementContext,
Collections.emptyList(), grantee, globalRuleMetaData, databases.get("foo_db"),
rule, hintValueContext));
+ DMLWithoutShardingKeyException ex =
assertThrows(DMLWithoutShardingKeyException.class, () -> new
ShardingSQLAuditor().audit(
+ new QueryContext(sqlStatementContext, "",
Collections.emptyList(), hintValueContext), grantee, globalRuleMetaData,
databases.get("foo_db"), rule));
assertThat(ex.getMessage(), is("Not allow DML operation without
sharding conditions."));
verify(rule.getAuditors().get("auditor_1")).check(sqlStatementContext,
Collections.emptyList(), grantee, globalRuleMetaData, databases.get("foo_db"));
}
diff --git
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditEngine.java
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditEngine.java
index 102cf44833c..388b51478ff 100644
---
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditEngine.java
+++
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditEngine.java
@@ -19,17 +19,15 @@ package org.apache.shardingsphere.infra.executor.audit;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
-import org.apache.shardingsphere.infra.hint.HintValueContext;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.infra.metadata.user.Grantee;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
import java.util.Collection;
import java.util.LinkedList;
-import java.util.List;
import java.util.Map.Entry;
/**
@@ -41,22 +39,19 @@ public final class SQLAuditEngine {
/**
* Audit SQL.
*
- * @param sqlStatementContext SQL statement context
- * @param params SQL parameters
+ * @param queryContext query context
* @param globalRuleMetaData global rule meta data
* @param database database
* @param grantee grantee
- * @param hintValueContext hint value context
*/
@SuppressWarnings({"rawtypes", "unchecked"})
- public static void audit(final SQLStatementContext sqlStatementContext,
final List<Object> params,
- final RuleMetaData globalRuleMetaData, final
ShardingSphereDatabase database, final Grantee grantee, final HintValueContext
hintValueContext) {
+ public static void audit(final QueryContext queryContext, final
RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database, final
Grantee grantee) {
Collection<ShardingSphereRule> rules = new
LinkedList<>(globalRuleMetaData.getRules());
if (null != database) {
rules.addAll(database.getRuleMetaData().getRules());
}
for (Entry<ShardingSphereRule, SQLAuditor> entry :
OrderedSPILoader.getServices(SQLAuditor.class, rules).entrySet()) {
- entry.getValue().audit(sqlStatementContext, params, grantee,
globalRuleMetaData, database, entry.getKey(), hintValueContext);
+ entry.getValue().audit(queryContext, grantee, globalRuleMetaData,
database, entry.getKey());
}
}
}
diff --git
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditor.java
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditor.java
index a239ba02698..d9c1605565a 100644
---
a/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditor.java
+++
b/infra/executor/src/main/java/org/apache/shardingsphere/infra/executor/audit/SQLAuditor.java
@@ -17,17 +17,14 @@
package org.apache.shardingsphere.infra.executor.audit;
-import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
-import org.apache.shardingsphere.infra.hint.HintValueContext;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.infra.metadata.user.Grantee;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPI;
-import java.util.List;
-
/**
* SQL auditor.
*
@@ -39,14 +36,11 @@ public interface SQLAuditor<T extends ShardingSphereRule>
extends OrderedSPI<T>
/**
* Audit SQL.
*
- * @param sqlStatementContext SQL statement context
- * @param params SQL parameters
+ * @param queryContext query context
* @param grantee grantee
* @param globalRuleMetaData global rule meta data
* @param database current database
* @param rule rule
- * @param hintValueContext hint value context
*/
- void audit(SQLStatementContext sqlStatementContext, List<Object> params,
Grantee grantee, RuleMetaData globalRuleMetaData,
- ShardingSphereDatabase database, T rule, HintValueContext
hintValueContext);
+ void audit(QueryContext queryContext, Grantee grantee, RuleMetaData
globalRuleMetaData, ShardingSphereDatabase database, T rule);
}
diff --git
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
index 1686c79b264..7d9a6c2fd71 100644
---
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
+++
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/DriverExecutor.java
@@ -219,7 +219,7 @@ public final class DriverExecutor implements AutoCloseable {
private ExecutionContext createExecutionContext(final
ShardingSphereDatabase database, final QueryContext queryContext) throws
SQLException {
clearStatements();
RuleMetaData globalRuleMetaData = metaData.getGlobalRuleMetaData();
- SQLAuditEngine.audit(queryContext.getSqlStatementContext(),
queryContext.getParameters(), globalRuleMetaData, database, null,
queryContext.getHintValueContext());
+ SQLAuditEngine.audit(queryContext, globalRuleMetaData, database, null);
return kernelProcessor.generateExecutionContext(queryContext,
database, globalRuleMetaData, metaData.getProps(),
connection.getDatabaseConnectionManager().getConnectionContext());
}
diff --git
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index f45c8e8f58e..7fa3aea8e89 100644
---
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -163,9 +163,8 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
this(connection, sql, resultSetType, resultSetConcurrency,
resultSetHoldability, false, null);
}
- private ShardingSpherePreparedStatement(final ShardingSphereConnection
connection, final String sql,
- final int resultSetType, final int
resultSetConcurrency, final int resultSetHoldability, final boolean
returnGeneratedKeys,
- final String[] columns) throws
SQLException {
+ private ShardingSpherePreparedStatement(final ShardingSphereConnection
connection, final String sql, final int resultSetType,
+ final int resultSetConcurrency,
final int resultSetHoldability, final boolean returnGeneratedKeys, final
String[] columns) throws SQLException {
ShardingSpherePreconditions.checkNotEmpty(sql, () -> new
EmptySQLException().toSQLException());
this.connection = connection;
metaData =
connection.getContextManager().getMetaDataContexts().getMetaData();
@@ -351,7 +350,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
private ExecutionContext createExecutionContext(final QueryContext
queryContext) {
RuleMetaData globalRuleMetaData = metaData.getGlobalRuleMetaData();
ShardingSphereDatabase currentDatabase =
metaData.getDatabase(databaseName);
- SQLAuditEngine.audit(queryContext.getSqlStatementContext(),
queryContext.getParameters(), globalRuleMetaData, currentDatabase, null,
queryContext.getHintValueContext());
+ SQLAuditEngine.audit(queryContext, globalRuleMetaData,
currentDatabase, null);
ExecutionContext result = kernelProcessor.generateExecutionContext(
queryContext, currentDatabase, globalRuleMetaData,
metaData.getProps(),
connection.getDatabaseConnectionManager().getConnectionContext());
findGeneratedKey().ifPresent(optional ->
generatedValues.addAll(optional.getGeneratedValues()));
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
index f428d090667..12e6c6e42ec 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
@@ -147,8 +147,7 @@ public final class ProxyBackendHandlerFactory {
ShardingSphereDatabase database =
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName);
ShardingSpherePreconditions.checkState(new
AuthorityChecker(authorityRule,
connectionSession.getGrantee()).isAuthorized(databaseName),
() -> new UnknownDatabaseException(databaseName));
- SQLAuditEngine.audit(sqlStatementContext,
queryContext.getParameters(),
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData(),
- database, connectionSession.getGrantee(),
queryContext.getHintValueContext());
+ SQLAuditEngine.audit(queryContext,
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData(),
database, connectionSession.getGrantee());
backendHandler =
DatabaseAdminBackendHandlerFactory.newInstance(databaseType,
sqlStatementContext, connectionSession);
return backendHandler.orElseGet(() ->
DatabaseBackendHandlerFactory.newInstance(queryContext, connectionSession,
preferPreparedStatement));
}
diff --git
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
index 46f6081fc3e..9d9e874fc9c 100644
---
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
+++
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
@@ -167,7 +167,7 @@ public final class MySQLMultiStatementsHandler implements
ProxyBackendHandler {
private ExecutionContext createExecutionContext(final QueryContext
queryContext) {
RuleMetaData globalRuleMetaData =
metaDataContexts.getMetaData().getGlobalRuleMetaData();
ShardingSphereDatabase currentDatabase =
metaDataContexts.getMetaData().getDatabase(connectionSession.getDatabaseName());
- SQLAuditEngine.audit(queryContext.getSqlStatementContext(),
queryContext.getParameters(), globalRuleMetaData, currentDatabase, null,
queryContext.getHintValueContext());
+ SQLAuditEngine.audit(queryContext, globalRuleMetaData,
currentDatabase, null);
return kernelProcessor.generateExecutionContext(queryContext,
currentDatabase, globalRuleMetaData, metaDataContexts.getMetaData().getProps(),
connectionSession.getConnectionContext());
}
diff --git
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
index ea0ef544920..a4f0ba848bb 100644
---
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
+++
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLBatchedStatementsExecutor.java
@@ -130,7 +130,7 @@ public final class PostgreSQLBatchedStatementsExecutor {
private ExecutionContext createExecutionContext(final QueryContext
queryContext) {
RuleMetaData globalRuleMetaData =
metaDataContexts.getMetaData().getGlobalRuleMetaData();
ShardingSphereDatabase currentDatabase =
metaDataContexts.getMetaData().getDatabase(connectionSession.getDatabaseName());
- SQLAuditEngine.audit(queryContext.getSqlStatementContext(),
queryContext.getParameters(), globalRuleMetaData, currentDatabase, null,
queryContext.getHintValueContext());
+ SQLAuditEngine.audit(queryContext, globalRuleMetaData,
currentDatabase, null);
return kernelProcessor.generateExecutionContext(queryContext,
currentDatabase, globalRuleMetaData, metaDataContexts.getMetaData().getProps(),
connectionSession.getConnectionContext());
}