/*
* 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.select.rationaldbassistant;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
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.WabacusRuntimeException;
import com.wabacus.system.ReportRequest;
import com.wabacus.system.assistant.ReportAssistant;
import com.wabacus.system.dataset.select.common.SQLCommonDataSetValueProvider;
import com.wabacus.system.datatype.IDataType;
public class GetDataSetBySQL
{
private static Log log=LogFactory.getLog(GetDataSetBySQL.class);
protected List<String> lstConditions;
protected List<IDataType> lstConditionsTypes;
protected boolean isPreparedStmt;
protected ReportRequest rrequest;
protected ReportBean rbean;
public GetDataSetBySQL(ReportRequest rrequest,ReportBean rbean,boolean isPreparedStmt)
{
this.rrequest=rrequest;
this.rbean=rbean;
this.isPreparedStmt=isPreparedStmt;
if(isPreparedStmt)
{
lstConditions=new ArrayList<String>();
lstConditionsTypes=new ArrayList<IDataType>();
}
}
public Object getCommonDataSet(SQLCommonDataSetValueProvider provider,Object typeObj,String sql)
{
if(lstConditions!=null) lstConditions.clear();
if(lstConditionsTypes!=null) lstConditionsTypes.clear();
sql=ReportAssistant.getInstance().addDynamicConditionExpressionsToSql(rrequest,rbean,null,sql,
provider.getLstConditions(),lstConditions,lstConditionsTypes);
if(rbean.getInterceptor()!=null&&typeObj!=null)
{
Object obj=rbean.getInterceptor().beforeLoadData(rrequest,rbean,typeObj,sql);
if(!(obj instanceof String)) return obj;
sql=(String)obj;
}
try
{
return executeQuery(provider.getDatasource(),sql);
}catch(SQLException e)
{
throw new WabacusRuntimeException("执行报表"+rbean.getPath()+"的SQL语句:"+sql+"失败",e);
}
}
protected ResultSet executeQuery(String datasource,String sql) throws SQLException
{
if(Config.show_sql) log.info("Execute sql: "+sql);
if(this.isPreparedStmt)
{
PreparedStatement pstmt=rrequest.getConnection(datasource).prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
if(lstConditions.size()>0)
{
AbsDatabaseType dbtype=rrequest.getDbType(datasource);
for(int i=0;i<lstConditions.size();i++)
{
if(Config.show_sql) log.info("param"+(i+1)+"="+lstConditions.get(i));
lstConditionsTypes.get(i).setPreparedStatementValue(i+1,lstConditions.get(i),pstmt,dbtype);
}
}
rrequest.addUsedStatement(pstmt);
return pstmt.executeQuery();
}else
{
Statement stmt=rrequest.getConnection(datasource).createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rrequest.addUsedStatement(stmt);
return stmt.executeQuery(sql);
}
}
}