|
13 | 13 | import java.sql.Blob;
|
14 | 14 | import java.sql.Clob;
|
15 | 15 | import java.sql.Date;
|
| 16 | +import java.sql.JDBCType; |
16 | 17 | import java.sql.NClob;
|
17 | 18 | import java.sql.Ref;
|
18 | 19 | import java.sql.ResultSet;
|
|
28 | 29 | import java.time.LocalDateTime;
|
29 | 30 | import java.time.LocalTime;
|
30 | 31 | import java.util.Calendar;
|
| 32 | +import java.util.Collection; |
| 33 | +import java.util.Iterator; |
31 | 34 | import java.util.List;
|
32 | 35 | import java.util.Map;
|
33 | 36 | import java.util.NoSuchElementException;
|
|
38 | 41 | import org.hibernate.type.descriptor.jdbc.JdbcType;
|
39 | 42 |
|
40 | 43 | import io.vertx.core.buffer.Buffer;
|
| 44 | +import io.vertx.sqlclient.PropertyKind; |
41 | 45 | import io.vertx.sqlclient.Row;
|
42 |
| -import io.vertx.sqlclient.RowIterator; |
43 | 46 | import io.vertx.sqlclient.RowSet;
|
44 | 47 | import io.vertx.sqlclient.desc.ColumnDescriptor;
|
| 48 | +import io.vertx.sqlclient.impl.RowBase; |
45 | 49 |
|
46 | 50 | import static java.util.Collections.emptyList;
|
47 | 51 | import static java.util.Objects.requireNonNull;
|
|
52 | 56 | */
|
53 | 57 | public class ResultSetAdaptor implements ResultSet {
|
54 | 58 |
|
55 |
| - private final RowIterator<Row> iterator; |
56 |
| - private final RowSet<Row> rows; |
| 59 | + private final Iterator<Row> iterator; |
| 60 | + |
| 61 | + private final List<ColumnDescriptor> columnDescriptors; |
| 62 | + private final List<String> columnNames; |
57 | 63 | private Row row;
|
58 | 64 | private boolean wasNull;
|
59 | 65 |
|
60 | 66 | public ResultSetAdaptor(RowSet<Row> rows) {
|
61 | 67 | requireNonNull( rows );
|
62 | 68 | this.iterator = rows.iterator();
|
63 |
| - this.rows = rows; |
| 69 | + this.columnNames = rows.columnsNames() == null ? emptyList() : rows.columnsNames(); |
| 70 | + this.columnDescriptors = rows.columnDescriptors(); |
| 71 | + } |
| 72 | + |
| 73 | + public ResultSetAdaptor(RowSet<Row> rows, PropertyKind<Row> propertyKind, String idColumnName, Class<?> idClass) { |
| 74 | + this( rows, rows.property( propertyKind ), idColumnName, idClass ); |
| 75 | + } |
| 76 | + |
| 77 | + public ResultSetAdaptor(RowSet<Row> rows, Collection<?> ids, String idColumnName, Class<?> idClass) { |
| 78 | + this( rows, new RowFromId( ids, idColumnName ), idColumnName, idClass ); |
| 79 | + } |
| 80 | + |
| 81 | + private ResultSetAdaptor(RowSet<Row> rows, Row row, String idColumnName, Class<?> idClass) { |
| 82 | + requireNonNull( rows ); |
| 83 | + requireNonNull( idColumnName ); |
| 84 | + this.iterator = List.of( row ).iterator(); |
| 85 | + this.columnNames = List.of( idColumnName ); |
| 86 | + ColumnDescriptor columnDescriptor = new ColumnDescriptor() { |
| 87 | + @Override |
| 88 | + public String name() { |
| 89 | + return idColumnName; |
| 90 | + } |
| 91 | + |
| 92 | + @Override |
| 93 | + public boolean isArray() { |
| 94 | + return idClass.isArray(); |
| 95 | + } |
| 96 | + |
| 97 | + @Override |
| 98 | + public String typeName() { |
| 99 | + return idClass.getName(); |
| 100 | + } |
| 101 | + |
| 102 | + @Override |
| 103 | + public JDBCType jdbcType() { |
| 104 | + return null; |
| 105 | + } |
| 106 | + }; |
| 107 | + this.columnDescriptors = List.of( columnDescriptor ); |
| 108 | + } |
| 109 | + |
| 110 | + private static class RowFromId extends RowBase { |
| 111 | + |
| 112 | + private final List<String> columns; |
| 113 | + |
| 114 | + public RowFromId(Collection<?> ids, String columnName) { |
| 115 | + super( ids ); |
| 116 | + this.columns = List.of( requireNonNull( columnName ) ); |
| 117 | + } |
| 118 | + |
| 119 | + @Override |
| 120 | + public String getColumnName(int pos) { |
| 121 | + return pos > 0 ? null : columns.get( pos ); |
| 122 | + } |
| 123 | + |
| 124 | + @Override |
| 125 | + public int getColumnIndex(String column) { |
| 126 | + return columns.indexOf( column ); |
| 127 | + } |
64 | 128 | }
|
65 | 129 |
|
66 | 130 | @Override
|
@@ -221,7 +285,7 @@ private <T> T caseInsensitiveGet(String columnLabel, Function<String, T> produce
|
221 | 285 | * @return A list of column names or an empty list.
|
222 | 286 | */
|
223 | 287 | private List<String> getColumnsNames() {
|
224 |
| - return rows.columnsNames() == null ? emptyList() : rows.columnsNames(); |
| 288 | + return this.columnNames; |
225 | 289 | }
|
226 | 290 |
|
227 | 291 | @Override
|
@@ -379,129 +443,6 @@ public String getCursorName() {
|
379 | 443 | return null;
|
380 | 444 | }
|
381 | 445 |
|
382 |
| - @Override |
383 |
| - public ResultSetMetaData getMetaData() { |
384 |
| - return new ResultSetMetaData() { |
385 |
| - @Override |
386 |
| - public int getColumnCount() { |
387 |
| - return getColumnsNames() == null ? 0 : getColumnsNames().size(); |
388 |
| - } |
389 |
| - |
390 |
| - @Override |
391 |
| - public int getColumnType(int column) { |
392 |
| - ColumnDescriptor descriptor = rows.columnDescriptors().get( column - 1 ); |
393 |
| - return descriptor.isArray() ? Types.ARRAY : descriptor.jdbcType().getVendorTypeNumber(); |
394 |
| - } |
395 |
| - |
396 |
| - @Override |
397 |
| - public String getColumnLabel(int column) { |
398 |
| - return getColumnsNames().get( column - 1 ); |
399 |
| - } |
400 |
| - |
401 |
| - @Override |
402 |
| - public String getColumnName(int column) { |
403 |
| - return getColumnsNames().get( column - 1 ); |
404 |
| - } |
405 |
| - |
406 |
| - @Override |
407 |
| - public boolean isAutoIncrement(int column) { |
408 |
| - return false; |
409 |
| - } |
410 |
| - |
411 |
| - @Override |
412 |
| - public boolean isCaseSensitive(int column) { |
413 |
| - return false; |
414 |
| - } |
415 |
| - |
416 |
| - @Override |
417 |
| - public boolean isSearchable(int column) { |
418 |
| - return false; |
419 |
| - } |
420 |
| - |
421 |
| - @Override |
422 |
| - public boolean isCurrency(int column) { |
423 |
| - return false; |
424 |
| - } |
425 |
| - |
426 |
| - @Override |
427 |
| - public int isNullable(int column) { |
428 |
| - return columnNullableUnknown; |
429 |
| - } |
430 |
| - |
431 |
| - @Override |
432 |
| - public boolean isSigned(int column) { |
433 |
| - return false; |
434 |
| - } |
435 |
| - |
436 |
| - @Override |
437 |
| - public int getColumnDisplaySize(int column) { |
438 |
| - return 0; |
439 |
| - } |
440 |
| - |
441 |
| - @Override |
442 |
| - public String getSchemaName(int column) { |
443 |
| - return null; |
444 |
| - } |
445 |
| - |
446 |
| - @Override |
447 |
| - public int getPrecision(int column) { |
448 |
| - return 0; |
449 |
| - } |
450 |
| - |
451 |
| - @Override |
452 |
| - public int getScale(int column) { |
453 |
| - return 0; |
454 |
| - } |
455 |
| - |
456 |
| - @Override |
457 |
| - public String getTableName(int column) { |
458 |
| - return null; |
459 |
| - } |
460 |
| - |
461 |
| - @Override |
462 |
| - public String getCatalogName(int column) { |
463 |
| - return null; |
464 |
| - } |
465 |
| - |
466 |
| - @Override |
467 |
| - public String getColumnTypeName(int column) { |
468 |
| - // This information is in rows.columnDescriptors().get( column-1 ).dataType.name |
469 |
| - // but does not appear to be accessible. |
470 |
| - return null; |
471 |
| - } |
472 |
| - |
473 |
| - @Override |
474 |
| - public boolean isReadOnly(int column) { |
475 |
| - return false; |
476 |
| - } |
477 |
| - |
478 |
| - @Override |
479 |
| - public boolean isWritable(int column) { |
480 |
| - return false; |
481 |
| - } |
482 |
| - |
483 |
| - @Override |
484 |
| - public boolean isDefinitelyWritable(int column) { |
485 |
| - return false; |
486 |
| - } |
487 |
| - |
488 |
| - @Override |
489 |
| - public String getColumnClassName(int column) { |
490 |
| - return null; |
491 |
| - } |
492 |
| - |
493 |
| - @Override |
494 |
| - public <T> T unwrap(Class<T> iface) { |
495 |
| - return null; |
496 |
| - } |
497 |
| - |
498 |
| - @Override |
499 |
| - public boolean isWrapperFor(Class<?> iface) { |
500 |
| - return false; |
501 |
| - } |
502 |
| - }; |
503 |
| - } |
504 |
| - |
505 | 446 | @Override
|
506 | 447 | public Object getObject(int columnIndex) {
|
507 | 448 | Object object = row.getValue( columnIndex - 1 );
|
@@ -680,7 +621,7 @@ public void moveToCurrentRow() {
|
680 | 621 |
|
681 | 622 | @Override
|
682 | 623 | public Statement getStatement() {
|
683 |
| - throw new UnsupportedOperationException(); |
| 624 | + return new PreparedStatementAdaptor(); |
684 | 625 | }
|
685 | 626 |
|
686 | 627 | @Override
|
@@ -1309,4 +1250,139 @@ public void updateNClob(int columnIndex, Reader reader) {
|
1309 | 1250 | public void updateNClob(String columnLabel, Reader reader) {
|
1310 | 1251 | throw new UnsupportedOperationException();
|
1311 | 1252 | }
|
| 1253 | + |
| 1254 | + |
| 1255 | + @Override |
| 1256 | + public ResultSetMetaData getMetaData() { |
| 1257 | + return new MetaData( columnNames, columnDescriptors ); |
| 1258 | + } |
| 1259 | + |
| 1260 | + private static class MetaData implements ResultSetMetaData { |
| 1261 | + |
| 1262 | + private final List<String> columns; |
| 1263 | + private final List<ColumnDescriptor> descriptors; |
| 1264 | + |
| 1265 | + public MetaData(List<String> columnNames, List<ColumnDescriptor> columnDescriptors) { |
| 1266 | + columns = columnNames; |
| 1267 | + descriptors = columnDescriptors; |
| 1268 | + } |
| 1269 | + |
| 1270 | + @Override |
| 1271 | + public int getColumnCount() { |
| 1272 | + return columns.size(); |
| 1273 | + } |
| 1274 | + |
| 1275 | + @Override |
| 1276 | + public int getColumnType(int column) { |
| 1277 | + ColumnDescriptor descriptor = descriptors.get( column - 1 ); |
| 1278 | + return descriptor.isArray() ? Types.ARRAY : descriptor.jdbcType().getVendorTypeNumber(); |
| 1279 | + } |
| 1280 | + |
| 1281 | + @Override |
| 1282 | + public String getColumnLabel(int column) { |
| 1283 | + return columns.get( column - 1 ); |
| 1284 | + } |
| 1285 | + |
| 1286 | + @Override |
| 1287 | + public String getColumnName(int column) { |
| 1288 | + return columns.get( column - 1 ); |
| 1289 | + } |
| 1290 | + |
| 1291 | + @Override |
| 1292 | + public boolean isAutoIncrement(int column) { |
| 1293 | + return false; |
| 1294 | + } |
| 1295 | + |
| 1296 | + @Override |
| 1297 | + public boolean isCaseSensitive(int column) { |
| 1298 | + return false; |
| 1299 | + } |
| 1300 | + |
| 1301 | + @Override |
| 1302 | + public boolean isSearchable(int column) { |
| 1303 | + return false; |
| 1304 | + } |
| 1305 | + |
| 1306 | + @Override |
| 1307 | + public boolean isCurrency(int column) { |
| 1308 | + return false; |
| 1309 | + } |
| 1310 | + |
| 1311 | + @Override |
| 1312 | + public int isNullable(int column) { |
| 1313 | + return columnNullableUnknown; |
| 1314 | + } |
| 1315 | + |
| 1316 | + @Override |
| 1317 | + public boolean isSigned(int column) { |
| 1318 | + return false; |
| 1319 | + } |
| 1320 | + |
| 1321 | + @Override |
| 1322 | + public int getColumnDisplaySize(int column) { |
| 1323 | + return 0; |
| 1324 | + } |
| 1325 | + |
| 1326 | + @Override |
| 1327 | + public String getSchemaName(int column) { |
| 1328 | + return null; |
| 1329 | + } |
| 1330 | + |
| 1331 | + @Override |
| 1332 | + public int getPrecision(int column) { |
| 1333 | + return 0; |
| 1334 | + } |
| 1335 | + |
| 1336 | + @Override |
| 1337 | + public int getScale(int column) { |
| 1338 | + return 0; |
| 1339 | + } |
| 1340 | + |
| 1341 | + @Override |
| 1342 | + public String getTableName(int column) { |
| 1343 | + return null; |
| 1344 | + } |
| 1345 | + |
| 1346 | + @Override |
| 1347 | + public String getCatalogName(int column) { |
| 1348 | + return null; |
| 1349 | + } |
| 1350 | + |
| 1351 | + @Override |
| 1352 | + public String getColumnTypeName(int column) { |
| 1353 | + // This information is in rows.columnDescriptors().get( column-1 ).dataType.name |
| 1354 | + // but does not appear to be accessible. |
| 1355 | + return null; |
| 1356 | + } |
| 1357 | + |
| 1358 | + @Override |
| 1359 | + public boolean isReadOnly(int column) { |
| 1360 | + return false; |
| 1361 | + } |
| 1362 | + |
| 1363 | + @Override |
| 1364 | + public boolean isWritable(int column) { |
| 1365 | + return false; |
| 1366 | + } |
| 1367 | + |
| 1368 | + @Override |
| 1369 | + public boolean isDefinitelyWritable(int column) { |
| 1370 | + return false; |
| 1371 | + } |
| 1372 | + |
| 1373 | + @Override |
| 1374 | + public String getColumnClassName(int column) { |
| 1375 | + return null; |
| 1376 | + } |
| 1377 | + |
| 1378 | + @Override |
| 1379 | + public <T> T unwrap(Class<T> iface) { |
| 1380 | + return null; |
| 1381 | + } |
| 1382 | + |
| 1383 | + @Override |
| 1384 | + public boolean isWrapperFor(Class<?> iface) { |
| 1385 | + return false; |
| 1386 | + } |
| 1387 | + } |
1312 | 1388 | }
|
0 commit comments