Author: kai
Date: Sun Jun 7 10:48:55 2009
New Revision: 782361
URL: http://svn.apache.org/viewvc?rev=782361&view=rev
Log:
IBATIS-384 (SQLExecutor.getFirstResultSet goes into infinite loop)
- implemented the suggested solution: if moveToNextResultsSafely returns false,
and the driver does not support multiple result sets we return false even if
the update count is not -1
Modified:
ibatis/trunk/java/ibatis-2/ibatis-2-core/src/com/ibatis/sqlmap/engine/execution/DefaultSqlExecutor.java
Modified:
ibatis/trunk/java/ibatis-2/ibatis-2-core/src/com/ibatis/sqlmap/engine/execution/DefaultSqlExecutor.java
URL:
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-2/ibatis-2-core/src/com/ibatis/sqlmap/engine/execution/DefaultSqlExecutor.java?rev=782361&r1=782360&r2=782361&view=diff
==============================================================================
---
ibatis/trunk/java/ibatis-2/ibatis-2-core/src/com/ibatis/sqlmap/engine/execution/DefaultSqlExecutor.java
(original)
+++
ibatis/trunk/java/ibatis-2/ibatis-2-core/src/com/ibatis/sqlmap/engine/execution/DefaultSqlExecutor.java
Sun Jun 7 10:48:55 2009
@@ -15,22 +15,29 @@
*/
package com.ibatis.sqlmap.engine.execution;
-import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMapping;
+import java.sql.BatchUpdateException;
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl;
+import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;
import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMap;
+import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMapping;
import com.ibatis.sqlmap.engine.mapping.result.ResultMap;
import com.ibatis.sqlmap.engine.mapping.result.ResultObjectFactoryUtil;
+import com.ibatis.sqlmap.engine.mapping.statement.DefaultRowHandler;
import com.ibatis.sqlmap.engine.mapping.statement.MappedStatement;
import com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback;
import com.ibatis.sqlmap.engine.scope.ErrorContext;
-import com.ibatis.sqlmap.engine.scope.StatementScope;
import com.ibatis.sqlmap.engine.scope.SessionScope;
-import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl;
-import com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate;
-import com.ibatis.sqlmap.engine.mapping.statement.DefaultRowHandler;
-
-import java.sql.*;
-import java.util.ArrayList;
-import java.util.List;
+import com.ibatis.sqlmap.engine.scope.StatementScope;
/**
* Class responsible for executing the SQL
@@ -337,17 +344,34 @@
private boolean moveToNextResultsIfPresent(StatementScope scope, Statement
stmt) throws SQLException {
boolean moreResults;
// This is the messed up JDBC approach for determining if there are more
results
- moreResults = !(((moveToNextResultsSafely(scope, stmt) == false) &&
(stmt.getUpdateCount() == -1)));
+ boolean movedToNextResultsSafely = moveToNextResultsSafely(scope, stmt);
+ int updateCount = stmt.getUpdateCount();
+
+ moreResults = !(!movedToNextResultsSafely && (updateCount == -1));
+
+ //ibatis-384: workaround for mysql not returning -1 for
stmt.getUpdateCount()
+ if (moreResults == true){
+ moreResults = !(!movedToNextResultsSafely &&
!isMultipleResultSetSupportPresent(scope, stmt));
+ }
+
return moreResults;
}
private boolean moveToNextResultsSafely(StatementScope scope, Statement
stmt) throws SQLException {
- if (forceMultipleResultSetSupport(scope) ||
stmt.getConnection().getMetaData().supportsMultipleResultSets()) {
+ if (isMultipleResultSetSupportPresent(scope, stmt)) {
return stmt.getMoreResults();
}
return false;
}
+ /**
+ * checks whether multiple result set support is present - either by direct
support of the database driver or by forcing it
+ */
+ private boolean isMultipleResultSetSupportPresent(StatementScope scope,
+ Statement stmt) throws SQLException {
+ return forceMultipleResultSetSupport(scope) ||
stmt.getConnection().getMetaData().supportsMultipleResultSets();
+ }
+
private boolean forceMultipleResultSetSupport(StatementScope scope) {
return
((SqlMapClientImpl)scope.getSession().getSqlMapClient()).getDelegate().isForceMultipleResultSetSupport();
}