You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/03/18 10:40:32 UTC

[shardingsphere] branch master updated: Refactor TablePrivilege (#9732)

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 80b9c18  Refactor TablePrivilege (#9732)
80b9c18 is described below

commit 80b9c182834829c589501b1a19822db0d3ed365b
Author: Liang Zhang <te...@163.com>
AuthorDate: Thu Mar 18 18:39:59 2021 +0800

    Refactor TablePrivilege (#9732)
    
    * Refactor TablePrivilege
    
    * Refactor MySQLPrivilegeLoader
---
 .../loader/dialect/MySQLPrivilegeLoader.java       | 113 ++++++++++-----------
 .../privilege/admin/AdministrativePrivilege.java   |   4 +-
 .../privilege/database/DatabasePrivilege.java      |   8 +-
 .../model/privilege/database/SchemaPrivilege.java  |   8 +-
 .../model/privilege/database/TablePrivilege.java   |   5 +-
 .../type/CreateUserStatementAuthRefresher.java     |   4 +-
 6 files changed, 65 insertions(+), 77 deletions(-)

diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/dialect/MySQLPrivilegeLoader.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/dialect/MySQLPrivilegeLoader.java
index c478b45..e1aea1d 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/dialect/MySQLPrivilegeLoader.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/builder/loader/dialect/MySQLPrivilegeLoader.java
@@ -29,7 +29,10 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * MySQL privilege loader.
@@ -196,7 +199,7 @@ public final class MySQLPrivilegeLoader implements PrivilegeLoader {
     private void fillSchemaPrivilege(final ShardingSpherePrivilege privilege, final DataSource dataSource, final ShardingSphereUser user) throws SQLException {
         try (Connection connection = dataSource.getConnection()) {
             connection.setAutoCommit(true);
-            PreparedStatement statement = connection.prepareStatement("select * from mysql.db where user=? and host=?");
+            PreparedStatement statement = connection.prepareStatement("SELECT * FROM mysql.db WHERE user=? AND host=?");
             statement.setString(1, user.getGrantee().getUsername());
             statement.setString(2, user.getGrantee().getHostname());
             ResultSet resultSet = statement.executeQuery();
@@ -287,71 +290,61 @@ public final class MySQLPrivilegeLoader implements PrivilegeLoader {
     private void fillTablePrivilege(final ShardingSpherePrivilege privilege, final DataSource dataSource, final ShardingSphereUser user) throws SQLException {
         try (Connection connection = dataSource.getConnection()) {
             connection.setAutoCommit(true);
-            PreparedStatement statement = connection.prepareStatement("select * from mysql.tables_priv where user=? and host=?");
-            statement.setString(1, user.getGrantee().getUsername());
-            statement.setString(2, user.getGrantee().getHostname());
-            ResultSet resultSet = statement.executeQuery();
-            while (resultSet.next()) {
-                String schema = resultSet.getString("Db");
-                String tableName = resultSet.getString("Table_name");
-                TablePrivilege tablePrivilege = new TablePrivilege(tableName);
-                String[] privs = (String[]) resultSet.getArray("Table_priv").getArray();
-                for (String each : privs) {
-                    switch (each) {
-                        case "Select":
-                            tablePrivilege.getPrivileges().add(PrivilegeType.SELECT);
-                            break;
-                        case "Insert":
-                            tablePrivilege.getPrivileges().add(PrivilegeType.INSERT);
-                            break;
-                        case "Update":
-                            tablePrivilege.getPrivileges().add(PrivilegeType.UPDATE);
-                            break;
-                        case "Delete":
-                            tablePrivilege.getPrivileges().add(PrivilegeType.DELETE);
-                            break;
-                        case "Create":
-                            tablePrivilege.getPrivileges().add(PrivilegeType.CREATE);
-                            break;
-                        case "Drop":
-                            tablePrivilege.getPrivileges().add(PrivilegeType.DROP);
-                            break;
-                        case "Grant":
-                            tablePrivilege.getPrivileges().add(PrivilegeType.GRANT);
-                            break;
-                        case "References":
-                            tablePrivilege.getPrivileges().add(PrivilegeType.REFERENCES);
-                            break;
-                        case "Index":
-                            tablePrivilege.getPrivileges().add(PrivilegeType.INDEX);
-                            break;
-                        case "Alter":
-                            tablePrivilege.getPrivileges().add(PrivilegeType.ALTER);
-                            break;
-                        case "Create View":
-                            tablePrivilege.getPrivileges().add(PrivilegeType.CREATE_VIEW);
-                            break;
-                        case "Show view":
-                            tablePrivilege.getPrivileges().add(PrivilegeType.SHOW_VIEW);
-                            break;
-                        case "Trigger":
-                            tablePrivilege.getPrivileges().add(PrivilegeType.TRIGGER);
-                            break;
-                        default:
-                            break;
+            PreparedStatement preparedStatement = connection.prepareStatement("SELECT Db, Table_name, Table_priv FROM mysql.tables_priv WHERE user=? AND host=?");
+            preparedStatement.setString(1, user.getGrantee().getUsername());
+            preparedStatement.setString(2, user.getGrantee().getHostname());
+            try (ResultSet resultSet = preparedStatement.executeQuery()) {
+                while (resultSet.next()) {
+                    String db = resultSet.getString("Db");
+                    String tableName = resultSet.getString("Table_name");
+                    String[] tablePrivileges = (String[]) resultSet.getArray("Table_priv").getArray();
+                    TablePrivilege tablePrivilege = new TablePrivilege(tableName, getPrivileges(tablePrivileges));
+                    if (!privilege.getDatabasePrivilege().getSpecificPrivileges().containsKey(db)) {
+                        privilege.getDatabasePrivilege().getSpecificPrivileges().put(db, new SchemaPrivilege(db));
                     }
-                }
-                if (privilege.getDatabasePrivilege().getSpecificPrivileges().containsKey(schema)) {
-                    privilege.getDatabasePrivilege().getSpecificPrivileges().get(schema).getSpecificPrivileges().put(tableName, tablePrivilege);
-                } else {
-                    SchemaPrivilege schemaPrivilege = new SchemaPrivilege(schema);
-                    schemaPrivilege.getSpecificPrivileges().put(tableName, tablePrivilege);
-                    privilege.getDatabasePrivilege().getSpecificPrivileges().put(schema, schemaPrivilege);
+                    privilege.getDatabasePrivilege().getSpecificPrivileges().get(db).getSpecificPrivileges().put(tableName, tablePrivilege);
                 }
             }
         }
     }
     
+    private Collection<PrivilegeType> getPrivileges(final String[] privileges) {
+        return Arrays.stream(privileges).map(this::getPrivilegeType).collect(Collectors.toSet());
+    }
+    
+    private PrivilegeType getPrivilegeType(final String privilege) {
+        switch (privilege) {
+            case "Select":
+                return PrivilegeType.SELECT;
+            case "Insert":
+                return PrivilegeType.INSERT;
+            case "Update":
+                return PrivilegeType.UPDATE;
+            case "Delete":
+                return PrivilegeType.DELETE;
+            case "Create":
+                return PrivilegeType.CREATE;
+            case "Drop":
+                return PrivilegeType.DROP;
+            case "Grant":
+                return PrivilegeType.GRANT;
+            case "References":
+                return PrivilegeType.REFERENCES;
+            case "Index":
+                return PrivilegeType.INDEX;
+            case "Alter":
+                return PrivilegeType.ALTER;
+            case "Create View":
+                return PrivilegeType.CREATE_VIEW;
+            case "Show view":
+                return PrivilegeType.SHOW_VIEW;
+            case "Trigger":
+                return PrivilegeType.TRIGGER;
+            default:
+                throw new UnsupportedOperationException(privilege);
+        }
+    }
+    
     @Override
     public String getDatabaseType() {
         return "MySQL";
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/admin/AdministrativePrivilege.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/admin/AdministrativePrivilege.java
index 5cf111e..9494aa2 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/admin/AdministrativePrivilege.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/admin/AdministrativePrivilege.java
@@ -22,7 +22,7 @@ import lombok.Getter;
 import org.apache.shardingsphere.infra.metadata.auth.model.privilege.PrivilegeType;
 
 import java.util.Collection;
-import java.util.LinkedHashSet;
+import java.util.concurrent.CopyOnWriteArraySet;
 
 /**
  * Administrative privilege.
@@ -31,7 +31,7 @@ import java.util.LinkedHashSet;
 @EqualsAndHashCode
 public final class AdministrativePrivilege {
     
-    private final Collection<PrivilegeType> privileges = new LinkedHashSet<>();
+    private final Collection<PrivilegeType> privileges = new CopyOnWriteArraySet<>();
     
     /**
      * Has privileges.
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/DatabasePrivilege.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/DatabasePrivilege.java
index 4a85c8d..d4fe67f 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/DatabasePrivilege.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/DatabasePrivilege.java
@@ -22,9 +22,9 @@ import lombok.Getter;
 import org.apache.shardingsphere.infra.metadata.auth.model.privilege.PrivilegeType;
 
 import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.stream.Collectors;
 
 /**
@@ -34,9 +34,9 @@ import java.util.stream.Collectors;
 @EqualsAndHashCode
 public final class DatabasePrivilege {
     
-    private final Collection<PrivilegeType> globalPrivileges = new LinkedHashSet<>();
+    private final Collection<PrivilegeType> globalPrivileges = new CopyOnWriteArraySet<>();
     
-    private final Map<String, SchemaPrivilege> specificPrivileges = new LinkedHashMap<>();
+    private final Map<String, SchemaPrivilege> specificPrivileges = new ConcurrentHashMap<>();
     
     /**
      * Has privileges.
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/SchemaPrivilege.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/SchemaPrivilege.java
index 148ca40..b701797 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/SchemaPrivilege.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/SchemaPrivilege.java
@@ -23,9 +23,9 @@ import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.metadata.auth.model.privilege.PrivilegeType;
 
 import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.stream.Collectors;
 
 /**
@@ -38,9 +38,9 @@ public final class SchemaPrivilege {
     
     private final String name;
     
-    private final Collection<PrivilegeType> globalPrivileges = new LinkedHashSet<>();
+    private final Collection<PrivilegeType> globalPrivileges = new CopyOnWriteArraySet<>();
     
-    private final Map<String, TablePrivilege> specificPrivileges = new LinkedHashMap<>();
+    private final Map<String, TablePrivilege> specificPrivileges = new ConcurrentHashMap<>();
     
     /**
      * Has privileges.
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/TablePrivilege.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/TablePrivilege.java
index b74bf6d..70cee15 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/TablePrivilege.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/model/privilege/database/TablePrivilege.java
@@ -18,24 +18,21 @@
 package org.apache.shardingsphere.infra.metadata.auth.model.privilege.database;
 
 import lombok.EqualsAndHashCode;
-import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.metadata.auth.model.privilege.PrivilegeType;
 
 import java.util.Collection;
-import java.util.LinkedHashSet;
 
 /**
  * Table privilege.
  */
 @RequiredArgsConstructor
-@Getter
 @EqualsAndHashCode
 public final class TablePrivilege {
     
     private final String tableName;
     
-    private final Collection<PrivilegeType> privileges = new LinkedHashSet<>();
+    private final Collection<PrivilegeType> privileges;
     
     /**
      * Has privileges.
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/refresher/type/CreateUserStatementAuthRefresher.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/refresher/type/CreateUserStatementAuthRefresher.java
index 4be1afd..b0fcc9b 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/refresher/type/CreateUserStatementAuthRefresher.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/auth/refresher/type/CreateUserStatementAuthRefresher.java
@@ -38,9 +38,7 @@ public final class CreateUserStatementAuthRefresher implements AuthenticationRef
     @Override
     public void refresh(final Authentication authentication, final SQLStatement sqlStatement, final ShardingSphereMetaData metaData) {
         Collection<ShardingSphereUser> users = generateUsers((CreateUserStatement) sqlStatement);
-        for (ShardingSphereUser each : authentication.getAuthentication().keySet()) {
-            users.add(each);
-        }
+        users.addAll(authentication.getAuthentication().keySet());
         ShardingSphereEventBus.getInstance().post(new CreateUserEvent(users));
     }