/**
* <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 java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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.PROCGetRecordBeginToken;
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 PROCGetRecordBeginMacroHandler implements IMacroTokenHandler {
/* (non-Javadoc)
* @see com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler#getKey()
*/
@Override
public String getKey() {
return MacroConstant.PROC_GET_RECORD_BEGIN_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 == -28) || (SQLCODE == -1012) )
lpConn->setErrMessage(HSDB_CONNECT_DISCONN,SQLCODE,sqlca.sqlerrm.sqlerrmc);
if (SQLCODE == OK_SUCCESS)
{
do
{
*/
List<ICodeToken> codeToken = new ArrayList<ICodeToken>(1);
addProcVarLis( token,context);//����SQL����е�@���������뵽PRO*C���������б���
//ISkeletonAttributeHelper helper = (ISkeletonAttributeHelper)context.get(IAtomEngineContextConstantMySQL.SKELETON_ATTRIBUTE_HELPER);
String lastId = getRsId(context);
List<String> sqlFields =this.getSqlFields(context);//ȡ���ֶ��б�
codeToken.add(new PROCGetRecordBeginToken(token,context,lastId,sqlFields));//����codeToken
addDomain(context);//�����
removeDomain(context);
return codeToken.iterator();//���ش˺�codeToken�б�
}
/**
* ����SQL����е�@���������뵽PRO*C���������б���
* @param procVarList
*/
private void addProcVarLis(IMacroToken token,Map<Object, Object> context ){
ISkeletonAttributeHelper helper = (ISkeletonAttributeHelper)context.get(IAtomEngineContextConstantMySQL.SKELETON_ATTRIBUTE_HELPER);
List<String> popVarList = (List<String>)context.get(IEngineContextConstant.PSEUDO_CODE_PARA_LIST);
Pattern p = Pattern.compile("@[\\w\\d_]+");
//sql����ڵ�һ������
Matcher m = p.matcher(token.getParameters()[0]);
while (m.find()) {
popVarList.add(m.group().substring(1));
}
}
/**
* �����
*/
private void addDomain(Map<Object, Object> context){
IDomainHandler handler = (IDomainHandler) context.get(IEngineContextConstant.DOMAIN_HANDLER);
Object[] args = new Object[2];
args[0] = getRsId(context);//��ӽ����Id��������������ػ�PRO*C��¼��ȡ��ʼ��PRO*C��¼��ȡ���������ɴ���ʱ��Ҫʹ�á�
args[1] = getSqlFields(context);//�α��ֶ�����
handler.addDomain(new TokenDomain(getKey(),args));
}
/**
* @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);
}
}