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.executor.sql.context.ExecutionContext;
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 @Getter
44 private final List<ResultSet> resultSets;
45
46 @Getter
47 private final Statement statement;
48
49 private final boolean selectContainsEnhancedTable;
50
51 private boolean closed;
52
53 private final ForceExecuteTemplate<ResultSet> forceExecuteTemplate = new ForceExecuteTemplate<>();
54
55 @Getter
56 private final ExecutionContext executionContext;
57
58 protected AbstractResultSetAdapter(final List<ResultSet> resultSets, final Statement statement, final boolean selectContainsEnhancedTable, final ExecutionContext executionContext) {
59 Preconditions.checkArgument(!resultSets.isEmpty());
60 this.resultSets = resultSets;
61 this.statement = statement;
62 this.selectContainsEnhancedTable = selectContainsEnhancedTable;
63 this.executionContext = executionContext;
64 }
65
66 @Override
67 public final ResultSetMetaData getMetaData() throws SQLException {
68 return new ShardingSphereResultSetMetaData(resultSets.get(0).getMetaData(), getDatabase(), selectContainsEnhancedTable, executionContext.getSqlStatementContext());
69 }
70
71 private ShardingSphereDatabase getDatabase() {
72 ShardingSphereConnection connection = statement instanceof ShardingSpherePreparedStatement
73 ? ((ShardingSpherePreparedStatement) statement).getConnection()
74 : ((ShardingSphereStatement) statement).getConnection();
75 return connection.getContextManager().getMetaDataContexts().getMetaData().getDatabase(connection.getDatabaseName());
76 }
77
78 @Override
79 public final int findColumn(final String columnLabel) throws SQLException {
80 return resultSets.get(0).findColumn(columnLabel);
81 }
82
83 @Override
84 public final void close() throws SQLException {
85 closed = true;
86 forceExecuteTemplate.execute(resultSets, ResultSet::close);
87 }
88
89 @Override
90 public final boolean isClosed() {
91 return closed;
92 }
93
94 @Override
95 public final void setFetchDirection(final int direction) throws SQLException {
96 forceExecuteTemplate.execute(resultSets, resultSet -> resultSet.setFetchDirection(direction));
97 }
98
99 @Override
100 public final int getFetchDirection() throws SQLException {
101 return resultSets.get(0).getFetchDirection();
102 }
103
104 @Override
105 public final void setFetchSize(final int rows) throws SQLException {
106 forceExecuteTemplate.execute(resultSets, resultSet -> resultSet.setFetchSize(rows));
107 }
108
109 @Override
110 public final int getFetchSize() throws SQLException {
111 return resultSets.get(0).getFetchSize();
112 }
113
114 @Override
115 public final int getType() throws SQLException {
116 return resultSets.get(0).getType();
117 }
118
119 @Override
120 public final int getConcurrency() throws SQLException {
121 return resultSets.get(0).getConcurrency();
122 }
123
124 @Override
125 public final SQLWarning getWarnings() throws SQLException {
126 return resultSets.get(0).getWarnings();
127 }
128
129 @Override
130 public final void clearWarnings() throws SQLException {
131 forceExecuteTemplate.execute(resultSets, ResultSet::clearWarnings);
132 }
133 }