[
https://issues.apache.org/jira/browse/IBATIS-537?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12633718#action_12633718
]
Amol Jadhav commented on IBATIS-537:
------------------------------------
Hi Kai,
Not sure how to attach a patch to the trunk...
Will ...try to do it.
Regards,
Amol
> 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.