# HG changeset patch # User Martin van Dinther <martin.van.dinther@monetdbsolutions.com> # Date 1501768465 -7200 # Node ID dcf7879d4862e1bba27c07235bc4b468c2c5cfa7 # Parent fd1f55e41bfb9f9fc837e0399bccbce9f6e9afb9 Optimised ResulSet methods getDate(column), getTime(column) and getTimestamp(column) by avoiding creation of a Calendar object for each method call. It now converts the internal string value directly into a Date/Time/Timestamp object. diff --git a/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java b/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java --- a/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java +++ b/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java @@ -103,6 +103,7 @@ public class MonetResultSet extends Mone * * @param statement the statement which created this ResultSet * @param header a header containing the query, resultset type, etc. + * @throws IllegalArgumentException if called with null or invalid value for one of the arguments * @throws SQLException is a protocol error occurs */ MonetResultSet( @@ -147,6 +148,7 @@ public class MonetResultSet extends Mone * @param columns the column names * @param types the column types * @param results the number of rows in the ResultSet + * @throws IllegalArgumentException if called with null or invalid value for one of the arguments * @throws IOException if communicating with monet failed * @throws SQLException is a protocol error occurs */ @@ -155,7 +157,7 @@ public class MonetResultSet extends Mone String[] columns, String[] types, int results - ) throws IllegalArgumentException + ) throws IllegalArgumentException { if (statement == null) { throw new IllegalArgumentException("Statement may not be null!"); @@ -2782,21 +2784,26 @@ public class MonetResultSet extends Mone public java.sql.Date getDate(int columnIndex, Calendar cal) throws SQLException { - // to avoid unnecessary work, check for NULL value and invalid columnIndex first try { - if (tlp.values[columnIndex - 1] == null) { + String val = tlp.values[columnIndex - 1]; + if (val == null) { lastReadWasNull = true; return null; } + lastReadWasNull = false; + if (cal == null) { + // convert string in JDBC date escape format yyyy-[m]m-[d]d directly to a Date object + return java.sql.Date.valueOf(val); + } else { + int ret = getJavaDate(cal, columnIndex, Types.DATE); + return ret == -1 ? null : new java.sql.Date(cal.getTimeInMillis()); + } + } catch (IllegalArgumentException iae) { + throw new SQLException("Could not convert value to a Date. Expected JDBC date escape format yyyy-[m]m-[d]d. " + + iae.getMessage(), "22007"); // 22007 = invalid datetime format } catch (IndexOutOfBoundsException e) { throw newSQLInvalidColumnIndexException(columnIndex); } - - if (cal == null) { - cal = Calendar.getInstance(); - } - int ret = getJavaDate(cal, columnIndex, Types.DATE); - return ret == -1 ? null : new java.sql.Date(cal.getTimeInMillis()); } /** @@ -2870,21 +2877,26 @@ public class MonetResultSet extends Mone public Time getTime(int columnIndex, Calendar cal) throws SQLException { - // to avoid unnecessary work, check for NULL value and invalid columnIndex first try { - if (tlp.values[columnIndex - 1] == null) { + String val = tlp.values[columnIndex - 1]; + if (val == null) { lastReadWasNull = true; return null; } + lastReadWasNull = false; + if (cal == null) { + // convert string in JDBC time escape format hh:mm:ss directly to a Time object + return Time.valueOf(val); + } else { + int ret = getJavaDate(cal, columnIndex, Types.TIME); + return ret == -1 ? null : new Time(cal.getTimeInMillis()); + } + } catch (IllegalArgumentException iae) { + throw new SQLException("Could not convert value to a Time. Expected JDBC time escape format hh:mm:ss. " + + iae.getMessage(), "22007"); // 22007 = invalid datetime format } catch (IndexOutOfBoundsException e) { throw newSQLInvalidColumnIndexException(columnIndex); } - - if (cal == null) { - cal = Calendar.getInstance(); - } - int ret = getJavaDate(cal, columnIndex, Types.TIME); - return ret == -1 ? null : new Time(cal.getTimeInMillis()); } /** @@ -2958,26 +2970,31 @@ public class MonetResultSet extends Mone public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { - // to avoid unnecessary work, check for NULL value and invalid columnIndex first try { - if (tlp.values[columnIndex - 1] == null) { + String val = tlp.values[columnIndex - 1]; + if (val == null) { lastReadWasNull = true; return null; } + lastReadWasNull = false; + if (cal == null) { + // convert string in JDBC timestamp escape format yyyy-[m]m-[d]d hh:mm:ss[.f...] directly to a Timestamp object + return Timestamp.valueOf(val); + } else { + int nanos = getJavaDate(cal, columnIndex, Types.TIMESTAMP); + if (nanos == -1) + return null; + + Timestamp ts = new Timestamp(cal.getTimeInMillis()); + ts.setNanos(nanos); + return ts; + } + } catch (IllegalArgumentException iae) { + throw new SQLException("Could not convert value to a Timestamp. Expected JDBC time escape format yyyy-[m]m-[d]d hh:mm:ss[.f...]. " + + iae.getMessage(), "22007"); // 22007 = invalid datetime format } catch (IndexOutOfBoundsException e) { throw newSQLInvalidColumnIndexException(columnIndex); } - - if (cal == null) { - cal = Calendar.getInstance(); - } - int nanos = getJavaDate(cal, columnIndex, Types.TIMESTAMP); - if (nanos == -1) - return null; - - Timestamp ts = new Timestamp(cal.getTimeInMillis()); - ts.setNanos(nanos); - return ts; } /**