/** * <p>Copyright: Copyright (c) 2013</p> * <p>Company: �������ӹɷ����޹�˾</p> */ package com.hundsun.ares.studio.atom.compiler.mysql.macro.handlers; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import com.hundsun.ares.studio.atom.compiler.mysql.constant.IAtomEngineContextConstantMySQL; import com.hundsun.ares.studio.atom.compiler.mysql.macro.MacroConstant; import com.hundsun.ares.studio.atom.compiler.mysql.token.PROCResultSetReturnToken; import com.hundsun.ares.studio.engin.constant.IEngineContextConstant; import com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler; import com.hundsun.ares.studio.engin.skeleton.ISkeletonAttributeHelper; 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; /** * @author zhuyf * */ public class PROCResultSetReturnMacroHandler implements IMacroTokenHandler { /* (non-Javadoc) * @see com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler#getKey() */ @Override public String getKey() { return MacroConstant.PROC_RESULTSET_RETURN_MACRONAME; } /* (non-Javadoc) * @see com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler#handle(com.hundsun.ares.studio.engin.token.macro.IMacroToken, java.util.Map) */ @Override public Iterator<ICodeToken> handle(IMacroToken token, Map<Object, Object> context) throws Exception { /* * ���������� [PRO*C���������] �������̣� 1.����������䣺 @result_num = 0; [�α����������ֶ�] while ( SQLCODE == OK_SUCCESS ) '{' EXEC SQL FETCH cursor[�����]+[���] INTO: [�оٽ�����ֶβ����ֶ�������α��׺]; if ( (SQLCODE == -28) || (SQLCODE == -1012) ) lpConn->setErrMessage(HSDB_CONNECT_DISCONN,SQLCODE,sqlca.sqlerrm.sqlerrmc); if ( SQLCODE == OK_SUCCESS) '{' @result_num = @result_num + 1; [�α����������ֶ�ֵ] '}' else break; '}' EXEC SQL CLOSE cursor[�����]+[���]; 2.����[�α����������ֶ�]Ϊ��Ԥ���PROC������ֶ��б��б����ֶΣ���ÿһ�ֶ����ɣ� lpOutPacker->AddField("[�ֶ���]"); ע������������͵IJ���������Ҳ�������仯 3.[�оٽ�����ֶβ����ֶ�������α��׺]Ϊ��Ԥ���PROC������ֶ��б��б����ֶΣ���ÿһ�ֶ����ɣ� [�ֶ���]_cur ������ΪProc����������proc���������б��� 4.[�α����������ֶ�ֵ]Ϊ��Ԥ���PROC������ֶ��б��б����ֶΣ���ÿһ�ֶ����ɣ� lpOutPacker->Add[�ֶ�����]([�ֶ���]_cur); //[�ֶ�ע��] */ addMacroNameToMacroList(token,context);//�Ѻ����ص������ݿ���Լ�proc���б��� addVarList(context);//�ѱ������뵽�����б���ȥ List<ICodeToken> codeList = new ArrayList<ICodeToken>(); String rsId = getRsId(context); List<String> sqlFields =this.getSqlFields(context);//ȡ���ֶ��б� codeList.add(new PROCResultSetReturnToken(rsId,sqlFields) );//���CodeToken removeDomain(context);//ɾ���� return codeList.iterator(); } /** * �Ѻ������뵽���б��� */ private void addMacroNameToMacroList(IMacroToken token, Map<Object, Object> context){ ISkeletonAttributeHelper helper = (ISkeletonAttributeHelper)context.get(IAtomEngineContextConstantMySQL.SKELETON_ATTRIBUTE_HELPER); helper.addAttribute(IAtomEngineContextConstantMySQL.ATTR_DATABASE_MACRO,token.getKeyword());//��ӵ����ݿ��б��� helper.addAttribute(IAtomEngineContextConstantMySQL.ATTR_PROC_MACRO,token.getKeyword());//��ӵ�proc���б��� } /** * ���ֶι���ӵ������б���ȥ * * @param procVarList */ private void addVarList(Map<Object, Object> context) { List<String> popVarList = (List<String>)context.get(IEngineContextConstant.PSEUDO_CODE_PARA_LIST); //���뵽proc�����б��У�����proc����������proc���������� List<String> varList = new ArrayList<String>(5); varList.add("result_num"); varList.add("error_no"); varList.add("error_info"); varList.add("error_sysinfo"); varList.add("error_id"); for(String varName:varList){ popVarList.add(varName); } } /** * @return ȡ���ֶ����� */ private List<String> getSqlFields(Map<Object, Object> context){ ITokenDomain domain = getDomain(context); return (List<String>)domain.getArgs()[1]; } private String getRsId(Map<Object, Object> context){ ITokenDomain domain = getDomain(context); return (String)domain.getArgs()[0]; } /** * ����� */ private ITokenDomain getDomain(Map<Object, Object> context){ IDomainHandler handler = (IDomainHandler) context.get(IEngineContextConstant.DOMAIN_HANDLER); return handler.getDomain(MacroConstant.PROC_RESULTSET_STATEMENT_MACRONAME); } /** * ɾ���� */ private void removeDomain(Map<Object, Object> context){ IDomainHandler handler = (IDomainHandler) context.get(IEngineContextConstant.DOMAIN_HANDLER); handler.removeDomain(MacroConstant.PROC_RESULTSET_STATEMENT_MACRONAME); } }