/*
* Copyright 2008 biaoping.yin
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.frameworkset.common.poolman;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.frameworkset.util.BigFile;
import org.frameworkset.util.ClassUtil;
import org.frameworkset.util.ClassUtil.ClassInfo;
import org.frameworkset.util.ClassUtil.PropertieDescription;
import org.frameworkset.util.annotations.wraper.ColumnWraper;
import com.frameworkset.common.poolman.handle.FieldRowHandler;
import com.frameworkset.common.poolman.handle.ResultSetNullRowHandler;
import com.frameworkset.common.poolman.handle.RowHandler;
import com.frameworkset.common.poolman.handle.ValueExchange;
import com.frameworkset.common.poolman.handle.XMLMark;
import com.frameworkset.common.poolman.handle.XMLRowHandler;
import com.frameworkset.common.poolman.sql.PoolManResultSetMetaData;
import com.frameworkset.common.poolman.sql.PoolManResultSetMetaData.WrapInteger;
import com.frameworkset.common.poolman.util.JDBCPool;
import com.frameworkset.common.poolman.util.SQLUtil;
import com.frameworkset.orm.adapter.DB;
import com.frameworkset.orm.annotation.PrimaryKey;
import com.frameworkset.orm.engine.model.SchemaType;
import com.frameworkset.util.ColumnEditorInf;
import com.frameworkset.util.ValueObjectUtil;
/**
*
*
* <p>
* Title: ResultMap.java
* </p>
*
* <p>
* Description:
* </p>
*
* <p>
* Copyright: Copyright (c) 2007
* </p>
*
*
* @Date Oct 22, 2008 2:10:42 PM
* @author biaoping.yin
* @version 1.0
*/
public class ResultMap {
public static int type_list = 0;
public static int type_objcet = 1;
public static int type_objectarray = 2;
public static int type_xml = 3;
public static int type_maparray = 4;
public static int type_null = 5;
private static Logger log = Logger.getLogger(ResultMap.class);
private Object functionResult;
private Record origineprocresult;
private Object commonresult;
private int size;
public void setCommonresult(Object commonresult)
{
this.commonresult = commonresult;
}
/**
*
* @param cstmt
* @param rs
* @param outparams
* @param valueobjectType
* @throws SQLException
*/
public void handle(CallableStatement cstmt, ResultSet rs,
Class valueobjectType, CallableParams outparams,
StatementInfo stmtInfo, RowHandler rowHander) throws SQLException {
if (rs != null) {
rs.next();
functionResult = rs.getObject(1);
}
if (valueobjectType == Map.class || valueobjectType == List.class)// 映射为map对象
{
Record record = buildMap(cstmt, outparams, stmtInfo);
if (rowHander != null) {
try
{
rowHander.handleRow(record, record);
}
catch (SQLException e)
{
throw e;
}
catch (Exception e)
{
throw new NestedSQLException(e);
}
this.commonresult = record;
return;
}
if (valueobjectType == List.class) {
List datas = new ArrayList();
datas.add(record);
this.commonresult = datas;
} else {
this.commonresult = record;
this.origineprocresult = record;
}
}
else if (valueobjectType == XMLMark.class)// 映射为xml格式化串
{
// if(rowHander == null)
// {
// rowHander = new XMLRowHandler()
// }
this.commonresult = buildXMLString(cstmt, outparams, stmtInfo,
rowHander);
} else // 映射为普通的值对象,为值对象时,要求out参数全部通过outparameter名称注册,不能通过位置索引来指定
{
this.commonresult = buildValueObject(cstmt, valueobjectType,
outparams, stmtInfo, rowHander,ValueObjectUtil.isPrimaryType(valueobjectType));
}
}
public static <T> T buildValueObject(ResultSet rs,
Class<T> valueObjectType,
StatementInfo stmtInfo) throws SQLException
{
return buildValueObject(rs,
valueObjectType,
stmtInfo, null,false,ClassUtil.getClassInfo(valueObjectType));
}
public static <T> T buildValueObject(ResultSet rs,
Class<T> valueObjectType,
StatementInfo stmtInfo, RowHandler rowHander,boolean ismap,ClassInfo beanInfo)
throws SQLException {
if (rs == null ||valueObjectType == null || stmtInfo == null)
return null;
T valueObject = null;
if (rowHander != null) {
boolean isfieldRowHandler = isFieldRowHandler(rowHander);
try {
if(!isfieldRowHandler)
valueObject = valueObjectType.newInstance();
} catch (InstantiationException e1) {
throw new NestedSQLException(e1);
} catch (IllegalAccessException e1) {
throw new NestedSQLException(e1);
}
Record data = buildMap(rs, stmtInfo,stmtInfo.getDbadapter());
try
{
if(!isfieldRowHandler)
rowHander.handleRow(valueObject, data);
else
valueObject = ((FieldRowHandler<T>)rowHander).handleField_(data);
}
catch (SQLException e)
{
throw e;
}
catch (Exception e)
{
throw new NestedSQLException(e);
}
return valueObject;
}
if( !ismap)
{
// if(!String.class.isAssignableFrom(valueObjectType))//如果要求返回字符串类型的数据,则直接返回String类型的值
// ClassInfo beanInfo = ClassUtil.getClassInfo(valueObjectType);
if(!beanInfo.isPrimary())
{
try {
valueObject = valueObjectType.newInstance();
} catch (InstantiationException e1) {
throw new NestedSQLException(e1);
} catch (IllegalAccessException e1) {
throw new NestedSQLException(e1);
}
// BeanInfo beanInfo;
// try {
//
// beanInfo = Introspector.getBeanInfo(valueObjectType);
// } catch (IntrospectionException e1) {
// throw new NestedSQLException(e1);
// }
List<PropertieDescription> attributes = beanInfo.getPropertyDescriptors();
PoolManResultSetMetaData meta = stmtInfo.getMeta();
for (int n = 0; attributes != null && n < attributes.size(); n++) {
PropertieDescription attribute = attributes.get(n);
ColumnWraper cl = attribute.getColumn();
if(attribute.getIgnoreORMapping() != null || (cl != null && cl.ignorebind()))
continue;
String attrName = attribute.getName();
String upname = attribute.getUperName();
// if(attrName.equals("class"))
// continue;
String annotationName = null;
if(BigFile.class.isAssignableFrom(attribute.getPropertyType()) )//不支持大字段转换为BigFile接口
continue;
boolean userAnnotation = false;
ColumnEditorInf editor = null;
try {
// Field field = classinfo.getDeclaredField(attrName);
// if(field != null)
PrimaryKey apk = attribute.getPk();
if(apk != null)
{
// PrimaryKey apk = field.getAnnotation(PrimaryKey.class);
annotationName = apk.name();
if(annotationName == null
|| annotationName.equals(""))
{
}
else
{
attrName = annotationName;
upname = annotationName.toUpperCase();
userAnnotation = true;
}
}
else
{
if(cl != null)
{
editor = cl.editor();
annotationName = cl.name();
if(annotationName == null
|| annotationName.equals(""))
{
}
else
{
attrName = annotationName;
upname = annotationName.toUpperCase();
userAnnotation = true;
}
}
}
} catch (Exception e1) {
log.info(attribute.getName() + " is not a field of bean[" +valueObjectType.getClass().getCanonicalName() + "].");
}
for (int i = 0; i < meta.getColumnCounts(); i++) {
int cidx = i+1;
String columnName = meta.getColumnLabelUpperByIndex(i);
if (!upname.equals(columnName))
{
if(!userAnnotation && JDBCPool.nameMapping)
{
String javaName = meta.getColumnJavaNameByIndex(i);
if(javaName != null )
{
if(!attrName.equals(javaName))
continue;
}
else
{
continue;
}
}
else
{
continue;
}
}
Class type = attribute.getPropertyType();
Object propsVal = null;
try {
// propsVal = ValueExchange.getValueFromResultSet(rs, columnName,
// stmtInfo.getMeta().getColumnType(i + 1),
// type,
// stmtInfo.getDbname());
propsVal = ValueExchange.getValueFromResultSet(rs, cidx,
stmtInfo.getMeta().getColumnTypeByIndex(i),
type,
stmtInfo.getDbadapter(),editor,cl);
} catch (Exception e) {
StringBuffer err = new StringBuffer(
"Build ValueObject for ResultSet[").append(
stmtInfo.getSql()).append("] Get Column[")
.append(columnName).append("] from ResultSet to ").append(valueObject).append(".")
.append(attrName).append("[")
.append(type.getName()).append("] failed:").append(
e.getMessage());
log.error(err.toString(), e);
break;
}
try {
if(attribute.canwrite())
{
attribute.setValue(valueObject, propsVal);
}
// attribute.getWriteMethod().invoke(valueObject,
// new Object[] { propsVal });
break;
} catch (Exception e) {
StringBuffer err = new StringBuffer(
"Build ValueObject for ResultSet[").append(
stmtInfo.getSql()).append("] Get Column[")
.append(columnName).append("] from ResultSet to ").append(valueObject).append(".")
.append(attrName).append("[")
.append(type.getName()).append("] failed:").append(
e.getMessage());
// System.out.println(err);
log.error(err.toString(), e);
break;
}
}
}
}
else
{
valueObject = (T)ValueExchange.getValueFromResultSet(rs, 1,
stmtInfo.getMeta().getColumnTypeByIndex(0),
valueObjectType,
stmtInfo.getDbadapter(),(ColumnEditorInf)null,(ColumnWraper)null);
}
}
else
{
valueObject = (T)buildMap(valueObjectType,rs,stmtInfo);
}
return valueObject;
}
public static void buildRecord(ResultSet rs,
StatementInfo stmtInfo, RowHandler rowHander,DB db)
throws SQLException {
if (rs == null || stmtInfo == null)
return ;
if (rowHander != null) {
if(!(rowHander instanceof ResultSetNullRowHandler))
{
Record data = buildMap(rs, stmtInfo,db);
try
{
rowHander.handleRow(null, data);
}
catch (SQLException e)
{
throw e;
}
catch (Exception e)
{
throw new NestedSQLException(e);
}
}
else
{
try
{
rowHander.handleRow(rs, null);
}
catch (SQLException e)
{
throw e;
}
catch (Exception e)
{
throw new NestedSQLException(e);
}
}
}
}
private static boolean isFieldRowHandler(RowHandler rowHander)
{
return rowHander instanceof FieldRowHandler;
}
public static Object buildValueObject(CallableStatement cstmt,
Class valueObjectType, CallableParams outparams,
StatementInfo stmtInfo, RowHandler rowHander,boolean isprimaryType)
throws SQLException {
// Record data = buildMap( cstmt, outparams, stmtInfo);
// if(data == null)
// return null;
// this.origineprocresult = new Record(data);
if (outparams == null || outparams.outParams == null
|| outparams.outParams.size() == 0)
return null;
Object valueObject = null;
if (rowHander != null) {
boolean isfieldRowHandler = isFieldRowHandler(rowHander);
try {
if(!isfieldRowHandler)
valueObject = valueObjectType.newInstance();
} catch (InstantiationException e1) {
throw new NestedSQLException(e1);
} catch (IllegalAccessException e1) {
throw new NestedSQLException(e1);
}
Record data = buildMap(cstmt, outparams, stmtInfo);
try
{
if(!isfieldRowHandler)
{
rowHander.handleRow(valueObject, data);
}
else
{
valueObject = ((FieldRowHandler)rowHander).handleField_(data);
}
}
catch (SQLException e)
{
throw e;
}
catch (Exception e)
{
throw new NestedSQLException(e);
}
return valueObject;
}
if( !Map.class.isAssignableFrom(valueObjectType))
{
// if(!String.class.isAssignableFrom(valueObjectType))//如果要求返回String类型,直接按照String类型进行处理
if(!isprimaryType)
{
try {
valueObject = valueObjectType.newInstance();
} catch (InstantiationException e1) {
throw new NestedSQLException(e1);
} catch (IllegalAccessException e1) {
throw new NestedSQLException(e1);
}
ClassInfo beanInfo = ClassUtil.getClassInfo(valueObjectType);
List<PropertieDescription> attributes = beanInfo.getPropertyDescriptors();
for (int n = 0; attributes != null && n < attributes.size(); n++) {
PropertieDescription attribute = attributes.get(n);
ColumnWraper cl = attribute.getColumn();
if(attribute.getIgnoreORMapping() != null || (cl != null && cl.ignorebind()))
continue;
String attrName = attribute.getName();
// if(attrName.equals("class"))
// continue;
if(BigFile.class.isAssignableFrom(attribute.getPropertyType()) )//不支持大字段转换为BigFile接口
continue;
String annotationName = null;
ColumnEditorInf editor = null;
try {
PrimaryKey apk = attribute.getPk();
if(apk != null)
{
annotationName = apk.name();
if(annotationName == null
|| annotationName.equals(""))
{
}
else
{
attrName = annotationName;
}
}
else
{
if(cl != null)
{
editor = cl.editor();
annotationName = cl.name();
if(annotationName == null
|| annotationName.equals(""))
{
}
else
{
attrName = annotationName;
}
}
}
} catch (Exception e1) {
log.info(attribute.getName() + " is not a field of bean[" +valueObjectType.getClass().getCanonicalName() + "].");
}
for (int i = 0; i < outparams.outParams.size(); i++) {
CallableParam param = (CallableParam) outparams.outParams
.get(i);
if (param.parameterName == null) {
String msg = new StringBuffer(
"Build ValueObject for callablestatement[").append(
outparams.prepareSqlifo.getNewsql()).append(
"] need named binding variable,ignore handle ")
.append(param).append(".").toString();
log.warn(msg);
// System.out.println(msg);
outparams.outParams.remove(i);
continue;
}
if (!attrName.equalsIgnoreCase(param.parameterName))
continue;
Class type = attribute.getPropertyType();
Object propsVal = null;
// Object temp_ = getValueFromCallableStatement(cstmt,
// param.parameterName,
// param.sqlType,
// stmtInfo.getDbname());
try {
propsVal = ValueExchange.getValueFromCallableStatement(
cstmt, param.parameterName, param.sqlType, type,
stmtInfo.getDbname(),editor,cl);
} catch (Exception e) {
StringBuffer err = new StringBuffer(
"Build ValueObject for callablestatement[").append(
outparams.prepareSqlifo.getNewsql()).append("] Get Param[")
.append(param).append("] from ").append(cstmt)
.append(" to ").append(valueObject).append(".")
.append(attrName).append("[")
.append(type.getName()).append("] failed:").append(
e.getMessage());
log.error(err.toString(), e);
// 处理一个就外部参数剔除一个
outparams.outParams.remove(i);
break;
}
// if(propsVal == null)
// {
// outparams.outParams.remove(i);
// }
try {
if(attribute.canwrite())
{
attribute.setValue(valueObject, propsVal);
}
// attribute.getWriteMethod().invoke(valueObject,
// new Object[] { propsVal });
// 处理一个就外部参数剔除一个
outparams.outParams.remove(i);
break;
} catch (Exception e) {
StringBuffer err = new StringBuffer("set Param[").append(
param).append("] into ").append(valueObject)
.append(".").append(attrName).append("[").append(
type.getName()).append("] failed:").append(
e.getMessage());
// System.out.println(err);
log.error(err.toString(), e);
// 处理一个就外部参数剔除一个
outparams.outParams.remove(i);
break;
}
}
}
if (outparams.outParams.size() > 0) {
StringBuffer msg = new StringBuffer();
msg.append("Following outparams not mapping attributes in ")
.append(valueObjectType.getName()).append(":\r\n");
for (int i = 0; i < outparams.outParams.size(); i++) {
msg.append(" ").append(outparams.outParams.remove(i));
}
}
}
else
{
CallableParam param = (CallableParam) outparams.outParams.get(0);
try {
valueObject = ValueExchange.getValueFromCallableStatement(
cstmt, param.parameterName, param.sqlType, valueObjectType,
stmtInfo.getDbname(),(ColumnEditorInf)null,(ColumnWraper)null);
} catch (Exception e) {
StringBuffer err = new StringBuffer(
"Build ValueObject for callablestatement[").append(
outparams.prepareSqlifo.getNewsql()).append("] Get Param[")
.append(param).append("] from ").append(cstmt)
.append(" to String failed:").append(
e.getMessage());
log.error(err.toString(), e);
}
outparams.outParams.clear();
}
}
else
{
valueObject = buildMap(valueObjectType,cstmt, outparams, stmtInfo);
}
return valueObject;
}
public static Map buildMap(Class valueObjectType,CallableStatement cstmt,
CallableParams outparams, StatementInfo stmtInfo)
throws SQLException {
Map data = null;
if (outparams.outParams != null && outparams.outParams.size() > 0) {
try {
data = ResultMap.findMapObject(valueObjectType, outparams.outParams.size());
} catch (InstantiationException e) {
throw new NestedSQLException(e);
} catch (IllegalAccessException e) {
throw new NestedSQLException(e);
}
// data = new Record(outparams.outParams.size());
for (int i = 0; outparams.outParams != null
&& i < outparams.outParams.size(); i++) {
Object param = outparams.outParams.get(i);
if (param instanceof CallableParam) {
CallableParam _param = (CallableParam) param;
if (_param.parameterName != null) {
Object object = ValueExchange
.getValueFromCallableStatement(cstmt,
_param.parameterName, _param.sqlType,
stmtInfo.getDbname());
data.put(_param.parameterName, object);
} else {
Object object = ValueExchange
.getValueFromCallableStatement(cstmt,
_param.index, _param.sqlType, stmtInfo
.getDbname());
data.put(new Integer(_param.index), object);
}
} else {
throw new SQLException(new StringBuffer("Param[").append(
param).append("] is not an out parameter.")
.toString());
}
}
}
return data;
}
public static Record buildMap(CallableStatement cstmt,
CallableParams outparams, StatementInfo stmtInfo)
throws SQLException {
Record data = null;
if (outparams.outParams != null && outparams.outParams.size() > 0) {
data = new CallRecord(outparams.outParams.size());
for (int i = 0; outparams.outParams != null
&& i < outparams.outParams.size(); i++) {
Object param = outparams.outParams.get(i);
if (param instanceof CallableParam) {
CallableParam _param = (CallableParam) param;
if (_param.parameterName != null) {
Object object = ValueExchange
.getValueFromCallableStatement(cstmt,
_param.parameterName, _param.sqlType,
stmtInfo.getDbname());
data.put(_param.parameterName, object);
} else {
Object object = ValueExchange
.getValueFromCallableStatement(cstmt,
_param.index, _param.sqlType, stmtInfo
.getDbname());
data.put(new Integer(_param.index), object);
}
} else {
throw new SQLException(new StringBuffer("Param[").append(
param).append("] is not an out parameter.")
.toString());
}
}
}
return data;
}
public static Record buildMap(ResultSet rs,StatementInfo stmtInfo,DB db)
throws SQLException {
Record record = null;
PoolManResultSetMetaData meta = stmtInfo.getMeta();
if (rs != null && stmtInfo != null) {
int cols = meta.getColumnCounts();
record = new Record(cols,meta.get_columnLabel_upper(),meta.getSamecols());
record.setRowid(rs.getRow());
for (int i = 1; i <= cols; i++) {
Object value = ValueExchange.getValueFromRS(rs, i, meta
.getColumnType(i), db);
// 将属性名称全部转换为大写,统一不同数据库之间的差异
if (value != null)
{
WrapInteger wi = meta.getSameColumns(i);
if(wi == null || i == 1)
{
record.put(meta
.getColumnLabelUpper(i),
value);
}
else
{
record.put(wi.getColumnName(i - 1) ,
value);
// wi.getColumnName();
}
// /**
// * 直接以列索引存放数据,列索引从0
// */
// record.put(new Integer(i-1),
// value);
}
}
}
return record;
}
private static Map findMapObject(Class valueObjectType,int initialCapacity) throws InstantiationException, IllegalAccessException
{
try {
Constructor constructor = valueObjectType.getConstructor(int.class);
return (Map)constructor.newInstance(initialCapacity);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (Map)valueObjectType.newInstance();
}
public static <T> T buildMap(Class<T> valueObjectType,ResultSet rs,StatementInfo stmtInfo)
throws SQLException {
Map valueObject = null;
PoolManResultSetMetaData meta = stmtInfo.getMeta();
if (rs != null && stmtInfo != null) {
int cols = meta.getColumnCounts();
try {
valueObject = findMapObject(valueObjectType,cols);
} catch (Exception e) {
// TODO Auto-generated catch block
throw new NestedSQLException(e);
}
// record = new Record(cols,meta.get_columnLabel_upper(),meta.getSamecols());
// record.setRowid(rs.getRow());
for (int i = 1; i <= cols; i++) {
Object value = ValueExchange.getValueFromRS(rs, i, meta
.getColumnType(i), stmtInfo.getDbadapter());
// 将属性名称全部转换为大写,统一不同数据库之间的差异
if (value != null)
{
WrapInteger wi = meta.getSameColumns(i);
if(wi == null || i == 1)
{
valueObject.put(meta
.getColumnLabelUpper(i),
value);
}
else
{
valueObject.put(wi.getColumnName(i - 1) ,
value);
// wi.getColumnName();
}
// /**
// * 直接以列索引存放数据,列索引从0
// */
// record.put(new Integer(i-1),
// value);
}
}
}
// return record;
return (T)valueObject;
}
public static StringBuffer buildSingleRecordXMLString(ResultSet rs,
StatementInfo stmtInfo,
RowHandler rowHander,DB db) throws SQLException {
StringBuffer record = new StringBuffer();
// if (rowHander != null)
// {
Record data = buildMap(rs, stmtInfo,db);
try
{
rowHander.handleRow(record, data);
}
catch (SQLException e)
{
throw e;
}
catch (Exception e)
{
throw new NestedSQLException(e);
}
return record;
// }
// record.append("\r\n\t<record>");
// for (int i = 0; i < stmtInfo.getMeta().getColumnCounts(); i++) {
// String columnName = stmtInfo.getMeta().getColumnLabelUpper(i + 1);
//
//
// int sqltype = stmtInfo.getMeta().getColumnType(i + 1);
//
// String object = (String) ValueExchange
// .getValueFromResultSet(rs,
// columnName, sqltype,
// String.class, stmtInfo.getDbname());
// SchemaType schemaType = SQLUtil.getSchemaType(stmtInfo
// .getDbname(), sqltype);
// record.append("\r\n\t\t<column name=\"").append(
// columnName).append(
// "\" type=\"").append(schemaType.getName())
// .append("\" javatype=\"").append(
// schemaType.getJavaType()).append("\"")
// .append(">\r\n")
// .append("\t\t\t<![CDATA[")
// // .append(ResultMap.getStringFromObject(object))//需要转换成String类型
// .append(object)// 需要转换成String类型
// .append("]]>\r\n").append(
// "\t\t</column>");
//
//
// }
// record.append("\r\n\t</record>");
// return record;
}
public String buildXMLString(CallableStatement cstmt,
CallableParams outparams, StatementInfo stmtInfo,
RowHandler rowHander) throws SQLException {
// Map data = buildMap(cstmt, outparams, stmtInfo);
// this.origineprocresult = new Record(data);
if (outparams.outParams != null && outparams.outParams.size() > 0) {
StringBuffer records = new StringBuffer(2000);
boolean isxmlhandler = rowHander != null && rowHander instanceof XMLRowHandler;
XMLRowHandler xhdl = null;
if(!isxmlhandler) //行处理器不是从XMLRowHandler处理器继承时进入这个分支
{
records.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
records.append("<records>\r\n");
}
else
{
xhdl = (XMLRowHandler)rowHander;
records.append("<?xml version=\"")
.append(xhdl.getVersion())
.append("\" encoding=\"")
.append(xhdl.getEncoding())
.append("\"?>\r\n");
records.append("<")
.append(xhdl.getRootName())
.append(">\r\n");
}
StringBuffer record = new StringBuffer(100);
if (rowHander != null)
{
Record origineprocresult = buildMap(cstmt, outparams, stmtInfo);
try
{
rowHander.handleRow(record, origineprocresult);
}
catch (SQLException e)
{
throw e;
}
catch (Exception e)
{
throw new NestedSQLException(e);
}
}
else
{
record.append(" <record>\r\n");
for (int i = 0; i < outparams.outParams.size(); i++) {
Object param = outparams.outParams.get(i);
if (param instanceof CallableParam) {
CallableParam _param = (CallableParam) param;
if (_param.parameterName != null) {
// Object object = getValueFromCallableStatement(cstmt,
// _param.parameterName,
// _param.sqlType,stmtInfo.getDbname());
String object = (String) ValueExchange
.getValueFromCallableStatement(cstmt,
_param.parameterName, _param.sqlType,
String.class, stmtInfo.getDbname(),null,null);
SchemaType schemaType = SQLUtil.getSchemaType(stmtInfo
.getDbname(), _param.sqlType,null);
record.append(" <column name=\"").append(
_param.parameterName).append(
"\" type=\"").append(schemaType.getName())
.append("\" javatype=\"").append(
schemaType.getJavaType()).append("\"")
.append(">\r\n")
.append(" <![CDATA[")
// .append(ResultMap.getStringFromObject(object))//需要转换成String类型
.append(object)// 需要转换成String类型
.append("]]>\r\n").append(
" </column>\r\n");
// data.put(_param.parameterName, object);
} else {
// Object object = getValueFromCallableStatement(cstmt,
// _param.index, _param.sqlType,stmtInfo.getDbname());
String object = (String) ValueExchange
.getValueFromCallableStatement(cstmt,
_param.index, _param.sqlType,
String.class, stmtInfo.getDbname(),null);
SchemaType schemaType = SQLUtil.getSchemaType(stmtInfo
.getDbname(), _param.sqlType,null);
record.append(" <column index=\"").append(
_param.index).append("\" type=\"").append(
schemaType.getName()).append("\" javatype=\"")
.append(schemaType.getJavaType()).append("\"")
.append(">\r\n")
.append(" <![CDATA[")
// .append(ResultMap.getStringFromObject(object))//需要转换成String类型
.append(object).append("]]>\r\n").append(
" </column>\r\n");
// data.put(new Integer(_param.index), object);
}
} else {
throw new SQLException(new StringBuffer("Param[").append(
param).append("] is not an out parameter.")
.toString());
}
}
record.append(" </record>");
}
if(!isxmlhandler)
{
records.append(record).append("\r\n").append("</records>");
}
else
{
records.append(record).append("\r\n").append("</")
.append(xhdl.getRootName())
.append(">");
}
return records.toString();
}
return null;
}
public Object getFunctionResult() {
return functionResult;
}
public Record getOrigineprocresult() {
return origineprocresult;
}
public Object getCommonresult() {
return commonresult;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}