You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by wi...@apache.org on 2007/06/16 01:44:48 UTC

svn commit: r547831 - in /openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql: DB2Dictionary.java DBDictionary.java OracleDictionary.java SQLServerDictionary.java SelectImpl.java

Author: wisneskid
Date: Fri Jun 15 16:44:47 2007
New Revision: 547831

URL: http://svn.apache.org/viewvc?view=rev&rev=547831
Log:
OPENJPA-240 Feature:Persistent field mapping support for XML column type.

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLServerDictionary.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java?view=diff&rev=547831&r1=547830&r2=547831
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java Fri Jun 15 16:44:47 2007
@@ -207,6 +207,8 @@
 	    		supportsLockingWithInnerJoin = true;
 	    		supportsLockingWithOuterJoin = true;
 	    		forUpdateClause = "WITH RR USE AND KEEP UPDATE LOCKS";
+	    		if (maj >=9)
+	    		    supportsXMLColumn = true;
 	    	}
 
             if (metaData.getDatabaseProductVersion().indexOf("DSN") != -1) {

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java?view=diff&rev=547831&r1=547830&r2=547831
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java Fri Jun 15 16:44:47 2007
@@ -212,6 +212,7 @@
     public boolean requiresCastForMathFunctions = false;
     public boolean requiresCastForComparisons = false;
     public boolean supportsModOperator = false;
+    public boolean supportsXMLColumn = false;
 
     // functions
     public String castFunction = "CAST({0} AS {1})";
@@ -273,6 +274,8 @@
     public String tinyintTypeName = "TINYINT";
     public String varbinaryTypeName = "VARBINARY";
     public String varcharTypeName = "VARCHAR";
+    public String xmlTypeName = "XML";
+    public String getStringVal = "";
 
     // schema metadata
     public boolean useSchemaName = true;

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java?view=diff&rev=547831&r1=547830&r2=547831
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java Fri Jun 15 16:44:47 2007
@@ -130,6 +130,8 @@
             "CTXSYS", "MDSYS", "SYS", "SYSTEM", "WKSYS", "WMSYS", "XDB",
         }));
 
+        supportsXMLColumn = true;
+        xmlTypeName = "XMLType";
         bigintTypeName = "NUMBER{0}";
         bitTypeName = "NUMBER{0}";
         decimalTypeName = "NUMBER{0}";
@@ -182,15 +184,23 @@
                 driverVendor = VENDOR_ORACLE + meta.getDriverMajorVersion()
                     + meta.getDriverMinorVersion();
 
+                String productVersion = meta.getDatabaseProductVersion()
+                    .split("Release ",0)[1].split("\\.",0)[0];
+                int release = Integer.parseInt(productVersion);
+                
                 // warn sql92
-                if (meta.getDatabaseProductVersion().indexOf("Release 8.") > 0)
-                {
+                if (release == 8) {
                     if (joinSyntax == SYNTAX_SQL92 && log.isWarnEnabled())
                         log.warn(_loc.get("oracle-syntax"));
                     joinSyntax = SYNTAX_DATABASE;
                     dateTypeName = "DATE"; // added oracle 9
                     timestampTypeName = "DATE"; // added oracle 9
+                    supportsXMLColumn = false;
                 }
+                else 
+                    // select of an xml column requires ".getStringVal()"
+                    // suffix. eg. t0.xmlcol.getStringVal()
+                    getStringVal = ".getStringVal()";
             } else if (metadataClassName.startsWith("com.ddtek.")
                 || url.indexOf("jdbc:datadirect:oracle:") != -1
                 || "Oracle".equals(driverName)) {
@@ -499,7 +509,8 @@
         throws SQLException {
         if (colType == Types.BLOB && _driverBehavior == BEHAVE_ORACLE)
             stmnt.setBlob(idx, getEmptyBlob());
-        else if (colType == Types.CLOB && _driverBehavior == BEHAVE_ORACLE)
+        else if (colType == Types.CLOB && _driverBehavior == BEHAVE_ORACLE
+            && !col.isXML())
             stmnt.setClob(idx, getEmptyClob());
         else if ((colType == Types.STRUCT || colType == Types.OTHER)
             && col != null && col.getTypeName() != null)
@@ -509,7 +520,7 @@
         else if (colType == Types.DATE)
             super.setNull(stmnt, idx, Types.TIMESTAMP, col);
         // the Oracle driver does not support Types.OTHER with setNull
-        else if (colType == Types.OTHER)
+        else if (colType == Types.OTHER || col.isXML())
             super.setNull(stmnt, idx, Types.NULL, col);
         else
             super.setNull(stmnt, idx, colType, col);

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLServerDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLServerDictionary.java?view=diff&rev=547831&r1=547830&r2=547831
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLServerDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLServerDictionary.java Fri Jun 15 16:44:47 2007
@@ -79,6 +79,9 @@
                     driverVendor = VENDOR_OTHER;
             } else
                 driverVendor = VENDOR_OTHER;
+            if (driverName.contains(platform) && Integer.parseInt(driverName
+                .split("Server ",0)[1].split(" ")[0]) >= 2005)
+                supportsXMLColumn = true;
         }
 
         // warn about using cursors

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java?view=diff&rev=547831&r1=547830&r2=547831
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java Fri Jun 15 16:44:47 2007
@@ -189,6 +189,7 @@
         _conf = conf;
         _dict = _conf.getDBDictionaryInstance();
         _joinSyntax = _dict.joinSyntax;
+        _selects._dict = _dict;
     }
 
     /////////////////////////////////
@@ -2661,6 +2662,7 @@
         private List _idents = null;
         private Map _aliases = null;
         private Map _selectAs = null;
+        private DBDictionary _dict = null;
 
         /**
          * Add all aliases from another instance.
@@ -2769,6 +2771,9 @@
                     Object id = (ident && _idents != null) ? _idents.get(i)
                         : _ids.get(i);
                     Object alias = _aliases.get(id);
+                    if (id instanceof Column && ((Column)id).isXML())
+                        alias = alias + _dict.getStringVal;
+                        
                     String as = null;
                     if (inner)
                         as = ((String) alias).replace('.', '_');