2323import java .sql .Statement ;
2424import java .sql .Time ;
2525import java .sql .Timestamp ;
26+ import java .time .Instant ;
27+ import java .time .LocalDate ;
28+ import java .time .LocalDateTime ;
29+ import java .time .LocalTime ;
30+ import java .time .ZonedDateTime ;
2631import java .util .ArrayList ;
2732import java .util .Calendar ;
2833import java .util .Collection ;
@@ -46,6 +51,8 @@ public class DetachedResultSet implements ResultSet, JdbcV2Wrapper {
4651
4752 private ResultSetMetaData metaData ;
4853
54+ private final Calendar defaultCalendar ;
55+
4956 private Map <String , Object > record ;
5057
5158 private boolean wasNull ;
@@ -58,10 +65,11 @@ public class DetachedResultSet implements ResultSet, JdbcV2Wrapper {
5865
5966 private Map <String , Integer > columnMap ;
6067
61- private DetachedResultSet (List <Map <String , Object >> records , ResultSetMetaData metaData ) throws SQLException {
68+ private DetachedResultSet (List <Map <String , Object >> records , ResultSetMetaData metaData , Calendar defaultCalendar ) throws SQLException {
6269 this .records = records ;
6370 this .iterator = records .listIterator ();
6471 this .metaData = metaData ;
72+ this .defaultCalendar = defaultCalendar ;
6573 this .wasNull = false ;
6674 this .row = ResultSetImpl .BEFORE_FIRST ;
6775 this .lastRow = records .size ();
@@ -73,7 +81,7 @@ private DetachedResultSet(List<Map<String, Object>> records, ResultSetMetaData m
7381 }
7482 }
7583
76- public static DetachedResultSet createFromResultSet (ResultSet resultSet , Collection <Consumer <Map <String , Object >>> mutators ) throws SQLException {
84+ public static DetachedResultSet createFromResultSet (ResultSet resultSet , Calendar defaultCalendar , Collection <Consumer <Map <String , Object >>> mutators ) throws SQLException {
7785 ResultSetMetaData metaData = resultSet .getMetaData ();
7886 List <Map <String , Object >> records = new ArrayList <>();
7987 while (resultSet .next ()) {
@@ -86,7 +94,7 @@ public static DetachedResultSet createFromResultSet(ResultSet resultSet, Collect
8694 }
8795 records .add (record );
8896 }
89- return new DetachedResultSet (records , metaData );
97+ return new DetachedResultSet (records , metaData , defaultCalendar );
9098 }
9199
92100 @ Override
@@ -263,19 +271,19 @@ public byte[] getBytes(String columnLabel) throws SQLException {
263271 @ Override
264272 public Date getDate (String columnLabel ) throws SQLException {
265273 ensureOpen ();
266- return getObject (columnLabel , Date . class );
274+ return getDate (columnLabel , defaultCalendar );
267275 }
268276
269277 @ Override
270278 public Time getTime (String columnLabel ) throws SQLException {
271279 ensureOpen ();
272- return getObject (columnLabel , Time . class );
280+ return getTime (columnLabel , defaultCalendar );
273281 }
274282
275283 @ Override
276284 public Timestamp getTimestamp (String columnLabel ) throws SQLException {
277285 ensureOpen ();
278- return getObject (columnLabel , Timestamp . class );
286+ return getTimestamp (columnLabel , defaultCalendar );
279287 }
280288
281289 @ Override
@@ -783,7 +791,19 @@ public Date getDate(int columnIndex, Calendar cal) throws SQLException {
783791 @ Override
784792 public Date getDate (String columnLabel , Calendar cal ) throws SQLException {
785793 ensureOpen ();
786- return null ;
794+ try {
795+ Date date = getObject (columnLabel , Date .class );
796+ if (date != null ) {
797+ Calendar c = (Calendar ) (cal != null ? cal : defaultCalendar ).clone ();
798+ c .clear ();
799+ LocalDate ld = date .toLocalDate ();
800+ c .set (ld .getYear (), ld .getMonthValue () - 1 , ld .getDayOfMonth (), 0 , 0 , 0 );
801+ date = new Date (c .getTimeInMillis ());
802+ }
803+ return date ;
804+ } catch (Exception e ) {
805+ throw new SQLException (String .format ("Method: getDate(\" %s\" ) encountered an exception." , columnLabel ), e );
806+ }
787807 }
788808
789809 @ Override
@@ -794,7 +814,19 @@ public Time getTime(int columnIndex, Calendar cal) throws SQLException {
794814 @ Override
795815 public Time getTime (String columnLabel , Calendar cal ) throws SQLException {
796816 ensureOpen ();
797- return null ;
817+ try {
818+ Time time = getObject (columnLabel , Time .class );
819+ if (time != null ) {
820+ Calendar c = (Calendar ) (cal != null ? cal : defaultCalendar ).clone ();
821+ c .clear ();
822+ LocalTime ld = time .toLocalTime ();
823+ c .set (1970 , Calendar .JANUARY , 1 , ld .getHour (), ld .getMinute (), ld .getSecond ());
824+ time = new Time (c .getTimeInMillis ());
825+ }
826+ return time ;
827+ } catch (Exception e ) {
828+ throw new SQLException (String .format ("Method: getTime(\" %s\" ) encountered an exception." , columnLabel ), e );
829+ }
798830 }
799831
800832 @ Override
@@ -805,7 +837,22 @@ public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException
805837 @ Override
806838 public Timestamp getTimestamp (String columnLabel , Calendar cal ) throws SQLException {
807839 ensureOpen ();
808- return null ;
840+ try {
841+ Timestamp timestamp = getObject (columnLabel , Timestamp .class );
842+ if (timestamp != null ) {
843+ Calendar c = (Calendar ) (cal != null ? cal : defaultCalendar ).clone ();
844+ c .clear ();
845+ LocalDateTime ldt = timestamp .toLocalDateTime ();
846+ c .set (ldt .getYear (), ldt .getMonthValue () - 1 , ldt .getDayOfMonth (), ldt .getHour (), ldt .getMinute (),
847+ ldt .getSecond ());
848+ timestamp = new Timestamp (c .getTimeInMillis ());
849+ timestamp .setNanos (ldt .getNano ());
850+ return timestamp ;
851+ }
852+ return timestamp ;
853+ } catch (Exception e ) {
854+ throw new SQLException (String .format ("Method: getTimestamp(\" %s\" ) encountered an exception." , columnLabel ), e );
855+ }
809856 }
810857
811858 @ Override
0 commit comments