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();
   }


Reply via email to