Multiple external RowHandler support
------------------------------------

                 Key: IBATIS-537
                 URL: https://issues.apache.org/jira/browse/IBATIS-537
             Project: iBatis for Java
          Issue Type: Improvement
          Components: SQL Maps
    Affects Versions: 2.3.3
            Reporter: Amol Jadhav
            Priority: Minor


We have MS-SQL  store proc which returns mutiple result sets. The results sets 
are big and it will not be a good idea to put them in ArraList. The current 
iBatis version do not support multiple external RowHandler (external means, 
provided by iBatis user). By defualt iBatis uses DefaultRowHandler to process 
multiple resultsets, the current code which handles multiple resultset is as 
below

Class:  com.ibatis.sqlmap.engine.execution.SqlExecutor 
in method private ResultSet handleMultipleResults(....

    // Multiple ResultSet handling
    if (callback.getRowHandler() instanceof DefaultRowHandler) {
      MappedStatement statement = statementScope.getStatement();
      DefaultRowHandler defaultRowHandler = ((DefaultRowHandler) 
callback.getRowHandler());
      if (statement.hasMultipleResultMaps()) {
        List multipleResults = new ArrayList();
        multipleResults.add(defaultRowHandler.getList());
        ResultMap[] resultMaps = statement.getAdditionalResultMaps();
        int i = 0;
        while (moveToNextResultsSafely(statementScope, ps)) {
          if (i >= resultMaps.length) break;
          ResultMap rm = resultMaps[i];
          statementScope.setResultMap(rm);
          rs = ps.getResultSet();
          DefaultRowHandler rh = new DefaultRowHandler();
          handleResults(statementScope, rs, skipResults, maxResults, new 
RowHandlerCallback(rm, null, rh));
          multipleResults.add(rh.getList());
          i++;
        }
        defaultRowHandler.setList(multipleResults);
        statementScope.setResultMap(statement.getResultMap());
      } else {
        while (moveToNextResultsSafely(statementScope, ps)) ;
      }
    }
    // End additional ResultSet handling


The fix which was put to solve this was as below, please let me know your 
suggestions.

1. A new interface as below 
 
package com.ibatis.sqlmap.client.event;

import com.ibatis.sqlmap.client.event.RowHandler;
public interface MultiRowHandler extends RowHandler{
      public MultiRowHandler getNextRowHandler();
}

 2. Changes to com.ibatis.sqlmap.engine.execution.SqlExecutor 

if (callback.getRowHandler() instanceof MultiRowHandler) {
        MappedStatement statement = statementScope.getStatement();
        MultiRowHandler multipleRowHandler = 
(MultiRowHandler)callback.getRowHandler();
        if (statement.hasMultipleResultMaps()) {
          ResultMap[] resultMaps = statement.getAdditionalResultMaps();
          int i = 0;
          while (moveToNextResultsSafely(statementScope, ps)) {
            if (i >= resultMaps.length) break;
            ResultMap rm = resultMaps[i];
            statementScope.setResultMap(rm);
            rs = ps.getResultSet();
            RowHandler rh = multipleRowHandler.getNextRowHandler();
            RowHandlerCallback hdc = new RowHandlerCallback(rm, null, rh);
            handleResults(statementScope, rs, skipResults, maxResults,hdc );
            multipleRowHandler = (MultiRowHandler)hdc.getRowHandler();
            i++;
          }
          statementScope.setResultMap(statement.getResultMap());
        } else {

          while (moveToNextResultsSafely(statementScope, ps)) ;
        }
      }




-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to