This is an automated email from the ASF dual-hosted git repository.
azexin 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 3a6dd034577 Query required variables in one SQL for
MySQLDataSourceChecker (#25711)
3a6dd034577 is described below
commit 3a6dd034577b185346e521f4a59b8b9f71176830
Author: Hongsheng Zhong <[email protected]>
AuthorDate: Wed May 17 11:21:17 2023 +0800
Query required variables in one SQL for MySQLDataSourceChecker (#25711)
* Query required variables in one SQL for MySQLDataSourceChecker
* Update unit test
* Update MySQLDataSourceChecker
* Update MySQLDataSourceChecker
---
.../check/datasource/MySQLDataSourceChecker.java | 35 +++++++++++-----------
.../datasource/MySQLDataSourceCheckerTest.java | 4 ++-
2 files changed, 21 insertions(+), 18 deletions(-)
diff --git
a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceChecker.java
b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceChecker.java
index 77d6ddc9efb..b40eecd350a 100644
---
a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceChecker.java
+++
b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceChecker.java
@@ -33,6 +33,7 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.stream.Collectors;
/**
* Data source checker for MySQL.
@@ -43,14 +44,16 @@ public final class MySQLDataSourceChecker extends
AbstractDataSourceChecker {
private static final String[][] REQUIRED_PRIVILEGES = {{"ALL PRIVILEGES",
"ON *.*"}, {"REPLICATION SLAVE", "REPLICATION CLIENT", "ON *.*"}};
- private static final String SHOW_VARIABLES_SQL = "SHOW VARIABLES LIKE ?";
-
private static final Map<String, String> REQUIRED_VARIABLES = new
HashMap<>(3, 1);
+ private static final String SHOW_VARIABLES_SQL;
+
static {
REQUIRED_VARIABLES.put("LOG_BIN", "ON");
REQUIRED_VARIABLES.put("BINLOG_FORMAT", "ROW");
+ // It does not exist in all versions of MySQL
REQUIRED_VARIABLES.put("BINLOG_ROW_IMAGE", "FULL");
+ SHOW_VARIABLES_SQL = String.format("SHOW VARIABLES WHERE Variable_name
IN (%s)", REQUIRED_VARIABLES.keySet().stream().map(each ->
"?").collect(Collectors.joining(",")));
}
@Override
@@ -89,25 +92,23 @@ public final class MySQLDataSourceChecker extends
AbstractDataSourceChecker {
}
private void checkVariable(final DataSource dataSource) {
- try (Connection connection = dataSource.getConnection()) {
+ try (
+ Connection connection = dataSource.getConnection();
+ PreparedStatement preparedStatement =
connection.prepareStatement(SHOW_VARIABLES_SQL)) {
+ int parameterIndex = 1;
for (Entry<String, String> entry : REQUIRED_VARIABLES.entrySet()) {
- checkVariable(connection, entry.getKey(), entry.getValue());
+ preparedStatement.setString(parameterIndex++, entry.getKey());
}
- } catch (final SQLException ex) {
- throw new PrepareJobWithCheckPrivilegeFailedException(ex);
- }
- }
-
- private void checkVariable(final Connection connection, final String key,
final String toBeCheckedValue) throws SQLException {
- try (PreparedStatement preparedStatement =
connection.prepareStatement(SHOW_VARIABLES_SQL)) {
- preparedStatement.setString(1, key);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
- if (resultSet.next()) {
- String actualValue = resultSet.getString(2);
-
ShardingSpherePreconditions.checkState(toBeCheckedValue.equalsIgnoreCase(actualValue),
- () -> new
PrepareJobWithInvalidSourceDataSourceException(key, toBeCheckedValue,
actualValue));
- }
+ resultSet.next();
+ String key = resultSet.getString(1).toUpperCase();
+ String toBeCheckedValue = REQUIRED_VARIABLES.get(key);
+ String actualValue = resultSet.getString(2);
+
ShardingSpherePreconditions.checkState(toBeCheckedValue.equalsIgnoreCase(actualValue),
+ () -> new
PrepareJobWithInvalidSourceDataSourceException(key, toBeCheckedValue,
actualValue));
}
+ } catch (final SQLException ex) {
+ throw new PrepareJobWithCheckPrivilegeFailedException(ex);
}
}
diff --git
a/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceCheckerTest.java
b/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceCheckerTest.java
index e72f21752c2..b930782988d 100644
---
a/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceCheckerTest.java
+++
b/kernel/data-pipeline/dialect/mysql/src/test/java/org/apache/shardingsphere/data/pipeline/mysql/check/datasource/MySQLDataSourceCheckerTest.java
@@ -90,14 +90,16 @@ class MySQLDataSourceCheckerTest {
@Test
void assertCheckVariableSuccess() throws SQLException {
when(resultSet.next()).thenReturn(true, true);
+ when(resultSet.getString(1)).thenReturn("LOG_BIN", "BINLOG_FORMAT",
"BINLOG_ROW_IMAGE");
when(resultSet.getString(2)).thenReturn("ON", "ROW", "FULL");
new MySQLDataSourceChecker().checkVariable(dataSources);
- verify(preparedStatement, times(3)).executeQuery();
+ verify(preparedStatement, times(1)).executeQuery();
}
@Test
void assertCheckVariableWithWrongVariable() throws SQLException {
when(resultSet.next()).thenReturn(true, true);
+ when(resultSet.getString(1)).thenReturn("LOG_BIN", "BINLOG_FORMAT");
when(resultSet.getString(2)).thenReturn("OFF", "ROW");
assertThrows(PrepareJobWithInvalidSourceDataSourceException.class, ()
-> new MySQLDataSourceChecker().checkVariable(dataSources));
}