1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.data.pipeline.opengauss.check.datasource;
19
20 import org.apache.shardingsphere.data.pipeline.core.exception.job.PrepareJobWithCheckPrivilegeFailedException;
21 import org.apache.shardingsphere.data.pipeline.core.exception.job.PrepareJobWithoutEnoughPrivilegeException;
22 import org.apache.shardingsphere.data.pipeline.core.exception.job.PrepareJobWithoutUserException;
23 import org.apache.shardingsphere.data.pipeline.core.checker.DialectDataSourceChecker;
24 import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
25
26 import javax.sql.DataSource;
27 import java.sql.Connection;
28 import java.sql.DatabaseMetaData;
29 import java.sql.PreparedStatement;
30 import java.sql.ResultSet;
31 import java.sql.SQLException;
32 import java.util.Collections;
33
34
35
36
37 public final class OpenGaussDataSourceChecker implements DialectDataSourceChecker {
38
39 private static final String SHOW_GRANTS_SQL = "SELECT * FROM pg_roles WHERE rolname = ?";
40
41 @Override
42 public void checkPrivilege(final DataSource dataSource) {
43 try (Connection connection = dataSource.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement(SHOW_GRANTS_SQL)) {
44 DatabaseMetaData metaData = connection.getMetaData();
45 preparedStatement.setString(1, metaData.getUserName());
46 try (ResultSet resultSet = preparedStatement.executeQuery()) {
47 String username = metaData.getUserName();
48 ShardingSpherePreconditions.checkState(resultSet.next(), () -> new PrepareJobWithoutUserException(username));
49 String isSuperRole = resultSet.getString("rolsuper");
50 String isReplicationRole = resultSet.getString("rolreplication");
51 String isSystemAdminRole = resultSet.getString("rolsystemadmin");
52 ShardingSpherePreconditions.checkState("t".equalsIgnoreCase(isSuperRole) || "t".equalsIgnoreCase(isReplicationRole) || "t".equalsIgnoreCase(isSystemAdminRole),
53 () -> new PrepareJobWithoutEnoughPrivilegeException(Collections.singleton("REPLICATION")));
54 }
55 } catch (final SQLException ex) {
56 throw new PrepareJobWithCheckPrivilegeFailedException(ex);
57 }
58 }
59
60 @Override
61 public void checkVariable(final DataSource dataSource) {
62 }
63
64 @Override
65 public String getDatabaseType() {
66 return "openGauss";
67 }
68 }