You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by mi...@apache.org on 2011/08/01 21:22:36 UTC

svn commit: r1152900 - in /openjpa/branches/1.2.x: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/ openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/ openjpa-project/src/doc/manual/

Author: mikedd
Date: Mon Aug  1 19:22:35 2011
New Revision: 1152900

URL: http://svn.apache.org/viewvc?rev=1152900&view=rev
Log:
Revert "OPENJPA-1691: Oracle XMLType column failed to insert/update when xml contains more than 4000 characters - applied Jeremy's 1.2.x patch and in addition I added documentation."

This reverts commit b5e924da96e088785eb20b23eeaf710f92c7f33a.

Modified:
    openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
    openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
    openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/RowImpl.java
    openjpa/branches/1.2.x/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/localizer.properties
    openjpa/branches/1.2.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/LoggingConnectionDecorator.java
    openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml

Modified: openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java?rev=1152900&r1=1152899&r2=1152900&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java (original)
+++ openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java Mon Aug  1 19:22:35 2011
@@ -4568,16 +4568,4 @@ public class DBDictionary
     public void deleteStream(JDBCStore store, Select sel) throws SQLException {
         // Do nothing
     }
-    
-    /**
-     * Return parameter marker for INSERT and UPDATE statements.
-     * Usually it is <code>?</code> but some database-specific types might require customization.
-     * 
-     * @param col column definition
-     * @param val value to be inserted/updated
-     * @return parameter marker
-    */
-    public String getMarkerForInsertUpdate(Column col, Object val) {
-       return "?";
-    }
 }

Modified: openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java?rev=1152900&r1=1152899&r2=1152900&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java (original)
+++ openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java Mon Aug  1 19:22:35 2011
@@ -18,8 +18,6 @@
  */
 package org.apache.openjpa.jdbc.sql;
 
-import java.io.Reader;
-import java.io.StringReader;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.security.AccessController;
@@ -48,10 +46,8 @@ import org.apache.openjpa.jdbc.schema.In
 import org.apache.openjpa.jdbc.schema.PrimaryKey;
 import org.apache.openjpa.jdbc.schema.Sequence;
 import org.apache.openjpa.jdbc.schema.Table;
-import org.apache.openjpa.lib.jdbc.DelegatingConnection;
 import org.apache.openjpa.lib.jdbc.DelegatingDatabaseMetaData;
 import org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement;
-import org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator;
 import org.apache.openjpa.lib.util.J2DoPrivHelper;
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.util.StoreException;
@@ -75,14 +71,6 @@ public class OracleDictionary
     private static Blob EMPTY_BLOB = null;
     private static Clob EMPTY_CLOB = null;
 
-    private Method _setClob = null;    
-    private Boolean _isJDBC4 = null;
-
-    /**
-     * Type constructor for XML column, used in INSERT and UPDATE statements.
-    */
-    public String xmlTypeMarker = "XMLType(?)";
-    
     private static final Localizer _loc = Localizer.forPackage
         (OracleDictionary.class);
 
@@ -111,14 +99,6 @@ public class OracleDictionary
      */
     public boolean useSetFormOfUseForUnicode = true;
 
-    /**
-     * If true, OpenJPA will attempt to use a Reader-based JDBC 4.0 method to 
-     * set Clob or XML data.  This allows XMLType and Clob values larger than 4000 bytes
-     * to be used if OpenJPA is used with a Java 6.0 JRE along with a JDBC 4.0 Oracle
-     * driver (ojdbc6.jar).
-     */
-    public boolean supportsSetClob = false;
-    
     // some oracle drivers have problems with select for update; warn the
     // first time locking is attempted
     private boolean _checkedUpdateBug = false;
@@ -232,11 +212,7 @@ public class OracleDictionary
                 }
                     // select of an xml column requires ".getStringVal()"
                     // suffix. eg. t0.xmlcol.getStringVal()
-                if (!supportsSetClob) {
                     getStringVal = ".getStringVal()";
-                } else {
-                	getStringVal = ".getClobVal()";
-                }
             } else if (metadataClassName.startsWith("com.ddtek.")
                 || url.indexOf("jdbc:datadirect:oracle:") != -1
                 || "Oracle".equals(driverName)) {
@@ -549,75 +525,6 @@ public class OracleDictionary
             super.setNull(stmnt, idx, colType, col);
     }
 
-    @Override
-    public void setClobString(PreparedStatement stmnt, int idx, String val,
-        Column col)
-        throws SQLException {
-        if (!useSetStringForClobs && supportsSetClob) {
-            // If the JRE and underlying driver support JDBC, reflectively call
-            // the JDBC setClob method which supports streams larger than 4000 bytes.
-            if (val != null && supportsJDBC4(stmnt.getConnection())) {
-                if (setClob(stmnt, idx, val)) {
-                    return;
-                }
-            }
-        }
-        super.setClobString(stmnt, idx, val, col);
-    }
-
-    /**
-     * This method reflectively calls the JDBC 4 setClob method which takes a
-     * reader as a parameter.  This allows support for clobs and XML values larger than 4000 bytes.
-     * @param stmnt
-     * @param idx
-     * @param val
-     * @return
-     */
-    private boolean setClob(PreparedStatement stmnt, int idx, String val) {
-        if (_setClob == null) {
-            try {
-                _setClob = PreparedStatement.class.getMethod(
-                           "setClob", int.class, Reader.class, long.class);
-                if (_setClob == null) {
-                    return false;
-                }
-            } catch (Throwable t) {
-                log.warn(_loc.get("oracle-set-clob-unsupported"), t);
-                return false;
-            }
-        }
-        try {
-            PreparedStatement inner = stmnt;
-            PreparedStatement outer = stmnt;
-            if (stmnt instanceof DelegatingPreparedStatement) {
-                inner = (PreparedStatement) ((DelegatingPreparedStatement)stmnt).getInnermostDelegate();
-                outer = (PreparedStatement) ((DelegatingPreparedStatement)stmnt).getDelegate();
-            }
-            _setClob.invoke(inner, new Object[] { idx, new StringReader(val), (long)val.length() } );
-            // Direct invocation of setClob on the Oracle driver bypasses OpenJPA's built-in
-            // parameter logging via decorators.  Log the parameter directly.
-            LoggingConnectionDecorator.logStatementParameter(outer, idx, "Clob", val);
-        } catch (Throwable t) {         
-            log.warn(_loc.get("oracle-set-clob-failed"), t);
-            return false;
-        }
-        return true;
-    }
-
-
-    /**
-     * Oracle requires special handling of XML column.
-     * Unless the value length is less or equal to 4000 bytes,
-     * the parameter marker must be decorated with type constructor.
-    */
-    @Override
-    public String getMarkerForInsertUpdate(Column col, Object val) {
-       if (col.isXML() && val != RowImpl.NULL) {
-          return xmlTypeMarker;
-       }
-       return super.getMarkerForInsertUpdate(col, val);
-    }
-
     public String getClobString(ResultSet rs, int column)
         throws SQLException {
         if (_driverBehavior != BEHAVE_ORACLE)
@@ -1218,37 +1125,4 @@ public class OracleDictionary
         }
         return updateSuccessCnt;
     }
-    
-    /**
-     * Attempts to reflectively call a local JDBC4 method to determine whether 
-     * JDBC 4.0 is supported in the runtime environment.  This requires JDK 1.6,
-     * DBCP 1.4, and an Oracle JDK 1.6/JDBC 4.0 driver (ojdbc6.jar).
-    */
-    protected boolean supportsJDBC4(Connection conn) {
-        if (_isJDBC4 != null) {
-            return _isJDBC4;
-        }
-        if (_driverBehavior != BEHAVE_ORACLE) {
-            _isJDBC4 = false;
-            return _isJDBC4;
-        }
-        try {
-            Connection inner = conn;
-            if (conn instanceof DelegatingConnection) {
-                inner = ((DelegatingConnection)conn).getInnermostDelegate();
-            }
-            Method getClientInfo = Connection.class.getMethod(
-                "getClientInfo", new Class[0]);
-            getClientInfo.invoke(inner, new Object[0]);
-            _isJDBC4 = true;
-        } catch (Throwable t) {
-            if (t instanceof SQLException) {
-                // OK, we are on JDBC 4.
-               _isJDBC4 = true;
-            } else {
-                _isJDBC4 = false;
-            }
-        }
-        return _isJDBC4;
-     }
 }

Modified: openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/RowImpl.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/RowImpl.java?rev=1152900&r1=1152899&r2=1152900&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/RowImpl.java (original)
+++ openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/RowImpl.java Mon Aug  1 19:22:35 2011
@@ -754,10 +754,8 @@ public class RowImpl
             buf.append(_cols[i]);
             if (_types[i] == RAW)
                 buf.append(" = ").append(_vals[i]);
-            else {
-                buf.append(" = ");
-                buf.append(dict.getMarkerForInsertUpdate(_cols[i], _vals[i]));
-            }
+            else
+                buf.append(" = ?");
             hasVal = true;
         }
 
@@ -787,7 +785,7 @@ public class RowImpl
             if (_types[i] == RAW)
                 vals.append(_vals[i]);
             else
-                vals.append(dict.getMarkerForInsertUpdate(_cols[i], _vals[i]));
+                vals.append("?");
             hasVal = true;
         }
 

Modified: openjpa/branches/1.2.x/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/localizer.properties?rev=1152900&r1=1152899&r2=1152900&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/localizer.properties (original)
+++ openjpa/branches/1.2.x/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/localizer.properties Mon Aug  1 19:22:35 2011
@@ -190,9 +190,4 @@ sequencesql-override: Going to override 
     the property.  This will allow openJPA to detect a difference between the DB2 default \
     string and the string set in the property and will further allow openJPA to use the \
     string defined by the property rather than the default string for DB2.
-oracle-set-clob-unsupported: The JRE or JDBC level in use does not support the function \
-    necessary to support storing large Clob or XML values.  An alternate method will be used \
-    to store the data, but this may result in failure if the data is larger than 4000 bytes.
-oracle-set-clob-failed: Invocation of methods to support storing large Clob or XML values \
-    resulted in an error.  An alternate method will be used to store the data, but this may \
-    result in failure if the data is larger than 4000 bytes.
+

Modified: openjpa/branches/1.2.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/LoggingConnectionDecorator.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/LoggingConnectionDecorator.java?rev=1152900&r1=1152899&r2=1152900&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/LoggingConnectionDecorator.java (original)
+++ openjpa/branches/1.2.x/openjpa-lib/src/main/java/org/apache/openjpa/lib/jdbc/LoggingConnectionDecorator.java Mon Aug  1 19:22:35 2011
@@ -241,16 +241,6 @@ public class LoggingConnectionDecorator 
     }
    
 
-    /* Allows direct recording of a statement parameter for logging purposes,
-    * provided the prepared statement implements LoggingPreparedStatement.
-    */
-   public static void logStatementParameter(PreparedStatement stmnt, int index, String type, Object val) {
-       if (stmnt instanceof LoggingConnection.LoggingPreparedStatement) {
-           LoggingConnection.LoggingPreparedStatement lcstmnt = (LoggingConnection.LoggingPreparedStatement) stmnt;
-           lcstmnt.setLogParameter(index, type, val);
-       }
-   }
-    
     /**
      * Interface that allows customization of what to do when
      * {@link SQLWarning}s occur.
@@ -263,7 +253,7 @@ public class LoggingConnectionDecorator 
     /**
      * Logging connection.
      */
-    protected class LoggingConnection extends DelegatingConnection {
+    private class LoggingConnection extends DelegatingConnection {
 
         public LoggingConnection(Connection conn) throws SQLException {
             super(conn);
@@ -831,7 +821,7 @@ public class LoggingConnectionDecorator 
             }
         }
 
-        protected class LoggingPreparedStatement
+        private class LoggingPreparedStatement
             extends DelegatingPreparedStatement {
 
             private final String _sql;

Modified: openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml?rev=1152900&r1=1152899&r2=1152900&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml (original)
+++ openjpa/branches/1.2.x/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml Mon Aug  1 19:22:35 2011
@@ -3373,35 +3373,6 @@ on database configuration, e.g. encoding
 CLOB to persist with the embedded method. Defaults to 4000 characters.
                     </para>
                 </listitem>
-                <listitem id="OracleDictionary.SupportsSetClob">
-                    <para>
-<literal>SupportsSetClob</literal>: If true, OpenJPA will attempt to use a
-Reader-based JDBC 4.0 method to set Clob or XML data.  This allows XMLType
-and Clob values larger than 4000 bytes to be used if OpenJPA is used
-with a Java 6.0 JRE along with a JDBC 4.0 Oracle driver (e.g. ojdbc6.jar).
-It is expected that this property will be used in conjunction with
-<literal>XMLValueHandler</literal>, see <xref linkend="ref_guide_xmlmapping"/>.
-That is, it is expected that the XML field in question will be annotated with
-the <literal>XMLValueHandler</literal> annotation.  This allows a user to
-indicate that OpenJPA should use JAXB class metadata to perform the to/from 
-database value retrieval and storage.  In addition, using this strategy 
-indicates there is an XMLType used to store the value in the database.  However,
-it is possible for a user to use the <literal>SupportsSetClob</literal> and
-managing their own XML string, mapped to a string field.  In this case,
-additional actions need to be taken.  First, the XML field will need to be
-annotated with the <literal>Lob</literal> annotation.  Second, the
-<literal>MaxEmbeddedClobSize</literal> dictionary property will need to be
-set to -1.  Finally, a user may need to set the
-<literal>openjpa.jdbc.SchemaFactory</literal> property to <literal>native</literal>,
-see <xref linkend="ref_guide_schema_info_factory"/>.
-This property is necessary to allow OpenJPA to detect the XML column type.  While 
-a user may have an XMLType specified in the column definition, OpenJPA cannot count 
-on this data to detect whether the column is really an XML column in the 
-database.  (The table could have been created manually with separate DDL instead 
-of using OpenJPA's mapping tool).  By enabling OpenJPA's native schema factory 
-the database column type can be detected as XMLType.
-                    </para>
-                </listitem>
                 <listitem id="OracleDictionary.UseSetFormOfUseForUnicode">
                     <para>
 <literal>UseSetFormOfUseForUnicode</literal>: Prior to Oracle 10i, statements