/** * <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.macro.TokenDomain; import com.hundsun.ares.studio.atom.compiler.mysql.token.PROCGetRecordEndToken; import com.hundsun.ares.studio.engin.constant.IEngineContextConstant; import com.hundsun.ares.studio.engin.constant.ITokenConstant; import com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler; import com.hundsun.ares.studio.engin.skeleton.ISkeletonAttributeHelper; import com.hundsun.ares.studio.engin.token.DefaultTokenEvent; 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.ITokenListenerManager; import com.hundsun.ares.studio.engin.token.macro.IMacroToken; /** * @author zhuyf * */ public class PROCGetRecordEndMacroHandler implements IMacroTokenHandler { /* (non-Javadoc) * @see com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler#getKey() */ @Override public String getKey() { return MacroConstant.PROC_GET_RECORD_END_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.����Ƿ���[PRO*C��¼��ȡ��ʼ]�ɶ�ƥ�� 2.����������䣺 EXEC SQL FETCH cursor[�����]+[���] INTO [�ֶ��б�@ת��Ϊproc����]; if ((SQLCODE != OK_SUCCESS) && (SQLCODE != 100) && (SQLCODE != 1403)) { iReturnCode = SQLCODE; @error_no = SQLCODE; hs_strcpy(@error_info, sqlca.sqlerrm.sqlerrmc); @error_id = 0; } } while (SQLCODE == OK_SUCCESS); } else if ((SQLCODE != 100) && (SQLCODE != 1403)) { iReturnCode = SQLCODE; @error_no = SQLCODE; hs_strcpy(@error_info, sqlca.sqlerrm.sqlerrmc); @error_id = 0; } EXEC SQL CLOSE cursor[�����]+[���]; if ( (iReturnCode != 0) || (SQLCODE != OK_SUCCESS) ) goto svr_end; �����ֶ��б�ȡ�Գɶ�ƥ���[PRO*C��¼��ȡ��ʼ][Ҫ����ֶ��б�] */ addMacroNameToMacroList(token,context);//�Ѻ����ӵ������ݿ��б��Լ�proc�б��� List<ICodeToken> codeList = new ArrayList<ICodeToken>(); if(!checkIsMacroMatch(context)){//���PRO*C��¼��ȡ�������Ƿ���PRO*C��¼��ȡ��ʼ��ƥ�� fireEvent(context);// ����ȱ��PRO*C��¼��ȡ��ʼ���¼� } String lastId = getRsId(context); List<String> sqlFields =this.getSqlFields(context);//ȡ���ֶ��б� codeList.add(new PROCGetRecordEndToken(token,lastId));//��Ӻ�codeToken removeDomain(context);//ɾ���� return codeList.iterator(); } /* * * �����PRO*C��¼��ȡ�������Ƿ���PRO*C��¼��ȡ��ʼ��ƥ�� * @return */ private boolean checkIsMacroMatch(Map<Object, Object> context){ IDomainHandler handler = (IDomainHandler) context.get(IEngineContextConstant.DOMAIN_HANDLER); ITokenDomain procGetRecordBeginDomain =handler.getDomain(MacroConstant.PROC_GET_RECORD_BEGIN_MACRONAME); //���ǰ����PRO*C��¼��ȡ��ʼ��procGetRecordBeginDomain��Ϊnull return procGetRecordBeginDomain!=null; } /** * ɾ���� */ private void removeDomain(Map<Object, Object> context){ IDomainHandler handler = (IDomainHandler) context.get(IEngineContextConstant.DOMAIN_HANDLER); handler.removeDomain(MacroConstant.PROC_BLOCK_BEGIN_MACRONAME); } /** * ������ */ private ITokenDomain getDomain(Map<Object, Object> context){ IDomainHandler handler = (IDomainHandler) context.get(IEngineContextConstant.DOMAIN_HANDLER); return handler.getDomain(MacroConstant.PROC_GET_RECORD_BEGIN_MACRONAME); } /** * ����ȱ��PRO*C��¼��ȡ��ʼ�¼� */ private void fireEvent(Map<Object, Object> context){ ITokenListenerManager manager = (ITokenListenerManager)context.get(IEngineContextConstant.TOKEN_LISTENER_MANAGER); String message = String.format("��[%1s]ȱ�ٺ�[%2s]", this.getKey(),MacroConstant.PROC_GET_RECORD_BEGIN_MACRONAME); manager.fireEvent(new DefaultTokenEvent(ITokenConstant.EVENT_ENGINE_WARNNING,message)); } /** * �Ѻ������뵽���б��� */ 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���б��� } /** * @return ȡ���ֶ����� */ private List<String> getSqlFields(Map<Object, Object> context){ ITokenDomain domain = getBeginDomain(context); return (List<String>)domain.getArgs()[1]; } private String getRsId(Map<Object, Object> context){ ITokenDomain domain = getBeginDomain(context); return (String)domain.getArgs()[0]; } /** * ����� */ private ITokenDomain getBeginDomain(Map<Object, Object> context){ IDomainHandler handler = (IDomainHandler) context.get(IEngineContextConstant.DOMAIN_HANDLER); return handler.getDomain(MacroConstant.PROC_GET_RECORD_BEGIN_MACRONAME); } }