This is an automated email from the ASF dual-hosted git repository.

struberg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openjpa.git

commit 59a8586855b23cc38cf0c79c4ab050f9f1de7bfd
Author: Mark Struberg <strub...@apache.org>
AuthorDate: Fri Apr 9 14:26:51 2021 +0200

    OPENJPA-2865 use java.time handling from JDBC driver
---
 .../apache/openjpa/jdbc/sql/OracleDictionary.java  | 86 ++++++++++++++++++----
 1 file changed, 73 insertions(+), 13 deletions(-)

diff --git 
a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java 
b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
index b3d7c17..b352908 100644
--- 
a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
+++ 
b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
@@ -34,6 +34,10 @@ import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Timestamp;
 import java.sql.Types;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.OffsetDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
@@ -94,6 +98,14 @@ public class OracleDictionary
     public String autoAssignSequenceName = null;
 
     /**
+     * Whether this JDBC driver has native java.time support for
+     * LocalDate, LocalDateTime, LocalTime, OffsetTime and OffsetDateTime
+     *
+     *
+     */
+    public boolean nativeJavaTimeSupport = true;
+
+    /**
      * Flag to use OpenJPA 0.3 style naming for auto assign sequence name and
      * trigger name for backwards compatibility.
      */
@@ -218,7 +230,7 @@ public class OracleDictionary
             "EXCLUSIVE", "EXISTS", "FILE", "FLOAT", "FOR", "FROM", "GRANT",
             "GROUP", "HAVING", "IDENTIFIED", "IMMEDIATE", "IN", "INCREMENT",
             "INDEX", "INITIAL", "INSERT", "INTEGER", "INTERSECT", "INTO",
-            "IS", "LEVEL", "LIKE", "LOCK", "LONG", "MAXEXTENTS", "MINUS",
+            "IS", "KEY", "LEVEL", "LIKE", "LOCK", "LONG", "MAXEXTENTS", 
"MINUS",
             "MODE", "NOAUDIT", "NOCOMPRESS", "NOT", "NOWAIT", "NULL", "NUMBER",
             "OF", "OFFLINE", "ON", "ONLINE", "OPTION", "OR", "ORDER", 
"PCTFREE",
             "PRIOR", "PRIVILEGES", "PUBLIC", "REVOKE", "ROW", "ROWS", "SELECT",
@@ -302,6 +314,10 @@ public class OracleDictionary
                     maxEmbeddedBlobSize = -1;
                     maxEmbeddedClobSize = -1;
                 }
+                if (jdbcMajor < 18) {
+                    // no native java.time support for old JDBC drivers.
+                    nativeJavaTimeSupport = false;
+                }
                 String productVersion = meta.getDatabaseProductVersion()
                     .split("Release ",0)[1].split("\\.",0)[0];
                 int release = Integer.parseInt(productVersion);
@@ -648,18 +664,18 @@ public class OracleDictionary
         Column col)
         throws SQLException {
 
-       //We need a place to detect if the user is setting the 
'supportsSetClob' property.
-       //While in previous releases this property had meaning, it is no longer 
useful
-       //given the code added via OPENJPA-1691.  As such, we need to warn 
user's the
-       //property no longer has meaning.  While it would be nice to have a 
better way
-       //to detect if the supportsSetClob property has been set, the best we 
can do
-       //is detect the variable in this code path as this is the path a user's 
code
-       //would go down if they are still executing code which actually made 
use of
-       //the support provided via setting supportsSetClob.
-       if (supportsSetClob && logSupportsSetClobWarning){
-               log.warn(_loc.get("oracle-set-clob-warning"));
-               logSupportsSetClobWarning=false;
-       }
+        //We need a place to detect if the user is setting the 
'supportsSetClob' property.
+        //While in previous releases this property had meaning, it is no 
longer useful
+        //given the code added via OPENJPA-1691.  As such, we need to warn 
user's the
+        //property no longer has meaning.  While it would be nice to have a 
better way
+        //to detect if the supportsSetClob property has been set, the best we 
can do
+        //is detect the variable in this code path as this is the path a 
user's code
+        //would go down if they are still executing code which actually made 
use of
+        //the support provided via setting supportsSetClob.
+        if (supportsSetClob && logSupportsSetClobWarning){
+            log.warn(_loc.get("oracle-set-clob-warning"));
+            logSupportsSetClobWarning=false;
+        }
 
         if (col.isXML()) {
             if (isJDBC4) {
@@ -705,6 +721,46 @@ public class OracleDictionary
     }
 
     @Override
+    public void setLocalDate(PreparedStatement stmnt, int idx, LocalDate val, 
Column col) throws SQLException {
+        stmnt.setObject(idx, val);
+    }
+
+    @Override
+    public LocalDate getLocalDate(ResultSet rs, int column) throws 
SQLException {
+        return rs.getObject(column, LocalDate.class);
+    }
+
+    @Override
+    public void setLocalTime(PreparedStatement stmnt, int idx, LocalTime val, 
Column col) throws SQLException {
+        stmnt.setObject(idx, val);
+    }
+
+    @Override
+    public LocalTime getLocalTime(ResultSet rs, int column) throws 
SQLException {
+        return rs.getObject(column, LocalTime.class);
+    }
+
+    @Override
+    public void setLocalDateTime(PreparedStatement stmnt, int idx, 
LocalDateTime val, Column col) throws SQLException {
+        stmnt.setObject(idx, val);
+    }
+
+    @Override
+    public LocalDateTime getLocalDateTime(ResultSet rs, int column) throws 
SQLException {
+        return rs.getObject(column, LocalDateTime.class);
+    }
+
+    @Override
+    public void setOffsetDateTime(PreparedStatement stmnt, int idx, 
OffsetDateTime val, Column col) throws SQLException {
+        stmnt.setObject(idx, val);
+    }
+
+    @Override
+    public OffsetDateTime getOffsetDateTime(ResultSet rs, int column) throws 
SQLException {
+        return rs.getObject(column, OffsetDateTime.class);
+    }
+
+    @Override
     public String getClobString(ResultSet rs, int column)
         throws SQLException {
         if (_driverBehavior != BEHAVE_ORACLE)
@@ -831,6 +887,10 @@ public class OracleDictionary
      */
     @Override
     public int getPreferredType(int type) {
+        if (nativeJavaTimeSupport) {
+            return type;
+        }
+
         switch (type) {
             case Types.TIME_WITH_TIMEZONE:
                 return Types.TIME;

Reply via email to