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; }