1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.driver.jdbc.adapter;
19
20 import com.google.common.base.Preconditions;
21 import lombok.Getter;
22 import org.apache.shardingsphere.driver.jdbc.adapter.executor.ForceExecuteTemplate;
23 import org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection;
24 import org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSetMetaData;
25 import org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement;
26 import org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement;
27 import org.apache.shardingsphere.driver.jdbc.unsupported.AbstractUnsupportedOperationResultSet;
28 import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
29 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
30
31 import java.sql.ResultSet;
32 import java.sql.ResultSetMetaData;
33 import java.sql.SQLException;
34 import java.sql.SQLWarning;
35 import java.sql.Statement;
36 import java.util.List;
37
38
39
40
41 public abstract class AbstractResultSetAdapter extends AbstractUnsupportedOperationResultSet {
42
43 private final List<ResultSet> resultSets;
44
45 @Getter
46 private final Statement statement;
47
48 private final SQLStatementContext sqlStatementContext;
49
50 private final ForceExecuteTemplate<ResultSet> forceExecuteTemplate;
51
52 private boolean closed;
53
54 protected AbstractResultSetAdapter(final List<ResultSet> resultSets, final Statement statement, final SQLStatementContext sqlStatementContext) {
55 Preconditions.checkArgument(!resultSets.isEmpty());
56 this.resultSets = resultSets;
57 this.statement = statement;
58 this.sqlStatementContext = sqlStatementContext;
59 forceExecuteTemplate = new ForceExecuteTemplate<>();
60 }
61
62 @Override
63 public final ResultSetMetaData getMetaData() throws SQLException {
64 return new ShardingSphereResultSetMetaData(resultSets.get(0).getMetaData(), getDatabase(), sqlStatementContext);
65 }
66
67 private ShardingSphereDatabase getDatabase() {
68 ShardingSphereConnection connection = statement instanceof ShardingSpherePreparedStatement
69 ? ((ShardingSpherePreparedStatement) statement).getConnection()
70 : ((ShardingSphereStatement) statement).getConnection();
71 return connection.getContextManager().getMetaDataContexts().getMetaData().getDatabase(connection.getCurrentDatabaseName());
72 }
73
74 @Override
75 public final int findColumn(final String columnLabel) throws SQLException {
76 return resultSets.get(0).findColumn(columnLabel);
77 }
78
79 @Override
80 public final void setFetchDirection(final int direction) throws SQLException {
81 forceExecuteTemplate.execute(resultSets, resultSet -> resultSet.setFetchDirection(direction));
82 }
83
84 @Override
85 public final int getFetchDirection() throws SQLException {
86 return resultSets.get(0).getFetchDirection();
87 }
88
89 @Override
90 public final void setFetchSize(final int rows) throws SQLException {
91 forceExecuteTemplate.execute(resultSets, resultSet -> resultSet.setFetchSize(rows));
92 }
93
94 @Override
95 public final int getFetchSize() throws SQLException {
96 return resultSets.get(0).getFetchSize();
97 }
98
99 @Override
100 public final int getType() throws SQLException {
101 return resultSets.get(0).getType();
102 }
103
104 @Override
105 public final int getConcurrency() throws SQLException {
106 return resultSets.get(0).getConcurrency();
107 }
108
109 @Override
110 public final SQLWarning getWarnings() throws SQLException {
111 return resultSets.get(0).getWarnings();
112 }
113
114 @Override
115 public final void clearWarnings() throws SQLException {
116 forceExecuteTemplate.execute(resultSets, ResultSet::clearWarnings);
117 }
118
119 @Override
120 public final boolean isClosed() {
121 return closed;
122 }
123
124 @Override
125 public final void close() throws SQLException {
126 closed = true;
127 forceExecuteTemplate.execute(resultSets, ResultSet::close);
128 }
129 }