package com.hundsun.ares.studio.atom.compiler.mysql.token;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import com.hundsun.ares.studio.atom.compiler.mysql.constant.IAtomEngineContextConstantMySQL;
import com.hundsun.ares.studio.atom.compiler.mysql.skeleton.util.AtomFunctionCompilerUtil;
import com.hundsun.ares.studio.biz.Parameter;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.engin.constant.IEngineContextConstant;
import com.hundsun.ares.studio.engin.constant.ITokenConstant;
import com.hundsun.ares.studio.engin.parser.PseudoCodeParser;
import com.hundsun.ares.studio.engin.token.ICodeToken;
import com.hundsun.ares.studio.engin.token.IDomainHandler;
import com.hundsun.ares.studio.engin.token.ITokenDomain;
import com.hundsun.ares.studio.engin.token.macro.IMacroToken;
import com.hundsun.ares.studio.jres.model.metadata.StandardDataType;
import com.hundsun.ares.studio.jres.model.metadata.util.MetadataServiceProvider;
import com.hundsun.ares.studio.procdure.Procedure;
import com.hundsun.ares.studio.usermacro.compiler.contants.IUserMacroEnginConstant;
public class ProcedureCallNoResultSetInProcStaticToken implements ICodeToken {
Procedure procedure;
IMacroToken token;
public ProcedureCallNoResultSetInProcStaticToken(Procedure procedure,IMacroToken token) {
this.procedure = procedure;
this.token = token;
}
@Override
public String getContent() {
return null;
}
@Override
public int getType() {
return 0;
}
@Override
public String genCode(Map<Object, Object> context) throws Exception {
IARESProject project = (IARESProject) context.get(IAtomEngineContextConstantMySQL.Aresproject);
StringBuffer buffer = new StringBuffer();
String name = procedure.getName();
String[] params = token.getParameters();
Map<String, String> values = new HashMap<String, String>();
if(params.length>0){
values.putAll(PseudoCodeParser.parserKeyValueWithAt(params[0]));
}
StringBuffer paramBuffer = new StringBuffer();
int index = 0;
List<Parameter> paramList = new ArrayList<Parameter>();
paramList.addAll(procedure.getInputParameters());
paramList.addAll(procedure.getOutputParameters());
for(Parameter param : paramList){
List<String> popVarList = (List<String>)context.get(IEngineContextConstant.PSEUDO_CODE_PARA_LIST);
//��Ӵ����ڹ����ж��������ں����еIJ���
if(!popVarList.contains(param.getId())){
popVarList.add(param.getId());
}
if(index > 0){
paramBuffer.append(",");
}
if(values.containsKey(param.getId())){
//����Ĭ��ֵ
if(StringUtils.defaultIfBlank(values.get(param.getId()), "").indexOf("@")!=-1){
paramBuffer.append(":"+getRealFieldName(values.get(param.getId()),getRealType(param, project,context),project));
paramBuffer.append(ITokenConstant.NL);
}else{
paramBuffer.append(values.get(param.getId()));
paramBuffer.append(ITokenConstant.NL);
}
}else{
paramBuffer.append(":@" + param.getId());
paramBuffer.append(ITokenConstant.NL);
}
index ++;
}
StringBuffer elseBuffer = new StringBuffer();
boolean noText =true;
if (isInTranInProcBlock(context)) {
noText = false;
elseBuffer.append("rollback;\n");
}
if (token.getFlag().indexOf("M") < 0) {
noText = false;
elseBuffer.append("goto svr_end;").append("\r\n");
}
if(noText){
elseBuffer.append("NULL;");
}
buffer.append(String.format(CALL_BODY, name,paramBuffer.toString(),elseBuffer.toString()));
return buffer.toString();
}
//�Ƿ������ﴦ�����
private boolean isInTranInProcBlock(Map<Object, Object> context){
IDomainHandler handler = (IDomainHandler) context.get(IEngineContextConstant.DOMAIN_HANDLER);
ITokenDomain tokenDomain =handler.getDomain(IUserMacroEnginConstant.TRAN_BLOCK_BEGIN_MACRONAME);
return tokenDomain!=null;
}
//��ȡ��ȷ�IJ�������@occur_balance*-1����ȡ����Ӧ����@occur_balance����@��ͷ����ȡ��ʵĬ��ֵ
private String getRealFieldName(String fieldName, String type, IARESProject project) throws Exception{
Pattern p = Pattern.compile("@[\\w\\d_]+");
Matcher m = p.matcher(fieldName);
if(m.find()){
return m.group();
}
return AtomFunctionCompilerUtil.getTrueDefaultValueByType(type, fieldName, project);
}
//����type��ȡ��������ʵ����
private String getRealType(Parameter param,IARESProject project,Map<Object,Object> context){
return AtomFunctionCompilerUtil.getRealDataType(param.getId(), project,context);
}
private final String CALL_BODY = ":iReturnCode := %1$s (" + ITokenConstant.NL
+"%2$s" + ITokenConstant.NL
+");" + ITokenConstant.NL
+"if :iReturnCode != 0 then" + ITokenConstant.NL
+"%3$s" + ITokenConstant.NL
+"else" + ITokenConstant.NL
+":@error_pathinfo := :v_error_pathinfo_tmp;" + ITokenConstant.NL
+"end if;" + ITokenConstant.NL;
}