Author: cbegin Date: Sat Jun 3 06:29:45 2006 New Revision: 411431 URL: http://svn.apache.org/viewvc?rev=411431&view=rev Log: Applied Sven's cursor support patch from the wiki (file name modsrc_new.zip)
Modified: ibatis/trunk/java/mapper/mapper2/build/version.properties ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMapping.java ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/TypeHandlerFactory.java Modified: ibatis/trunk/java/mapper/mapper2/build/version.properties URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/build/version.properties?rev=411431&r1=411430&r2=411431&view=diff ============================================================================== --- ibatis/trunk/java/mapper/mapper2/build/version.properties (original) +++ ibatis/trunk/java/mapper/mapper2/build/version.properties Sat Jun 3 06:29:45 2006 @@ -1,5 +1,5 @@ #Build version info -#Fri Mar 03 23:28:40 MST 2006 +#Fri Jun 02 23:47:35 MDT 2006 version=2.1.7 -buildDate=2006/03/03 23\:28 -buildNum=602 +buildDate=2006/06/02 23\:47 +buildNum=603 Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java?rev=411431&r1=411430&r2=411431&view=diff ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/SqlMapParser.java Sat Jun 3 06:29:45 2006 @@ -26,8 +26,8 @@ public class SqlMapParser extends BaseParser { - private static final Log log = LogFactory.getLog(SqlMapParser.class); - + private static final Log log = LogFactory.getLog(SqlMapParser.class); + protected final NodeletParser parser = new NodeletParser(); public SqlMapParser(Variables vars) { @@ -246,12 +246,14 @@ String jdbcType = childAttributes.getProperty("jdbcType"); String type = childAttributes.getProperty("typeName"); String javaType = childAttributes.getProperty("javaType"); + String resultMap = childAttributes.getProperty("resultMap"); String nullValue = childAttributes.getProperty("nullValue"); String mode = childAttributes.getProperty("mode"); String callback = childAttributes.getProperty("typeHandler"); callback = vars.typeHandlerFactory.resolveAlias(callback); javaType = vars.typeHandlerFactory.resolveAlias(javaType); + resultMap = applyNamespace( resultMap ); vars.errorCtx.setObjectId(propertyName + " mapping of the " + vars.currentParameterMap.getId() + " parameter map"); @@ -279,6 +281,7 @@ mapping.setPropertyName(propertyName); mapping.setJdbcTypeName(jdbcType); mapping.setTypeName(type); + mapping.setResultMapName( resultMap ); mapping.setNullValue(nullValue); if (mode != null && mode.length() > 0) { mapping.setMode(mode); @@ -305,7 +308,7 @@ vars.currentResultMap.setDiscriminator(vars.discriminator); vars.discriminator = null; - + vars.client.getDelegate().addResultMap(vars.currentResultMap); vars.errorCtx.setMoreInfo(null); Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd?rev=411431&r1=411430&r2=411431&view=diff ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/builder/xml/sql-map-2.dtd Sat Jun 3 06:29:45 2006 @@ -36,6 +36,7 @@ nullValue CDATA #IMPLIED mode (IN | OUT | INOUT) #IMPLIED typeHandler CDATA #IMPLIED +resultMap CDATA #IMPLIED > <!ELEMENT resultMap (result+, discriminator?)> <!ATTLIST resultMap Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java?rev=411431&r1=411430&r2=411431&view=diff ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/execution/SqlExecutor.java Sat Jun 3 06:29:45 2006 @@ -23,6 +23,8 @@ import com.ibatis.sqlmap.engine.scope.ErrorContext; import com.ibatis.sqlmap.engine.scope.RequestScope; import com.ibatis.sqlmap.engine.scope.SessionScope; +import com.ibatis.sqlmap.engine.impl.ExtendedSqlMapClient; +import com.ibatis.sqlmap.engine.mapping.statement.DefaultRowHandler; import java.sql.*; import java.util.ArrayList; @@ -239,7 +241,7 @@ rows = cs.getUpdateCount(); errorContext.setMoreInfo("Check the output parameters (retrieval of output parameters failed)."); - retrieveOutputParameters(cs, mappings, parameters); + retrieveOutputParameters(request, cs, mappings, parameters, null); } finally { closeStatement(cs); } @@ -298,7 +300,7 @@ while (cs.getMoreResults()); errorContext.setMoreInfo("Check the output parameters (retrieval of output parameters failed)."); - retrieveOutputParameters(cs, mappings, parameters); + retrieveOutputParameters( request, cs, mappings, parameters, callback); } finally { try { @@ -347,12 +349,30 @@ // Private Methods // - private void retrieveOutputParameters(CallableStatement cs, ParameterMapping[] mappings, Object[] parameters) throws SQLException { + private void retrieveOutputParameters(RequestScope request, CallableStatement cs, ParameterMapping[] mappings, Object[] parameters, RowHandlerCallback callback) throws SQLException { for (int i = 0; i < mappings.length; i++) { BasicParameterMapping mapping = ((BasicParameterMapping) mappings[i]); if (mapping.isOutputAllowed()) { - Object o = mapping.getTypeHandler().getResult(cs, i + 1); - parameters[i] = o; + if ( "java.sql.ResultSet".equalsIgnoreCase(mapping.getJavaTypeName()) ) { + ResultSet rs = (ResultSet) cs.getObject( i + 1 ); + ResultMap resultMap; + if ( mapping.getResultMapName() == null ) { + resultMap = request.getResultMap(); + handleResults(request, resultMap, rs, callback); + } + else { + ExtendedSqlMapClient client = (ExtendedSqlMapClient)request.getSession().getSqlMapClient(); + resultMap = client.getDelegate().getResultMap( mapping.getResultMapName() ); + DefaultRowHandler rowHandler = new DefaultRowHandler(); + RowHandlerCallback handlerCallback = new RowHandlerCallback(resultMap, null, rowHandler); + handleResults(request, resultMap, rs, handlerCallback); + parameters[i] = rowHandler.getList(); + } + rs.close(); + } + else { + parameters[i] = mapping.getTypeHandler().getResult(cs, i + 1); + } } } } @@ -367,6 +387,26 @@ cs.registerOutParameter(i + 1, mapping.getJdbcType()); } } + } + } + + private void handleResults(RequestScope request, ResultMap resultMap, ResultSet rs, RowHandlerCallback callback) throws SQLException { + ResultMap orig = request.getResultMap(); + try { + request.setResultSet(rs); + if (resultMap != null) { + request.setResultMap( resultMap ); + + + // Get Results + while (rs.next()) { + Object[] columnValues = resultMap.resolveSubMap(request, rs).getResults(request, rs); + callback.handleResultObject(request, columnValues, rs); + } + } + } finally { + request.setResultSet(null); + request.setResultMap(orig); } } Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMapping.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMapping.java?rev=411431&r1=411430&r2=411431&view=diff ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMapping.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/parameter/BasicParameterMapping.java Sat Jun 3 06:29:45 2006 @@ -35,6 +35,7 @@ private boolean inputAllowed; private boolean outputAllowed; private Class javaType; + private String resultMapName; private String errorString; @@ -134,7 +135,7 @@ /** * user-defined or REF types - * + * * @return typeName */ public String getTypeName() { @@ -147,6 +148,14 @@ */ public void setTypeName(String typeName) { this.typeName = typeName; + } + + public String getResultMapName() { + return resultMapName; + } + + public void setResultMapName(String resultMapName) { + this.resultMapName = resultMapName; } } Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/TypeHandlerFactory.java URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/TypeHandlerFactory.java?rev=411431&r1=411430&r2=411431&view=diff ============================================================================== --- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/TypeHandlerFactory.java (original) +++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/type/TypeHandlerFactory.java Sat Jun 3 06:29:45 2006 @@ -106,6 +106,7 @@ putTypeAlias("arraylist", ArrayList.class.getName()); putTypeAlias("collection", Collection.class.getName()); putTypeAlias("iterator", Iterator.class.getName()); + putTypeAlias("cursor", java.sql.ResultSet.class.getName()); } @@ -206,7 +207,7 @@ } else { value = string; } - + return value; }