changeset 774:e029af7551b7

Implemented ResultSet methods: <T> T getObject(int columnIndex, Class<T> type) <T> T getObject(String columnLabel, Class<T> type) They used to throw an SQLFeatureNotSupportedException.
author Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
date Wed, 09 Aug 2023 22:13:52 +0200 (20 months ago)
parents 2bd1983f1c11
children cb20730499c7
files ChangeLog release.txt src/main/java/org/monetdb/jdbc/MonetResultSet.java
diffstat 3 files changed, 89 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,12 @@
 # ChangeLog file for monetdb-java
 # This file is updated with Maddlog
 
+* Wed Aug  9 2023 Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
+- Implemented ResultSet methods:
+   <T> T getObject(int columnIndex, Class<T> type)
+   <T> T getObject(String columnLabel, Class<T> type)
+  They used to throw an SQLFeatureNotSupportedException.
+
 * Thu Jul  6 2023 Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
 - Removed deprecated nl.cwi.monetdb.*.* classes and package.
   Those classes were marked deprecated on 12 Nov 2020 from
--- a/release.txt
+++ b/release.txt
@@ -170,7 +170,6 @@ Currently implemented JDBC 4.2 interface
     - getAsciiStream, getUnicodeStream
     - getNClob
     - getRef, getRowId, getSQLXML
-    - getObject(column, Class<T> type)
     - moveToCurrentRow, moveToInsertRow,
     - All methods related to updateable result sets such as:
       updateArray ... updateTimestamp, cancelRowUpdates,
--- a/src/main/java/org/monetdb/jdbc/MonetResultSet.java
+++ b/src/main/java/org/monetdb/jdbc/MonetResultSet.java
@@ -3190,8 +3190,6 @@ public class MonetResultSet
 	 *         null or another error occurs. The getCause() method of
 	 *         the exception may provide a more detailed exception, for
 	 *         example, if a conversion error occurs
-	 * @throws SQLFeatureNotSupportedException the JDBC driver does
-	 *         not support this method
 	 */
 	@Override
 	public <T> T getObject(final int columnIndex, final Class<T> type) throws SQLException {
@@ -3199,7 +3197,89 @@ public class MonetResultSet
 		if (type == null)
 			throw new SQLException("type is null", "M1M05");
 
-		throw newSQLFeatureNotSupportedException("getObject(column, Class<T> type)");
+		final String val;
+		try {
+			val = tlp.values[columnIndex - 1];
+			if (val == null) {
+				lastReadWasNull = true;
+				return null;
+			}
+			lastReadWasNull = false;
+		} catch (IndexOutOfBoundsException e) {
+			throw newSQLInvalidColumnIndexException(columnIndex);
+		}
+
+		if (type == String.class) {
+			return type.cast(val);
+		}
+		if (type == Integer.class) {
+			return type.cast(Integer.valueOf(getInt(columnIndex)));
+		}
+		if (type == Long.class) {
+			return type.cast(Long.valueOf(getLong(columnIndex)));
+		}
+		if (type == Short.class) {
+			return type.cast(Short.valueOf(getShort(columnIndex)));
+		}
+		if (type == Double.class) {
+			return type.cast(Double.valueOf(getDouble(columnIndex)));
+		}
+		if (type == Float.class) {
+			return type.cast(Float.valueOf(getFloat(columnIndex)));
+		}
+		if (type == BigDecimal.class) {
+			return type.cast(getBigDecimal(columnIndex));
+		}
+		if (type == Boolean.class) {
+			return type.cast(Boolean.valueOf(getBoolean(columnIndex)));
+		}
+		if (type == byte[].class) {
+			return type.cast(getBytes(columnIndex));
+		}
+		if (type == Blob.class || type == MonetBlob.class) {
+			return type.cast(getBlob(columnIndex));
+		}
+		if (type == Clob.class || type == MonetClob.class) {
+			return type.cast(getClob(columnIndex));
+		}
+		if (type == URL.class) {
+			return type.cast(getURL(columnIndex));
+		}
+		if (type == Date.class) {
+			return type.cast(getDate(columnIndex, null));
+		}
+		if (type == Time.class) {
+			return type.cast(getTime(columnIndex, null));
+		}
+		if (type == Timestamp.class) {
+			return type.cast(getTimestamp(columnIndex, null));
+		}
+		if (type == java.util.Date.class) {
+		        final Timestamp timestamp = getTimestamp(columnIndex, null);
+		        return type.cast(new java.util.Date(timestamp.getTime()));
+		}
+		if (type == Calendar.class) {
+			final Calendar cal = Calendar.getInstance();
+			getJavaDate(cal, columnIndex, Types.TIMESTAMP);
+			return type.cast(cal);
+		}
+		if (type == java.util.UUID.class) {
+			try {
+				return type.cast(java.util.UUID.fromString(val));
+			} catch (IllegalArgumentException exc) {
+				throw new SQLException("conversion to java.util.UUID object failed: " + exc.getMessage(), "M1M05");
+			}
+		}
+		if (type == java.net.InetAddress.class) {
+			final int slash = val.indexOf('/');
+			try {
+				return type.cast(java.net.InetAddress.getByName(slash < 0 ? val : val.substring(0, slash)));
+			} catch (java.net.UnknownHostException exc) {
+				throw new SQLException("conversion to java.net.InetAddress object failed: " + exc.getMessage(), "M1M05");
+			}
+		}
+
+		throw new SQLException("conversion to '" + type.getName() + "' is not supported", "M1M05");
 	}
 
 	/**
@@ -3219,8 +3299,6 @@ public class MonetResultSet
 	 *         null or another error occurs. The getCause() method of
 	 *         the exception may provide a more detailed exception, for
 	 *         example, if a conversion error occurs
-	 * @throws SQLFeatureNotSupportedException the JDBC driver does
-	 *         not support this method
 	 */
 	@Override
 	public <T> T getObject(final String columnLabel, final Class<T> type) throws SQLException {