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.