From 6baa43c9fa6b2b2944fb1447cb74fa1c5be65474 Mon Sep 17 00:00:00 2001 From: Iwao AVE! Date: Sat, 13 Oct 2018 02:50:32 +0900 Subject: [PATCH 1/4] Add support for OffsetDateTime to be passed as 'type' in ResultSet.getObject() --- .../sqlserver/jdbc/SQLServerResultSet.java | 7 +++++ .../java/microsoft/sql/DateTimeOffset.java | 12 ++++++++ .../jdbc/resultset/ResultSetTest.java | 29 +++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java index 612c44ab3..bf5bb008c 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java @@ -2398,6 +2398,13 @@ public T getObject(int columnIndex, Class type) throws SQLException { returnValue = ldt.toLocalTime(); } } + } else if (type == java.time.OffsetDateTime.class) { + microsoft.sql.DateTimeOffset dateTimeOffset = getDateTimeOffset(columnIndex); + if (dateTimeOffset == null) { + returnValue = null; + } else { + returnValue = dateTimeOffset.getOffsetDateTime(); + } } else if (type == microsoft.sql.DateTimeOffset.class) { returnValue = getDateTimeOffset(columnIndex); } else if (type == UUID.class) { diff --git a/src/main/java/microsoft/sql/DateTimeOffset.java b/src/main/java/microsoft/sql/DateTimeOffset.java index fc5135b43..caeaae6ac 100644 --- a/src/main/java/microsoft/sql/DateTimeOffset.java +++ b/src/main/java/microsoft/sql/DateTimeOffset.java @@ -215,6 +215,18 @@ public java.sql.Timestamp getTimestamp() { return timestamp; } + /** + * Returns OffsetDateTime equivalent to this DateTimeOffset object. + * + * @return OffsetDateTime equivalent to this DateTimeOffset object. + */ + public java.time.OffsetDateTime getOffsetDateTime() { + java.time.ZoneOffset zoneOffset = java.time.ZoneOffset.ofTotalSeconds(60 * minutesOffset); + java.time.LocalDateTime localDaetTime = java.time.LocalDateTime.ofEpochSecond(utcMillis / 1000, nanos, + zoneOffset); + return java.time.OffsetDateTime.of(localDaetTime, zoneOffset); + } + /** * Returns this DateTimeOffset object's offset value. * diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/resultset/ResultSetTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/resultset/ResultSetTest.java index 574a928df..d7c78e17b 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/resultset/ResultSetTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/resultset/ResultSetTest.java @@ -24,6 +24,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; import java.util.TimeZone; import java.util.UUID; @@ -291,6 +292,34 @@ public void testGetObjectAsLocalDateTime() throws SQLException { } } + /** + * Tests getObject(n, java.time.OffsetDateTime.class). + * + * @throws SQLException + */ + @Test + public void testGetObjectAsOffsetDateTime() throws SQLException { + try (Connection con = DriverManager.getConnection(connectionString); Statement stmt = con.createStatement()) { + final String testValue = "2018-01-02T11:22:33.123456700+12:34"; + + stmt.executeUpdate("CREATE TABLE " + AbstractSQLGenerator.escapeIdentifier(tableName) + + " (id INT PRIMARY KEY, dto DATETIMEOFFSET)"); + stmt.executeUpdate("INSERT INTO " + AbstractSQLGenerator.escapeIdentifier(tableName) + + " (id, dto) VALUES (1, '" + testValue + "')"); + + try (ResultSet rs = stmt.executeQuery( + "SELECT dto FROM " + AbstractSQLGenerator.escapeIdentifier(tableName) + " WHERE id=1")) { + rs.next(); + + OffsetDateTime expected = OffsetDateTime.parse(testValue); + OffsetDateTime actual = rs.getObject(1, OffsetDateTime.class); + assertEquals(expected, actual); + } finally { + TestUtils.dropTableIfExists(AbstractSQLGenerator.escapeIdentifier(tableName), stmt); + } + } + } + /** * Tests ResultSet#isWrapperFor and ResultSet#unwrap. * From 03ba0c495cfe129328f7bbba672e88275f2d1540 Mon Sep 17 00:00:00 2001 From: Iwao AVE! Date: Tue, 11 Dec 2018 11:27:30 +0900 Subject: [PATCH 2/4] Typo fix. --- src/main/java/microsoft/sql/DateTimeOffset.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/microsoft/sql/DateTimeOffset.java b/src/main/java/microsoft/sql/DateTimeOffset.java index caeaae6ac..170ddce42 100644 --- a/src/main/java/microsoft/sql/DateTimeOffset.java +++ b/src/main/java/microsoft/sql/DateTimeOffset.java @@ -222,9 +222,9 @@ public java.sql.Timestamp getTimestamp() { */ public java.time.OffsetDateTime getOffsetDateTime() { java.time.ZoneOffset zoneOffset = java.time.ZoneOffset.ofTotalSeconds(60 * minutesOffset); - java.time.LocalDateTime localDaetTime = java.time.LocalDateTime.ofEpochSecond(utcMillis / 1000, nanos, + java.time.LocalDateTime localDateTime = java.time.LocalDateTime.ofEpochSecond(utcMillis / 1000, nanos, zoneOffset); - return java.time.OffsetDateTime.of(localDaetTime, zoneOffset); + return java.time.OffsetDateTime.of(localDateTime, zoneOffset); } /** From 077e7828b504e7d72ea730211fa908d8bd9789cf Mon Sep 17 00:00:00 2001 From: Iwao AVE! Date: Tue, 11 Dec 2018 20:22:16 +0900 Subject: [PATCH 3/4] Added OffsetTime support. Allow retrieving OffsetTime out of DATETIMEOFFSET column. --- .../com/microsoft/sqlserver/jdbc/SQLServerResultSet.java | 7 +++++++ .../microsoft/sqlserver/jdbc/resultset/ResultSetTest.java | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java index bf5bb008c..bf4f0c1bd 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResultSet.java @@ -2405,6 +2405,13 @@ public T getObject(int columnIndex, Class type) throws SQLException { } else { returnValue = dateTimeOffset.getOffsetDateTime(); } + } else if (type == java.time.OffsetTime.class) { + microsoft.sql.DateTimeOffset dateTimeOffset = getDateTimeOffset(columnIndex); + if (dateTimeOffset == null) { + returnValue = null; + } else { + returnValue = dateTimeOffset.getOffsetDateTime().toOffsetTime(); + } } else if (type == microsoft.sql.DateTimeOffset.class) { returnValue = getDateTimeOffset(columnIndex); } else if (type == UUID.class) { diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/resultset/ResultSetTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/resultset/ResultSetTest.java index d7c78e17b..50aedaa02 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/resultset/ResultSetTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/resultset/ResultSetTest.java @@ -293,7 +293,7 @@ public void testGetObjectAsLocalDateTime() throws SQLException { } /** - * Tests getObject(n, java.time.OffsetDateTime.class). + * Tests getObject(n, java.time.OffsetDateTime.class) and getObject(n, java.time.OffsetTime.class). * * @throws SQLException */ @@ -314,6 +314,10 @@ public void testGetObjectAsOffsetDateTime() throws SQLException { OffsetDateTime expected = OffsetDateTime.parse(testValue); OffsetDateTime actual = rs.getObject(1, OffsetDateTime.class); assertEquals(expected, actual); + + OffsetTime expectedTime = OffsetTime.parse(testValue.split("T")[1]); + OffsetTime actualTime = rs.getObject(1, OffsetTime.class); + assertEquals(expectedTime, actualTime); } finally { TestUtils.dropTableIfExists(AbstractSQLGenerator.escapeIdentifier(tableName), stmt); } From c28421d686ae3b198c1622a8813b897d35484121 Mon Sep 17 00:00:00 2001 From: Iwao AVE! Date: Tue, 11 Dec 2018 20:28:39 +0900 Subject: [PATCH 4/4] Added assertions for more coverage. --- .../sqlserver/jdbc/resultset/ResultSetTest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/resultset/ResultSetTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/resultset/ResultSetTest.java index 50aedaa02..a76da0d7c 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/resultset/ResultSetTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/resultset/ResultSetTest.java @@ -25,6 +25,7 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.time.OffsetDateTime; +import java.time.OffsetTime; import java.util.TimeZone; import java.util.UUID; @@ -303,21 +304,23 @@ public void testGetObjectAsOffsetDateTime() throws SQLException { final String testValue = "2018-01-02T11:22:33.123456700+12:34"; stmt.executeUpdate("CREATE TABLE " + AbstractSQLGenerator.escapeIdentifier(tableName) - + " (id INT PRIMARY KEY, dto DATETIMEOFFSET)"); + + " (id INT PRIMARY KEY, dto DATETIMEOFFSET, dto2 DATETIMEOFFSET)"); stmt.executeUpdate("INSERT INTO " + AbstractSQLGenerator.escapeIdentifier(tableName) - + " (id, dto) VALUES (1, '" + testValue + "')"); + + " (id, dto, dto2) VALUES (1, '" + testValue + "', null)"); try (ResultSet rs = stmt.executeQuery( - "SELECT dto FROM " + AbstractSQLGenerator.escapeIdentifier(tableName) + " WHERE id=1")) { + "SELECT dto, dto2 FROM " + AbstractSQLGenerator.escapeIdentifier(tableName) + " WHERE id=1")) { rs.next(); OffsetDateTime expected = OffsetDateTime.parse(testValue); OffsetDateTime actual = rs.getObject(1, OffsetDateTime.class); assertEquals(expected, actual); + assertNull(rs.getObject(2, OffsetDateTime.class)); OffsetTime expectedTime = OffsetTime.parse(testValue.split("T")[1]); OffsetTime actualTime = rs.getObject(1, OffsetTime.class); assertEquals(expectedTime, actualTime); + assertNull(rs.getObject(2, OffsetTime.class)); } finally { TestUtils.dropTableIfExists(AbstractSQLGenerator.escapeIdentifier(tableName), stmt); }