You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by jr...@apache.org on 2008/10/23 06:43:36 UTC
svn commit: r707270 - in /openjpa/trunk:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/
openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/
openjpa-project/src/doc/manual/
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