/*
* Copyright (C) 2010---2014 星星(wuweixing)<349446658@qq.com>
*
* This file is part of Wabacus
*
* Wabacus is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.wabacus.system.dataset.update.action.rationaldb;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.wabacus.config.Config;
import com.wabacus.config.component.application.report.ReportBean;
import com.wabacus.config.database.type.AbsDatabaseType;
import com.wabacus.exception.WabacusConfigLoadingException;
import com.wabacus.system.ReportRequest;
import com.wabacus.system.assistant.WabacusAssistant;
import com.wabacus.system.component.application.report.configbean.editablereport.AbsEditableReportEditDataBean;
import com.wabacus.system.component.application.report.configbean.editablereport.EditableReportParamBean;
import com.wabacus.system.dataset.update.action.AbsUpdateAction;
import com.wabacus.system.datatype.IDataType;
import com.wabacus.system.datatype.VarcharType;
import com.wabacus.util.Tools;
public class SPUpdateAction extends AbsRationalDBUpdateAction
{
private static Log log=LogFactory.getLog(SPUpdateAction.class);
private List lstParams;
public SPUpdateAction(AbsEditableReportEditDataBean ownerUpdateBean)
{
super(ownerUpdateBean);
}
public String getExecuteSql(ReportRequest rrequest,Map<String,String> rowData,Map<String,String> paramValues)
{
String dynamicsql=getDynExecuteSql(rrequest,null);
if(!Tools.isEmpty(dynamicsql)) return dynamicsql;
return this.sqlsp;
}
public void updateData(ReportRequest rrequest,Map<String,String> mRowData,
Map<String,String> mParamValues) throws SQLException
{
String realsql=getExecuteSql(rrequest,mRowData,mParamValues);
AbsDatabaseType dbtype=rrequest.getDbType(this.datasource);
Connection conn=rrequest.getConnection(this.datasource);
CallableStatement cstmt=null;
try
{
ReportBean rbean=this.ownerUpdateBean.getOwner().getReportBean();
if(Config.show_sql) log.info("Execute sql:"+realsql);
cstmt=conn.prepareCall(realsql);
if(lstParams!=null&&lstParams.size()>0)
{
int idx=1;
IDataType varcharTypeObj=Config.getInstance().getDataTypeByClass(VarcharType.class);
EditableReportParamBean paramBeanTmp;
for(Object paramObjTmp:this.lstParams)
{
if(paramObjTmp instanceof EditableReportParamBean)
{
paramBeanTmp=(EditableReportParamBean)paramObjTmp;
paramBeanTmp.getDataTypeObj().setPreparedStatementValue(
idx++,
paramBeanTmp.getRuntimeParamValue(rrequest,rbean,mRowData,mParamValues,this.datasource,ownerUpdateBean
.isAutoReportdata()),cstmt,dbtype);
}else
{
varcharTypeObj.setPreparedStatementValue(idx++,paramObjTmp==null?"":String.valueOf(paramObjTmp),cstmt,dbtype);
}
}
}
int outputindex=-1;
if(this.returnValueParamname!=null&&!this.returnValueParamname.trim().equals(""))
{//有返回值
outputindex=this.lstParams==null?1:this.lstParams.size()+1;
cstmt.registerOutParameter(outputindex,java.sql.Types.VARCHAR);
}
cstmt.execute();
if(outputindex>0)
{
String rtnVal=cstmt.getString(outputindex);
storeReturnValue(rrequest,mParamValues,rtnVal);
}
}finally
{
WabacusAssistant.getInstance().release(null,cstmt);
}
}
public void parseActionScript(String sp,List<AbsUpdateAction> lstUpdateActions,String reportTypeKey)
{
ReportBean rbean=this.ownerUpdateBean.getOwner().getReportBean();
if(sp.startsWith("{")&&sp.endsWith("}")) sp=sp.substring(1,sp.length()-1).trim();
String procedure=sp.toLowerCase().startsWith("call ")?sp.substring("call ".length()).trim():sp.trim();
if(procedure.equals(""))
{
throw new WabacusConfigLoadingException("加载报表"+rbean.getPath()+"上的更新语句"+sp+"失败,没有指定要调用的存储过程名");
}
String procname=procedure;
List lstProcedureParams=new ArrayList();
int idxLeft=procedure.indexOf("(");
if(idxLeft==0) throw new WabacusConfigLoadingException("加载报表"+rbean.getPath()+"上的更新语句"+sp+"失败,配置的要调用的存储过程格式不对");
if(idxLeft>0)
{
int idxRight=procedure.lastIndexOf(")");
if(idxRight!=procedure.length()-1) throw new WabacusConfigLoadingException("加载报表"+rbean.getPath()+"上的更新语句"+sp+"失败,配置的要调用的存储过程格式不对");
procname=procedure.substring(0,idxLeft).trim();
String params=procedure.substring(idxLeft+1,idxRight).trim();//存储过程参数
if(!params.equals(""))
{
List<String> lstParamsTmp=Tools.parseStringToList(params,",",new String[]{"'","'"},false);
Object paramObjTmp;
for(String paramTmp:lstParamsTmp)
{
paramObjTmp=createEditParams(paramTmp,reportTypeKey);
if(paramObjTmp instanceof String)
{
String strParamTmp=((String)paramObjTmp);
if(strParamTmp.startsWith("'")&&strParamTmp.endsWith("'")) strParamTmp=strParamTmp.substring(1,strParamTmp.length()-1);
if(strParamTmp.startsWith("\"")&&strParamTmp.endsWith("\"")) strParamTmp=strParamTmp.substring(1,strParamTmp.length()-1);
paramObjTmp=strParamTmp;
}
lstProcedureParams.add(paramObjTmp);
}
}
}
StringBuilder tmpBuf=new StringBuilder("{call "+procname+"(");
for(int i=0,len=lstProcedureParams.size();i<len;i++)
{
tmpBuf.append("?,");
}
if(this.returnValueParamname!=null&&!this.returnValueParamname.trim().equals("")) tmpBuf.append("?");
if(tmpBuf.charAt(tmpBuf.length()-1)==',') tmpBuf.deleteCharAt(tmpBuf.length()-1);
tmpBuf.append(")}");
this.sqlsp=tmpBuf.toString();
this.lstParams=lstProcedureParams;
lstUpdateActions.add(this);
}
}