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