示例#1
0
void OracleRefCursor()
{
	SAConnection con;

	try
	{
		SACommand cmd(&con);

		con.Connect(
			"demo", "scott", "tiger", SA_Oracle_Client);
		cout << "Connected OK!" << "\n";

		cmd.setCommandText("TestRefCursorPkg.TestRefCursorProc");
		cmd.Execute();
		cout << "Stored procedure executed OK!" << "\n";

		SACommand *pRefCursor = cmd.Param("REFCURSOR");
		while(pRefCursor->FetchNext())
		{
			cout 
				<< (const char*)pRefCursor->Field(1).Name() << "="
				<< (const char*)pRefCursor->Field(1).asString() << "\n";
		}
		cout << "Ref cursor fetched OK!" << "\n";
	}
    catch(SAException &x)
    {
        // SAConnection::Rollback()
        // can also throw an exception
        // (if a network error for example),
        // we will be ready
        try
        {
            // on error rollback changes
            con.Rollback();
        }
        catch(SAException &)
        {
        }
        // print error message
        cout << (const char*)x.ErrText() << "\n";
    }
}
示例#2
0
/**< 生成渠道流水 */
int COperateDB::MyBeforeInsertDB(SAConnection *pSaconn, TRADEDATA *pData)
{
	if (pSaconn == NULL || pData == NULL)
	{
		trace_log(ERR, "Parameter error!");
		return -1;
	}
	char cOrgVouchNo[8] = { 0 };
	char cCurTime[15] = {0};
	SAString sSql;
	SACommand Cmd;
	Cmd.setConnection(pSaconn);
	try
	{
	   /**<  如果有原交易流水ID,则先取原交易流水号*/
		if (pData->TransData.HeadData.nOrigLFlowID > 0)
		{
			sSql.Format("select CTL_VOUCHNO, CTL_BATCHNO, to_char(SYSDATE, 'yyyymmddHH24MISS') CTL_TIME, "
				         "lpad(CTL_AMOUNT, 12, '0') CTL_AMOUNT, CTL_REFERENCE, CTL_AUTHCODE,to_char(CTL_CUPTIME,'mmddHH24MISS') ori_trandatetime from T_CHANNEL_TRADELIST"
					    " where RTL_TLAUTOID='%ld'", pData->TransData.HeadData.nOrigLFlowID);
			Cmd.setCommandText(sSql);
			Cmd.Execute();
			if (Cmd.FetchNext())
			{
                // 左边没送金额才取原金额
                if (atoi(pData->TransData.HeadData.ReqAmount) <= 0)
                    strncpy(pData->TransData.HeadData.ReqAmount, (char *)_T(Cmd.Field("CTL_AMOUNT").asString()),Cmd.Field("CTL_AMOUNT").asString().GetLength());

                if(Cmd.Field("CTL_VOUCHNO").asString().GetLength() > 0)
                {
                    strncpy(cOrgVouchNo, (char *)_T(Cmd.Field("CTL_VOUCHNO").asString()), 6);
                    memcpy(pData->TransData.HeadData.OrigLPosSeq, cOrgVouchNo,strlen(cOrgVouchNo)); //暂时将原流水号保存于该字段
                    trace_log(DBG,"[CTL_VOUCHNO]:%s ",_T(Cmd.Field("CTL_VOUCHNO").asString()));
                }

                if(Cmd.Field("CTL_BATCHNO").asString().GetLength() > 0)
                {
                    //暂时将原批次号保存于OrigLBatchNo
                    memcpy(pData->TransData.HeadData.OrigLBatchNo, Cmd.Field("CTL_BATCHNO").asString(),Cmd.Field("CTL_BATCHNO").asString().GetLength());
                    trace_log(DBG,"[CTL_BATCHNO]:%s ",_T(Cmd.Field("CTL_BATCHNO").asString()));
                }

                if(Cmd.Field("CTL_REFERENCE").asString().GetLength() > 0)
                {
                    trace_log(DBG,"CTL_REFERENCE[%s]", _T(Cmd.Field("CTL_REFERENCE").asString()));
                    memcpy(pData->TransData.HeadData.SysRefNo,_T(Cmd.Field("CTL_REFERENCE").asString()),Cmd.Field("CTL_REFERENCE").asString().GetLength());
                }
                if(Cmd.Field("CTL_AUTHCODE").asString().GetLength() > 0)
	            {
                    trace_log(DBG,"CTL_AUTHCODE[%s]", _T(Cmd.Field("CTL_AUTHCODE").asString()));
                    memcpy(pData->TransData.HeadData.OrigAuthCode,_T(Cmd.Field("CTL_AUTHCODE").asString()),Cmd.Field("CTL_AUTHCODE").asString().GetLength());
                }
                if(Cmd.Field("ori_trandatetime").asString().GetLength()> 0)
                {
                    memcpy(pData->cOri_DateTime,_T(Cmd.Field("ori_trandatetime").asString()),Cmd.Field("ori_trandatetime").asString().GetLength());
                    trace_log(DBG, "[trandatetime]:%s ", _T(Cmd.Field("ori_trandatetime").asString()));
                }
            }
        }


		/**<  获取自动编号和日期时间*/
        sSql.Format("select SEQ_C_TRADELIST_ATUOID.NEXTVAL NEXTVAL, to_char(SYSDATE, 'yyyymmddHH24MISS') CURTIME from dual");
		Cmd.setCommandText(sSql);
		Cmd.Execute();
		if (Cmd.FetchNext())
		{
			pData->iRAutoId = Cmd.Field("NEXTVAL").asLong();
			int nLen = Cmd.Field("CURTIME").asString().GetLength();
			if(nLen > 0) memcpy(cCurTime, _T(Cmd.Field("CURTIME").asString()), nLen);
			trace_log(DBG, "CURTIME[%s] ", cCurTime);
		}else{
			trace_log(ERR, "Get NEXTVAL fail[sql:%s]!", _T(sSql));
			return -1;
		}

		if(strlen(pData->TransData.HeadData.ReqAmount) == 0) strcpy(pData->TransData.HeadData.ReqAmount, "0");
		//添加渠道手续费
		long pTradeFee = 0;
		char cTime[9]={0};
		memcpy(cTime,cCurTime,8);
		sSql.Format("insert into T_CHANNEL_TRADELIST(CTL_AUTOID, CF_INTERFACE, RTL_TLAUTOID, CT_TMNL, CM_MCHT, CTL_TYPE, CTL_CARDNO,"
					"CTL_AMOUNT, CTL_VOUCHNO, CTL_BATCHNO, CTL_ORIGVOUCH, CTL_ORGIBATCH, CTL_TIME,CTL_RECKON,CTL_CUPTIME, CTL_SATATE, CTL_EXPENSE) "
					"values('%ld', '%d','%ld', '%s', '%s', '%c', '%s', '%s', '%s', '%s', '%s', '%s', to_date('%s','yyyymmddHH24MISS'),TO_DATE('%s', 'yyyymmdd') + 1, to_date('%s','yyyymmddHH24MISS'), '%c', '%ld')",
					pData->iRAutoId, pData->TransData.HeadData.nInterface, pData->TransData.HeadData.nLFlowID, pData->TransData.HeadData.arrRTermNo,
					pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.RTradeType,
					pData->TransData.HeadData.RTradeType == POS_SIGN ? "" : pData->TransData.HeadData.Account,
					pData->TransData.HeadData.ReqAmount, pData->VouchNo, pData->BatchNo, cOrgVouchNo,
					pData->TransData.HeadData.OrigLBatchNo, cCurTime, cTime, cCurTime,ST_HASSEND, pTradeFee);
		Cmd.setCommandText(sSql);
		trace_log(DBG, "Sql: %s",_T(sSql));
		Cmd.Execute();
        pSaconn->Commit();
	}catch (SAException &e){
		pSaconn->Rollback();
		trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql));
		return -1;
	}catch (...){
		trace_log(ERR, "Execute sql fail[sql:%s]!", _T(sSql));
		return -1;
	}
	return 0;
}
示例#3
0
/**< 更新渠道流水 */
int COperateDB::MyAfterUpdateDB(SAConnection *pSaconn, TRADEDATA *pData, char status,char* respcode, char * respcode_desc)
{
	if (pSaconn == NULL || pData == NULL)
	{
		trace_log(ERR, "Parameter error!");
		return -1;
	}
	SAString sSql;
	SACommand Cmd;
	Cmd.setConnection(pSaconn);
	try
	{
        char DateTime[16]={0};
        char cDate[5]={0};
        int nTmpDataLen = 0;
        // 解tlv包
        CTLVTemplet TlvObj;
        TlvObj.UnPackTLVData(pData->TransData.TlvDataLen,pData->TransData.TlvData);
        //获取银行交易时间
        nTmpDataLen = TlvObj.GetTLVItemByHex(TAG_DATETIME, (BYTE *)DateTime, sizeof(DateTime));
        if(nTmpDataLen > 0)
        {
            memcpy(cDate, DateTime, sizeof(cDate) -1);
        }
        /**< 更新交易流水表 */
		if (4 > strlen(pData->TransData.HeadData.SettDate) || 10 > strlen(DateTime)) //判断时间日期不合法性
		{
			sSql.Format("update T_CHANNEL_TRADELIST set CTL_CARDNO='%s', CTL_REFERENCE='%s',CTL_CUPTIME=nvl(TO_DATE('%s', 'MM-DD HH24:MI:SS'),CTL_CUPTIME), \
					CTL_RECKON=nvl(TO_DATE('%s', 'MM-DD') + 1,ctl_reckon),CTL_AUTHCODE='%s', CTL_SATATE='%c',CTL_REPCODE='%s', CTL_DEMO='%s' where CTL_AUTOID = '%ld'",
					pData->TransData.HeadData.Account, pData->TransData.HeadData.SysRefNo,DateTime,
					cDate,pData->TransData.HeadData.OrigAuthCode, status, respcode,respcode_desc,	pData->iRAutoId);
		}else{
			sSql.Format("update T_CHANNEL_TRADELIST set CTL_CARDNO='%s', CTL_REFERENCE='%s', \
					CTL_RECKON=TO_DATE('%s', 'MM-DD'),CTL_CUPTIME=nvl(TO_DATE('%s', 'MM-DD HH24:MI:SS'),CTL_CUPTIME), \
					CTL_AUTHCODE='%s', CTL_SATATE='%c',CTL_REPCODE='%s', CTL_DEMO='%s' where CTL_AUTOID = '%ld'",
					pData->TransData.HeadData.Account, pData->TransData.HeadData.SysRefNo,
					pData->TransData.HeadData.SettDate, DateTime,
					pData->TransData.HeadData.OrigAuthCode, status, respcode,respcode_desc,	pData->iRAutoId);
		}
		trace_log(DBG, "Sql: %s",_T(sSql));
		Cmd.setCommandText(sSql);
		Cmd.Execute();

		/**<取原交易的索引ID  */
		int nOrigAutoID = 0;
		POS_TRADE_TYPE posType = (POS_TRADE_TYPE)pData->TransData.HeadData.RTradeType;
		if(posType < POS_PAYBACK && posType >=POS_UNCONSUME)
		{
			sSql.Format("select CTL_AUTOID from T_CHANNEL_TRADELIST where RTL_TLAUTOID='%ld'",
			    pData->TransData.HeadData.nOrigLFlowID);
			Cmd.setCommandText(sSql);
			Cmd.Execute();

			if(Cmd.FetchNext())
			{
				nOrigAutoID = Cmd.Field("CTL_AUTOID").asLong();
				trace_log(DBG, "CTL_AUTOID[%d]", nOrigAutoID);
			}else{
				trace_log(ERR, "Get CTL_AUTOID fail[sql:%s]!", _T(sSql));
				return -1;
			}
		}

        if(posType < POS_UNCONSUME || posType > POS_PAYBACK)
        {
            //保存冲正信息
            sSql.Format("update T_CHANNEL_RESETLIST set FIELD12='%s',FIELD13='%s',FIELD15='%s',FIELD37='%s',"
                "FIELD39='%s' where FIELD41='%s' and FIELD42='%s' and FIELD11='%s' and CRT_BATCHNO='%s' "
                "and CRT_TYPE='%c'", DateTime + 4, cDate, pData->TransData.HeadData.SettDate,
                pData->TransData.HeadData.SysRefNo, pData->TransData.HeadData.RspCode,
                pData->TransData.HeadData.arrRTermNo, pData->TransData.HeadData.arrRMerchNo, pData->VouchNo,
                pData->BatchNo, posType);
            Cmd.setCommandText(sSql);
            Cmd.Execute();
            trace_log(DBG, "Sql: %s", _T(sSql));
        }

		//修改原交易状态
		if(status == ST_SUCCESS && (posType == POS_REPEAL || posType == POS_PREAUTHREVE ||posType == POS_PREAUTHCPLREVE))
		{
			//原交易状态改为已撤销
			sSql.Format("update T_CHANNEL_TRADELIST set CTL_SATATE='%c' where CTL_AUTOID='%ld'",ST_HASRPL, nOrigAutoID);
			Cmd.setCommandText(sSql);
			Cmd.Execute();
		}else if(posType >= POS_UNCONSUME && posType < POS_PAYBACK ){
			if(strcmp(pData->TransData.HeadData.RspCode, "00") == 0 || strcmp(pData->TransData.HeadData.RspCode, "25") == 0)
			{
				//删除冲正信息
				map<POS_TRADE_TYPE, POS_TRADE_TYPE> ::iterator it =CTradeDoReset::m_unTradeOrgMap.find( posType);
                if(it!=CTradeDoReset::m_unTradeOrgMap.end())
                {
                    sSql.Format("delete from T_CHANNEL_RESETLIST where FIELD41='%s' and FIELD42='%s' and FIELD13<>to_char(sysdate,'mmdd') and CRT_TYPE='%c'",
                                 pData->TransData.HeadData.arrRTermNo,pData->TransData.HeadData.arrRMerchNo, it->second);
                    Cmd.setCommandText(sSql);
                    Cmd.Execute();
                    //交易状态改为已冲正
                    sSql.Format("update T_CHANNEL_TRADELIST set CTL_SATATE='%c' where CTL_AUTOID='%ld'",ST_HASRST, nOrigAutoID);
                    Cmd.setCommandText(sSql);
                    trace_log(DBG, "pData->VouchNo=%s, pData->BatchNo=%s", pData->VouchNo, pData->BatchNo);
                    Cmd.Execute();
                    //更新原交易状态
                    if(posType == POS_UNREPEAL || posType == POS_UNPREAUTHREVE ||posType == POS_UNPREAUTHCPLREVE)
                    {
                        sSql.Format("select CTL_ORIGVOUCH,CTL_ORGIBATCH,CTL_TYPE from T_CHANNEL_TRADELIST where CTL_AUTOID = %d", nOrigAutoID);
                        Cmd.setCommandText(sSql);
                        Cmd.Execute();
                        if(Cmd.FetchNext())
                        {
                            char cOrgBatch[7] = {0};
                            char cOrgVouch[7] = {0};
                            int nLen = Cmd.Field("CTL_ORIGVOUCH").asString().GetLength();
                            memcpy(cOrgVouch, Cmd.Field("CTL_ORIGVOUCH").asString(), nLen);

                            nLen = Cmd.Field("CTL_ORGIBATCH").asString().GetLength();
                            memcpy(cOrgBatch, Cmd.Field("CTL_ORGIBATCH").asString(), nLen);

                            char cType;
                            memcpy(&cType, Cmd.Field("CTL_TYPE").asString(), 1);
                            it =CTradeDoReset::m_unTradeOrgMap.find( (POS_TRADE_TYPE)cType);
                            if(it!=CTradeDoReset::m_unTradeOrgMap.end())
                            {
                                sSql.Format("update T_CHANNEL_TRADELIST set CTL_SATATE='%c' where CM_MCHT='%s' "
                                    "and CT_TMNL='%s' and CTL_TYPE='%c' and CTL_VOUCHNO='%s' and CTL_BATCHNO='%s'",
                                    ST_SUCCESS, pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.arrRTermNo,
                                    it->second, cOrgVouch, cOrgBatch);
                                Cmd.setCommandText(sSql);
                                Cmd.Execute();
                                trace_log(DBG, "Sql: %s", _T(sSql));
                            }
                        }
                    }
                }
			}else{
				//更新冲正表
				sSql.Format("update T_CHANNEL_RESETLIST set FIELD12='%s',FIELD13='%s',FIELD15='%s',FIELD39='%s' "
					"where FIELD41='%s' and FIELD42='%s' and FIELD11='%s' and CRT_BATCHNO='%s' and CRT_TYPE='%c'",
					DateTime + 4, cDate, pData->TransData.HeadData.SettDate, pData->TransData.HeadData.RspCode,
					pData->TransData.HeadData.arrRTermNo, 	pData->TransData.HeadData.arrRMerchNo, pData->VouchNo,
					pData->BatchNo, pData->TransData.HeadData.RTradeType);
				Cmd.setCommandText(sSql);
				Cmd.Execute();
			}
		}
        pSaconn->Commit();
	}catch (SAException &e){
		pSaconn->Rollback();
		trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql));
		return -1;
	}catch (...){
		trace_log(ERR, "Execute sql fail[sql:%s]!", _T(sSql));
		return -1;
	}
	return 0;
}
示例#4
0
/** \brief
 * 获取冲正数据
 * \param
 * \param
 * \return
 *
 */
int COperateDB::GetResetData(SAConnection *pSaconn, TRADEDATA *pData, CUPS8583 *sendObj)
{
    SAString sSql,str;
    SACommand Cmd;
    Cmd.setConnection(pSaconn);
	try
	{
	    POS_TRADE_TYPE posType = (POS_TRADE_TYPE)pData->TransData.HeadData.RTradeType;
	    map<POS_TRADE_TYPE, POS_TRADE_TYPE> ::iterator it =CTradeDoReset::m_unTradeOrgMap.find( posType);
	    if(it==CTradeDoReset::m_unTradeOrgMap.end())
        {
            trace_log(ERR,"No the Reset trade");
            return -1;
        }
        sSql.Format("select FIELD2,FIELD3,FIELD4,FIELD11,FIELD22,FIELD35,FIELD36,FIELD38,FIELD41,"
            "FIELD42,FIELD48,FIELD49 from T_CHANNEL_RESETLIST where FIELD11='%s' and FIELD41='%s'"
            " and FIELD42='%s' and CRT_TYPE='%c' and CRT_BATCHNO='%s'", pData->TransData.HeadData.OrigLPosSeq,
            pData->TransData.HeadData.arrRTermNo, pData->TransData.HeadData.arrRMerchNo,
            it->second, pData->TransData.HeadData.OrigLBatchNo);
        Cmd.setCommandText(sSql);
        Cmd.Execute();
        if(!Cmd.FetchNext())
        {
            trace_log(ERR, " no found the original trans  sql=[%s]!", _T(sSql));
            memcpy(pData->TransData.HeadData.RspCode, "25",2);
            return RET_SYSEXP;
        }
	    //2账号
	   sendObj->SetValueByStr(2, _T(Cmd.Field("FIELD2").asString()));
	    //3处理码
	   sendObj->SetValueByStr(3, _T(Cmd.Field("FIELD3").asString()));
	    //4金额
	   sendObj->SetValueByStr(4, _T(Cmd.Field("FIELD4").asString()));
        //22 输入方式
        sendObj->SetValueByStr(22, _T(Cmd.Field("FIELD22").asString()));
        //35 二磁道
        str = Cmd.Field("FIELD35").asString();
        if(str.GetLength() > 0)
        {
           sendObj->SetValueByStr(35, _T(str));
        }

        //36 三磁道
        str = Cmd.Field("FIELD36").asString();
        if(str.GetLength() > 0)
        {
            sendObj->SetValueByStr(36, _T(str));
        }
        //38 预授权
        str = Cmd.Field("FIELD38").asString();
        if(str.GetLength() > 0)
        {
            sendObj->SetValueByStr(38, _T(str));
        }
         //41终端号
	    sendObj->SetValueByStr(41, _T(Cmd.Field("FIELD41").asString()));
	    //42商户号
	    sendObj->SetValueByStr(42, _T(Cmd.Field("FIELD42").asString()));

        //48 自定义域
        str = Cmd.Field("FIELD48").asString();
        if(str.GetLength() > 0)
        {
            sendObj->SetValueByStr(48, _T(str));
        }
        //49 货币代码
       sendObj->SetValueByStr(49, _T(Cmd.Field("FIELD49").asString()));

        //62原始交易信息(信息类型码,系统跟踪号,交易日期和时间)
        char cData[7]={0},cTran[5]={0};
        BYTE bTmpData[FIELD_MAXLEN]={0};
        if( posType==POS_UNPREAUTH||posType==POS_UNPREAUTHREVE)
        {
           strcpy(cTran,"0100");/**< 预授权和预授权撤销为‘0100’ ,别的四个交易类型为‘0200’*/
        }else{
            strcpy(cTran,"0200");
        }
        memcpy(cData,Cmd.Field("FIELD11").asString(),Cmd.Field("FIELD11").asString().GetLength());
        memset(bTmpData, 0, sizeof(bTmpData));
        sprintf((char *)bTmpData, "%s%s%s",cTran, cData,pData->cOri_DateTime);
        sendObj->SetValueByStr(62, (char *)bTmpData);

        return 0;
	}catch (SAException &e){
		pSaconn->Rollback();
		trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql));
		return -1;
	}catch (...){
		trace_log(ERR, "Execute sql fail[sql:%s]!", _T(sSql));
		return -1;
	}

}
示例#5
0
/**<  获取渠道部分信息*/
int COperateDB::GetChannelInfo(SAConnection * pSaconn, TRADEDATA * pData)
{
    if (NULL == pData || NULL == pSaconn)
	{
		trace_log(ERR, "GetChannelInfo: param error.");
		return -1;
	}
    int nLen = 0;
    char cDate[5] = {0};
	char cCurTime[9] = {0};
    struct tm stCurTime;
	time_t ltime;
	time( &ltime );
	localtime_xgd(&ltime, &stCurTime);
    sprintf(cCurTime, "%4d%02d%02d", stCurTime.tm_year + 1900, stCurTime.tm_mon + 1,stCurTime.tm_mday);
	if(!pData->bIsLogin)
    {
        SAString sSql;
        SACommand Cmd;
        Cmd.setConnection(pSaconn);
        try{
            sSql.Format("select cf_sign,cf_signdate from t_channel_finance  where cf_interface =%d",pData->TransData.HeadData.nInterface );
            Cmd.setCommandText(sSql);
            Cmd.Execute();
            if(Cmd.FetchNext())
            {
                char cDownSign[2]={0}; /**<是否所有的重新 签到 */
                nLen = Cmd.Field("cf_sign").asString().GetLength();
                if(nLen > 0)
					memcpy(cDownSign, Cmd.Field("cf_sign").asString(), nLen);
				nLen = Cmd.Field("cf_signdate").asString().GetLength();
                if(nLen > 0)
					memcpy(cDate, Cmd.Field("cf_signdate").asString(), nLen);
				char cCurDate[32] = {0};
                struct tm stCurTime;
                time_t ltime;
                time( &ltime );
                strftime(cCurDate, sizeof(cCurDate), "%Y%m%d%H%M%S", localtime_xgd(&ltime, &stCurTime));
                trace_log(DBG, "cDownSign = %s,cCurDate = %s",cDownSign,cCurDate);
                if(cDownSign[0] != '1' || strncmp(cDate, cCurDate+4, 4) != 0)
                {
                     pData->bIsLogin = true;
                }
            }else{
                trace_log(ERR, "Execute sql failed[sql:%s]!", _T(sSql));
                return -1;
            }
			sSql.Format("select m.cm_name, t.CT_VOUCHNO,t.CT_BATCHNO from T_CHANNEL_MERCHANT m,T_CHANNEL_TERMINAL t "
            " where m.cf_interface=t.CF_INTERFACE and m.cm_mcht=t.CM_MCHT and  t.CT_STATUS = '1' and t.CM_MCHT = '%s' and t.CT_TMNL = '%s' and t.CF_INTERFACE=%d",
            pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.arrRTermNo,pData->TransData.HeadData.nInterface);
            Cmd.setCommandText(sSql);
            Cmd.Execute();
            if(Cmd.FetchNext())
            {
                /**< 流水号 */
                nLen = Cmd.Field("CT_VOUCHNO").asString().GetLength();
                if(nLen > 0)
                {
                    memcpy(pData->VouchNo, Cmd.Field("CT_VOUCHNO").asString(), nLen);
                    trace_log(DBG, "pData->VouchNo = %s", pData->VouchNo);
                }else{
                    memcpy(pData->VouchNo,"000001",6);
                    trace_log(DBG, "pData->VouchNo = 000001");
                }
                /**< 批次号 */
                nLen = Cmd.Field("CT_BATCHNO").asString().GetLength();
                if(nLen > 0)
                {
                    memcpy(pData->BatchNo, Cmd.Field("CT_BATCHNO").asString(), nLen);
                    trace_log(DBG, "pData->BatchNo = %s", pData->BatchNo);
                }else{
                    memcpy(pData->BatchNo, "000001", 6);
                    trace_log(DBG, "pData->BatchNo = %s", "000001");
                }
            }else{
                trace_log(ERR, "Execute sql failed[sql:%s]!", _T(sSql));
                return -1;
            }
			#if SoftEnc

			sSql.Format("select TMK,PINK,MACK,TRACK from T_BANK_KEY where MERNO = '%s' and TERMNO = '%s'",pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.arrRTermNo);
            Cmd.setCommandText(sSql);
            Cmd.Execute();
            if(Cmd.FetchNext())
            {
            	nLen = Cmd.Field("TMK").asString().GetLength();
                if(nLen > 0)
                    memcpy(pData->bMainKey, Cmd.Field("TMK").asString(), nLen);
                nLen = Cmd.Field("PINK").asString().GetLength();
                if(nLen > 0)
                    memcpy(pData->bPinKey, Cmd.Field("PINK").asString(), nLen);
                nLen = Cmd.Field("MACK").asString().GetLength();
                if(nLen > 0)
                    memcpy(pData->bMacKey, Cmd.Field("MACK").asString(), nLen);
				nLen = Cmd.Field("TRACK").asString().GetLength();
                if(nLen > 0)
                    memcpy(pData->bTdkKey, Cmd.Field("TRACK").asString(), nLen);
            }else{
                trace_log(ERR, "Execute sql failed[sql:%s]!", _T(sSql));
                return -1;
            }
			#endif
            return 0;
        }catch (SAException &e){
            pSaconn->Rollback();
            trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql));
            return -1;
        }catch (...){
            trace_log(ERR, "Execute sql failed[sql:%s]!", _T(sSql));
            return -1;
        }
    }
    return 0;
}
void Oracle_OCI_ATTR_CHARSET_FORM_OCI_ATTR_CHARSET_ID()
{
	SAConnection con;
	SACommand cmd;
	cmd.setConnection(&con);

    try
    {
		con.Connect("cit", "dwadm", "dwadm", SA_Oracle_Client);

		bool bDropTable = !false;
		bool bCreateTable = !false;
		if(bDropTable)
		{
			cmd.setCommandText(
				"drop table test_charset");
			cmd.Execute();
		}
		if(bCreateTable)
		{
			cmd.setCommandText(
				"Create table test_charset (f1 nchar(254), f2 char(254))");
			cmd.Execute();
		}

		cmd.setCommandText("delete from test_charset");
		cmd.Execute();

		cmd.setCommandText("insert into test_charset values (:1, :2)");
		cmd.Param(1).setOption("OCI_ATTR_CHARSET_FORM") = "SQLCS_NCHAR";
		cmd.Param(1).setOption("OCI_ATTR_CHARSET_ID") = "171";
		cmd.Param(2).setOption("OCI_ATTR_CHARSET_ID") = "CL8MSWIN1251";

		cmd.Param(1).setAsString() = "string f1 - 1";
		cmd.Param(2).setAsValueRead() = cmd.Param(1);
		cmd.Execute();

		cmd.Param(1).setAsString() = "������ f1 - 2";
		cmd.Param(2).setAsValueRead() = cmd.Param(1);
		cmd.Execute();

		cmd.setCommandText("select * from test_charset");
		cmd.Execute();

		cmd.Field(1).setOption("OCI_ATTR_CHARSET_ID") = "171";
		cmd.Field(2).setOption("OCI_ATTR_CHARSET_ID") = "CL8MSWIN1251";
		while(cmd.FetchNext())
		{
			cout 
				<< (const char*)cmd[1].asString()
				<< ""
				<< (const char*)cmd[2].asString()
				<< endl;
		}
    }
    catch(SAException &x)
    {
        try
        {
            con.Rollback();
        }
        catch(SAException &)
        {
        }
        printf("%s\n", (const char*)x.ErrText());
    }
}
示例#7
0
//冲正
int CTradeDoReset::DoPack(SAConnection *saConn, void * pNode,
                        unsigned char * pBuffer, unsigned & iBufLen)
{
    if(saConn == NULL || pNode == NULL || pBuffer == NULL)
    {
        trace_log(ERR, "Paramter error!");
        return RET_SYSEXP;
    }
    TRADEDATA * pData = (TRADEDATA *)pNode;

    CTLVTemplet tlvObj;
    if(1 != tlvObj.UnPackTLVData(pData->TransData.TlvDataLen, pData->TransData.TlvData))
    {
        trace_log(ERR, "UnPackTLVData fail!");
        return RET_SYSEXP;
    }

    bool bFlag = true;
    //unsigned char cFieldData[FIELD_MAXLEN]={0}, bFieldData[FIELD_MAXLEN]={0}, 
    //unsigned int iFieldDataLen = 0;
    POS_TRADE_TYPE posType = (POS_TRADE_TYPE)pData->TransData.HeadData.RTradeType;

    if(m_unTradeOrgMap.empty())
        initTredeTypeMap();

    //冲正的时候不能隔批次
    if(strcmp(pData->BatchNo, pData->TransData.HeadData.OrigLBatchNo))
    {
        trace_log(ERR, "The original BatchNo is different with the current one");
        return RET_SYSEXP;
    }
    
    SAString sSql;
    SACommand Cmd;
    Cmd.setConnection(saConn);
    try
    {
        //trace_log(DBG, "posType = %c, m_unTradeOrgMap[posType] = %c", posType, m_unTradeOrgMap[posType]);
        sSql.Format("select FIELD2,FIELD3,FIELD4,FIELD11,FIELD14,FIELD22,FIELD32,FIELD33,FIELD35,FIELD36,FIELD41,"
            "FIELD42,FIELD48,FIELD49,FIELD60,FIELD62 from T_CHANNEL_RESETLIST where FIELD11='%s' and FIELD41='%s'"
            " and FIELD42='%s' and CRT_TYPE='%c' and CRT_BATCHNO='%s'", pData->TransData.HeadData.OrigLPosSeq,
            pData->TransData.HeadData.arrRTermNo, pData->TransData.HeadData.arrRMerchNo,
            m_unTradeOrgMap[posType], pData->TransData.HeadData.OrigLBatchNo);
        Cmd.setCommandText(sSql);
        Cmd.Execute();
        if(!Cmd.FetchNext())
        {
            trace_log(ERR, "select original trade record fail[%s]!", _T(sSql));
            strcpy(pData->TransData.HeadData.RspCode, "25");
            return RET_SYSEXP;
        }
        
        //0消息类型
        bFlag &= sndObj.SetValueByStr(0, "0420");
        //2账号
        bFlag &= sndObj.SetValueByStr(2, _T(Cmd.Field("FIELD2").asString()));        
        //3处理码
        bFlag &= sndObj.SetValueByStr(3, _T(Cmd.Field("FIELD3").asString()));
        //4金额
        bFlag &= sndObj.SetValueByStr(4, _T(Cmd.Field("FIELD4").asString()));
        //11流水号:此处需要新流水号,而62域要原流水号
        bFlag &= sndObj.SetValueByStr(11, pData->VouchNo);
        //14 卡有效期
        SAString str = Cmd.Field("FIELD14").asString();
        if(str.GetLength() > 0)
        {
            bFlag &= sndObj.SetValueByStr(14, _T(str));
        }
            
        if( posType >= 0x63 && posType <= 0x66)
        {
            //22 输入方式
            bFlag &= sndObj.SetValueByStr(22, _T(Cmd.Field("FIELD22").asString()));

            //35 二磁道
            str = Cmd.Field("FIELD35").asString();
            if(str.GetLength() > 0)
            {
                bFlag &= sndObj.SetValueByStr(35, _T(str));
            }
            
            //36 三磁道
            str = Cmd.Field("FIELD36").asString();
            if(str.GetLength() > 0)
            {
                bFlag &= sndObj.SetValueByStr(36, _T(str));
            }
            
            //48 自定义域
            str = Cmd.Field("FIELD48").asString();
            if(str.GetLength() > 0)
            {
                bFlag &= sndObj.SetValueByStr(48, _T(str));
            }
            //49 货币代码
            bFlag &= sndObj.SetValueByStr(49, _T(Cmd.Field("FIELD49").asString()));
        }
            
        //32 受理机构代码
        bFlag &= sndObj.SetValueByStr(32, _T(Cmd.Field("FIELD32").asString()));
        //33 发送机构代码
        bFlag &= sndObj.SetValueByStr(33, _T(Cmd.Field("FIELD33").asString()));
        //41 终端号
        bFlag &= sndObj.SetValueByStr(41, _T(Cmd.Field("FIELD41").asString()));
        //42 商户号
        bFlag &= sndObj.SetValueByStr(42, _T(Cmd.Field("FIELD42").asString()));
        //60
        bFlag &= sndObj.SetValueByStr(60, _T(Cmd.Field("FIELD60").asString()));
        //62
        bFlag &= sndObj.SetValueByStr(62, _T(Cmd.Field("FIELD62").asString()));
    }
    catch (SAException &e)
    {
        saConn->Rollback();
        trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql));
        return -1;
    }
    catch (...)
    {
        trace_log(ERR, "Execute sql fail[sql:%s]!", _T(sSql));
        return -1;
    }
    
    //64MAC
    bFlag &= sndObj.SetValueByHex(64, (unsigned char*)"00000000", 8);
    
    //组包
    iBufLen = PACK_MAXLEN;
    bFlag &= sndObj.Pack(pBuffer, iBufLen);
    if(!bFlag)
    {
        trace_log(ERR, "Pack right CUPS8583 fail!");
        return RET_PACK;
    }

    //计算Mac
    bool bIsOrg = true;
    int nReturn = CalcMac(bIsOrg, iBufLen, pBuffer, pData);
    if(nReturn)
    {
        trace_log(ERR, "Calc Mac failed!");
        return nReturn;
    }

    return RET_SUCCESS;
}
示例#8
0
int OnSynData(QUEUE_LIST *pDataNode)
{
    thd_log(LOG_DEBUG,(char *)"OnSynData...");
    int MSGLength = pDataNode->Length;        //报文(MSG)
    unsigned char *pMSG = pDataNode->Buffer;   //应先判断pMSG长度 看主账号这些数据是否存在
    pMSG++;
    MSGLength--;
    int iFlag = pMSG[0];
    int UpdateNum = 0;
    const int MerNoLen = MERNOLENGTH;
    char MerNo[MERNOLENGTH+1] = {0};
    char Mer_PosNo[1025] = {0};
    char SID[11][51] = {{0}};

    int DataLen = 0;
    int iCount = 0;
    if(iFlag == 1)
    {
        //在数据库中判断IsNew是否为1(1为新添加数据,需要SPOS同步),循环每次取10条记录
        try
        {
            SAString sSql;
            SACommand Cmd;
            Cmd.setConnection(pDataNode->psaConn);
            sSql.Format("select count(*) as num from t_pos_key where isnew = 1 ");
            thd_log( LOG_DEBUG,"OnSynData,sSQL: %s", _T(sSql));
            Cmd.setCommandText(sSql);
            Cmd.Execute();
            if (Cmd.FetchNext())
            {
                UpdateNum = Cmd.Field("num").asShort();
            }
            else
            {
                thd_log(LOG_WARNING,(char *)"OnSynData, Port[%d] Peer[%d] : There's no data in t_pos_key!",
                          pDataNode->SrvrPort, pDataNode->PeerSockId);
                return 0;
            }
        }
        catch(SAException &x)
        {
            thd_log( LOG_ERROR,(char *)"OnSynData, SQLAPI Exception %s", _T(x.ErrText()));
            setCmdError(pDataNode);
            return 0;
        }
        if(UpdateNum != 0)
        {
            try
            {
                SAString sSql;
                SACommand Cmd;
                Cmd.setConnection(pDataNode->psaConn);
                sSql.Format("select sid,merno,posno,adddate from t_pos_key where isnew = 1 and rownum <=10");
                thd_log( LOG_DEBUG,"OnSynData, sSQL: %s", _T(sSql));
                Cmd.setCommandText(sSql);
                Cmd.Execute();
                while(Cmd.FetchNext())
                {
                    strcpy(SID[iCount],_T(Cmd.Field("sid").asString()));
                    strcpy(MerNo,_T(Cmd.Field("merno").asString()));
                    int tmpLen = strlen(MerNo);
                    if(tmpLen < 20)
                    {
                        memset(&MerNo[tmpLen],' ',20-tmpLen);
                    }
                    memcpy(&Mer_PosNo[DataLen],MerNo,MerNoLen);
                    DataLen += MerNoLen;
                    memcpy(&Mer_PosNo[DataLen],_T(Cmd.Field("posno").asString()),POSNOLENGTH);
                    DataLen += POSNOLENGTH;
                    memcpy(&Mer_PosNo[DataLen],_T(Cmd.Field("adddate").asString()),8);  //2011-09-08修改:同步时加上增加日期
                    DataLen += 8;                                   //2011-09-08修改:同步时加上增加日期
                    iCount++;
                }
            }
            catch(SAException &x)
            {
                thd_log( LOG_ERROR,(char *)"OnSynData, SQLAPI Exception %s", _T(x.ErrText()));
                setCmdError(pDataNode);
                return 0;
            }
            int iOutLen = 0;
            // 输出缓存
            char OutBuf[1024];
            memset(OutBuf, 0, sizeof(OutBuf));
            OutBuf[iOutLen] = pDataNode->Buffer[0];
            iOutLen += 1;
            OutBuf[iOutLen] = CMD_OK;
            iOutLen += 1;
            OutBuf[iOutLen] = iCount;
            iOutLen += 1;
            memcpy(&OutBuf[iOutLen],Mer_PosNo,iCount*(MerNoLen+POSNOLENGTH));
            iOutLen += iCount*(MerNoLen+POSNOLENGTH +8);   //2011-09-08修改:同步时加上增加日期
            memcpy(pDataNode->Buffer, OutBuf, iOutLen);
            pDataNode->Length = iOutLen ;
            thd_log(LOG_DEBUG,(char *)"OnSynData, Output Buffer Data:");
            trace_mem(LOG_DEBUG,(unsigned char *)pDataNode->Buffer,iOutLen);
            //更新数据库的IsNew字段
            try
            {
                SAString sSql;
                SACommand Cmd;
                Cmd.setConnection(pDataNode->psaConn);
                sSql.Format("update t_pos_key set isnew= 0 where sid = '%s' or sid = '%s' or sid = '%s' or sid = '%s' or \
                            sid = '%s' or sid = '%s' or sid = '%s' or sid = '%s' or sid = '%s'or sid = '%s'",\
                            SID[0] ,SID[1],SID[2],SID[3],SID[4],SID[5],SID[6],SID[7],SID[8],SID[9]);
                thd_log(LOG_DEBUG,(char *) "OnSynData, sSQL: %s", _T(sSql));
                Cmd.setCommandText(sSql);
                Cmd.Execute();
            }
            catch(SAException &x)
            {
                thd_log( LOG_ERROR,(char *)"OnSynData, SQLAPI Exception %s", _T(x.ErrText()));
                return false;
            }
        }
        else   //所有数据同步完毕 返回个数0给spos
        {
            pDataNode->Buffer[1] = CMD_OK;
            pDataNode->Buffer[2] = 0x00;
            pDataNode->Length = 3;
            thd_log(LOG_DEBUG,(char *)"OnSynData, Output Buffer Data:");
            trace_mem(LOG_DEBUG,(unsigned char *)pDataNode->Buffer,pDataNode->Length);
        }

    }
    else
    {
        setCmdError(pDataNode);
    }
    return 1;
}
示例#9
0
int OnEncrypt0405(QUEUE_LIST *pDataNode)  //PinBlock转换,将终端加密的PinBlock转换为成员行密钥加密的PinBlock并将转换后的PinBlock发给sever,再传给银行
{
    thd_log(LOG_DEBUG,(char *)"OnEncrypt0405...Received Data:");
    trace_mem(LOG_DEBUG,(unsigned char *)pDataNode->Buffer,pDataNode->Length);
    int MSGLength = pDataNode->Length;        //报文(MSG)
    unsigned char *pMSG = pDataNode->Buffer;   //应先判断pMSG长度 看主账号这些数据是否存在
    pMSG++;
    MSGLength--;
    int iOffset = 0;
    char MerNo[MERNOLENGTH+1] = {0};
    char TermNo[BANKNOLENGTH+1] = {0};
    char destype;
    char data[9]= {0}; //加密机返回的转换后data
    memcpy(MerNo,&pMSG[0],MERNOLENGTH);
    iOffset += MERNOLENGTH;     //加字节商户号
    MSGLength -=MERNOLENGTH;
    memcpy(TermNo, &pMSG[iOffset], BANKNOLENGTH);
    iOffset += BANKNOLENGTH;   //加16字节银行终端号
    MSGLength -= BANKNOLENGTH;
    //char flag;
//    flag = pMSG[iOffset];  //标志位‘0’:不对PINBLOCK作特殊处理 ,‘1’:对PINBLOCK作特殊处理
//    iOffset += 1;
//    MSGLength -=1;
    destype = pMSG[iOffset];   //加密类型
    iOffset += 1;
    MSGLength -=1;
    memcpy(data,&pMSG[iOffset],8);   //转换前PinBlock
    iOffset += 8;
    MSGLength -=8;

    int macklen = 0;
    unsigned char mack[33] = {0};

    try
    {
        SAString sSql;
        SACommand Cmd;
        Cmd.setConnection(pDataNode->psaConn);
        sSql.Format("select b.MACKLEN,b.MACK from t_bank_key b where b.termno = trim('%s') and b.merno =trim('%s') ", TermNo,MerNo);
        thd_log(LOG_DEBUG,(char *) "sSQL: %s", _T(sSql));
        Cmd.setCommandText(sSql);
        Cmd.Execute();
        if (Cmd.FetchNext())
        {
            macklen = Cmd.Field("MACKLEN").asShort();
            asc2bcd(mack,(char*)_T(Cmd.Field("MACK").asString()));  //t_bank_key数据库中查找pink;
            thd_log(LOG_DEBUG,(char *) "MACK :");
            trace_mem(LOG_DEBUG, mack, 32);
        }
        else
        {
            thd_log(LOG_WARNING,(char *)"Port[%d] Peer[%d] Terminal[%s]: There's no MacK in t_bank_key!",
                      pDataNode->SrvrPort, pDataNode->PeerSockId, TermNo);
            return false;
        }
    }
    catch(SAException &x)
    {
        thd_log( LOG_ERROR,(char *)"OnEncrypt0405, SQLAPI Exception %s", _T(x.ErrText()));
        return false;
    }

    char OutBuf[1024];  // 输出缓存
    memset(OutBuf, 0, sizeof(OutBuf));

    if(!PospEncryptPin(g_Cfg.forbankwk, destype, macklen, mack, data, pDataNode))
    {
        setCmdError1(pDataNode);
        return 1;
    }
    int iOutLen = 0;
   /* iOffset = 0;
    memcpy(&OutBuf[iOutLen],&pDataNode->Buffer[0] ,1);  //指令号CMD
    iOutLen++;
    OutBuf[iOutLen] = CMD_OK;            //执行SQL成功
    iOutLen++;
    /////////////////////////////
    //2011-07-01:修改协议,返回数据加上商户号和终端号
    memcpy(&OutBuf[iOutLen],&pDataNode->Buffer[iOffset] ,MERNOLENGTH);
    iOutLen += MERNOLENGTH;
    iOffset += MERNOLENGTH;
    memcpy(&OutBuf[iOutLen],&pDataNode->Buffer[iOffset] ,POSNOLENGTH);
    iOutLen += POSNOLENGTH;
    iOffset += POSNOLENGTH;
    memcpy(&OutBuf[iOutLen],&pDataNode->Buffer[iOffset] ,BANKNOLENGTH);
    iOutLen += BANKNOLENGTH;
    iOffset += BANKNOLENGTH;
    /////////////////////////////////*/

    iOutLen = 2+MERNOLENGTH+BANKNOLENGTH;
    setCmdToSeverSucceed(pDataNode,iOutLen,OutBuf);

    memcpy(&OutBuf[iOutLen],data,8);   //加密机返回的转换后的PinBlock
    iOutLen += 8;
    memcpy(pDataNode->Buffer, OutBuf, iOutLen);
    pDataNode->Length = iOutLen ;
    thd_log(LOG_DEBUG,(char *)"OnEncrypt0405, Output Buffer Data:");
    trace_mem(LOG_DEBUG,(unsigned char *)pDataNode->Buffer,iOutLen);
    return 1;
}
示例#10
0
//冲正
int CTradeDoReset::DoPack(SAConnection *saConn, void * pNode,
                        unsigned char * pBuffer, unsigned & iBufLen)
{
    if(saConn == NULL || pNode == NULL || pBuffer == NULL)
    {
        trace_log(ERR, "Paramter error!");
        return RET_SYSEXP;
    }
    TRADEDATA * pData = (TRADEDATA *)pNode;

    CTLVTemplet tlvObj;
    if(1 != tlvObj.UnPackTLVData(pData->TransData.TlvDataLen, pData->TransData.TlvData))
    {
        trace_log(ERR, "UnPackTLVData fail!");
        return RET_SYSEXP;
    }

    bool bFlag = true, bIsICC = false;
    unsigned char cFieldData[FIELD_MAXLEN]={0};//bFieldData[FIELD_MAXLEN]={0}, 
    unsigned int iFieldDataLen = 0;
    POS_TRADE_TYPE posType = (POS_TRADE_TYPE)pData->TransData.HeadData.RTradeType;
    if(m_unTradeOrgMap.empty())
        initTredeTypeMap();

    SAString sSql;
    SACommand Cmd;
    Cmd.setConnection(saConn);
    try
    {
        sSql.Format("select * from T_CHANNEL_RESETLIST where FIELD11='%s' and FIELD41='%s' and FIELD42='%s'"
            " and CRT_TYPE='%c' and CRT_BATCHNO='%s'", pData->TransData.HeadData.OrigLPosSeq,
            pData->TransData.HeadData.arrRTermNo, pData->TransData.HeadData.arrRMerchNo,
            m_unTradeOrgMap[posType], pData->TransData.HeadData.OrigLBatchNo);
        Cmd.setCommandText(sSql);
	    Cmd.Execute();
	    if(!Cmd.FetchNext())
	    {
	        trace_log(ERR, "select original trade record fail[%s]!", _T(sSql));
	        strcpy(pData->TransData.HeadData.RspCode, "25");
	        return RET_SYSEXP;
	    }
		
	    //0消息类型
	    bFlag &= sndObj.SetValueByStr(0, "0400");
	    //2账号
	    SAString str = Cmd.Field("FIELD2").asString();
	    if(str.GetLength() > 0)
	    {
	        bFlag &= sndObj.SetValueByStr(2, _T(str));
	    }
		
	    //3处理码
	    bFlag &= sndObj.SetValueByStr(3, _T(Cmd.Field("FIELD3").asString()));
	    //4金额
	    bFlag &= sndObj.SetValueByStr(4, _T(Cmd.Field("FIELD4").asString()));
	    //11流水号
	    bFlag &= sndObj.SetValueByStr(11, _T(Cmd.Field("FIELD11").asString()));
		
	    //14 卡的有效期
		str = Cmd.Field("FIELD14").asString();
	    if(str.GetLength() > 0)
	    {
	        bFlag &= sndObj.SetValueByStr(14, _T(str));
	    }
			
	    //22服务点输入方式
		/*iFieldDataLen = tlvObj.GetTLVItemByHex(TAG_POSENTMODE, pData->TransData.HeadData.SvrPointCode, 2);
		if(iFieldDataLen > 0)
		{
			bFlag &= sndObj.SetValueByHex(22, pData->TransData.HeadData.SvrPointCode, 2);	

		    if(memcmp(pData->TransData.HeadData.SvrPointCode, "05", 2) == 0 ||
				memcmp(pData->TransData.HeadData.SvrPointCode, "07", 2) == 0  ||
				memcmp(pData->TransData.HeadData.SvrPointCode, "98", 2) == 0 ||
				memcmp(pData->TransData.HeadData.SvrPointCode, "95", 2) == 0)	
		        bIsICC = true;
		}*/
		str = Cmd.Field("FIELD22").asString();
	    if(str.GetLength() > 0)
	    {
	        bFlag &= sndObj.SetValueByStr(22, _T(str));
			//char Field22[3] = {0};
    			//strcpy(Field22,_T(str));
			if(memcmp(_T(str), "05", 2) == 0 ||memcmp(_T(str), "07", 2) == 0  ||
				memcmp(_T(str), "98", 2) == 0 ||memcmp(_T(str), "95", 2) == 0)	
		        bIsICC = true;
			trace_log(DBG, "bIsICC=%d", bIsICC);
	    }
		else
		{
			trace_log(ERR, "get FIELD22 from database failed!");
			return RET_PACK;
		}
		
	    //23IC卡序列号
		if(pData->TransData.HeadData.RTradeType < POS_UNELEWALLETLOAD ||
			pData->TransData.HeadData.RTradeType > POS_UNWALLETDEPOSIT)
		{
			str = Cmd.Field("FIELD23").asString();
		    if(str.GetLength() > 0)
		    {
		        bFlag &= sndObj.SetValueByStr(23, _T(str));
		    }
		}
	     //25服务点条件码
	    	bFlag &= sndObj.SetValueByStr(25, _T(Cmd.Field("FIELD25").asString()));
	    
	    //38原授权码
	    str = Cmd.Field("FIELD38").asString();
	    if(str.GetLength() > 0)
	    {
	        bFlag &= sndObj.SetValueByStr(38, _T(str));
	    }
		else if(posType == POS_UNPREAUTHREVE ||posType == POS_UNPREAUTHCPLREQ)
		{
			trace_log(ERR, "get FIELD38 from database failed!");
			return RET_PACK;
		}
		//39 响应码
		bFlag &= sndObj.SetValueByStr(39, _T(Cmd.Field("FIELD39").asString()));
	     //41终端号
	    bFlag &= sndObj.SetValueByStr(41, _T(Cmd.Field("FIELD41").asString()));
	    //42商户号
	    bFlag &= sndObj.SetValueByStr(42, _T(Cmd.Field("FIELD42").asString()));
	    
	    //48附加数据-私有 
	    if(posType == POS_UNWALLETDEPOSIT || posType == POS_UNECTRANSLOAD)
		{
		    bFlag &= sndObj.SetValueByStr(48, _T(Cmd.Field("FIELD48").asString()));
	    }
	    //49货币代码
	    bFlag &= sndObj.SetValueByStr(49, _T(Cmd.Field("FIELD49").asString()));
		//53安全控制信息 
		if(posType >= POS_UNREPEAL || posType <= POS_UNELEWALLETLOAD)
		{
			str = _T(Cmd.Field("").asString());
		    if(str.GetLength() > 0)
		    {
				bFlag &= sndObj.SetValueByStr(53, _T(Cmd.Field("FIELD53").asString()));
		    	}
	    	}
	    //55IC卡数据
	    if(bIsICC && (posType < POS_UNELEWALLETLOAD || posType > POS_UNWALLETDEPOSIT))
	    {
	        memset(cFieldData, 0, sizeof(cFieldData));
	        CTLVTemplet tlvDB, tlvF55;
	        unsigned char cICData[1024]={0};
	        str = Cmd.Field("FIELD55").asString();
	        iFieldDataLen = str.GetLength();
	        if(iFieldDataLen > 0)
	        {
	            AscToBcd(cICData, (unsigned char *)_T(str), iFieldDataLen);
	            iFieldDataLen /= 2;
	            if(1 != tlvDB.UnPackTLVData(iFieldDataLen, cICData))
	            {
	                trace_log(ERR,"UnPackTLVData error!");
	                strcpy(pData->TransData.HeadData.RspCode, ERR_PACKMESSAGE);
	                return RET_PACK;
	            }
	            if(pData->TransData.HeadData.RTradeType == POS_UNCONSUME ||
	               pData->TransData.HeadData.RTradeType == POS_UNPREAUTH ||
	               pData->TransData.HeadData.RTradeType == POS_UNFILLECASH||
	               pData->TransData.HeadData.RTradeType == POS_UNELECASHLOAD||
	               pData->TransData.HeadData.RTradeType == POS_UNECTRANSLOAD)
	            {//消费冲正或预授权冲正需上送55域
	                iFieldDataLen = tlvObj.GetTLVItemByHex(TAG_TERMVERRET, cFieldData, sizeof(cFieldData));
	                if(iFieldDataLen > 0)
	                {
	                    bFlag &= tlvF55.AddTLVItemByHex(GetTagTxt(TAG_TERMVERRET), iFieldDataLen, cFieldData);
	                }

	                iFieldDataLen = tlvDB.GetTLVItemByHex(TAG_INTDEVSERNO, cFieldData, sizeof(cFieldData));
	                if(iFieldDataLen > 0)
	                {
	                    bFlag &= tlvF55.AddTLVItemByHex(GetTagTxt(TAG_INTDEVSERNO), iFieldDataLen, cFieldData);
	                }

	                iFieldDataLen = tlvObj.GetTLVItemByHex(TAG_ISSAPPDATA, cFieldData, sizeof(cFieldData));
	                if(iFieldDataLen > 0)
	                {
	                    bFlag &= tlvF55.AddTLVItemByHex(GetTagTxt(TAG_ISSAPPDATA), iFieldDataLen, cFieldData);
	                }

	                iFieldDataLen = tlvDB.GetTLVItemByHex(TAG_APPTRACOU, cFieldData, sizeof(cFieldData));
	                if(iFieldDataLen > 0)
	                {
	                    bFlag &= tlvF55.AddTLVItemByHex(GetTagTxt(TAG_APPTRACOU), iFieldDataLen, cFieldData);
	                }

	                iFieldDataLen = tlvObj.GetTLVItemByHex(TAG_ISSCRIRET, cFieldData, sizeof(cFieldData));
	                if(iFieldDataLen > 0)
	                {
	                    bFlag &= tlvF55.AddTLVItemByHex(GetTagTxt(TAG_ISSCRIRET), iFieldDataLen, cFieldData);
	                }

	                iFieldDataLen = sizeof(cFieldData);
	                bFlag &= tlvF55.PackTLVData(cFieldData, (unsigned &)iFieldDataLen);
	                bFlag &= sndObj.SetValueByHex(55, cFieldData, iFieldDataLen);
	            }
	        }
	    }
		//58 PBOC电子钱包/存折标准的交易信息
		if(posType >= POS_UNELEWALLETLOAD && posType <= POS_UNWALLETDEPOSIT)
		{
			bFlag &= sndObj.SetValueByStr(58, _T(Cmd.Field("FIELD58").asString()));
		}
	    //60
	    bFlag &= sndObj.SetValueByStr(60, _T(Cmd.Field("FIELD60").asString()));
		
		//61 原始信息域
		if(posType == POS_UNPREAUTHCPLREQ || (posType >= POS_REPEAL && posType <= POS_FILLECASHREVE))
		{
			bFlag &= sndObj.SetValueByStr(61, _T(Cmd.Field("FIELD61").asString()));
		}
		//62
		if(posType == POS_UNWALLETDEPOSIT || posType == POS_UNECTRANSLOAD || posType == POS_UNCONSUME)
		{
			str = _T(Cmd.Field("FIELD62").asString());
		    if(str.GetLength() > 0)
		    {
				bFlag &= sndObj.SetValueByStr(62, _T(str));
		    	}
		    	else if(posType != POS_UNCONSUME)
		    	{
		    		trace_log(ERR, "get FIELD62 from database failed!");
				return RET_PACK;
		    	}
		}
	}
	catch (SAException &e)
	{
		saConn->Rollback();
		trace_log(ERR,"database exceptions:%s ,SQL = [%s]",_T(e.ErrText()),_T(sSql));
		return -1;
	}
	catch (...)
	{
		trace_log(ERR, "Execute sql fail[sql:%s]!", _T(sSql));
		return -1;
	}
    
     //64MAC
    bFlag &= sndObj.SetValueByHex(64, (unsigned char*)"00000000", 8);
    /*unsigned char cMacBuf[FIELD_MAXLEN] = {0};
	if(1 != sndObj.GetMacData(cMacBuf, sizeof(cMacBuf)))
	{
		trace_log(ERR,"Get mac failed!");
		return RET_GETMACERR;
	}
	bFlag &= sndObj.SetValueByHex(64, cMacBuf, 8);*/
	
    //组包
    iBufLen = PACK_MAXLEN;
    bFlag &= sndObj.Pack(pBuffer, iBufLen);
    if(!bFlag)
    {
        trace_log(ERR, "Pack right CUPS8583 fail!");
        return RET_PACK;
    }
    //计算MAC
    BYTE bMab[PACK_MAXLEN] = {0};
    BYTE bMac[9] = {0};
    BYTE bTak[17] = {0};
    int nMabPos = 2 + 5 + 6;
    int nMacLen = 8;

    Ccommon::Str2Hex((char *)pData->bMacKey, bTak, (sizeof(bTak) - 1)*2);
    memcpy(bMab, pBuffer + nMabPos, iBufLen - nMabPos - nMacLen);
    if(!m_checkMesValue.GenMacData(bMab, iBufLen - nMabPos - nMacLen, bTak, bMac))
    {
        memcpy((pBuffer + iBufLen -nMacLen), bMac, nMacLen);
    }
#if 0
    unsigned char ucMab[1024]={0};
	unsigned char ucTmp[9] = {0};
	// 如果是非指定账户转账类圈存算MAC需要修改为转账类的计算MAC方法
	if (pData->TransData.HeadData.RTradeType == POS_UNECTRANSLOAD)
		ucMab[0] = 1;

    int iMabLen = sndObj.GetMacData(ucMab, sizeof(ucMab));
    if(iMabLen > 0)
    {
        if(!g_EncComm->CalculateMac(g_Cfg.SndBrchCode, g_Cfg.RcvBrchCode,
                ucMab, iMabLen, ucTmp, 2, 0))
        {
            trace_log(ERR,"CalculateMac fail!");
            return RET_SYSEXP;
        }
		BcdToAsc(pBuffer+iBufLen-8, ucTmp, 4);
    }
    else
    {
        trace_log(ERR,"GetMacData fail!");
        return RET_SYSEXP;
    }
#endif
    return RET_SUCCESS;
}