Skip to content

Commit a2858eb

Browse files
committed
Support isWrapperFor() and unwrap() methods
Add missed implementation of Wrapper interface for SQLDatabaseMetadata, SQLResultSet, and SQL ResultSetMetaData classes. Closes: #73
1 parent 06755d5 commit a2858eb

8 files changed

+108
-15
lines changed

src/main/java/org/tarantool/jdbc/SQLDatabaseMetadata.java

+8-5
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import java.sql.ResultSet;
99
import java.sql.RowIdLifetime;
1010
import java.sql.SQLException;
11-
import java.sql.SQLFeatureNotSupportedException;
11+
import java.sql.SQLNonTransientException;
1212
import java.sql.Types;
1313
import java.util.ArrayList;
1414
import java.util.Arrays;
@@ -1085,13 +1085,16 @@ public boolean generatedKeyAlwaysReturned() throws SQLException {
10851085
}
10861086

10871087
@Override
1088-
public <T> T unwrap(Class<T> iface) throws SQLException {
1089-
throw new SQLFeatureNotSupportedException();
1088+
public <T> T unwrap(Class<T> type) throws SQLException {
1089+
if (isWrapperFor(type)) {
1090+
return type.cast(this);
1091+
}
1092+
throw new SQLNonTransientException("DatebaseMetadata does not wrap " + type.getName());
10901093
}
10911094

10921095
@Override
1093-
public boolean isWrapperFor(Class<?> iface) throws SQLException {
1094-
throw new SQLFeatureNotSupportedException();
1096+
public boolean isWrapperFor(Class<?> type) throws SQLException {
1097+
return type.isAssignableFrom(this.getClass());
10951098
}
10961099

10971100
private ResultSet asMetadataResultSet(JDBCBridge jdbcBridge) throws SQLException {

src/main/java/org/tarantool/jdbc/SQLResultSet.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -1081,13 +1081,16 @@ public <T> T getObject(String columnLabel, Class<T> type) throws SQLException {
10811081
}
10821082

10831083
@Override
1084-
public <T> T unwrap(Class<T> iface) throws SQLException {
1085-
throw new SQLFeatureNotSupportedException();
1084+
public <T> T unwrap(Class<T> type) throws SQLException {
1085+
if (isWrapperFor(type)) {
1086+
return type.cast(this);
1087+
}
1088+
throw new SQLNonTransientException("ResultSet does not wrap " + type.getName());
10861089
}
10871090

10881091
@Override
1089-
public boolean isWrapperFor(Class<?> iface) throws SQLException {
1090-
throw new SQLFeatureNotSupportedException();
1092+
public boolean isWrapperFor(Class<?> type) throws SQLException {
1093+
return type.isAssignableFrom(this.getClass());
10911094
}
10921095

10931096
@Override

src/main/java/org/tarantool/jdbc/SQLResultSetMetaData.java

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package org.tarantool.jdbc;
22

3+
import org.tarantool.JDBCBridge;
4+
35
import java.sql.ResultSetMetaData;
46
import java.sql.SQLException;
57
import java.sql.SQLFeatureNotSupportedException;
8+
import java.sql.SQLNonTransientException;
69
import java.sql.Types;
710

8-
import org.tarantool.JDBCBridge;
9-
1011
public class SQLResultSetMetaData implements ResultSetMetaData {
1112
protected final JDBCBridge JDBCBridgeExecutor;
1213

@@ -120,13 +121,16 @@ public String getColumnClassName(int column) throws SQLException {
120121
}
121122

122123
@Override
123-
public <T> T unwrap(Class<T> iface) throws SQLException {
124-
throw new SQLFeatureNotSupportedException();
124+
public <T> T unwrap(Class<T> type) throws SQLException {
125+
if (isWrapperFor(type)) {
126+
return type.cast(this);
127+
}
128+
throw new SQLNonTransientException("ResultSetMetadata does not wrap " + type.getName());
125129
}
126130

127131
@Override
128-
public boolean isWrapperFor(Class<?> iface) throws SQLException {
129-
throw new SQLFeatureNotSupportedException();
132+
public boolean isWrapperFor(Class<?> type) throws SQLException {
133+
return type.isAssignableFrom(this.getClass());
130134
}
131135

132136
@Override

src/test/java/org/tarantool/jdbc/JdbcDatabaseMetaDataIT.java

+12
Original file line numberDiff line numberDiff line change
@@ -254,4 +254,16 @@ public void testSupportsResultSetHoldability() throws SQLException {
254254
assertFalse(meta.supportsResultSetHoldability(42));
255255
}
256256

257+
@Test
258+
public void testUnwrap() throws SQLException {
259+
assertEquals(meta, meta.unwrap(SQLDatabaseMetadata.class));
260+
assertThrows(SQLException.class, () -> meta.unwrap(Integer.class));
261+
}
262+
263+
@Test
264+
public void testIsWrapperFor() throws SQLException {
265+
assertTrue(meta.isWrapperFor(SQLDatabaseMetadata.class));
266+
assertFalse(meta.isWrapperFor(Integer.class));
267+
}
268+
257269
}

src/test/java/org/tarantool/jdbc/JdbcPreparedStatementIT.java

+16
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,22 @@ public void execute() throws Throwable {
161161
assertEquals(3, i);
162162
}
163163

164+
@Test
165+
public void testUnwrap() throws SQLException {
166+
prep = conn.prepareStatement("SELECT val FROM test");
167+
assertEquals(prep, prep.unwrap(SQLPreparedStatement.class));
168+
assertEquals(prep, prep.unwrap(SQLStatement.class));
169+
assertThrows(SQLException.class, () -> prep.unwrap(Integer.class));
170+
}
171+
172+
@Test
173+
public void testIsWrapperFor() throws SQLException {
174+
prep = conn.prepareStatement("SELECT val FROM test");
175+
assertTrue(prep.isWrapperFor(SQLPreparedStatement.class));
176+
assertTrue(prep.isWrapperFor(SQLStatement.class));
177+
assertFalse(prep.isWrapperFor(Integer.class));
178+
}
179+
164180
@Test
165181
public void testSetByte() throws SQLException {
166182
makeHelper(Byte.class)

src/test/java/org/tarantool/jdbc/JdbcResultSetIT.java

+15
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import static org.junit.jupiter.api.Assertions.assertEquals;
1414
import static org.junit.jupiter.api.Assertions.assertFalse;
1515
import static org.junit.jupiter.api.Assertions.assertNotNull;
16+
import static org.junit.jupiter.api.Assertions.assertThrows;
1617
import static org.junit.jupiter.api.Assertions.assertTrue;
1718

1819
public class JdbcResultSetIT extends JdbcTypesIT {
@@ -132,4 +133,18 @@ public void testHoldability() throws SQLException {
132133
assertEquals(metaData.getResultSetHoldability(), resultSet.getHoldability());
133134
}
134135

136+
@Test
137+
public void testUnwrap() throws SQLException {
138+
ResultSet resultSet = stmt.executeQuery("SELECT * FROM test WHERE id < 0");
139+
assertEquals(resultSet, resultSet.unwrap(SQLResultSet.class));
140+
assertThrows(SQLException.class, () -> resultSet.unwrap(Integer.class));
141+
}
142+
143+
@Test
144+
public void testIsWrapperFor() throws SQLException {
145+
ResultSet resultSet = stmt.executeQuery("SELECT * FROM test WHERE id < 0");
146+
assertTrue(resultSet.isWrapperFor(SQLResultSet.class));
147+
assertFalse(resultSet.isWrapperFor(Integer.class));
148+
}
149+
135150
}

src/test/java/org/tarantool/jdbc/JdbcResultSetMetaDataIT.java

+27
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
import java.sql.Statement;
99

1010
import static org.junit.jupiter.api.Assertions.assertEquals;
11+
import static org.junit.jupiter.api.Assertions.assertFalse;
1112
import static org.junit.jupiter.api.Assertions.assertNotNull;
13+
import static org.junit.jupiter.api.Assertions.assertThrows;
14+
import static org.junit.jupiter.api.Assertions.assertTrue;
1215

1316
public class JdbcResultSetMetaDataIT extends AbstractJdbcIT {
1417
@Test
@@ -31,4 +34,28 @@ public void testColumnNames() throws SQLException {
3134
rs.close();
3235
stmt.close();
3336
}
37+
38+
@Test
39+
public void testUnwrap() throws SQLException {
40+
try (
41+
Statement statement = conn.createStatement();
42+
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
43+
) {
44+
ResultSetMetaData metaData = resultSet.getMetaData();
45+
assertEquals(metaData, metaData.unwrap(SQLResultSetMetaData.class));
46+
assertThrows(SQLException.class, () -> metaData.unwrap(Integer.class));
47+
}
48+
}
49+
50+
@Test
51+
public void testIsWrapperFor() throws SQLException {
52+
try (
53+
Statement statement = conn.createStatement();
54+
ResultSet resultSet = statement.executeQuery("SELECT * FROM test")
55+
) {
56+
ResultSetMetaData metaData = resultSet.getMetaData();
57+
assertTrue(metaData.isWrapperFor(SQLResultSetMetaData.class));
58+
assertFalse(metaData.isWrapperFor(Integer.class));
59+
}
60+
}
3461
}

src/test/java/org/tarantool/jdbc/JdbcStatementIT.java

+13
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,17 @@ public void execute() throws Throwable {
9393
}
9494
assertEquals(3, i);
9595
}
96+
97+
@Test
98+
public void testUnwrap() throws SQLException {
99+
assertEquals(stmt, stmt.unwrap(SQLStatement.class));
100+
assertThrows(SQLException.class, () -> stmt.unwrap(Integer.class));
101+
}
102+
103+
@Test
104+
public void testIsWrapperFor() throws SQLException {
105+
assertTrue(stmt.isWrapperFor(SQLStatement.class));
106+
assertFalse(stmt.isWrapperFor(Integer.class));
107+
}
108+
96109
}

0 commit comments

Comments
 (0)