Author: jrbauer Date: Wed Oct 22 21:43:35 2008 New Revision: 707270 URL: http://svn.apache.org/viewvc?rev=707270&view=rev Log: OPENJPA-750: Added option to Sybase dictionary to ignore truncation warnings, added doc for new dictionary option, and code to log any SQLWarnings when update count isn't expected value.
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/BatchingPreparedStatementManagerImpl.java openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedStatementManagerImpl.java openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SybaseDictionary.java openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/BatchingPreparedStatementManagerImpl.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/BatchingPreparedStatementManagerImpl.java?rev=707270&r1=707269&r2=707270&view=diff ============================================================================== --- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/BatchingPreparedStatementManagerImpl.java (original) +++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/BatchingPreparedStatementManagerImpl.java Wed Oct 22 21:43:35 2008 @@ -55,7 +55,6 @@ private List _batchedRows = new ArrayList(); private int _batchLimit; private boolean _disableBatch = false; - private transient Log _log = null; /** * Constructor. Supply connection. @@ -64,7 +63,6 @@ Connection conn, int batchLimit) { super(store, conn); _batchLimit = batchLimit; - _log = store.getConfiguration().getLog(JDBCConfiguration.LOG_JDBC); if (_log.isTraceEnabled()) _log.trace(_loc.get("batch_limit", String.valueOf(_batchLimit))); } @@ -216,6 +214,7 @@ row.flush(ps, _dict, _store); int count = executeUpdate(ps, row.getSQL(_dict), row); if (count != 1) { + logSQLWarnings(ps); Object failed = row.getFailedObject(); if (failed != null) _exceptions.add(new OptimisticException(failed)); @@ -280,6 +279,7 @@ break; case 0: // no row is inserted, treats it as failed // case + logSQLWarnings(ps); if (failed != null) _exceptions.add(new OptimisticException(failed)); else if (row.getAction() == Row.ACTION_INSERT) Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedStatementManagerImpl.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedStatementManagerImpl.java?rev=707270&r1=707269&r2=707270&view=diff ============================================================================== --- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedStatementManagerImpl.java (original) +++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedStatementManagerImpl.java Wed Oct 22 21:43:35 2008 @@ -22,11 +22,13 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.SQLWarning; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.List; +import org.apache.openjpa.jdbc.conf.JDBCConfiguration; import org.apache.openjpa.jdbc.meta.ClassMapping; import org.apache.openjpa.jdbc.schema.Column; import org.apache.openjpa.jdbc.sql.DBDictionary; @@ -34,6 +36,7 @@ import org.apache.openjpa.jdbc.sql.RowImpl; import org.apache.openjpa.jdbc.sql.SQLExceptions; import org.apache.openjpa.kernel.OpenJPAStateManager; +import org.apache.openjpa.lib.log.Log; import org.apache.openjpa.lib.util.Localizer; import org.apache.openjpa.util.ApplicationIds; import org.apache.openjpa.util.OpenJPAException; @@ -53,6 +56,7 @@ protected final JDBCStore _store; protected final Connection _conn; protected final DBDictionary _dict; + protected transient Log _log = null; // track exceptions protected final Collection _exceptions = new LinkedList(); @@ -64,6 +68,8 @@ _store = store; _dict = store.getDBDictionary(); _conn = conn; + if (store.getConfiguration() != null) + _log = store.getConfiguration().getLog(JDBCConfiguration.LOG_JDBC); } public Collection getExceptions() { @@ -105,6 +111,7 @@ try { int count = executeUpdate(stmnt, sql, row); if (count != 1) { + logSQLWarnings(stmnt); Object failed = row.getFailedObject(); if (failed != null) _exceptions.add(new OptimisticException(failed)); @@ -233,4 +240,32 @@ else return _conn.prepareStatement(sql); } + + /** + * Provided the JDBC log category is logging warnings, this method will + * log any SQL warnings that result from the execution of a SQL statement. + */ + protected void logSQLWarnings(PreparedStatement stmt) { + if (stmt != null && _log != null && _log.isTraceEnabled()) { + try { + SQLWarning warn = stmt.getWarnings(); + while (warn != null) { + logSQLWarning(warn); + warn = warn.getNextWarning(); + } while (warn != null); + } catch (SQLException e) {} + } + } + + /* + * Log the SQLWarning message. Some drivers report expected conditions + * such as "no rows returned" as a warning. These types of messages can + * clutter up the default log very quickly, so trace level will be used to + * log SQL warnings. + */ + private void logSQLWarning(SQLWarning warn) { + if (warn != null) { + _log.trace(_loc.get("sql-warning", warn.getMessage())); + } + } } Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SybaseDictionary.java URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SybaseDictionary.java?rev=707270&r1=707269&r2=707270&view=diff ============================================================================== --- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SybaseDictionary.java (original) +++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SybaseDictionary.java Wed Oct 22 21:43:35 2008 @@ -75,6 +75,13 @@ */ public String identityColumnName = "UNQ_INDEX"; + /** + * If true, Sybase will ignore numeric truncation on insert or + * update operations. Otherwise, the operation will fail. The default + * value, false is in accordance with SQL92. + */ + public boolean ignoreNumericTruncation = false; + public SybaseDictionary() { platform = "Sybase"; schemaCase = SCHEMA_CASE_PRESERVE; @@ -277,6 +284,18 @@ stmnt.execute(); stmnt.close(); } + + // By default, Sybase will fail to insert or update if a numeric + // truncation occurs as a result of, for example, loss of decimal + // precision. This setting specifies that the operation should not + // fail if a numeric truncation occurs. + if (ignoreNumericTruncation) { + String str = "set arithabort numeric_truncation off"; + PreparedStatement stmnt = prepareStatement(conn, str); + stmnt.execute(); + stmnt.close(); + } + return new SybaseConnection(conn); } Modified: openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties?rev=707270&r1=707269&r2=707270&view=diff ============================================================================== --- openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties (original) +++ openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties Wed Oct 22 21:43:35 2008 @@ -117,3 +117,4 @@ statement {1}. cache-hit: SQL Cache hit with key: {0} in {1} cache-missed: SQL Cache missed with key: {0} in {1} +sql-warning: The statement resulted in SQL warning: {0} Modified: openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml?rev=707270&r1=707269&r2=707270&view=diff ============================================================================== --- openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml (original) +++ openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml Wed Oct 22 21:43:35 2008 @@ -3360,7 +3360,41 @@ </listitem> </itemizedlist> </section> - </section> + <section id="ref_guide_dbsetup_dbsupport_sybase"> + <title> + SybaseDictionary Properties + </title> + <indexterm zone="ref_guide_dbsetup_dbsupport_sybase"> + <primary> + Sybase + </primary> + <seealso> + DBDictionary + </seealso> + </indexterm> + <para> +The <literal>sybase</literal> dictionary understands the following additional +properties: + </para> + <itemizedlist> + <listitem id="OracleDictionary.IgnoreNumericTruncation"> + <para> + <indexterm> + <primary> + Sybase + </primary> + <secondary> + IgnoreNumericTruncation + </secondary> + </indexterm> +<literal>IgnoreNumericTruncation</literal>: If true, Sybase will ignore numeric +truncation on SQL operations. Otherwise, if numeric trunctation is detected, +the operation will fail. + </para> + </listitem> + </itemizedlist> + </section> + </section> <section id="ref_guide_dbsetup_isolation"> <title> Setting the Transaction Isolation