示例#1
0
文件: step7.cpp 项目: kzinti/revok
void LongQuery(void *addl)
{
	if(WaitForSingleObject(hQueryMutex, 75L) == WAIT_TIMEOUT)
	{
		WaitForSingleObject(hScreenMutex, INFINITE);
		std::cout << "query still running, use 'C' to cancel it." << std::endl;
		ReleaseMutex(hScreenMutex);
		return;
	}

	try
	{
		g_Cmd.setCommandText(LONG_RUNNING_QUERY);

		WaitForSingleObject(hScreenMutex, INFINITE);
		std::cout << "executing " << (const char*)g_Cmd.CommandText() << std::endl;
		ReleaseMutex(hScreenMutex);

		g_Cmd.Execute();

		WaitForSingleObject(hScreenMutex, INFINITE);
		std::cout << "executed" << std::endl;
		ReleaseMutex(hScreenMutex);
	}
	catch(SAException &x)
	{
		WaitForSingleObject(hScreenMutex, INFINITE);
		std::cout << (const char*)x.ErrText() << std::endl;
		ReleaseMutex(hScreenMutex);
	}

	ReleaseMutex(hQueryMutex);
}
示例#2
0
/**< 更新流水和批次 */
int COperateDB::SaveChannelInfo(SAConnection *pSaconn, TRADEDATA * pData)
{
	if(pData == NULL || pSaconn == NULL)
	{
		trace_log(ERR, "parameter error!");
		return -1;
	}
    SAString sSql;
    SACommand Cmd;
    try
    {
        Cmd.setConnection(pSaconn);
		sSql.Format("update T_CHANNEL_TERMINAL set CT_VOUCHNO='%s',CT_BATCHNO='%s' where CM_MCHT='%s'"
			"and CT_TMNL='%s' and CF_INTERFACE=%d and CT_STATUS = 1", pData->VouchNo, pData->BatchNo,
			pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.arrRTermNo,pData->TransData.HeadData.nInterface);
		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));
		throw;
		return -1;
	}
	return 0;
}
示例#3
0
void Oracle_Cancel()
{
	SAConnection con2;
	SAConnection con;
	SACommand cmd2;
	SACommand cmd;
	cmd2.setConnection(&con2);
	cmd.setConnection(&con);

	try
	{
		con2.Connect(
			"test", "scott", "tiger", SA_Oracle_Client);
		//con.setOption("UseAPI") = "OCI7";
		con.Connect(
			"test", "scott", "tiger", SA_Oracle_Client);

		// block
		cmd2.setCommandText("Update DEPT set DNAME=DNAME");
		cmd2.Execute();

		DWORD ThreadId;
		HANDLE hThread;
		hThread = ::CreateThread(
			NULL, 0,
			Oracle_Cancel_Thread, &con,
			0, &ThreadId);
		WaitForSingleObject(hThread, 1000);
		cout << "Calling Cancel!" << endl;
		cmd.Open();
		cmd.Cancel();
		cout << "Cancel has been called!" << endl;

		WaitForSingleObject(hThread, 2000);
		cout << "Calling con2.Rollback()!" << endl;
		con2.Rollback();
		cout << "con2.Rollback() has been called!" << endl;

		WaitForSingleObject(hThread, INFINITE);
	}
    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() << endl;
    }
}
示例#4
0
void InterBaseEvents()
{
	SAConnection con;
	SACommand cmd;
	event_data_t event_data;

	try
	{
		con.Connect(
			"transfer:d:/temp/siemens/controller.gdb",     // database name
			"sysdba",   // user name
			"masterkey",   // password
			SA_InterBase_Client);
		event_data.pibAPI = (ibAPI *)con.NativeAPI();
		event_data.pibConnectionHandles = (ibConnectionHandles *)con.NativeHandles();

		con.setAutoCommit(SA_AutoCommitOn);

		// register interest for "TestEvent" event
		event_data.length = event_data.pibAPI->isc_event_block(
			&event_data.event_buffer,
			&event_data.result_buffer,
			1,
			"TestEvent");

		event_data.que_events();
		
		// this should fire event
		cmd.setConnection(&con);
		cmd.setCommandText("a");
		cmd.Param("sEvent").setAsString() = "TestEvent";
		cmd.Execute();

		// wait for event to be fired
		getchar();
	}
	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
		printf("Err = %s\nCode = %d\n", (const char*)x.ErrText(),
			x.ErrNativeCode());
	}
}
示例#5
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";
    }
}
示例#6
0
DWORD WINAPI Oracle_Cancel_Thread(void *_pCon)
{
	SAConnection *pCon = (SAConnection *)_pCon;
	SACommand cmd;
	cmd.setConnection(pCon);

	try
	{
		cmd.setCommandText("Update DEPT set DNAME=DNAME");
		//cmd.setCommandText("sys.DBMS_PIPE.receive_message");
		//cmd << SAPos("pipename") << "myPipe" << SAPos("timeout") << 10L;
		cout << "Calling Execute!" << endl;
		cmd.Execute();
		cout << "Execute has been called!" << endl;
	}
    catch(SAException &x)
    {
		cout << "Oracle_Cancel_Thread: " << (const char*)x.ErrText() << endl;
	}

	return 0;
}
示例#7
0
文件: step3.cpp 项目: kzinti/revok
int main(int argc, char* argv[])
{
    SAConnection con; // connection object
    SACommand cmd;    // command object
    
    try
    {
        // connect to database (Oracle in our example)
        con.Connect("test", "tester", "tester", SA_Oracle_Client);
        // associate a command with connection
        cmd.setConnection(&con);

        // Insert 2 rows
        cmd.setCommandText(
            "Insert into test_tbl(fid, fvarchar20) values(:1, :2)");

        // use first method of binding - param assignment
        cmd.Param(1).setAsLong() = 2;
        cmd.Param(2).setAsString() = "Some string (2)";
        // Insert first row
        cmd.Execute();

        // use second method of binding - stream binding
        cmd << (long)3 << "Some string (3)";
        // Insert second row
        cmd.Execute();

        // commit changes on success
        con.Commit();

        printf("Input parameters bound, rows inserted!\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
        printf("%s\n", (const char*)x.ErrText());
    }
    
    return 0;
}
示例#8
0
/**< 更新渠道某一终端的签到状态 */
int COperateDB::UpdateTermalState(SAConnection *pSaconn, BYTE *bDate, TRADEDATA *pData)
{
	if(pSaconn == NULL ||pData == NULL)
	{
		trace_log(ERR, "Input Parameter error!");
		return -1;
	}

	SAString sSql;
	SACommand Cmd;
	Cmd.setConnection(pSaconn);
	try{
	    sSql.Format("update  t_channel_finance set cf_sign='1'  where   CF_INTERFACE=%d",pData->TransData.HeadData.nInterface);
        Cmd.setCommandText(sSql);
		Cmd.Execute();

        sSql.Format("update T_CHANNEL_TERMINAL set CT_PARA1='%s',CT_PARA2='1',CT_PARA3='1' where CM_MCHT='%s' and CT_TMNL='%s' and CF_INTERFACE=%d", bDate,
             pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.arrRTermNo,pData->TransData.HeadData.nInterface);
		Cmd.setCommandText(sSql);
		Cmd.Execute();

		#if SoftEnc
		sSql.Format("update T_BANK_KEY set PINK='%s',MACK='%s',TRACK='%s' "
            "where MERNO='%s' and TERMNO='%s'", pData->bPinKey,pData->bMacKey,pData->bTdkKey, pData->TransData.HeadData.arrRMerchNo, pData->TransData.HeadData.arrRTermNo);
		trace_log(DBG, "sql=%s", _T(sSql));
		Cmd.setCommandText(sSql);
		Cmd.Execute();
		#endif
		pSaconn->Commit();
		trace_log(DBG, "update successful. sql=%s", _T(sSql));
	}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;
}
示例#9
0
文件: step2.cpp 项目: kzinti/revok
int main(int argc, char* argv[])
{
    SAConnection con; // connection object
    SACommand cmd;    // create command object
    
    try
    {
        // connect to database (Oracle in our example)
        con.Connect("test", "tester", "tester", SA_Oracle_Client);
        // associate a command with connection
        // connection can also be specified in SACommand constructor
        cmd.setConnection(&con);

        // create table
        cmd.setCommandText(
            "Create table test_tbl(fid integer, fvarchar20 varchar(20), fblob blob)");
        cmd.Execute();

        // insert value
        cmd.setCommandText(
            "Insert into test_tbl(fid, fvarchar20) values (1, 'Some string (1)')");
        cmd.Execute();

        // commit changes on success
        con.Commit();

        printf("Table created, row inserted!\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
        printf("%s\n", (const char*)x.ErrText());
    }
    
    return 0;
}
示例#10
0
文件: step7.cpp 项目: kzinti/revok
void LongQueryCancel()
{
	try
	{
		WaitForSingleObject(hScreenMutex, INFINITE);		
		std::cout << "CANCELLING..." << std::endl;
		ReleaseMutex(hScreenMutex);

		g_Cmd.Cancel();

		WaitForSingleObject(hScreenMutex, INFINITE);
		std::cout << "CANCELLED" << std::endl;
		ReleaseMutex(hScreenMutex);
	}
	catch(SAException &x)
	{
		WaitForSingleObject(hScreenMutex, INFINITE);
		std::cout << (const char*)x.ErrText() << std::endl;
		ReleaseMutex(hScreenMutex);
	}
}
示例#11
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;
}
示例#12
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;
}
示例#13
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;
}
示例#14
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;
	}

}
示例#15
0
 /**<  生成冲正数据 */
int COperateDB::BuildResetData(SAConnection *pSaconn, TRADEDATA *pData, CUPS8583 * sendObj)
{
	if (pSaconn == NULL || sendObj == NULL)
	{
		trace_log(ERR, "Parameter error!");
		return -1;
	}
	SAString sSql;
	SACommand Cmd;
	Cmd.setConnection(pSaconn);
	try
	{
		if (sendObj != NULL)
		{
		    trace_log(DBG,"COperateDB::BuildResetData start");
			char Field02[32]={0};
			if(sendObj->FieldExist(2)) sendObj->GetValueByStr(2, Field02, sizeof(Field02));
			char Field03[32]={0};
			if(sendObj->FieldExist(3)) sendObj->GetValueByStr(3, Field03, sizeof(Field03));
			char Field04[32]={0};
			//金额不能为NULL 否则DB2会报错
			if(sendObj->FieldExist(4)) sendObj->GetValueByStr(4, Field04, sizeof(Field04));
			char Field11[32]={0};
			if(sendObj->FieldExist(11)) sendObj->GetValueByStr(11, Field11, sizeof(Field11));
			char Field14[32]={0};
			if(sendObj->FieldExist(14)) sendObj->GetValueByStr(14, Field14, sizeof(Field14));
			char Field22[32]={0};
			if(sendObj->FieldExist(22)) sendObj->GetValueByStr(22, Field22, sizeof(Field22));
			char Field32[32]={0};
			if(sendObj->FieldExist(32)) sendObj->GetValueByStr(32, Field32, sizeof(Field32));
			char Field33[32]={0};
			if(sendObj->FieldExist(33)) sendObj->GetValueByStr(33, Field33, sizeof(Field33));
			char Field35[128]={0};
			if(sendObj->FieldExist(35)) sendObj->GetValueByStr(35, Field35, sizeof(Field35));
			char Field36[256]={0};
			if(sendObj->FieldExist(36)) sendObj->GetValueByStr(36, Field36, sizeof(Field36));
			char Field38[32]={0};
			if(sendObj->FieldExist(38)) sendObj->GetValueByStr(38, Field38, sizeof(Field38));
			char Field41[16]={0};
			if(sendObj->FieldExist(41)) sendObj->GetValueByStr(41, Field41, sizeof(Field41));
			char Field42[32]={0};
			if(sendObj->FieldExist(42)) sendObj->GetValueByStr(42, Field42, sizeof(Field42));
			char Field48[512] ={0};
			if(sendObj->FieldExist(48)) sendObj->GetValueByStr(48, Field48, sizeof(Field48));
			char Field49[16]={0};
			if(sendObj->FieldExist(49)) sendObj->GetValueByStr(49, Field49, sizeof(Field49));
			char Field60[128]={0};
			if(sendObj->FieldExist(60)) sendObj->GetValueByStr(60, Field60, sizeof(Field60));
			//撤销时,保存的流水号和批次号是当前的
			char Field62[128]={0};
			if(pData->TransData.HeadData.RTradeType >= 0x71 && pData->TransData.HeadData.RTradeType <= 0x74)
				sprintf(Field62, "%s%s", pData->VouchNo, pData->BatchNo);
			else
				if(sendObj->FieldExist(62)) sendObj->GetValueByStr(62, Field62, sizeof(Field62));

			//保存渠道冲正信息
			sSql.Format("insert into T_CHANNEL_RESETLIST(CF_INTERFACE,FIELD2,FIELD3,FIELD4,FIELD11,FIELD13,FIELD14,FIELD22,"
						"FIELD32,FIELD33,FIELD38,FIELD41,FIELD42,FIELD48,FIELD49,FIELD60,FIELD62,CRT_TYPE,CRT_BATCHNO) "
						"values('%d', '%s','%s','%ld','%s', to_char(sysdate,'mmdd'),'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%c','%s')",
						pData->TransData.HeadData.nInterface,Field02,Field03,atoi(Field04),Field11,Field14,Field22,Field32,Field33,Field38,Field41,Field42,
						Field48,Field49,Field60,Field62,pData->TransData.HeadData.RTradeType, pData->BatchNo);
			Cmd.setCommandText(sSql);
			trace_log(DBG, "SQL = [insert T_CHANNEL_RESETLIST:%s]", _T(sSql));
			Cmd.Execute();
			pSaconn->Commit();
            trace_log(DBG,"COperateDB::BuildResetData end");
		}
	}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;
}
示例#16
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;
}
示例#17
0
int OnGetRandom(QUEUE_LIST *pDataNode)
{
    thd_log(LOG_DEBUG,(char *)"OnGetRandom...Received Data:");
    trace_mem(LOG_DEBUG,(unsigned char *)pDataNode->Buffer,pDataNode->Length);
    int MSGLength = pDataNode->Length;
    unsigned char *pMSG = pDataNode->Buffer;   //
    pMSG++;
    MSGLength--;
    int iOffset = 0;
    int DownKeyLen = 0;
    char DownKey[49] = {0};
    char TermNo[17] = {0};
    unsigned char TRD[9] = {0};            //加密机产生的随机数据,TTEK加密后送给SPOS服务器
    // 输出缓存
    char OutBuf[1025] = {0};
    char EDownKey[17] = {0};
    char chTRD[17] = {0};

    unsigned char KeyRandom[8] = {0xD6, 0xA7, 0xB8, 0xB6, 0xCE, 0xDE, 0xD3, 0xC7};   //固定密钥 用来加密终端随机数
    char TermNo1[9] = {0};
    int iFlag = 0;
    iOffset += MERNOLENGTH;
    MSGLength -= MERNOLENGTH;
    memcpy(TermNo,&pMSG[iOffset],BANKNOLENGTH);
   // memcpy(TermNo,TermNo,8);
    //TermNo1 = trim(TermNo);
    memcpy(TermNo1,TermNo,8);
    iOffset += BANKNOLENGTH;
    MSGLength -= BANKNOLENGTH;
    iFlag = pMSG[iOffset];     //标志位:0:产生随机数;1:密钥下载密码
    iOffset += 1;
    MSGLength -= 1;
    if(iFlag == 1)
    {
        DownKeyLen = pMSG[iOffset];  // 密钥下载密码长度
        if(DownKeyLen%8 != 0)
        {
            setCmdError2(pDataNode);
            thd_log(LOG_WARNING,(char *)"OnGetRandom, Data Length is not 8 multiples !");
            return 1;
        }
       // thd_log(LOG_DEBUG,(char *)"OnGetRandom, Data Length : %d",DownKeyLen);
        iOffset += 1;
        MSGLength -= 1;
        memcpy(DownKey,&pMSG[iOffset],DownKeyLen);  //随机数/密钥下载密码
    }
    else if(iFlag == 0)   //需要产生随机数
    {
        GetRandom((unsigned char *)DownKey,8);   //随机数长度为8
        ////测试数据,固定随机数
      /*  DownKey[0] = 0x88;
        DownKey[1] = 0x77;
        DownKey[2] = 0x66;
        DownKey[3] = 0x55;
        DownKey[4] = 0x44;
        DownKey[5] = 0x33;
        DownKey[6] = 0x22;
        DownKey[7] = 0x11;*/
        /////////////
        DownKeyLen = 8;
        memcpy(TRD,DownKey,8) ;
        DesEncrypt(1,TRD,TRD,8,KeyRandom);    //将随机数用固定密钥加密存放到数据库
        bcd2asc(chTRD,(unsigned char *)TRD,8);
        /*将产生的随机数根据终端号保存到数据库t_bank_key 的random字段*/
        SAString sSql;
        SACommand Cmd;
        try
        {
            Cmd.setConnection(pDataNode->psaConn);
            sSql.Format("update t_bank_key set random = trim('%s') where termno = trim('%s')  ", chTRD,TermNo);
            Cmd.setCommandText(sSql);
            Cmd.Execute();
        }
        catch(SAException &x)
        {
            thd_log( LOG_ERROR,(char *)"SQLAPI Exception %s", _T(x.ErrText()));
            thd_log( LOG_ERROR,(char *)"sSQL: %s", _T(sSql));
            return false;
        }
    }
    thd_log(LOG_DEBUG,(char *)"OnGetRandom...Random Data:");
    trace_mem(LOG_DEBUG,(unsigned char *)DownKey,8);

    unsigned char TTEK[17] ={0};
    if( !CountTTEK(TermNo1, TTEK)  ) //用终端号计算TTEK
    {
        setCmdError2(pDataNode);
        return 1;
    }
    Des3Encrypt(1,(unsigned char *)EDownKey,(unsigned char *)DownKey,8,TTEK);   //用产生的TTEK加密随机数或者下载密钥,返回给服务器
    int iOutLen = 0;

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

    OutBuf[iOutLen] = DownKeyLen;
    iOutLen += 1;

    if(DownKeyLen > 1023)
    {
        setCmdError2(pDataNode);
        thd_log(LOG_WARNING,(char *)"OnGetRandom, Track Data Length from HSM is too long!");
        return 1;
    }
    memcpy(&OutBuf[iOutLen],EDownKey,DownKeyLen);
    iOutLen += DownKeyLen;

    memset(pDataNode->Buffer,0,1024);
    memcpy(pDataNode->Buffer, OutBuf, iOutLen);
    pDataNode->Length = iOutLen ;
    thd_log(LOG_DEBUG,(char *)"OnGetRandom, Output Buffer Data:");
    trace_mem(LOG_DEBUG,(unsigned char *)pDataNode->Buffer,iOutLen);

    return 1;
}
示例#18
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;
}
示例#19
0
//CMD_EXECSQL
//远程客户端请求执行SQL
//请求: [B0: 协议字] [B1:是否需要返回结果集] [B2~B5: 请求的起始记录号] [B6~B9: 最大返回的记录数] [B10~Bn: SQL语句]
//响应: [B0: 协议字] [B1: 执行结果0|1] [B2: 是否还有后续数据0|1] [B3..Bn: CDS结果集]
int OnExecSQL(QUEUE_LIST *pDataNode)
{
#ifdef _SUPPORT_CLITR   //支持客户端事务连接
    if (NULL != pDataNode->psaConn)
    {
        SAConnection *p = pDataNode->pCliTr->getCliTrConn(pDataNode->SrvrPort, pDataNode->PeerSockId);
        if (p) pDataNode->psaConn = p;
    }
#endif
    //报文(MSG)
    unsigned char *p = pDataNode->Buffer;
    p++;

    int iStartRecNo, iMaxCount, iSqlLen;
    bool bNeedReturnData = (*p == 1);
    p++;
    P2DW(iStartRecNo, p);
    p += 4;
    P2DW(iMaxCount, p);
    p += 4;
    P2W(iSqlLen, p);
    p += 2;
    if (iSqlLen > 8 * ONE_PACKSIZE)
    {
        setCmdError(pDataNode);
        return 1;
    }

    unsigned char *pSQL = (unsigned char *) GetMem(iSqlLen + 1);
    memcpy(pSQL, p, iSqlLen);
    pSQL[iSqlLen] = 0;

    thd_log(LOG_DEBUG,"Execute SQL: %s", pSQL);
    SACommand saCmd;
    try{
        saCmd.setConnection(pDataNode->psaConn);
        saCmd.setCommandText(_TSA(pSQL));
        saCmd.Execute();
    }
    catch(SAException &x)
    {
        thd_log( LOG_ERROR,(char *)"SQLAPI Exception %s", _T(x.ErrText()));
        setCmdError(pDataNode);
        return 1;
    }
    p = &pDataNode->Buffer[1];
    int iOutLen = 1;
    *p++ = CMD_OK;                                  //执行SQL成功
    iOutLen++;
    *p++ = 0x0;
    iOutLen++;

    //不需要返回数据
    if (!bNeedReturnData)
    {
        //m_pDataNode->psaConn->Commit();
        int rowUpd = saCmd.RowsAffected();          //更新的记录数
        W2P(p, rowUpd);
        iOutLen += 2;
        pDataNode->Length = iOutLen;
        FreeMem(pSQL);
        return 1;
    }

    bool bHasNext = false;
    p += 2;
    //返回数据
    int iRet = CopyDataSet(&bHasNext, p, ALL_PACKSIZE, &saCmd, iStartRecNo, iMaxCount);
    p -= 2;
    W2P(p, iRet);                                   //记录集大小
    if (bHasNext) pDataNode->Buffer[2] = 0x1;       //存在未返回记录
    iOutLen += 2 + iRet;
    pDataNode->Length = iOutLen;

    thd_log(LOG_DEBUG,"cdsfmt2 len = %d",pDataNode->Length);
    trace_mem( LOG_DEBUG,pDataNode->Buffer, pDataNode->Length);

    FreeMem(pSQL);
    return 1;
}
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());
    }
}
示例#21
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;
}
示例#22
0
int OnExecProc(QUEUE_LIST *pDataNode)
{
    //报文(MSG)
    unsigned char *p = pDataNode->Buffer;
    p++;

    char ProcName[255];
    memset(ProcName, 0, sizeof(ProcName));

    int iProcNameLen, iInputParaNums, iOutputParaNums;
    P2W(iProcNameLen, p);
    p += 2;
    memcpy(ProcName, p, iProcNameLen);
    p += iProcNameLen;

    // 输入参数个数
    P2W(iInputParaNums, p);
    p += 2;

	SACommand Cmd;
    Cmd.setConnection(pDataNode->psaConn);
    Cmd.setCommandText(ProcName);

    char ParaName[255], ParaVaule[255];
    int iLen;
    for (int i = 0; i < iInputParaNums; i++)
    {
        BYTE ParaType = *p;
        p++;
        memset(ParaName, 0, sizeof(ParaName));
        memset(ParaVaule, 0, sizeof(ParaVaule));
        P2W(iLen, p);
        p += 2;
        memcpy(ParaName, p, iLen);
        p += iLen;

        P2W(iLen, p);
        p += 2;
        memcpy(ParaVaule, p, iLen);
        p += iLen;

        if (ParaType == 0x00)
            Cmd.Param(ParaName).setAsLong() = atoi(ParaVaule);
        else if (ParaType == 0x01)
            Cmd.Param(ParaName).setAsString() = ParaVaule;
    }
    Cmd.Execute();

    // 输出缓存
    BYTE OutBuf[1024];
    memset(OutBuf, 0, sizeof(OutBuf));
    int iOffset = 0;

    // 输出参数个数
    memcpy(&OutBuf[iOffset], p, 2);
    P2W(iOutputParaNums, p);
    p += 2;
    iOffset += 2;

    for (int i = 0; i < iOutputParaNums; i++)
    {
        memset(ParaName, 0, sizeof(ParaName));
        memset(ParaVaule, 0, sizeof(ParaVaule));

        // 参数类型
        BYTE ParaType = *p;
        memcpy(&OutBuf[iOffset], p, 1);
        p++;
        iOffset ++;

        // 参数名称
        P2W(iLen, p);
        memcpy(&OutBuf[iOffset], p, 2);
        p += 2;
        iOffset += 2;

        memcpy(ParaName, p, iLen);
        memcpy(&OutBuf[iOffset], p, iLen);
        p += iLen;
        iOffset += iLen;

        // 参数值
        if (ParaType == 0x00)
            sprintf(ParaVaule, "%ld", Cmd.Param(ParaName).asLong());
        else if (ParaType == 0x01)
            strcpy(ParaVaule, Cmd.Param(ParaName).asString());

        int iTempLen = strlen(ParaVaule);
        BYTE *pLen = &OutBuf[iOffset];
        W2P(pLen, iTempLen);
        iOffset += 2;
        memcpy(&OutBuf[iOffset], ParaVaule, iTempLen);
        iOffset += iTempLen;
    }

    p = &pDataNode->Buffer[1];
    int iOutLen = 1;
    *p++ = CMD_OK;                                  //执行SQL成功
    iOutLen++;

    memcpy(p, OutBuf, iOffset);
    iOutLen += iOffset;

    iOutLen += 2;
    pDataNode->Length = iOutLen;

    return 1;
}
示例#23
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;
}