1 package com.zaxxer.hikari.pool;
2
3 import java.sql.Connection;
4 import java.sql.DatabaseMetaData;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7 import java.sql.Statement;
8
9 public abstract class ProxyDatabaseMetaData implements DatabaseMetaData
10 {
11    protected final ProxyConnection connection;
12
13    @SuppressWarnings("WeakerAccess")
14    protected final DatabaseMetaData delegate;
15
16    ProxyDatabaseMetaData(ProxyConnection connection, DatabaseMetaData metaData)
17    {
18       this.connection = connection;
19       this.delegate = metaData;
20    }
21
22    @SuppressWarnings("unused")
23    final SQLException checkException(SQLException e)
24    {
25       return connection.checkException(e);
26    }
27
28    /** {@inheritDoc} */
29    @Override
30    public final String toString()
31    {
32       final String delegateToString = delegate.toString();
33       return this.getClass().getSimpleName() + '@' + System.identityHashCode(this) + " wrapping " + delegateToString;
34    }
35
36    // **********************************************************************
37    //                 Overridden java.sql.DatabaseMetaData Methods
38    // **********************************************************************
39
40    /** {@inheritDoc} */
41    @Override
42    public final Connection getConnection()
43    {
44       return connection;
45    }
46
47    @Override
48    public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) throws SQLException {
49       ResultSet resultSet = delegate.getProcedures(catalog, schemaPattern, procedureNamePattern);
50       Statement statement = resultSet.getStatement();
51       if (statement != null) {
52          statement = ProxyFactory.getProxyStatement(connection, statement);
53       }
54       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
55    }
56
57    @Override
58    public ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) throws SQLException {
59       ResultSet resultSet = delegate.getProcedureColumns(catalog, schemaPattern, procedureNamePattern, columnNamePattern);
60       Statement statement = resultSet.getStatement();
61       if (statement != null) {
62          statement = ProxyFactory.getProxyStatement(connection, statement);
63       }
64       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
65    }
66
67    @Override
68    public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException {
69       ResultSet resultSet = delegate.getTables(catalog, schemaPattern, tableNamePattern, types);
70       Statement statement = resultSet.getStatement();
71       if (statement != null) {
72          statement = ProxyFactory.getProxyStatement(connection, statement);
73       }
74       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
75    }
76
77    @Override
78    public ResultSet getSchemas() throws SQLException {
79       ResultSet resultSet = delegate.getSchemas();
80       Statement statement = resultSet.getStatement();
81       if (statement != null) {
82          statement = ProxyFactory.getProxyStatement(connection, statement);
83       }
84       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
85    }
86
87    @Override
88    public ResultSet getCatalogs() throws SQLException {
89       ResultSet resultSet = delegate.getCatalogs();
90       Statement statement = resultSet.getStatement();
91       if (statement != null) {
92          statement = ProxyFactory.getProxyStatement(connection, statement);
93       }
94       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
95    }
96
97    @Override
98    public ResultSet getTableTypes() throws SQLException {
99       ResultSet resultSet = delegate.getTableTypes();
100       Statement statement = resultSet.getStatement();
101       if (statement != null) {
102          statement = ProxyFactory.getProxyStatement(connection, statement);
103       }
104       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
105    }
106
107    @Override
108    public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException {
109       ResultSet resultSet = delegate.getColumns(catalog, schemaPattern, tableNamePattern, columnNamePattern);
110       Statement statement = resultSet.getStatement();
111       if (statement != null) {
112          statement = ProxyFactory.getProxyStatement(connection, statement);
113       }
114       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
115    }
116
117    @Override
118    public ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) throws SQLException {
119       ResultSet resultSet = delegate.getColumnPrivileges(catalog, schema, table, columnNamePattern);
120       Statement statement = resultSet.getStatement();
121       if (statement != null) {
122          statement = ProxyFactory.getProxyStatement(connection, statement);
123       }
124       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
125    }
126
127    @Override
128    public ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) throws SQLException {
129       ResultSet resultSet = delegate.getTablePrivileges(catalog, schemaPattern, tableNamePattern);
130       Statement statement = resultSet.getStatement();
131       if (statement != null) {
132          statement = ProxyFactory.getProxyStatement(connection, statement);
133       }
134       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
135    }
136
137    @Override
138    public ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) throws SQLException {
139       ResultSet resultSet = delegate.getBestRowIdentifier(catalog, schema, table, scope, nullable);
140       Statement statement = resultSet.getStatement();
141       if (statement != null) {
142          statement = ProxyFactory.getProxyStatement(connection, statement);
143       }
144       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
145    }
146
147    @Override
148    public ResultSet getVersionColumns(String catalog, String schema, String table) throws SQLException {
149       ResultSet resultSet = delegate.getVersionColumns(catalog, schema, table);
150       Statement statement = resultSet.getStatement();
151       if (statement != null) {
152          statement = ProxyFactory.getProxyStatement(connection, statement);
153       }
154       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
155    }
156
157    @Override
158    public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException {
159       ResultSet resultSet = delegate.getPrimaryKeys(catalog, schema, table);
160       Statement statement = resultSet.getStatement();
161       if (statement != null) {
162          statement = ProxyFactory.getProxyStatement(connection, statement);
163       }
164       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
165    }
166
167    @Override
168    public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException {
169       ResultSet resultSet = delegate.getImportedKeys(catalog, schema, table);
170       Statement statement = resultSet.getStatement();
171       if (statement != null) {
172          statement = ProxyFactory.getProxyStatement(connection, statement);
173       }
174       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
175    }
176
177    @Override
178    public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException {
179       ResultSet resultSet = delegate.getExportedKeys(catalog, schema, table);
180       Statement statement = resultSet.getStatement();
181       if (statement != null) {
182          statement = ProxyFactory.getProxyStatement(connection, statement);
183       }
184       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
185    }
186
187    @Override
188    public ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException {
189       ResultSet resultSet = delegate.getCrossReference(parentCatalog, parentSchema, parentTable, foreignCatalog, foreignSchema, foreignTable);
190       Statement statement = resultSet.getStatement();
191       if (statement != null) {
192          statement = ProxyFactory.getProxyStatement(connection, statement);
193       }
194       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
195    }
196
197    @Override
198    public ResultSet getTypeInfo() throws SQLException {
199       ResultSet resultSet = delegate.getTypeInfo();
200       Statement statement = resultSet.getStatement();
201       if (statement != null) {
202          statement = ProxyFactory.getProxyStatement(connection, statement);
203       }
204       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
205    }
206
207    @Override
208    public ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) throws SQLException {
209       ResultSet resultSet = delegate.getIndexInfo(catalog, schema, table, unique, approximate);
210       Statement statement = resultSet.getStatement();
211       if (statement != null) {
212          statement = ProxyFactory.getProxyStatement(connection, statement);
213       }
214       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
215    }
216
217    @Override
218    public ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) throws SQLException {
219       ResultSet resultSet = delegate.getUDTs(catalog, schemaPattern, typeNamePattern, types);
220       Statement statement = resultSet.getStatement();
221       if (statement != null) {
222          statement = ProxyFactory.getProxyStatement(connection, statement);
223       }
224       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
225    }
226
227    @Override
228    public ResultSet getSuperTypes(String catalog, String schemaPattern, String typeNamePattern) throws SQLException {
229       ResultSet resultSet = delegate.getSuperTypes(catalog, schemaPattern, typeNamePattern);
230       Statement statement = resultSet.getStatement();
231       if (statement != null) {
232          statement = ProxyFactory.getProxyStatement(connection, statement);
233       }
234       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
235    }
236
237    @Override
238    public ResultSet getSuperTables(String catalog, String schemaPattern, String tableNamePattern) throws SQLException {
239       ResultSet resultSet = delegate.getSuperTables(catalog, schemaPattern, tableNamePattern);
240       Statement statement = resultSet.getStatement();
241       if (statement != null) {
242          statement = ProxyFactory.getProxyStatement(connection, statement);
243       }
244       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
245    }
246
247    @Override
248    public ResultSet getAttributes(String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern) throws SQLException {
249       ResultSet resultSet = delegate.getAttributes(catalog, schemaPattern, typeNamePattern, attributeNamePattern);
250       Statement statement = resultSet.getStatement();
251       if (statement != null) {
252          statement = ProxyFactory.getProxyStatement(connection, statement);
253       }
254       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
255    }
256
257    @Override
258    public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException {
259       ResultSet resultSet = delegate.getSchemas(catalog, schemaPattern);
260       Statement statement = resultSet.getStatement();
261       if (statement != null) {
262          statement = ProxyFactory.getProxyStatement(connection, statement);
263       }
264       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
265    }
266
267    @Override
268    public ResultSet getClientInfoProperties() throws SQLException {
269       ResultSet resultSet = delegate.getClientInfoProperties();
270       Statement statement = resultSet.getStatement();
271       if (statement != null) {
272          statement = ProxyFactory.getProxyStatement(connection, statement);
273       }
274       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
275    }
276
277    @Override
278    public ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern) throws SQLException {
279       ResultSet resultSet = delegate.getFunctions(catalog, schemaPattern, functionNamePattern);
280       Statement statement = resultSet.getStatement();
281       if (statement != null) {
282          statement = ProxyFactory.getProxyStatement(connection, statement);
283       }
284       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
285    }
286
287    @Override
288    public ResultSet getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) throws SQLException {
289       ResultSet resultSet = delegate.getFunctionColumns(catalog, schemaPattern, functionNamePattern, columnNamePattern);
290       Statement statement = resultSet.getStatement();
291       if (statement != null) {
292          statement = ProxyFactory.getProxyStatement(connection, statement);
293       }
294       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
295    }
296
297    @Override
298    public ResultSet getPseudoColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException {
299       ResultSet resultSet = delegate.getPseudoColumns(catalog, schemaPattern, tableNamePattern, columnNamePattern);
300       Statement statement = resultSet.getStatement();
301       if (statement != null) {
302          statement = ProxyFactory.getProxyStatement(connection, statement);
303       }
304       return ProxyFactory.getProxyResultSet(connection, (ProxyStatement) statement, resultSet);
305    }
306
307    /** {@inheritDoc} */
308    @Override
309    @SuppressWarnings("unchecked")
310    public final <T> T unwrap(Class<T> iface) throws SQLException
311    {
312       if (iface.isInstance(delegate)) {
313          return (T) delegate;
314       }
315       else if (delegate != null) {
316          return delegate.unwrap(iface);
317       }
318
319       throw new SQLException("Wrapped DatabaseMetaData is not an instance of " + iface);
320    }
321 }
322