1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.proxy.backend.mysql.handler.admin.executor;
19
20 import lombok.RequiredArgsConstructor;
21 import org.apache.shardingsphere.authority.checker.AuthorityChecker;
22 import org.apache.shardingsphere.authority.rule.AuthorityRule;
23 import org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
24 import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException;
25 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
26 import org.apache.shardingsphere.proxy.backend.handler.admin.executor.DatabaseAdminExecutor;
27 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
28 import org.apache.shardingsphere.sql.parser.sql.common.statement.dal.UseStatement;
29 import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
30
31
32
33
34 @RequiredArgsConstructor
35 public final class UseDatabaseExecutor implements DatabaseAdminExecutor {
36
37 private final UseStatement useStatement;
38
39 @Override
40 public void execute(final ConnectionSession connectionSession) {
41 String databaseName = SQLUtils.getExactlyValue(useStatement.getSchema());
42 AuthorityRule authorityRule = ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(AuthorityRule.class);
43 AuthorityChecker authorityChecker = new AuthorityChecker(authorityRule, connectionSession.getGrantee());
44 ShardingSpherePreconditions.checkState(ProxyContext.getInstance().databaseExists(databaseName) && authorityChecker.isAuthorized(databaseName),
45 () -> new UnknownDatabaseException(databaseName));
46 connectionSession.setCurrentDatabase(databaseName);
47 }
48 }