コード例 #1
0
ファイル: F847117.cpp プロジェクト: nykma/ykt4sungard
static int do_fronze_by_stuempno_ex(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret;
	ret = do_fronze_by_stuempno(handle,iRequest,rPack,pRetCode,szMsg);
	if(ret)
	{
		writelog(LOG_ERR,"froze card error ,stuemp_no[%s],ret[%d]",rPack->scust_no,ret);
		if(db_rollback())
		{
			return E_DB_ROLLBACK;
		}
		return ret;
	}
	writelog(LOG_DEBUG,"froze card success , stuemp_no[%s] ",rPack->scust_no);
	return 0;
}
コード例 #2
0
ファイル: mbbstat.c プロジェクト: denispeplin/mbb-devel
void mbb_stat_pool_save(struct mbb_stat_pool *pool)
{
	static GStaticMutex mutex = G_STATIC_MUTEX_INIT;

	mbb_log_lvl_t mask;

	mbb_log_mask(LOG_MASK_DEL, MBB_LOG_QUERY, &mask);

	if (! g_static_mutex_trylock(&mutex)) {
		mbb_log("wait for mutex");
		g_static_mutex_lock(&mutex);
	}

	if (! mbb_task_poll_state())
		goto out;

	mbb_log("save to db");

	if (! db_begin())
		goto out;

	if (! save_records(pool->ustat, unit_rec_save))
		goto rollback;

	if (! save_records(pool->lstat, link_rec_save))
		goto rollback;

	if (! save_records(pool->ulstat, unit_link_rec_save))
		goto rollback;

	db_commit();
	goto out;

rollback:
	db_rollback();
out:
	mbb_log_mask(LOG_MASK_SET, mask, NULL);
	g_static_mutex_unlock(&mutex);
	mbb_stat_pool_free(pool);
}
コード例 #3
0
ファイル: main.c プロジェクト: vSlipenchuk/httpdb
int onDbRequest(Socket *sock, vssHttp *req, SocketMap *map) { // Генерация статистики по серверу
char buf[1024];
httpSrv *srv = (void*)sock->pool;
strSetLength(&srv->buf,0); // ClearResulted
vss r=req->B;
strCat(&srv->buf,r.data,r.len); char *sql = srv->buf;
printf("DB->REQ:<%*.*s>\n",VSS(req->B));
if (strncmp(r.data,"select",6)==0) { // get a data
    if (db_select(db,sql)<=0) { // error here ...
        SocketPrintHttp(sock,req,"-%s",db->error);
        return 1;
       }
  strSetLength(&srv->buf,0);
  dbStrFetch(db,&srv->buf);
  SocketSendHttp(sock,req,srv->buf,-1);
  return 1;
  } else { //exec a result
    if (db_exec_once(db,sql)<=0) { // error here
       SocketPrintHttp(sock,req,"-%s",db->error);
       db_rollback(db);
        return 1;
    }
    db_commit(db); // anyqway
    SocketPrintHttp(sock,req,"+1 OK");
        return 1;
  }
/*
sprintf(buf,"{clients:%d,connects:%d,requests:%d,mem:%d,serverTime:'%s',pps:%d}",arrLength(srv->srv.sock)-1,
  srv->srv.connects,
  srv->srv.requests,
  os_mem_used(), szTimeNow,
  (srv->readLimit.pValue+srv->readLimit.ppValue)/2);
*/
SocketPrintHttp(sock,req,"%s","-not implemented yet"); // Flash Results as httpreturn 1; // OK - generated
return 1;
}
コード例 #4
0
ファイル: ksbu.cpp プロジェクト: nykma/ykt4sungard
int CallBDFunc(int fno,TRUSERID *handle,ST_CPACK *rpack,ST_PACK *pArrays,int *iRetCode, char *szMsg)
{
   int r=0;
   int rtn=0;
   int sendtype=0;
   char param[101]="";
#ifdef _DEBUG1
CMemoryState cm1, cm2, cm3;
#endif
   APPFUNC pFunc = g_XBDefines[fno].pFunc;

#ifdef _DEBUG1
	cm1.Checkpoint();
#endif
	*iRetCode=0;
	*szMsg=0;
	g_pArrays=pArrays;
	//判断是否是结帐时刻,如果是则等待处理
	sendtype=rpack->head.RequestType;
	switch(sendtype)
       {
       	case 95:
		case 93:
#ifdef _DEBUG_CPACK
//			rtn=SaveCPackData(rpack);
//			if(rtn)
//			{
//				//writelog(LOG_ERR,"SaveCpackData err ");
//				strcpy(szMsg,"写流水日志表错误");
//				ERR_DEAL( szMsg,rtn);
//				break;
//			}
#endif
			
			rtn = (*pFunc)(handle,rpack->head.RequestType,&rpack->pack,iRetCode,szMsg);
#ifdef _DEBUG1
			cm2.Checkpoint();
			if (cm3.Difference(cm1, cm2))
			{
			      BCCMsgLogOut(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType);
			      g_LogFile.WriteLogEx(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType);
					cm3.DumpStatistics();
			}
#endif 
			break;
		default:
		 	rtn=GetParameter(GLOBE_FLAG_BALANCE,param);
			if(rtn)
			{
				*iRetCode=rtn;
				break;
			}
			else if(strncmp(param,"0",1)!=0)
			{
				rtn=E_DAYEND_STATUS;
				*iRetCode=rtn;
				break;
			}
//			rtn=SaveCPackData(rpack);
//			if(rtn)
//			{
//				//writelog(LOG_ERR,"SaveCpackData err ");
//				strcpy(szMsg,"写流水日志表错误");
//				ERR_DEAL( szMsg,rtn);
//				break;
//			}
			rtn = (*pFunc)(handle,rpack->head.RequestType,&rpack->pack,iRetCode,szMsg);
#ifdef _DEBUG1
			cm2.Checkpoint();
			if (cm3.Difference(cm1, cm2))
			{
			      BCCMsgLogOut(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType);
			      g_LogFile.WriteLogEx(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType);
					cm3.DumpStatistics();
			}
#endif 
	              break;
       }
	
	if(rtn)
	{
	   	char sErrMsg[101]="";
		char sRetMsg[256]="";
		if(*szMsg)
			snprintf(sRetMsg,256," %s",szMsg);
		if(*iRetCode==0)
		  *iRetCode=rtn;
		r=get_errcode_msg(*iRetCode, sErrMsg);
		db_rollback();
		snprintf(szMsg,256,"%s%s\n%s",sErrMsg,sRetMsg,g_sqlmsg);
		writelog(LOG_ERR,"Func[%d]ecode[%d]msg[%s]",rpack->head.RequestType,*iRetCode,szMsg);
		ERR_DEAL(szMsg,*iRetCode);
		if(r)
		{
			AnswerData(handle,*iRetCode,szMsg);
			db_disconnect();
			writelog(LOG_ERR,"数据库错误,系统退出");
			exit(1);
		}
	}
	else
	{
		writelog(LOG_ERR,"Func[%d]Msg[%s]",rpack->head.RequestType,szMsg);
		if(strncmp(rpack->pack.scust_limit,"test",4)==0)
			db_rollback();
		else
		{
			//记录操作员流水
			r=db_commit();
			if(r)
			{
				*iRetCode=E_DB_COMMIT;
				strcpy(szMsg,"数据库事务提交失败");
				writelog(LOG_ERR,"Func[%d]Msg[%s]",rpack->head.RequestType,szMsg);
				db_rollback();
				ERR_DEAL( szMsg,*iRetCode);
			}
		}
	}
   	return(rtn);
}
コード例 #5
0
ファイル: parsethread.c プロジェクト: alistairyves/rteval
/**
 * The core parse function.  Parses an XML file and stores it in the database according to
 * the xmlparser.xsl template.
 *
 * @param thrdata  Pointer to a threadData_t structure with database connection, log context, settings, etc
 * @param job      Pointer to a parseJob_t structure containing the job information
 *
 * @return Return values:
 * @code
 *          STAT_SUCCESS  : Successfully registered report
 *          STAT_FTOOBIG  : XML report file is too big
 *          STAT_XMLFAIL  : Could not parse the XML report file
 *          STAT_SYSREG   : Failed to register the system into the systems or systems_hostname tables
 *          STAT_RTERIDREG: Failed to get a new rterid value
 *          STAT_GENDB    : Failed to start an SQL transaction (BEGIN)
 *          STAT_RTEVRUNS : Failed to register the rteval run into rtevalruns or rtevalruns_details
 *          STAT_CYCLIC   : Failed to register the data into cyclic_statistics or cyclic_rawdata tables
 *          STAT_REPMOVE  : Failed to move the report file
 * @endcode
 */
inline int parse_report(threadData_t *thrdata, parseJob_t *job)
{
	int syskey = -1, rterid = -1;
	int rc = -1;
	xmlDoc *repxml = NULL;
	char *destfname;

	// Check file size - and reject too big files
	if( check_filesize(thrdata, job->filename) == 0 ) {
		writelog(thrdata->dbc->log, LOG_ERR,
			 "[Thread %i] (submid: %i) Report file '%s' is too big, rejected",
			 thrdata->id, job->submid, job->filename);
		return STAT_FTOOBIG;
	}


	repxml = xmlParseFile(job->filename);
	if( !repxml ) {
		writelog(thrdata->dbc->log, LOG_ERR,
			 "[Thread %i] (submid: %i) Could not parse XML file: %s",
			 thrdata->id, job->submid, job->filename);
	        return STAT_XMLFAIL;
	}

	pthread_mutex_lock(thrdata->mtx_sysreg);
	syskey = db_register_system(thrdata->dbc, thrdata->xslt, repxml);
	if( syskey < 0 ) {
		writelog(thrdata->dbc->log, LOG_ERR,
			 "[Thread %i] Failed to register system (submid: %i, XML file: %s)",
			 thrdata->id, job->submid, job->filename);
		rc = STAT_SYSREG;
		goto exit;

	}
	rterid = db_get_new_rterid(thrdata->dbc);
	if( rterid < 0 ) {
		writelog(thrdata->dbc->log, LOG_ERR,
			 "[Thread %i] Failed to register rteval run (submid: %i, XML file: %s)",
			 thrdata->id, job->submid, job->filename);
		rc = STAT_RTERIDREG;
		goto exit;
	}
	pthread_mutex_unlock(thrdata->mtx_sysreg);

	if( db_begin(thrdata->dbc) < 1 ) {
		rc = STAT_GENDB;
		goto exit;
	}

	// Create a new filename of where to save the report
	destfname = get_destination_path(thrdata->dbc->log, thrdata->destdir, job, rterid);
	if( !destfname ) {
		writelog(thrdata->dbc->log, LOG_ERR,
			 "[Thread %i] Failed to generate local report filename for (submid: %i) %s",
			 thrdata->id, job->submid, job->filename);
		db_rollback(thrdata->dbc);
		rc = STAT_UNKNFAIL;
		goto exit;
	}

	if( db_register_rtevalrun(thrdata->dbc, thrdata->xslt, repxml, job->submid,
				  syskey, rterid, destfname) < 0 ) {
		writelog(thrdata->dbc->log, LOG_ERR,
			 "[Thread %i] Failed to register rteval run (submid: %i, XML file: %s)",
			 thrdata->id, job->submid, job->filename);
		db_rollback(thrdata->dbc);
		rc = STAT_RTEVRUNS;
		goto exit;
	}

	if( db_register_cyclictest(thrdata->dbc, thrdata->xslt, repxml, rterid) != 1 ) {
		writelog(thrdata->dbc->log, LOG_ERR,
			 "[Thread %i] Failed to register cyclictest data (submid: %i, XML file: %s)",
			 thrdata->id, job->submid, job->filename);
		db_rollback(thrdata->dbc);
		rc = STAT_CYCLIC;
		goto exit;
	}

	// When all database registrations are done, move the file to it's right place
	if( make_report_dir(thrdata->dbc->log, destfname) < 1 ) { // Make sure report directory exists
		db_rollback(thrdata->dbc);
		rc = STAT_REPMOVE;
		goto exit;
	}

	if( rename(job->filename, destfname) < 0 ) { // Move the file
		writelog(thrdata->dbc->log, LOG_ERR,
			 "[Thread %i] (submid: %i) Failed to move report file from %s to %s (%s)",
			 thrdata->id, job->submid, job->filename, destfname, strerror(errno));
		db_rollback(thrdata->dbc);
		rc = STAT_REPMOVE;
		goto exit;
	}
	free_nullsafe(destfname);

	rc = STAT_SUCCESS;
	db_commit(thrdata->dbc);
	writelog(thrdata->dbc->log, LOG_INFO,
		 "[Thread %i] Report parsed and stored (submid: %i, rterid: %i)",
		 thrdata->id, job->submid, rterid);
 exit:
	xmlFreeDoc(repxml);
	return rc;
}
コード例 #6
0
ファイル: F240002.cpp プロジェクト: nykma/ykt4sungard
int F240002(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{

	int ret=0;
	double unique=0;
	int temp_serial_no=0;
	char logicdate[11]="";
	char buffer[16]="";
	int i=0;

	double trans_amt=0.0;
	char sMsg[255]="";
	char sDebugMsg[255]="";

	char sMaxCardBalance[20]="";
	double dMaxCardBalance=0;
	T_t_aif_account	tAccount;		//帐户表
	T_t_cif_customer	tCustomer;
	T_t_pif_spefee 	tSpeFee;
	T_t_tif_tradeserial  tradeserial;		//卡操作流水表
	T_t_pif_card		card;
	InAcc	IA;

	memset(&tSpeFee,0,sizeof(tSpeFee));
	memset(&tCustomer,0,sizeof(tCustomer));
	memset(&tAccount,0,sizeof(tAccount));
	memset(&IA,0,sizeof(IA));

	memset(&tradeserial,0,sizeof(tradeserial));
	memset(&card,0,sizeof(card));


	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);


	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_DAMT0,F_DAMT1,F_DAMT2,F_LVOL1,F_LVOL2,F_SBANK_CODE,F_SEMP_NO,0);


	//memset(&tradeserial_bak,0,sizeof(tradeserial_bak));

	ret=GetLogicDate(logicdate);								//业务日期
	if(ret)
	{
		*pRetCode=E_TRANS_UNKNOW_ERROR;
		writelog(LOG_ERR,"GetLogicDate error,errcode=[%d]",ret);
		goto L_RETU;
	}

	//判断设备是否登陆
	if(0!=device_login_yes_or_no(atoi(rPack->sorder2)))
	{
		*pRetCode=E_TRANS_TERM_NOLOGIN;
		writelog(LOG_ERR,"Device don't login");
		goto L_RETU;
	}
	//判断是否处于日终结算状态
 	ret=GetParameter(GLOBE_FLAG_BALANCE,buffer);
	if(ret)
	{
		*pRetCode=E_TRANS_UNKNOW_ERROR;
		writelog(LOG_ERR,"GetParameter error,errcode=[%d]",ret);
		goto L_RETU;
	}
	else if(strncmp(buffer,"0",1)!=0)
	{
		*pRetCode=E_TRANS_BANK_SERVICE_NOEXIT;
		writelog(LOG_ERR,"System is balance now!");
		goto L_RETU;
	}

	ret=DB_t_pif_card_read_by_card_id(atoi(rPack->sserial0),&card);
	if(ret)
	{
		*pRetCode=E_TRANS_SCHACC_NOEXIT;
		writelog(LOG_ERR,"Create serial_no error,error code=[%d]",ret);
		goto L_RETU;
	}

	if(strncmp(card.state_id,CARDSTAT_LOGOUT,4)==0)
	{
		*pRetCode=E_TRANS_SCHACC_DESTORY;
		writelog(LOG_ERR,"card.state_id=[%d]",card.card_id);
		goto L_RETU;
	}

	if(STATE_TRUE==card.state_id[CARDSTAT_TYPE_LOST])
	{
		DB_t_pif_card_free_lock_by_cur();
		*pRetCode=E_TRANS_SCHCARD_LOSTING;
		writelog(LOG_ERR,"card_state=[%s]",card.state_id);
		goto L_RETU;
	}

	if(STATE_TRUE==card.state_id[CARDSTAT_TYPE_FREEZE])
	{
		DB_t_pif_card_free_lock_by_cur();
		*pRetCode=E_TRANS_SCHCARD_FREEZE;
		writelog(LOG_ERR,"card_state=[%s]",card.state_id);
		goto L_RETU;
	}
	if(STATE_TRUE==card.state_id[CARDSTAT_TYPE_WFAIL])
	{
		DB_t_pif_card_free_lock_by_cur();
		*pRetCode=E_TRANS_SCHCARD_WFAIL;
		writelog(LOG_ERR,"card_state=[%s]",card.state_id);
		goto L_RETU;
	}

	//转账不允许转小数金额
	if((rPack->lvol5)%100>0)
	{
		*pRetCode=E_TRANS_TRANSMONEY_OUTRANGE;
		writelog(LOG_ERR,"Trans money is not a integer!,transmoney=[%f]",rPack->lvol5/100.0);
		goto L_RETU;
	}

	//开始填充流水数据
	//流水号

	ret=getNewUniqNo(KEYTYPE_TRADESERIAL, &unique);
	if(ret)
	{
		*pRetCode=E_TRANS_UNKNOW_ERROR;
		writelog(LOG_ERR,"Create serial_no error,error code=[%d]",ret);
		goto L_RETU;
	}


	tradeserial.serial_no=D2I(unique);
	//记录流水号,作为冲正使用
	temp_serial_no=tradeserial.serial_no;

	tradeserial.other_seri_no=rPack->lvol0;	//上传端流水号
	tradeserial.serial_type=TXCODE_BANK_SCHOOL;	//交易代码
	tradeserial.serial_state=SERISTAT_NODEBT;	//流水状态
	tradeserial.card_id=atoi(rPack->sserial0);
	tradeserial.purse_id=0;
	tradeserial.in_balance=double((rPack->lvol6)/100.00);	//入卡金额
	tradeserial.out_balance=tradeserial.in_balance;			//出卡金额
	tradeserial.trade_count=rPack->lvol1+1;				//当前卡中交易次数

	ret=get_datetime_from_db(tradeserial.operate_date,tradeserial.operate_time);
	if(ret)
	{
		writelog(LOG_ERR,"get_datetime_from_db error,error code=[%d]",ret);
		getsysdate(tradeserial.operate_date);
		getsystime(tradeserial.operate_time);
	}
	Strncpy_t(tradeserial.collect_date,tradeserial.operate_date,sizeof(tradeserial.collect_date));	//采集日期
	Strncpy_t(tradeserial.collect_time,tradeserial.operate_time,sizeof(tradeserial.collect_time));	//采集时间
	Strncpy_t(tradeserial.enteract_date,logicdate,sizeof(tradeserial.enteract_date));	//入帐日期
	Strncpy_t(tradeserial.enteract_time,tradeserial.operate_time,sizeof(tradeserial.enteract_time));	//入帐时间
	tradeserial.maindevice_id=GetTransferSystemId();		//子系统号码
	tradeserial.device_id=atoi(rPack->sorder2);			//终端ID
	tradeserial.trade_fee=(rPack->lvol5)/100.0;	//转帐金额
	Strncpy_t(tradeserial.b_act_id,rPack->scust_auth,sizeof(tradeserial.b_act_id));
	tradeserial.sys_id=rPack->lvol2;						//表示银行
	tradeserial.condition_id=SELF_TRANS;						//自动/自助转帐标识
	tradeserial.customer_id=card.cosumer_id;
	Strncpy_t(tradeserial.oper_code,OPER_SYSTEM_KEY,sizeof(tradeserial.oper_code));	//操作员代码

	//判断转帐金额是否超出钱包最大限额
	ret=DB_t_aif_account_read_by_card_id_and_purse_id(card.card_id, PURSE_NO_ONE,&tAccount);
	if(ret)
	{
		writelog(LOG_ERR,"DB_t_aif_account_read_by_card_id_and_purse_id ret[%d]card_id[%d]",ret,card.card_id);
		if(DB_NOTFOUND==ret)
		{
			*pRetCode=E_TRANS_SCHACC_NOEXIT;
			goto L_RETU;
		}
		else
		{
			*pRetCode=E_TRANS_UNKNOW_ERROR;
			goto L_RETU;
		}
	}

	ret=GetParameter(GLOBE_MAXCARDBALANCE,sMaxCardBalance);
	if(ret)
	{
		writelog(LOG_ERR,"GetParameter GLOBE_MAXCARDBALANCE error,errcode=[%d]",ret);
		*pRetCode=E_TRANS_UNKNOW_ERROR;
		goto L_RETU;
	}
	dMaxCardBalance=atof(sMaxCardBalance);

	if(amtcmp(tAccount.cur_bala+tradeserial.trade_fee,dMaxCardBalance)>0)
	{
		*pRetCode=E_TRANS_TRANSMONEY_OUTRANGE;
		goto L_RETU;
	}
	//读取客户收费类别字段
	ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(card.cosumer_id, &tCustomer);
	if(ret)
	{
		writelog(LOG_ERR,"cut_id[%d]",card.cosumer_id);
		if(DB_NOTFOUND==ret)
		{
			*pRetCode=E_TRANS_UNKNOW_ERROR;
			goto L_RETU;
		}
		else
		{
			*pRetCode=E_TRANS_UNKNOW_ERROR;
			goto L_RETU;
		}
	}

	if(0==tCustomer.fee_type)
	{
		ret=DB_t_pif_spefee_read_by_dept_code_and_cut_type(tCustomer.classdept_no, tCustomer.cut_type,&tSpeFee);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
			{
				tCustomer.fee_type=tCustomer.cut_type;
			}
			else
			{
				DB_t_cif_customer_free_lock_cur();
				writelog(LOG_ERR,"DB_t_pif_spefee_read_by_dept_code_and_cut_type error,errcode=[%d]",ret);
				*pRetCode=E_TRANS_UNKNOW_ERROR;
				goto L_RETU;
			}
		}
		else
		{
			tCustomer.fee_type=tSpeFee.fee_type;
		}
	}
	DB_t_cif_customer_free_lock_cur();
	//记录流水数据,用于提供正确的流水号,以及银行业务不成功供查询
	ret=DB_t_tif_tradeserial_add(&tradeserial);
	if(ret)
	{
		*pRetCode=E_TRANS_UNKNOW_ERROR;
		writelog(LOG_ERR,"Insert t_tif_tradeserial table error,error code=[%d]",ret);
		goto L_RETU;
	}

	ret=db_commit();
	if(ret)
	{
		*pRetCode=E_DB_COMMIT;
		writelog(LOG_ERR,"db_commit error,error code=[%d]",ret);
		goto L_RETU;

	}
	//填写入账结构,问问闻剑
	memset(&IA,0,sizeof(IA));
	des2src(IA.sArrInActno[0],tAccount.account_id);			//贷方帐户,持卡人账户
	des2src(IA.sArrInActno[2],rPack->sstation0);				//借方帐号,由前置机上传

	switch (rPack->lvol3)
	{
		case 4:
			IA.iArrInFeeSwitch[1] = 1;
			break;
		case 5:
			IA.iArrInFeeSwitch[1] = 0;
			break;
		default:
			break;
	}
	
	IA.iCardNo=card.card_id;
	IA.iFeeType=tCustomer.fee_type;
	IA.dArrInAmt[0]=tradeserial.trade_fee;

	writelog(LOG_ERR,"借方帐号=[%d]",atoi(rPack->sstation0));
	
	ret=process(&IA,&tradeserial);
	if(ret)
	{
		writelog(LOG_ERR,"process err,errcode[%d]",ret);
		*pRetCode=E_TRANS_UNKNOW_ERROR;
		goto L_RETU;
	}

	sprintf(sDebugMsg,"流水号:%d ",IA.iSerialNo);
	for(i=1;i<=IA.iOutTxTypeCnt;i++)
	{
		switch(IA.iArrOutTxType[i])
		{
			case TXTYPE_TOLL_DEPOSIT:
			case TXTYPE_DEDUCT_DEPOSIT:
			case TXTYPE_RETURN_DEPOSIT:
				tradeserial.deposit_fee=IA.dArrOutAmt[i];
				break;
			case TXTYPE_PRE_TOLL_BOARD:
			case TXTYPE_TOLL_BOARD:
			case TXTYPE_DEDUCT_BOARD:
			case TXTYPE_RETURN_BOARD:
			case TXTYPE_BANK_PRE_TOLL_BOARD:
				tradeserial.boardfee=IA.dArrOutAmt[i];
				break;
			case TXTYPE_TOLL_CHARGE:
				tradeserial.in_fee=IA.dArrOutAmt[i];
				break;
			case TXTYPE_BANK_TRANSFER:
				trans_amt=IA.dArrOutAmt[i];
				break;
			default:
				break;
		}
		if(amtcmp(IA.dArrOutAmt[i],0)!=0)
		{
			sprintf(sMsg,"%s:%.2lf元 ",IA.sArrOutTxName[i],IA.dArrOutAmt[i]);
			strcat(sDebugMsg,sMsg);
		}
	}


	sprintf(sMsg,"充值前卡余额:%.2lf 转帐后卡余额:%.2lf ",IA.dInCardBala,IA.dOutCardBala);
    	strcat(sDebugMsg,sMsg);
	writelog(LOG_DEBUG,sDebugMsg);

	out_pack->damt0=tradeserial.out_balance;
	out_pack->damt1=tradeserial.trade_fee;
	out_pack->damt2=tradeserial.boardfee;
	out_pack->lvol1=tradeserial.serial_no;
	out_pack->lvol2=D2I(tradeserial.out_balance*100.0);
	des2src(out_pack->semp_no, tradeserial.operate_date);
	des2src(out_pack->sbank_code, tradeserial.operate_time);
	PutRow(handle,out_pack,pRetCode,szMsg);

	//业务结束后,回滚事务
	ret=db_rollback();
	if(ret)
	{
		*pRetCode=E_DB_ROLLBACK;
		writelog(LOG_ERR,"db_rollback error,error code=[%d]",ret);
		goto L_RETU;
	}
	
	return 0;
	
L_RETU:
	return -1;
}
コード例 #7
0
/* ****** Updated by CHENYH at 2004-4-9 10:06:44 ******
   增加pArrays: 为了能够接收处理多请求记录的情况
*/
int CallBDFunc(int fno,TRUSERID *handle,ST_CPACK *rpack,ST_PACK *pArrays,int *iRetCode, char *szMsg)
{
   int r=0;
   int rtn=0;
   int sendtype=0;
   char param[101]="";
#ifdef _DEBUG1
CMemoryState cm1, cm2, cm3;
#endif
   APPFUNC pFunc = g_BDefines[fno].pFunc;

#ifdef _DEBUG1
	cm1.Checkpoint();
#endif
	*iRetCode=0;
	*szMsg=0;
	//判断是否是结帐时刻,如果是则等待处理
	sendtype=rpack->head.RequestType/10000;
	switch(sendtype)
       {
		case 93:
			rtn = (*pFunc)(handle,rpack->head.RequestType,&rpack->pack,iRetCode,szMsg);
			break;
		default:
		 	rtn=GetParameter(GLOBE_FLAG_BALANCE,param);
			if(rtn)
			{
				*iRetCode=rtn;
				break;
			}
			else if(strncmp(param,"0",1)!=0)
			{
				rtn=E_DAYEND_STATUS;
				*iRetCode=rtn;
				break;
			}
			rtn = (*pFunc)(handle,rpack->head.RequestType,&rpack->pack,iRetCode,szMsg);
	              break;
       }
	if(rtn)
	{
	   	char sErrMsg[60]="";
		char sRetMsg[256]="";
		if(*szMsg)
			snprintf(sRetMsg,256," %s",szMsg);
		r=get_errcode_msg(*iRetCode, sErrMsg);
		db_rollback();
		snprintf(szMsg,256,"%s%s",sErrMsg,sRetMsg);
		writelog(LOG_ERR,"Func[%d]ecode[%d]msg[%s]",rpack->head.RequestType,*iRetCode,szMsg);
		ERR_DEAL(szMsg,*iRetCode);
		if(r)
		{
			AnswerData(handle,*iRetCode,szMsg);
			db_disconnect();
			writelog(LOG_ERR,"数据库错误,系统退出");
			exit(1);
		}
	}
	else
	{
		r=db_commit();
		if(r)
		{
			*iRetCode=E_DB_COMMIT;
			strcpy(szMsg,"数据库事务提交失败");
			writelog(LOG_ERR,"Func[%d]Msg[%s]",rpack->head.RequestType,szMsg);
			db_rollback();
			ERR_DEAL( szMsg,*iRetCode);
		}
	}
#ifdef _DEBUG1
	cm2.Checkpoint();
	if (cm3.Difference(cm1, cm2))
   {
      BCCMsgLogOut(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType);
      g_LogFile.WriteLogEx(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType);
		cm3.DumpStatistics();
   }
#endif

   if (g_BUnit.m_SqlDB.lErrorCode<=-10000)  // 出现SQL比较严重的错误
   {
      if (SQLIsConnectOK()==0)
      {
         SQLDisconnect();
      }
      g_BUnit.m_SqlDB.lErrorCode = 0;
   }
   return(rtn);
}
コード例 #8
0
ファイル: ext_consumer.cpp プロジェクト: nykma/ykt4sungard
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
//系统模拟入账
 int tend_to_enter_account(ST_PACK *in_pack,InAcc *IA,int trade_code,T_t_tif_tradeserial *tradeserial){
	int ret = 0;
	int i=0;
	int	card_id = 0;
	
	T_t_cif_customer 	tCustomer;
	T_t_pif_spefee 	tSpeFee;
	T_t_aif_account	tAccount;

	memset(&tCustomer,0,sizeof(tCustomer));
	memset(&tSpeFee,0,sizeof(tSpeFee));
	memset(&tAccount,0,sizeof(tAccount));

	card_id=tradeserial->card_id;
	
	//根据卡号和钱包号得到消费者账号(借方)
	ret=DB_t_aif_account_read_by_card_id_and_purse_id(card_id, PURSE_NO_ONE,&tAccount);
	if(ret)
	{
		writelog(LOG_ERR,"DB_t_aif_account_read_by_card_id_and_purse_id ret[%d]card_id[%d]",ret,card_id);
		if(DB_NOTFOUND==ret)
			ret=E_ACTNO_NOT_EXIST;
		else
			ret=E_DB_ACCOUNT_R;
		return ret;
	}
	
	ret=DB_t_cif_customer_read_by_cut_id(tAccount.customer_id, &tCustomer);
	if(ret)
	{
		writelog(LOG_ERR,"cut_id[%d]",tAccount.customer_id);
		if(DB_NOTFOUND==ret)
			ret= E_CUSTOMER_NOT_EXIST;
		else
			ret= E_DB_CUSTOMER_R;
		return ret;
	}
	

	IA->iCardNo=tradeserial->card_id;
	IA->iFeeType=tCustomer.fee_type;
	if(amtcmp(tradeserial->trade_fee, 0) <=0)
		return E_INPUT_AMT;
	IA->dArrInAmt[0]=tradeserial->trade_fee;
	IA->iMainDevId=tradeserial->maindevice_id;				//工作站标识
	IA->iDevId=tradeserial->device_id;						//设备ID
	IA->iSerialNo=tradeserial->serial_no;					//流水号
	IA->iTradeNo=tradeserial->serial_type;					//交易码
	strcpy(IA->sTxDate,tradeserial->operate_date);			//交易日期
	strcpy(IA->sTxTime,tradeserial->operate_time);			//交易时间
	strcpy(IA->sTxCollectDate,tradeserial->collect_date);		//采集日期
	strcpy(IA->sTxCollectTime,tradeserial->collect_time);		//采集时间
	strcpy(IA->sTxAccDate,tradeserial->enteract_date);		//记账日期
	strcpy(IA->sTxAccTime,tradeserial->enteract_time);		//记账时间
	strcpy(IA->sMdeOper,tradeserial->oper_code);			//操作员
	strcpy(IA->sChkOper,tradeserial->reserve_1);			//复核操作员

	IA->iUseCardFlag=USE_CARD_TYPE_ONLINE;		//联机交易
	IA->iTxCnt=tradeserial->trade_count;					//交易次数
	IA->dInCardBala=tradeserial->in_balance;				//入卡值
	IA->dOutCardBala=-1;							//出卡值

	//修改借方和贷方帐户余额,记会计分录帐
	ret=AccountProcess(IA);
	if(ret)
	{
		writelog(LOG_ERR,"AccountProcess ret[%d]",ret);
		return ret;
	}
	tradeserial->out_balance=IA->dOutCardBala;			//出卡值
	if(amtcmp(tradeserial->out_balance,0)<0)
	{
		return E_ENTER_ACCOUNT;
	}

	for(i=1;i<=IA->iOutTxTypeCnt;i++)
	{
		switch(IA->iArrOutTxType[i])
		{
			case TXTYPE_TOLL_DEPOSIT:
			case TXTYPE_TOLL_DEPOSIT_BILL:
			case TXTYPE_TOLL_DEPOSIT_FUNDBOOK:
			case TXTYPE_DEDUCT_DEPOSIT:
			case TXTYPE_RETURN_DEPOSIT:
				tradeserial->deposit_fee=IA->dArrOutAmt[i];
				break;
			case TXTYPE_PRE_TOLL_BOARD:
			case TXTYPE_PRE_TOLL_BOARD_BILL:
			case TXTYPE_BANK_PRE_TOLL_BOARD:
			case TXTYPE_PRE_TOLL_BOARD_FUNDBOOK:
			case TXTYPE_SUBSIDY_PRE_TOLL_BOARD_CASH:
			case TXTYPE_SUBSIDY_PRE_TOLL_BOARD_BILL:
			case TXTYPE_SUBSIDY_PRE_TOLL_BOARD_FUNDBOOK:
			case TXTYPE_TOLL_BOARD:
			case TXTYPE_DEDUCT_BOARD:
			case TXTYPE_RETURN_BOARD:
			case TXTYPE_RETURN_BOARD_BILL:
			case TXTYPE_RETURN_BOARD_FUNDBOOK:
				tradeserial->boardfee=IA->dArrOutAmt[i];
				break;
			case TXTYPE_TOLL_CHARGE:
			case TXTYPE_TOLL_CHARGE_BILL:
			case TXTYPE_TOLL_CHARGE_FUNDBOOK:
				tradeserial->in_fee=IA->dArrOutAmt[i];
				break;
			case TXTYPE_TOLL_CARDCOST:
			case TXTYPE_TOLL_CARDCOST_BILL:
			case TXTYPE_TOLL_CARDCOST_FUNDBOOK:
				tradeserial->cost_fee=IA->dArrOutAmt[i];
				break;
			default:
				break;
		}
		
	}

	ret = db_rollback();
	if(ret)
	{
		writelog(LOG_ERR,"db_roll_back error,errcode=[%d]",ret);
		return E_DB_ROLLBACK;
	}
	return 0;
}
コード例 #9
0
ファイル: transinfo.cpp プロジェクト: nykma/ykt4sungard
int Do_Compare_file_shoudong()
{
///*
	FILE *fp;
	TIniFile tf;
	char path_name[256]="";
	char file_name[256]="";
	int ret=0;
	int cnt=0;
	int i=0;

	BANK_COMPARE_RECODE compare,compare1;
	T_t_tif_bank_comp	bank_comp;
	T_t_tif_report_trans_comp trans_comp;
	T_t_tif_tradeserial	tradeserial;
	T_t_tif_tradeserial_his his_tradeserial;
	T_t_tif_diff_transfer  diff_transfer;

	char logicdate[10]="";
	char tmp_date[10]="";
	char forward_date[10]="";

	double trans_count=0;
	double bank_count=0;
	double trans_amt=0;
	double bank_amt=0;
	double second=0;

	double temp=0;
	char *p=getenv("BIN_PATH");

	ret=GetLogicDate(logicdate);								//业务日期
	if(ret)
	{
		writelog(LOG_ERR,"GetLogicDate error,errcode=[%d]",ret);
		return ret;
	}

	ret=datetime2second(logicdate, "YYYYMMDD", &second);
	if(ret)
	{
		writelog(LOG_ERR,"datetime2second error,errcode=[%d]",ret);
		return 	ret;
	}
	 //trans_count=0;
	 //bank_count=0;
	 //trans_amt=0;
	// bank_amt=0;

	second=second-24*60*60;
	ret=second2datetime(second, forward_date, "YYYYMMDD");
	if(ret)
	{
		writelog(LOG_ERR,"second2datetime error,errcode=[%d]",ret);
		return 	ret;
	}

	memset(&bank_comp,0,sizeof(bank_comp));
	memset(&compare,0,sizeof(compare));
	memset(&trans_comp,0,sizeof(trans_comp));
	memset(&tradeserial,0,sizeof(tradeserial));
	memset(&his_tradeserial,0,sizeof(his_tradeserial));

	memset(&compare1,0x30,sizeof(compare1));

	ret=DB_t_tif_report_trans_comp_read_by_cmp_date(forward_date,&trans_comp);
	if(ret!=100&&ret!=0)
	{
		writelog(LOG_ERR,"DB_t_tif_report_trans_comp_read_by_cmp_date error,errcode=[%d]",ret);
		goto LRet;
	}
	if(1==trans_comp.cmp_flag)
	{
		writelog(LOG_ERR,"trans_comp.cmp_flag =1,already compare!");
		goto LRet;
	}
	//配置环境变量
	if(p==NULL)
	{
	   	writelog(LOG_ERR,"Cann't get env HOME PATH\n");
	   	return -1;
	}
	//sprintf(path_name,"%s/ftp",p);
	sprintf(path_name,"%s",p);
	//strcpy(path_name,"/bank/ykt/src/bank/ftp");
	sprintf(file_name,"%s/XYK00002.%8.8s",path_name,forward_date);
	writelog(LOG_ERR,"Open indirect file=[%s]",file_name);
	if((fp = fopen(file_name,"rb"))==NULL)
	{
		writelog(LOG_ERR,"Open indirect file error,file=[%s]",file_name);
		return	-1;
	}

	while(!feof(fp))
	{
		memset(&bank_comp,0,sizeof(bank_comp));
		memset(&compare,0,sizeof(compare));
		cnt++;
		if(NULL==fgets((char *)(&compare),sizeof(compare),fp))
		{
			writelog(LOG_ERR,"fgets error,");
			continue;
		}
		//不知道为什么,必须要跳一个才能对?
		if((cnt+2)%2==0)	continue;
		//开始进行赋值
		if(memcmp(&compare,&compare1,10)==0)	break;
		else
		{
			strncpy(bank_comp.op_date,forward_date,sizeof(bank_comp.op_date)-1);
			memcpy(bank_comp.tx_code,compare.TradeCode,2);
			bank_comp.card_id=atoi(compare.GDCAccount);
			memcpy(bank_comp.bankcard,compare.BankCard,20);
			bank_comp.local_sn=atoi(compare.LocalSn);
			//printf("--------local_sn[%d]=[%d]\n",cnt,bank_comp.local_sn);
			memcpy(bank_comp.bank_sn,compare.BankSn,20);
			strncpy(bank_comp.trans_money,compare.TransMomoy,9);

			ret=DB_t_tif_bank_comp_add(&bank_comp);
			if(ret)
			{
				writelog(LOG_ERR,"DB_t_tif_bank_comp_add rows[%d] error,errcode=[%d]",cnt,ret);
				goto LRet;
			}
		}
	}
	//读取对帐文件结束,关闭对仗文件,提交事务
	//printf("Line=[%d]\n",__LINE__);
	if(fclose(fp))
	{
		writelog(LOG_ERR,"Close file error,file=[%s]",file_name);
		goto LRet;
	}
	ret=db_commit();
	if(ret)
	{
		writelog(LOG_ERR,"db_commit error,errcode=[%d]",ret);
		goto LRet;
	}

	//开始进行对帐
	cnt=0;

	//对总数
	ret=DB_his_t_tif_tradeserial_get_count_by_serial_type(&temp,240001,forward_date);
	if(ret!=100&&ret!=0)
	{
		writelog(LOG_ERR,"DB_t_tif_tradeserial_get_count_by_serial_type err,errcode=[%d]",ret);
		goto LRet;
	}
	trans_count=trans_count+temp;
	trans_comp.localself_num=trans_count;

	ret=DB_his_t_tif_tradeserial_get_sum_by_serial_type(&temp, 240001, forward_date);
	if(ret!=100&&ret!=0)
	{
		writelog(LOG_ERR,"DB_his_t_tif_tradeserial_get_sum_by_serial_type err,errcode=[%d]",ret);
		goto LRet;
	}
	trans_amt=trans_amt+temp;
	trans_comp.localself_amt=trans_amt;

	ret=DB_t_tif_bank_comp_open_select_by_cur1_and_op_date(forward_date);
	if(ret)
	{
		writelog(LOG_ERR,"DB_t_tif_bank_comp_open_select_by_cur1_and_op_date err,errcode=[%d]",ret);
		goto LRet;
	}
	while(1)
	{
		ret=DB_t_tif_bank_comp_fetch_select_by_cur1(&bank_comp);
		if(ret)
		{
			DB_t_tif_bank_comp_close_select_by_cur1();
			if(ret==DB_NOTFOUND)
			{
				if(cnt==0)
					{
						writelog(LOG_DEBUG,"There havn't record from t_tif_bankcomp table!");
						break;
					}
				else		break;
			}
			else
				goto LRet;
		}
		cnt++;
		bank_count=bank_count+1;
		bank_amt=bank_amt+atof(bank_comp.trans_money)/100.00;
		memset(&diff_transfer,0,sizeof(diff_transfer));
		//printf("Line=[%d],cnt=[%d]\n",__LINE__,cnt);

		ret=DB_t_tif_tradeserial_his_read_by_bak_date_and_serial_no(forward_date,bank_comp.local_sn,&his_tradeserial);
		//流水表中没有记录的情况
		if(ret)
		{
			if(100==ret)
			{
				strncpy(diff_transfer.op_date,forward_date,sizeof(diff_transfer.op_date)-1);
				strncpy(diff_transfer.bankcard,bank_comp.bankcard,sizeof(diff_transfer.bankcard)-1);
				diff_transfer.bank_amt=atoi(bank_comp.trans_money)/100.00;
				strncpy(diff_transfer.bank_sn,bank_comp.bank_sn,sizeof(diff_transfer.bank_sn)-1);
				diff_transfer.card_id=bank_comp.card_id;
				diff_transfer.local_sn=bank_comp.local_sn;
				diff_transfer.diff_amt=diff_transfer.bank_amt-diff_transfer.local_amt;
				diff_transfer.status=1;
				ret=DB_t_tif_diff_transfer_add(&diff_transfer);
				if(ret)
				{
					writelog(LOG_ERR,"DB_t_tif_diff_transfer_add error,errcode=[%d]!",ret);
					break;
				}
				continue;
			}
			else
			{
				writelog(LOG_ERR,"DB_t_tif_tradeserial_his_read_lock_by_c0_and_enteract_date_and_serial_no error,errcode=[%d]!",ret);
				break;
			}
		}
		//流水表中存在,但是没有入账的情况
		if(his_tradeserial.serial_state!=2)
		{
				strncpy(diff_transfer.op_date,forward_date,sizeof(diff_transfer.op_date)-1);
				strncpy(diff_transfer.bankcard,bank_comp.bankcard,sizeof(diff_transfer.bankcard)-1);
				diff_transfer.bank_amt=atoi(bank_comp.trans_money)/100.00;
				strncpy(diff_transfer.bank_sn,bank_comp.bank_sn,sizeof(diff_transfer.bank_sn)-1);
				diff_transfer.card_id=bank_comp.card_id;
				diff_transfer.local_amt=0;
				diff_transfer.local_sn=bank_comp.local_sn;
				diff_transfer.diff_amt=diff_transfer.bank_amt-diff_transfer.local_amt;
				diff_transfer.status=1;
				ret=DB_t_tif_diff_transfer_add(&diff_transfer);
				if(ret)
				{
					writelog(LOG_ERR,"DB_t_tif_diff_transfer_add error,errcode=[%d]!",ret);
					break;
				}
		}
	}

	trans_comp.bankself_amt=bank_amt;
	trans_comp.bankself_num=bank_count;
	trans_comp.localself_amt=trans_amt;
	trans_comp.localself_num=trans_count;
	trans_comp.cmp_flag=1;
	strncpy(trans_comp.cmp_date,forward_date,sizeof(trans_comp.cmp_date)-1);
	ret=DB_t_tif_report_trans_comp_add(&trans_comp);
	if(ret)
	{
		writelog(LOG_DEBUG,"DB_t_tif_report_trans_comp_add error,errcode=[%d]",ret);
		goto LRet;

	}

	ret=db_commit();
	if(ret)
	{
		writelog(LOG_ERR,"db_commit error,errcode=[%d]",ret);
		goto LRet;
	}
	return 0;

LRet:
	db_rollback();
	return ret;

	//*/
}
コード例 #10
0
ファイル: js_db.c プロジェクト: Bibamaru/showtime
static JSBool
js_db_txn(JSContext *cx, JSObject *obj, uintN argc,
          jsval *argv, jsval *rval)
{
    js_db_t *jd = JS_GetPrivate(cx, obj);

    if(js_db_check(cx, jd))
        return JS_FALSE;

    if(argc != 1) {
        JS_ReportError(cx, "Invalid number of arguments");
        return JS_FALSE;
    }

    if(jd->jd_transaction) {
        JS_ReportError(cx, "Nesting transactions is not allowed");
        return JS_FALSE;
    }

retry:
    if(db_begin(jd->jd_db)) {
        JS_ReportError(cx, "Failed to start transaction");
        return JS_FALSE;
    }

    jd->jd_transaction = 1;

    int r = JS_CallFunctionValue(cx, NULL, argv[0], 0, NULL, rval);
    jd->jd_transaction = 0;

    if(jd->jd_stmt) {
        sqlite3_finalize(jd->jd_stmt);
        jd->jd_stmt = NULL;
    }

    if(!r) {
        if(jd->jd_debug)
            TRACE(TRACE_DEBUG, "JS", "Transaction rollbacked due to error");
        db_rollback(jd->jd_db);
        if(JS_IsExceptionPending(cx)) {
            jsval exn;
            if(!JS_GetPendingException(cx, &exn)) {
                return JS_FALSE;
            }
            if(JSVAL_IS_OBJECT(exn)) {
                JSClass *c = JS_GetClass(cx, JSVAL_TO_OBJECT(exn));
                if(c == &db_deadlock_exn) {
                    if(jd->jd_debug)
                        TRACE(TRACE_DEBUG, "JS", "Catched deadlock exception, retrying");
                    JS_ClearPendingException(cx);
                    JS_BeginRequest(cx);
                    usleep(100000);
                    JS_EndRequest(cx);
                    goto retry;
                }
            }
        }
        return JS_FALSE;
    }

    if(*rval == JSVAL_TRUE) {
        if(jd->jd_debug)
            TRACE(TRACE_DEBUG, "JS", "Transaction committed");

        db_commit(jd->jd_db);
    } else {
        if(jd->jd_debug)
            TRACE(TRACE_DEBUG, "JS", "Transaction rollbacked");
        db_rollback(jd->jd_db);
    }
    return JS_TRUE;
}
コード例 #11
0
static int TestTrans(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	ST_CPACK aPack;
	ST_PACK *outPack = &(aPack.pack);
	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_LVOL0,F_LVOL1,F_LVOL2,F_LVOL8,F_LVOL10,F_LVOL11,F_LVOL12,F_SDATE0,F_SPHONE3,F_SADDR,F_LSAFE_LEVEL2,
		F_SDATE3,F_STIME3,F_SEMP,F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,0);
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	TRANS& trans=pAccTrans->trans;
	trans.transcode=TC_CARD2CARD;
	des2src(trans.opercode,rPack->semp);
	trans.termid=rPack->lwithdraw_flag;
	ret=pAccTrans->InitTrans();
	if(ret)
		return ret;	
	if(rPack->lvol0<1)
	{
		ERRTIP("请输入付款方卡号");
		return E_COMMON_ERR;
	}
	if(rPack->lvol2<1)
	{
		ERRTIP("请输入收款方卡号");
		return E_COMMON_ERR;
	}
	if(rPack->lvol1<0)
	{
		ERRTIP("请输入转账金额");
		return E_COMMON_ERR;
	}
	T_t_card tInCard;
	memset(&tInCard,0,sizeof(tInCard));

	T_t_account tInAccount;
	memset(&tInAccount,0,sizeof(tInAccount));

	pAccTrans->trans.cardno=rPack->lvol2;
	ret=pAccTrans->CheckAcc(&tInCard,&tInAccount);
	if(ret)
	{
		char sErrMsg[256];
		strcpy(sErrMsg,"收款方卡账户状态错误:");
		strcat(sErrMsg,pAccTrans->GetErrTip().c_str());
		ERRTIP(sErrMsg);
		return ret;
	}
	T_t_card  tOutCard;
	memset(&tOutCard,0,sizeof(tOutCard));

	T_t_account tOutAccount;
	memset(&tOutAccount,0,sizeof(tOutAccount));

	pAccTrans->trans.cardno=rPack->lvol0;

	ret=pAccTrans->CheckAcc(&tOutCard,&tOutAccount);
	if(ret)
	{
		char sErrMsg[256];
		strcpy(sErrMsg,"付款方卡账户状态错误:");
		strcat(sErrMsg,pAccTrans->GetErrTip().c_str());
		ERRTIP(sErrMsg);
		return ret;
	}
	double dInCardAftBal=(rPack->lvol1+rPack->lsafe_level)/100.0;
	trans.cardflag=0;
	trans.usecardflag=0;	
	trans.purseno=PURSE_NO_ONE;
	trans.paycnt=rPack->lvol6+1;
	des2src(trans.cardphyid,rPack->sstation1);

	trans.inputamt= D4U5(rPack->lvol1/100.0);	
	trans.unusedamt = trans.inputamt;
	trans.cardbefbal=rPack->lvol7/100.0;
	trans.cardaftbal=trans.cardbefbal - trans.inputamt;
	if(amtcmp(trans.inputamt,trans.cardbefbal)>0)
	{
		return ERRINFO(E_CARD_BALANCE_SHORTAGE,trans.cardbefbal);
	}	
	//检查收款方账户余额是否超过最大值
	double CardMaxBal=0;
	ret=GetPurseMaxBal(PURSE_NO_ONE,CardMaxBal);
	if(ret)
		return ret;
	if(amtcmp(dInCardAftBal,CardMaxBal)>=0)
	{
		return ERRINFO(E_AMT_EXCEED_MAX,CardMaxBal);
	}
		// 保持第三方账号
	T_t_transdtl transdtl;
	memset(&transdtl,0,sizeof(transdtl));
	transdtl.exttype = 0;
	sprintf(transdtl.voucherno,"%d",tInCard.cardno);
	transdtl.exttype=EXTTYPE_OPPSNO;
	GetStuempnoByCustid(tInCard.custid,transdtl.extdata);
	sprintf(transdtl.remark,"向(%s)转入",tInAccount.accname);
	ret = pAccTrans->GenTransdtl(&transdtl,DTLSTATUS_INIT);
	if(ret)
	{
		writelog(LOG_ERR,"GenTransdtl ret=%d",ret);
		return ret;
	}
	ret=db_commit();
	if(ret)
	{
		return ret;
	}	
	//trans.cardaftbal=trans.cardbefbal;
	strcpy(pAccTrans->trans.draccno,tOutAccount.accno);
	strcpy(pAccTrans->trans.craccno,tInAccount.accno);
	ret=pAccTrans->doTrans();
	if(ret)
	{
		writelog(LOG_ERR,"doTrans err=%d",ret);
		return ret;
	}
	ret=pAccTrans->doTransEnd();
	if(ret)
	{
		writelog(LOG_ERR,"doTransEnd err=%d",ret);
		return ret;
	}
	if(amtcmp(trans.cardaftbal,transdtl.cardaftbal)!=0)
	{
		ERRTIP("卡余额计算有误");
		return E_COMMON_ERR;
	}
	ret=db_rollback();
	if(ret)
	{
		writelog(LOG_ERR,"db_rollback err");
		return ret;
	}
	// 输出参数
	outPack->lvol0=tOutCard.cardno;
	outPack->lvol1=D4U5(trans.inputamt*100,0);
	outPack->lvol8=D4U5(transdtl.cardaftbal*100,0);
	outPack->lvol2=tInCard.cardno;
	outPack->lsafe_level2=D4U5(dInCardAftBal*100,0);
	des2src(outPack->sdate3,trans.accdate);
	des2src(outPack->stime3,trans.acctime);
	des2src(outPack->semp,trans.opercode);
	outPack->lwithdraw_flag=trans.termid;
	outPack->lserial1=trans.termseqno;
	des2src(outPack->sphone3,trans.refno);	
    des2src(outPack->saddr,trans.cardpwd);	//mac
    sprintf(trans.remark,"%s卡余额%.2lf元",pAccTrans->remark.c_str(),pAccTrans->trans.cardaftbal);
    des2src(outPack->vsmess,trans.remark);
	PutRow(handle,outPack,pRetCode,szMsg);
	return 0;
}
コード例 #12
0
ファイル: F240007.cpp プロジェクト: nykma/ykt4sungard
int F240007(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	char path_name[256]="";
	char file_name[256]="";
	int ret=0;
	int cnt=0;
	int i=0;

	T_t_tif_bank_comp	bank_comp;				// 银行对账文件数据存储表
	T_t_tif_report_trans_comp trans_comp;		// 财务统计报表
	T_t_tif_tradeserial	tradeserial;			// 当前流水表
	T_t_tif_tradeserial_his his_tradeserial;	// 历史流水表	
	T_t_tif_diff_transfer  diff_transfer;		// 银行对账文件和流水文件对账差异表

	char logicdate[10]="";
	char tmp_date[10]="";
	char forward_date[10]="";					// 结算时间从文件名中取得

	double trans_count=0;
	double bank_count=0;
	double trans_amt=0;
	double bank_amt=0;
	double second=0;

	double temp=0;
	memcpy(forward_date, rPack->scard1 + 6, 8);		// BANK + 银行标识(04) + 日期 + txt
	writelog(LOG_ERR,"bank compare name=[%s]", rPack->scard1);

	memset(&bank_comp,0,sizeof(bank_comp));
	memset(&trans_comp,0,sizeof(trans_comp));
	memset(&tradeserial,0,sizeof(tradeserial));
	memset(&his_tradeserial,0,sizeof(his_tradeserial));

	ret=DB_t_tif_report_trans_comp_read_by_cmp_date(forward_date,&trans_comp);
	if(ret!=100&&ret!=0)
	{
		writelog(LOG_ERR,"DB_t_tif_report_trans_comp_read_by_cmp_date error,errcode=[%d]",ret);
		goto LRet;
	}
	if(1==trans_comp.cmp_flag)
	{
		writelog(LOG_ERR,"trans_comp.cmp_flag =1,already compare!");
		goto LRet;
	}

	memset(&bank_comp,0,sizeof(bank_comp));
	des2src(bank_comp.bankcard, rPack->scust_auth);		// 银行卡号
	des2src(bank_comp.bank_sn, rPack->scust_auth2);		// 银行端流水号
	bank_comp.card_id = atoi(rPack->sorder0);			// 校园卡交易卡号
	bank_comp.local_sn = atoi(rPack->semp_no);			// 校园卡流水号		
	des2src(bank_comp.op_date, forward_date);			// 对账的交易时间
	des2src(bank_comp.trans_money, rPack->sorder1);		// 转帐金额
	des2src(bank_comp.tx_code, rPack->scust_type);		// 交易代码
	writelog(LOG_ERR, "bank_card=[%20.20s], bank_sn=[%20.20s], card_id=[%d], local_sn=[%d], date=[%8.8s], trade_code=[%2.2s], trans_money=[%9.9s]", bank_comp.bankcard, bank_comp.bank_sn, bank_comp.card_id, bank_comp.local_sn, bank_comp.op_date, bank_comp.tx_code, bank_comp.trans_money);
	
	// 文件读完标识, 如果文件已经读完了, 则开始进行对账, 0表示还需读取记录, 1表示没有记录可读
	if (0 == rPack->lvol0)
	{
		ret = DB_t_tif_bank_comp_add(&bank_comp);
		if (ret)
		{
			writelog(LOG_ERR,"DB_t_tif_bank_comp_add rows[%d] error,errcode=[%d]",cnt,ret);
			goto LRet;
		}

		ret = db_commit();
		if (ret)
		{
			writelog(LOG_ERR,"db_commit error,errcode=[%d]",ret);
			goto LRet;
		}

		goto L_RETU;
	}
	
	//开始进行对帐
	cnt=0;

	// 对一卡通转帐总数
	ret=DB_his_t_tif_tradeserial_get_count_by_serial_type(&temp,240001,forward_date);
	if(ret!=100&&ret!=0)
	{
		writelog(LOG_ERR,"DB_t_tif_tradeserial_get_count_by_serial_type err,errcode=[%d]",ret);
		goto LRet;
	}
	trans_count=trans_count+temp;
	trans_comp.localself_num=trans_count;

	// 对一卡通转帐总金额
	ret=DB_his_t_tif_tradeserial_get_sum_by_serial_type(&temp, 240001, forward_date);
	if(ret!=100&&ret!=0)
	{
		writelog(LOG_ERR,"DB_his_t_tif_tradeserial_get_sum_by_serial_type err,errcode=[%d]",ret);
		goto LRet;
	}
	trans_amt=trans_amt+temp;
	trans_comp.localself_amt=trans_amt;

	ret=DB_t_tif_bank_comp_open_select_by_cur1_and_op_date(forward_date);
	if(ret)
	{
		writelog(LOG_ERR,"DB_t_tif_bank_comp_open_select_by_cur1_and_op_date err,errcode=[%d]",ret);
		goto LRet;
	}
	while(1)
	{
		ret=DB_t_tif_bank_comp_fetch_select_by_cur1(&bank_comp);
		if(ret)
		{
			DB_t_tif_bank_comp_close_select_by_cur1();
			if(ret==DB_NOTFOUND)
			{
				if(cnt==0)
				{
					writelog(LOG_DEBUG,"There havn't record from t_tif_bankcomp table!");
					break;
				}
				else		
					break;
			}
			else
				goto LRet;
		}

		cnt++;
		bank_count=bank_count+1;
		bank_amt=bank_amt+atof(bank_comp.trans_money)/100.00;
		memset(&diff_transfer,0,sizeof(diff_transfer));

		// 以银行端的存储的一卡通流水号到一卡通流水表中查询数据
		ret=DB_t_tif_tradeserial_his_read_by_bak_date_and_serial_no(forward_date,bank_comp.local_sn,&his_tradeserial);
		if(ret)
		{
			if(100==ret)
			{
				// 一卡通中不存在的流水, 银行端存在的流水, 记入对账差异表中
				strncpy(diff_transfer.op_date,forward_date,sizeof(diff_transfer.op_date)-1);
				strncpy(diff_transfer.bankcard,bank_comp.bankcard,sizeof(diff_transfer.bankcard)-1);
				diff_transfer.bank_amt=atoi(bank_comp.trans_money)/100.00;
				strncpy(diff_transfer.bank_sn,bank_comp.bank_sn,sizeof(diff_transfer.bank_sn)-1);
				diff_transfer.card_id=bank_comp.card_id;
				diff_transfer.local_sn=bank_comp.local_sn;
				diff_transfer.diff_amt=diff_transfer.bank_amt-diff_transfer.local_amt;
				diff_transfer.status=1;
				ret=DB_t_tif_diff_transfer_add(&diff_transfer);
				if(ret)
				{
					writelog(LOG_ERR,"DB_t_tif_diff_transfer_add error,errcode=[%d]!",ret);
					break;
				}
				continue;
			}
			else
			{
				writelog(LOG_ERR,"DB_t_tif_tradeserial_his_read_lock_by_c0_and_enteract_date_and_serial_no error,errcode=[%d]!",ret);
				break;
			}
		}
		if(his_tradeserial.serial_state!=2)
		{
			// 一卡通中存在的流水, 发起未入账, 银行端对此流水已经入账, 记入对账差异表中	
			strncpy(diff_transfer.op_date,forward_date,sizeof(diff_transfer.op_date)-1);
			strncpy(diff_transfer.bankcard,bank_comp.bankcard,sizeof(diff_transfer.bankcard)-1);
			diff_transfer.bank_amt=atoi(bank_comp.trans_money)/100.00;
			strncpy(diff_transfer.bank_sn,bank_comp.bank_sn,sizeof(diff_transfer.bank_sn)-1);
			diff_transfer.card_id=bank_comp.card_id;
			diff_transfer.local_amt=0;
			diff_transfer.local_sn=bank_comp.local_sn;
			diff_transfer.diff_amt=diff_transfer.bank_amt-diff_transfer.local_amt;
			diff_transfer.status=1;
			ret=DB_t_tif_diff_transfer_add(&diff_transfer);
			if(ret)
			{
				writelog(LOG_ERR,"DB_t_tif_diff_transfer_add error,errcode=[%d]!",ret);
				break;
			}
		}
	}

	trans_comp.bankself_amt=bank_amt;
	trans_comp.bankself_num=bank_count;
	trans_comp.localself_amt=trans_amt;
	trans_comp.localself_num=trans_count;
	trans_comp.cmp_flag=1;
	strncpy(trans_comp.cmp_date,forward_date,sizeof(trans_comp.cmp_date)-1);
	ret=DB_t_tif_report_trans_comp_add(&trans_comp);
	if(ret)
	{
		writelog(LOG_DEBUG,"DB_t_tif_report_trans_comp_add error,errcode=[%d]",ret);
		goto LRet;

	}

	ret=db_commit();
	if(ret)
	{
		writelog(LOG_ERR,"db_commit error,errcode=[%d]",ret);
		goto LRet;
	}
	return 0;

LRet:
	db_rollback();
	return ret;

L_RETU:
	return ret;
}
コード例 #13
0
ファイル: vdbcon.c プロジェクト: vSlipenchuk/vdb
int process(char *buf) {
unsigned char *p=buf; int ok;
//printf("P:{%s}\n",buf);
if (strncmp(buf,".connect",7)==0) {
    p=buf+7; while(*p && *p<=32) p++;
    fprintf(stderr," ...connecting to <%s>\n",p);
    ok = db_connect_string(db,p);
    if (ok) fprintf(stderr,"+connected\n");
      else fprintf(stderr,"-err: %s\n",db->error);
    return 1;
    }
if (p[0]=='@') { // process file
    p++;
    printf("try run <%s>\n",p);
    FILE *f = fopen(p,"rt");
    if (!f) { fprintf(stderr,"fail open script %s\n",p); return 1;}
       process_file(f);
    fclose(f);
    return 1; // OK
    }
if (lcmp(&p,".echo")) {
    fprintf(stderr,"%s\n",p);
    return 1;
    }
if (lcmp(&p,".mode")) {
      unsigned char *m=get_word(&p);
      if ( lcmp(&m,"csv"))  { mode=1; fprintf(stderr,"+mode  csv now\n"); return 1;}
      if ( lcmp(&m,"text")) { mode=0; fprintf(stderr,"+mode  text now\n"); return 1;}
      if ( lcmp(&m,"json")) { mode=2; fprintf(stderr,"+mode  json now\n"); return 1;}
      fprintf(stderr,"ERR: mode %s unknown\n",m);
      return 2;
      }
if (lcmp(&p,".http.Auth")) { // set auth string
      vdb_http_auth_set(p);
      return 1;
      }
if (lcmp(&p,".http")) { // start http server
      int code = vdb_http_start();
      fprintf(stderr,"+server started code=%d\n",code);
      return 1;
      //vdb_http_process();
      }
if (lcmp(&p,"url")) {
      char *u = get_word(&p); // rest is SQL
      http_addSQL(u,p);
      fprintf(stderr,"url %s added to map\n",u);
      return 1;
    }
if (strcmp(buf,".help")==0) { prn_help(); return 1;}
if (strcmp(buf,".reconnects")==0) { do_reconnects(0); return 1;}
if (strcmp(buf,".stressFetch")==0) { do_stress_fetch("select* from test"); return 1;}
if (strcmp(buf,".stress")==0) { do_reconnects("select * from test"); return 1;}
if (strcmp(buf,".btest")==0) { do_binds("select * from dual where dummy = :txt"); return 1;}
if (lcmp(&p,".output")) {
    output = fopen(p,"wt");
    if (!output) { fprintf(stderr,"cant open file %s",p);}
    return 1;
    }
//if (strcmp(buf,".btest")==0) { do_binds("select * from email where sender = :txt"); return 1;}
if (strcmp(buf,".quit")==0) exit(0);
if (strcmp(buf,".rollback")==0) {
     printf("rollback code = %d\n",db_rollback(db)); return 1;
    }
if (strcmp(buf,".commit")==0) {
     printf("commit code = %d\n",db_commit(db)); return 1;
    }
if (strncmp(buf,".compile",8)==0) {
    char *sql = buf+8;
    fprintf(stderr," ...compiling sql <%s>\n",sql);
    if (!db_compile(db,sql)) fprintf(stderr,"-err compile: %s\n",db->error);
      else fprintf(stderr,"+ok compiled\n");
    return 1;
    }
if (lcmp(&p,".import")) {
     char *file = get_word(&p);
     char *tbl  = get_word(&p);
     if (mode==0) return vdb_upload(db,file,tbl,get_col);
        else return vdb_upload(db,file,tbl,get_csv_col);

    }
if (strncmp(buf,".sql",4)==0) {
    char *sql = buf+4; int ok;
    fprintf(stderr," ...compile&exec sql <%s>\n",sql);
    ok = db_compile(db,sql) && db_exec(db);
    if (!ok) fprintf(stderr,"-err : %s\n",db->error);
      else fprintf(stderr,"+ok execed\n");
    return 1;
    }
if (strncmp(buf,".desc",5)==0) {
    char *sql = buf+5; int ok,i;
    fprintf(stderr," ...describe sql <%s>\n",sql);
    ok = db_compile(db,sql) && db_open(db);
    if (!ok) { fprintf(stderr,"-err : %s\n",db->error); return 1; }
    for(i=0;i<db->out.count;i++) {
        db_col *c = db->out.cols+i;
        printf(" %2d. NAME:%-20s TYP:%d LEN:%d DBTYPE:%d\n",i,c->name,c->type,c->len,c->dbtype);
        }
    fprintf(stderr,"+ok %d columns\n",i);
    return 1;
    }
if (strncmp(buf,"select",6)==0) {
    int row=0;
    //fprintf(stderr," ...selecting sql <%s>\n",buf);
    if (!db_select(db,buf)) { fprintf(stderr,"-err: %s\n",db->error); return 1;}
   // fprintf(stderr,"begin output=%p mode=%d\n",output,mode);
    row = dump_dataset( output, db, mode);
    if (output) { fclose(output); output=0; }
    fprintf(stderr,"+%d rows selected\n",row);
    return 1;
    }
fprintf(stderr,"-command unknown '%s'\n",buf);
return 1;
}
コード例 #14
0
ファイル: F240002.cpp プロジェクト: nykma/ykt4sungard
int F240002(TRUSERID *handle,int iRequest,ST_PACK *rPack,int *pRetCode,char *szMsg)
{

	int ret=0;
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	pAccTrans->trans.transcode=TC_BANKTRANS;
	TRANS& trans=pAccTrans->trans;
	trans.termid=atoi(rPack->sorder2);
	ret=pAccTrans->InitTrans();
	if(ret)
		return ret;			
	trans.inputamt = rPack->lvol5/100.0;
	trans.unusedamt=trans.inputamt;
	trans.cardflag=1;
	trans.usecardflag=1;
	trans.cardbefbal=rPack->lvol6/100.00;
	trans.dpscnt=rPack->lvol1+1;
	trans.cardaftbal=trans.cardbefbal;
	//转账不允许转小数金额
	if((rPack->lvol5)%100>0)
	{
		writelog(LOG_ERR,"trans money is not a integer!,transmoney=[%f]",rPack->lvol5/100.0);
		strcpy(szMsg,"转账金额必须是整数");
		return E_TRANS_TRANSMONEY_OUTRANGE;
	}
	if(rPack->lvol5<1)
	{
		writelog(LOG_ERR,"trans money is not a integer!,transmoney=[%f]",rPack->lvol5/100.0);
		strcpy(szMsg,"转账金额不能为0");
		return E_TRANS_TRANSMONEY_OUTRANGE;
	}
	T_t_account		tAccount;		//帐户表
	T_t_card		card;

	memset(&tAccount,0,sizeof(tAccount));
	memset(&card,0,sizeof(card));


	ST_CPACK aPack;
	ST_PACK *out_pack = &(aPack.pack);


	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_DAMT0,F_DAMT1,F_DAMT2,F_LVOL1,F_LVOL2,F_LSERIAL0,F_SNAME2,0);


	//判断设备是否登陆
	if(0!=device_login_yes_or_no(trans.termid))
	{
		writelog(LOG_ERR,"Device don't login");
		return E_TRANS_TERM_NOLOGIN;
	}
	trans.cardno=atoi(rPack->sserial0);
	ret=pAccTrans->CheckAcc(&card,&tAccount);
	if(ret)
		return ret;
	if(amtcmp(trans.cardbefbal-tAccount.balance,MAXAMT_CARDGTACC)>=0)
	{
		writelog(LOG_ERR,"cardbefbal[%.2lf]account balance[%.2lf]",trans.cardbefbal,tAccount.balance);
		return ERRIF_CARDBAL_EXCEPT;
	}		
	double CardMaxBal=0;
	ret=GetPurseMaxBal(PURSE_NO_ONE,CardMaxBal);
	if(ret)
		return ret;
	if(amtcmp(trans.inputamt+trans.cardbefbal,CardMaxBal)>0)
		return ERRINFO(E_AMT_EXCEED_MAX,CardMaxBal);
	trans.feetype=card.feetype;
	trans.cardtype=card.cardtype;
	trans.custid=card.custid;
	des2src(trans.cardaccno,tAccount.accno);		//贷方帐户,持卡人账户
	des2src(trans.draccno,rPack->sstation0);		//借方帐号,由前置机上传
	ret=pAccTrans->doFeeTrans();
	if(ret)
		return ret;
	ret=pAccTrans->doMainTrans();
	if(ret)
		return ret;
	ret=pAccTrans->doTransEnd();
	if(ret)
		return ret;	
	//业务结束后,回滚事务
	ret=db_rollback();
	if(ret)
	{
		writelog(LOG_ERR,"db_rollback error,error code=[%d]",ret);
		return E_DB_ROLLBACK;
	}
	//重新取流水号
	ret=pAccTrans->GetTermSeqno();
	if(ret)
	{
		writelog(LOG_ERR,"GetTermSeqno error,error code=[%d]",ret);
		return ret;
	}
	T_t_transdtl transdtl;
	memset(&transdtl,0,sizeof(transdtl));

	des2src(transdtl.transdate,trans.transdate);
	des2src(transdtl.transtime,trans.transtime);
	strcpy(transdtl.accdate,trans.accdate);
	strcpy(transdtl.acctime,trans.acctime);
	transdtl.termid=trans.termid;
	transdtl.termseqno=trans.termseqno;
	transdtl.transcode=trans.transcode;
	transdtl.paytype=trans.fundtype;
	des2src(transdtl.voucherno,trans.voucherno);
	transdtl.cardno=trans.cardno;
	transdtl.purseno=trans.purseno;
	transdtl.transflag=TF_DPS;
	transdtl.cardcnt=trans.dpscnt;
	transdtl.cardbefbal=trans.cardbefbal;
    transdtl.amount=trans.totaltransamt;
	transdtl.managefee=trans.totalfeeamt;
	transdtl.cardaftbal=trans.cardaftbal;
	transdtl.custid=card.custid;
	//transdtl.sysid= rPack->lvol2;
	transdtl.exttype=EXTTYPE_BANKCARD;	
	des2src(transdtl.extdata,rPack->scust_auth);
	des2src(transdtl.showcardno,card.showcardno);
	transdtl.status[0]=DTLSTATUS_FAIL;
	ret=GetNewRefno(transdtl.refno);
	if(ret)
	{
		ERRTIP("取交易参考号失败");
		return ret;
	}		
	GetCustBaseInfoByCustID(card.custid,transdtl.custname,transdtl.stuempno,NULL);
	ret=DB_t_transdtl_add(&transdtl);
	if(ret)
	{
	  if(DB_REPEAT==ret)
	    return E_DB_TRANSDTL_E;
	  else
	    return E_DB_TRANSDTL_I;
	}	
	char sMsg[255]="";
	char sDebugMsg[255]="";
	sprintf(sDebugMsg,"流水号:%d ",trans.termseqno);
	sprintf(sMsg,"充值前卡余额:%.2lf 转帐后卡余额:%.2lf ",trans.cardbefbal,trans.cardaftbal);
    strcat(sDebugMsg,sMsg);
	writelog(LOG_DEBUG,sDebugMsg);

	des2src(out_pack->sname2,transdtl.refno);
	out_pack->lserial0=trans.termseqno;
	out_pack->damt0=trans.cardaftbal;
	out_pack->damt1=transdtl.amount;
	out_pack->damt2=transdtl.managefee;
	out_pack->lvol1=transdtl.termseqno;
	out_pack->lvol2=D2I(trans.cardaftbal*100);
	
	PutRow(handle,out_pack,pRetCode,szMsg);
	return 0;
}
コード例 #15
0
ファイル: brain.c プロジェクト: lp0/sqlhal
int main(int argc, char *argv[]) {
	char *action;
	char *name;
	char *prefix;
	int ret;
	int fail = 0;
	char *state;

	if (argc != 4 || (strcmp(argv[1], "load") && strcmp(argv[1], "save") && strcmp(argv[1], "save+"))) {
		printf("Brain manipulation\n");
		printf("Usage: %s load  <name> <filename prefix>\n", argv[0]);
		printf("       %s save  <name> <filename prefix>\n", argv[0]);
		printf("       %s save+ <name> <filename prefix>\n", argv[0]);
		return 1;
	}

	action = argv[1];
	name = argv[2];
	prefix = argv[3];

	state = "db_connect";
	ret = db_connect();
	if (ret) goto fail;
	else log_info("brain", ret, state);

	state = "db_begin";
	ret = db_begin();
	if (ret) goto fail;
	else log_info("brain", ret, state);

	if (!strcmp(action, "load")) {
		state = "input_list aux";
		ret = input_list(name, prefix, "aux", LIST_AUX);
		if (ret) { log_warn("brain", ret, state); fail = 1; }
		else log_info("brain", ret, state);

		state = "input_list ban";
		ret = input_list(name, prefix, "ban", LIST_BAN);
		if (ret) { log_warn("brain", ret, state); fail = 1; }
		else log_info("brain", ret, state);

		state = "input_list grt";
		ret = input_list(name, prefix, "grt", LIST_GREET);
		if (ret) { log_warn("brain", ret, state); fail = 1; }
		else log_info("brain", ret, state);

		state = "input_map swp";
		ret = input_map(name, prefix, "swp", MAP_SWAP);
		if (ret) { log_warn("brain", ret, state); fail = 1; }
		else log_info("brain", ret, state);

		state = "input_brain";
		ret = input_brain(name, prefix);
		if (ret) { log_warn("brain", ret, state); fail = 1; }
		else log_info("brain", ret, state);
	} else if (!strcmp(action, "save") || !strcmp(action, "save+")) {
		enum file_type type = FILETYPE_MEGAHAL8;
		if (!strcmp(action, "save+"))
			type = FILETYPE_SQLHAL0;

		state = "output_list aux";
		ret = output_list(name, prefix, "aux", LIST_AUX);
		if (ret) { log_warn("brain", ret, state); fail = 1; }
		else log_info("brain", ret, state);

		state = "output_list ban";
		ret = output_list(name, prefix, "ban", LIST_BAN);
		if (ret) { log_warn("brain", ret, state); fail = 1; }
		else log_info("brain", ret, state);

		state = "output_list grt";
		ret = output_list(name, prefix, "grt", LIST_GREET);
		if (ret) { log_warn("brain", ret, state); fail = 1; }
		else log_info("brain", ret, state);

		state = "output_map swp";
		ret = output_map(name, prefix, "swp", MAP_SWAP);
		if (ret) { log_warn("brain", ret, state); fail = 1; }
		else log_info("brain", ret, state);

		state = "output_brain";
		ret = output_brain(name, type, prefix);
		if (ret) { log_warn("brain", ret, state); fail = 1; }
		else log_info("brain", ret, state);
	} else {
		fail = 1;
	}

	if (fail) {
		state = "db_rollback";
		ret = db_rollback();
		if (ret) goto fail;
		else log_info("brain", ret, state);
	} else {
		state = "db_commit";
		ret = db_commit();
		if (ret) goto fail;
		else log_info("brain", ret, state);
	}

	state = "db_disconnect";
	ret = db_disconnect();
	if (ret) goto fail;
	else log_info("brain", ret, state);

	return 0;

fail:
	log_fatal("brain", ret, state);
	return 1;
}
コード例 #16
0
ファイル: F850005.cpp プロジェクト: nykma/ykt4sungard
static int TestTrans(TRUSERID *handle,ST_PACK *rPack,int *pRetCode,char *szMsg)
{
	int ret=0;
	ST_CPACK aPack;
	ST_PACK *outPack = &(aPack.pack);
	ResetNormalCPack(&aPack,0,1);
	SetCol(handle,0);
	SetCol(handle,F_LVOL0,F_LVOL1,F_LVOL8,F_LVOL10,F_LVOL11,F_LVOL12,F_SDATE0,F_SPHONE3,F_SADDR,F_LSAFE_LEVEL2,
		F_SDATE3,F_STIME3,F_SEMP,F_LWITHDRAW_FLAG,F_LSERIAL1,F_VSMESS,0);
	CAccTrans *pAccTrans=CAccTrans::getInstance();
	TRANS& trans=pAccTrans->trans;
	trans.transcode=TC_CARDPAYMENT;
	des2src(trans.opercode,rPack->semp);
	trans.termid=rPack->lwithdraw_flag;
	ret=pAccTrans->InitTrans();
	if(ret)
		return ret;	
	
	int paycode=rPack->lcert_code;

	trans.cardno=rPack->lvol0;
	if(trans.cardno<1)
	{
		return E_INPUTNULL_CARDNO;
	}
	trans.cardflag=1;
	trans.usecardflag=1;	
	trans.purseno=PURSE_NO_ONE;
	trans.paycnt=rPack->lvol6+1;
	des2src(trans.cardphyid,rPack->sstation1);

	trans.inputamt= D4U5(rPack->lvol1/100.0);	
	trans.unusedamt = trans.inputamt;
	trans.cardbefbal=rPack->lvol7/100.0;
	trans.cardaftbal=trans.cardbefbal - trans.inputamt;
	if(amtcmp(trans.inputamt,0)<=0)
	{
		ERRTIP("交易金额不能为0");
		return E_COMMON_ERR;
	}
	if(amtcmp(trans.inputamt,trans.cardbefbal)>0)
	{
		return ERRINFO(E_CARD_BALANCE_SHORTAGE,trans.cardbefbal);
	}	
	T_t_card  tCard;
	memset(&tCard,0,sizeof(tCard));

	T_t_account tAccount;
	memset(&tAccount,0,sizeof(tAccount));
	
	ret=pAccTrans->CheckAcc(&tCard,&tAccount);
	if(ret)
	{
		writelog(LOG_INFO,"检查状态失败");
		return ret;
	}
	if(amtcmp(trans.cardbefbal-tAccount.balance,MAXAMT_CARDGTACC)>0)
	{
		writelog(LOG_ERR,"卡余额[%.2lf]错误",trans.cardbefbal);
		return ERRIF_CARDBAL_EXCEPT;
	}
	if(strlen(rPack->stx_pwd))
	{
		ret=check_card_pwd_by_card(trans.cardno,rPack->stx_pwd);
		if(ret)
			return ret;
	}	
	if(tCard.custid>0)
	{
		ret=GetCustBaseInfoByCustID(trans.custid,trans.custname,trans.stuempno,NULL);
		if(ret)
			return ret;
	}
	CPaymentBase *payment;
	payment = CPaymentBase::find_payment(paycode);
	if(NULL == payment)
	{
		return E_TRANS_FUNC_NONSUPPORT;
	}
	ret = payment->init(handle,&aPack,rPack);
	if(ret)
	{
		writelog(LOG_ERR,"trade[%d],ret[%d]",paycode,ret);		
		return	ret;
	}
	int waterflag=0;
	double waterbefbal=0;
	double wateraftbal=0;
	if(paycode/1000==1)//水控
	{
		waterflag=1;
	}
	if(waterflag)
	{
		switch(rPack->lvol1)
		{
			case 500:
			case 1000:
			case 1500:
			case 2000:
				break;
			default:
			  ERRTIP("交易金额只能为5、10、15、20元");
			  return E_COMMON_ERR;
		}
		waterbefbal = rPack->lsafe_level/100.0;
		wateraftbal = D4U5(waterbefbal+trans.inputamt);
		double CardMaxBal=0;
		ret=GetPurseMaxBal(PURSE_NO_TWO,CardMaxBal);
		if(ret)
			return ret;
		if(amtcmp(wateraftbal,CardMaxBal)>0)
			return ERRINFO(E_AMT_EXCEED_MAX,CardMaxBal);
		if(1061==paycode)
		{
			int price1=0;
			int price2=0;
			int price3=0;
			ret=GetWaterPrice(price1,price2,price3);
			if(ret)
			{
				writelog(LOG_ERR,"读水价失败ret=%d",ret);
				return ret;
			}
			outPack->lvol10=price1;
			outPack->lvol11=price2;
			outPack->lvol12=price3;
		}
	}
	// 保持第三方账号
	T_t_transdtl transdtl;
	memset(&transdtl,0,sizeof(transdtl));
	transdtl.exttype = paycode;
	if(waterflag)
	{
		sprintf(transdtl.extdata,"%.2lf",wateraftbal);	
	}
	else
	{
		des2src(transdtl.extdata,rPack->sbank_acc);
	}
	ret = pAccTrans->GenTransdtl(&transdtl,DTLSTATUS_INIT);
	if(ret)
	{
		writelog(LOG_ERR,"GenTransdtl ret=%d",ret);
		return ret;
	}
	ret=db_commit();
	if(ret)
	{
		return ret;
	}	
	trans.cardaftbal=trans.cardbefbal;
	ret=pAccTrans->doTrans();
	if(ret)
	{
		writelog(LOG_ERR,"doTrans err=%d",ret);
		return ret;
	}
	ret=pAccTrans->doTransEnd();
	if(ret)
	{
		writelog(LOG_ERR,"doTransEnd err=%d",ret);
		return ret;
	}
	if(amtcmp(trans.cardaftbal,transdtl.cardaftbal)!=0)
	{
		ERRTIP("卡余额计算有误");
		return E_COMMON_ERR;
	}
	ret=db_rollback();
	if(ret)
	{
		writelog(LOG_ERR,"db_rollback err");
		return ret;
	}
	// 输出参数
	outPack->lvol0=tCard.cardno;
	outPack->lvol1=D4U5(trans.inputamt*100,0);
	outPack->lvol8=D4U5(transdtl.cardaftbal*100,0);
	outPack->lsafe_level2=D4U5(wateraftbal*100,0);
	des2src(outPack->sdate3,trans.accdate);
	des2src(outPack->stime3,trans.acctime);
	des2src(outPack->semp,trans.opercode);
	outPack->lwithdraw_flag=trans.termid;
	outPack->lserial1=trans.termseqno;
	des2src(outPack->sphone3,trans.refno);	
    des2src(outPack->saddr,trans.cardpwd);	//mac
    sprintf(trans.remark,"%s卡余额%.2lf元",pAccTrans->remark.c_str(),pAccTrans->trans.cardaftbal);
    des2src(outPack->vsmess,trans.remark);
 	if(payment->payment_.onlinepay>0&&payment->payment_.paychkflag>0)
  	{
		rPack->lwithdraw_flag=outPack->lwithdraw_flag;
		rPack->lserial1=outPack->lserial1;
		rPack->lvol0=outPack->lvol0;
		rPack->lvol1=outPack->lvol1;
		rPack->lvol8=outPack->lvol8;
		rPack->lsafe_level2=outPack->lsafe_level2;
		des2src(rPack->sdate3,outPack->sdate3);
		des2src(rPack->stime3,outPack->stime3);
		des2src(rPack->sphone3,outPack->sphone3);
		des2src(rPack->saddr,outPack->saddr);	//mac
		des2src(rPack->semp,outPack->semp);		
	  	ret=payment->qry_acc(handle,rPack,outPack);
	  	if(ret)
		  	return ret;
	  	if(payment->pushflag_ != 1)
		  	PutRow(handle,outPack,pRetCode,szMsg);
  	}
	else
	{
		PutRow(handle,outPack,pRetCode,szMsg);			
	}
	return 0;
}
コード例 #17
0
ファイル: ext_consumer.cpp プロジェクト: nykma/ykt4sungard
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
//系统模拟入账
 int tend_to_enter_account(ST_PACK *in_pack,InAcc *IA,int trade_code,T_t_tif_tradeserial *tradeserial){
	int ret = 0;
	int i=0;
	int	card_id = 0;
	char	Operator[33+1] = "";
	int	maindevice_id = 0;
	int	device_id = 0;
	char logicdate[11]="";
	char sysdate[11]="";
	char systime[9]="";
	double dUniqno = 0;
	char sMsg[256]="";

	T_t_cif_customer 	tCustomer;
	T_t_pif_spefee 	tSpeFee;
	T_t_aif_account	tAccount;
	T_t_pif_card	tCard;


	memset(&tCustomer,0,sizeof(tCustomer));
	memset(&tSpeFee,0,sizeof(tSpeFee));
	memset(&tAccount,0,sizeof(tAccount));
	memset(&tCard,0,sizeof(tCard));

	card_id=in_pack->lvol0;
	
	ret=get_datetime_from_db(sysdate,systime);
	if(ret)
	{
		writelog(LOG_ERR,"get_datetime_from_db error,error code=[%d]",ret);
		getsysdate(sysdate);
		getsystime(systime);
		return ret;
	}
	ret=GetLogicDate(logicdate);								//业务日期
	if(ret)
	{
		writelog(LOG_ERR,"GetLogicDate error,errcode=[%d]",ret);
		return ret;
	}

	ret=DB_t_pif_card_read_by_card_id(card_id, &tCard);
	if(ret)
	{
		if(DB_NOTFOUND==ret)
			ret=E_CARDNO_NOT_EXIST;
		else
			ret=E_DB_CARD_R;
		return ret;
	}


	if(strncmp(tCard.state_id,CARDSTAT_REG,4)!=0)
	{
		if('2'==tCard.state_id[CARDSTAT_TYPE_REG])
			ret= E_CARDNO_LOGOUT;
		else if('3'==tCard.state_id[CARDSTAT_TYPE_REG])
			ret = E_CARD_CHANGE;
		else if(tCard.state_id[CARDSTAT_TYPE_LOST]==STATE_TRUE)
			ret=E_CARDNO_LOST;
		else if(tCard.state_id[CARDSTAT_TYPE_FREEZE]==STATE_TRUE)
			ret=E_CARDNO_FREEZE;
		else if(tCard.state_id[CARDSTAT_TYPE_WFAIL]==STATE_TRUE)
			ret=E_CARDNO_WFAIL;
		return ret;
	}

	
	//根据卡号和钱包号得到消费者账号(借方)
	ret=DB_t_aif_account_read_by_card_id_and_purse_id(card_id, PURSE_NO_ONE,&tAccount);
	if(ret)
	{
		writelog(LOG_ERR,"DB_t_aif_account_read_by_card_id_and_purse_id ret[%d]card_id[%d]",ret,card_id);
		if(DB_NOTFOUND==ret)
			ret=E_ACTNO_NOT_EXIST;
		else
			ret=E_DB_ACCOUNT_R;
		return ret;
	}
	
	ret=DB_t_cif_customer_read_lock_by_cur_and_cut_id(tCard.cosumer_id, &tCustomer);
	if(ret)
	{
		writelog(LOG_ERR,"cut_id[%d]",tCard.cosumer_id);
		if(DB_NOTFOUND==ret)
			ret= E_CUSTOMER_NOT_EXIST;
		else
			ret= E_DB_CUSTOMER_R;
		return ret;
	}
	//得到收费类别
	if(0==tCustomer.fee_type)
	{
		ret=DB_t_pif_spefee_read_by_dept_code_and_cut_type(tCustomer.classdept_no, tCustomer.cut_type,&tSpeFee);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
			{
				tCustomer.fee_type=tCustomer.cut_type;
			}
			else
			{
				DB_t_cif_customer_free_lock_cur();
				return E_DB_SPEFEE_R;
			}
		}
		else
		{
			tCustomer.fee_type=tSpeFee.fee_type;
		}
		//更新客户表的收费类别字段
		ret=DB_t_cif_customer_update_lock_by_cur(&tCustomer);
		if(ret)
		{
			if(DB_NOTFOUND==ret)
				ret= E_CUSTOMER_NOT_EXIST;
			else
				ret= E_DB_CUSTOMER_U;
			return ret;
		}
	}
	DB_t_cif_customer_free_lock_cur();

	des2src(Operator,in_pack->scust_no);												//操作员号								//采集设备标识

	//	准备数据插入交易流水表
	ret = getNewUniqNo(KEYTYPE_TRADESERIAL,&dUniqno);  					//获得最大流水号
	if(ret)
	{
		writelog(LOG_ERR,"getNewUniqNo error,errcode=[%d]",ret);
		return ret;
	}
	
	strncpy(tradeserial->operate_date,sysdate,sizeof(sysdate)-1);				//发生日期
	strncpy(tradeserial->operate_time,systime,sizeof(systime)-1);
	des2src(tradeserial->collect_date,tradeserial->operate_date);								//采集日期
	des2src(tradeserial->collect_time,tradeserial->operate_time);								//采集时间
	des2src(tradeserial->enteract_date,logicdate);							//处理日期
	des2src(tradeserial->enteract_time,tradeserial->operate_time);							//处理时间
	tradeserial->serial_no = D2I(dUniqno);									//流水号
	tradeserial->serial_type = trade_code;						//流水类型
	tradeserial->purse_id = PURSE_NO_ONE;					//钱包号
	tradeserial->serial_state = SERISTAT_NODEBT;								//流水状态
	tradeserial->maindevice_id = maindevice_id;						//上传工作站标识
	tradeserial->device_id = device_id;										//采集设备标识
	tradeserial->card_id = card_id;										//交易卡号
	tradeserial->customer_id=tCard.cosumer_id;								//客户号
	des2src(tradeserial->oper_code,Operator);
	tradeserial->trade_count=in_pack->lvol1+1;		//交易次数
	tradeserial->in_balance=in_pack->damt0;			//入卡值
	tradeserial->trade_fee=in_pack->damt1;				//交易金额
	strncpy(tradeserial->reserve_2,in_pack->vsmess,sizeof(tradeserial->reserve_2)-1);

	IA->iCardNo=tCard.card_id;
	IA->iFeeType=tCustomer.fee_type;
	IA->dArrInAmt[0]=tradeserial->trade_fee;
	IA->iMainDevId=tradeserial->maindevice_id;				//工作站标识
	IA->iDevId=tradeserial->device_id;						//设备ID
	IA->iSerialNo=tradeserial->serial_no;					//流水号
	IA->iTradeNo=tradeserial->serial_type;					//交易码
	strcpy(IA->sTxDate,tradeserial->operate_date);			//交易日期
	strcpy(IA->sTxTime,tradeserial->operate_time);			//交易时间
	strcpy(IA->sTxCollectDate,tradeserial->collect_date);		//采集日期
	strcpy(IA->sTxCollectTime,tradeserial->collect_time);		//采集时间
	strcpy(IA->sTxAccDate,tradeserial->enteract_date);		//记账日期
	strcpy(IA->sTxAccTime,tradeserial->enteract_time);		//记账时间
	strcpy(IA->sMdeOper,tradeserial->oper_code);			//操作员
	strcpy(IA->sChkOper,tradeserial->reserve_1);			//复核操作员

	IA->iUseCardFlag=USE_CARD_TYPE_ONLINE;		//联机交易
	IA->iTxCnt=tradeserial->trade_count;					//交易次数
	IA->dInCardBala=tradeserial->in_balance;				//入卡值
	IA->dOutCardBala=-1;							//出卡值

	//修改借方和贷方帐户余额,记会计分录帐
	ret=AccountProcess(IA);
	if(ret)
	{
		writelog(LOG_ERR,"AccountProcess ret[%d]",ret);
		return ret;
	}
	tradeserial->out_balance=IA->dOutCardBala;			//出卡值
	if(amtcmp(tradeserial->out_balance,0)<0)
	{
		return E_ENTER_ACCOUNT;
	}

	for(i=1;i<=IA->iOutTxTypeCnt;i++)
	{
		switch(IA->iArrOutTxType[i])
		{
			case TXTYPE_TOLL_DEPOSIT:
			case TXTYPE_TOLL_DEPOSIT_BILL:
			case TXTYPE_TOLL_DEPOSIT_FUNDBOOK:
			case TXTYPE_DEDUCT_DEPOSIT:
			case TXTYPE_RETURN_DEPOSIT:
				tradeserial->deposit_fee=IA->dArrOutAmt[i];
				break;
			case TXTYPE_PRE_TOLL_BOARD:
			case TXTYPE_PRE_TOLL_BOARD_BILL:
			case TXTYPE_BANK_PRE_TOLL_BOARD:
			case TXTYPE_PRE_TOLL_BOARD_FUNDBOOK:
			case TXTYPE_SUBSIDY_PRE_TOLL_BOARD_CASH:
			case TXTYPE_SUBSIDY_PRE_TOLL_BOARD_BILL:
			case TXTYPE_SUBSIDY_PRE_TOLL_BOARD_FUNDBOOK:
			case TXTYPE_TOLL_BOARD:
			case TXTYPE_DEDUCT_BOARD:
			case TXTYPE_RETURN_BOARD:
			case TXTYPE_RETURN_BOARD_BILL:
			case TXTYPE_RETURN_BOARD_FUNDBOOK:
				tradeserial->boardfee=IA->dArrOutAmt[i];
				break;
			case TXTYPE_TOLL_CHARGE:
			case TXTYPE_TOLL_CHARGE_BILL:
			case TXTYPE_TOLL_CHARGE_FUNDBOOK:
				tradeserial->in_fee=IA->dArrOutAmt[i];
				break;
			case TXTYPE_TOLL_CARDCOST:
			case TXTYPE_TOLL_CARDCOST_BILL:
			case TXTYPE_TOLL_CARDCOST_FUNDBOOK:
				tradeserial->cost_fee=IA->dArrOutAmt[i];
				break;
			default:
				break;
		}
		if(amtcmp(IA->dArrOutAmt[i],0)!=0)
		{
			sprintf(sMsg,"%s:%.2lf元 ",IA->sArrOutTxName[i],IA->dArrOutAmt[i]);
		}
	}

	ret = db_rollback();
	if(ret)
	{
		writelog(LOG_ERR,"db_roll_back error,errcode=[%d]",ret);
		return E_DB_ROLLBACK;
	}
	return 0;
}
コード例 #18
0
ファイル: blobcache.c プロジェクト: tommie/showtime
static void *
blobcache_get0(sqlite3 *db, const char *key, const char *stash,
               size_t *sizep, int pad, int *is_expired,
               char **etagp, time_t *mtimep)
{
    int rc;
    void *rval = NULL;
    sqlite3_stmt *stmt;
    time_t now;

    if(db_begin(db))
        return NULL;

    rc = sqlite3_prepare_v2(db,
                            "SELECT payload,expiry,etag,modtime FROM item "
                            "WHERE k=?1 AND stash=?2",
                            -1, &stmt, NULL);
    if(rc) {
        db_rollback(db);
        return NULL;
    }

    time(&now);

    sqlite3_bind_text(stmt, 1, key, -1, SQLITE_STATIC);
    sqlite3_bind_text(stmt, 2, stash, -1, SQLITE_STATIC);
    rc = sqlite3_step(stmt);

    if(rc != SQLITE_ROW) {
        sqlite3_finalize(stmt);
        db_rollback(db);
        return NULL;
    }

    int expired = now > sqlite3_column_int64(stmt, 1);

    if(!expired || is_expired != NULL) {
        sqlite3_column_blob(stmt, 0);
        size_t size = sqlite3_column_bytes(stmt, 0);
        if(size > 0) {
            rval = malloc(size + pad);
            memset(rval + size, 0, pad);
            memcpy(rval, sqlite3_column_blob(stmt, 0), size);
            *sizep = size;
        }
    }

    if(is_expired != NULL)
        *is_expired = expired;

    if(etagp != NULL) {
        const char *str = (const char *)sqlite3_column_text(stmt, 2);
        if(str != NULL)
            *etagp = strdup(str);
    }

    if(mtimep != NULL)
        *mtimep = sqlite3_column_int(stmt, 3);


    sqlite3_finalize(stmt);

    // Update atime

    rc = sqlite3_prepare_v2(db,
                            "UPDATE item SET "
                            "lastaccess = ?3 "
                            "WHERE k = ?1 AND stash = ?2",
                            -1, &stmt, NULL);

    if(rc != SQLITE_OK) {
        TRACE(TRACE_ERROR, "SQLITE", "SQL Error at %s:%d",
              __FUNCTION__, __LINE__);
        db_rollback(db);
        return rval;
    } else {
        sqlite3_bind_text(stmt, 1, key, -1, SQLITE_STATIC);
        sqlite3_bind_text(stmt, 2, stash, -1, SQLITE_STATIC);
        sqlite3_bind_int(stmt, 3, time(NULL));
        rc = sqlite3_step(stmt);
        sqlite3_finalize(stmt);
    }

    db_commit(db);
    return rval;
}
コード例 #19
0
int CallBDFunc(int fno,TRUSERID *handle,ST_CPACK *rpack,ST_PACK *pArrays,int *iRetCode, char *szMsg)
{
   int r=0;
   int rtn=0;
   int sendtype=0;
   char sRetMsg[256]="";
   APPFUNC pFunc = g_XBDefines[fno].pFunc;
   CAccTrans& ats=CAccTrans::GetInst();    
   *iRetCode = ats.Reset(rpack);
   if(*iRetCode)
   	 goto NEXT;
#ifdef _DEBUG1
CMemoryState cm1, cm2, cm3;
#endif

#ifdef _DEBUG1
	cm1.Checkpoint();
#endif
	*iRetCode=0;
	*szMsg=0;
	g_pArrays=pArrays;
	//判断是否是结帐时刻,如果是则等待处理
	sendtype=rpack->head.RequestType;
	g_pRequestCpack = rpack;
	//writelog(LOG_INFO,"%s:bu[%02d][%d]Start",getdbtimestamp(NULL),g_pSvrLink->iThisProcID,rpack->head.RequestType);
	switch(sendtype)
       {
       	case 95:
		case 93:			
//#ifdef _DEBUG_CPACK
//			rtn=SaveCPackData(rpack);
//			if(rtn)
//			{
//				//writelog(LOG_ERR,"SaveCpackData err ");
//				strcpy(szMsg,"写流水日志表错误");
//				ERR_DEAL( szMsg,rtn);
//				break;
//			}
//#endif
			
			rtn = (*pFunc)(handle,rpack->head.RequestType,&rpack->pack,iRetCode,szMsg);
#ifdef _DEBUG1
			cm2.Checkpoint();
			if (cm3.Difference(cm1, cm2))
			{
			      BCCMsgLogOut(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType);
			      g_LogFile.WriteLogEx(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType);
					cm3.DumpStatistics();
			}
#endif 
			break;
		default:
			rtn = (*pFunc)(handle,rpack->head.RequestType,&rpack->pack,iRetCode,szMsg);
#ifdef _DEBUG1
			cm2.Checkpoint();
			if (cm3.Difference(cm1, cm2))
			{
			      BCCMsgLogOut(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType);
			      g_LogFile.WriteLogEx(14444,"在执行功能号:%u时候,经检查,内存出现错误!",rpack->head.RequestType);
					cm3.DumpStatistics();
			}
#endif 
	              break;
       }
	
	if(rtn)
	{
NEXT:
		if(*szMsg)
			snprintf(sRetMsg,256," %s",szMsg);
		if(*iRetCode==0)
		  *iRetCode=rtn;		
		if(*iRetCode<0)
			*iRetCode=E_COMMON_ERR;
		//get_errcode_msg(*iRetCode, sErrMsg);
		db_rollback();
		snprintf(szMsg,256,"%s%s\n%s",ats.GetErrMsgTip(*iRetCode).c_str(),sRetMsg,g_sqlmsg);
		writelog(LOG_ERR,"Func[%d]errcode[%d]errmsg[%s]",rpack->head.RequestType,*iRetCode,szMsg);
		//writelog(LOG_ERR,"Func[%d]ecode[%d]msg[%s]",rpack->head.RequestType,*iRetCode,szMsg);
		ERR_DEAL(szMsg,*iRetCode);
/*
		if(r)
		{
			AnswerData(handle,*iRetCode,szMsg);
			db_disconnect();
			writelog(LOG_ERR,"数据库错误,系统退出");
			exit(1);
		}
*/
	}
	else
	{
		if(strncmp(rpack->pack.semp,"test",4)==0)
			db_rollback();
		else
		{
			r=db_commit();
			if(r)
			{
				r=E_DB_COMMIT;
				strcpy(szMsg,"数据库事务提交失败");
			}
			if(r)
			{
				*iRetCode=r;
				db_rollback();
				writelog(LOG_ERR,"Func[%d]Msg[%s]",rpack->head.RequestType,szMsg);
				ERR_DEAL(szMsg,*iRetCode);
			}
		}
	}
	//writelog(LOG_INFO,"%s:bu[%02d][%d]  End",getdbtimestamp(NULL),g_pSvrLink->iThisProcID,rpack->head.RequestType);
   	return(rtn);
}
コード例 #20
0
ファイル: blobcache.c プロジェクト: tommie/showtime
static void
blobcache_prune(sqlite3 *db)
{
    int rc;
    sqlite3_stmt *sel, *del;
    int64_t currentsize, pruned_bytes = 0;
    int pruned_items = 0;
    if(db_begin(db))
        return;

    if(db_get_int64_from_query(db, "SELECT sum(length(payload)) FROM item",
                               &currentsize)) {
        db_rollback(db);
        return;
    }
    estimated_cache_size = currentsize;

    uint64_t limit = blobcache_compute_maxsize(currentsize) * 9 / 10;
    if(currentsize <= limit) {
        db_rollback(db);
        return;
    }

    rc = sqlite3_prepare_v2(db,
                            "SELECT _rowid_,length(payload) "
                            "FROM item "
                            "ORDER BY lastaccess",
                            -1, &sel, NULL);
    if(rc != SQLITE_OK) {
        TRACE(TRACE_ERROR, "SQLITE", "SQL Error %d at %s:%d",
              rc, __FUNCTION__, __LINE__);
        db_rollback(db);
        return;
    }

    while((rc = sqlite3_step(sel)) == SQLITE_ROW) {
        int itemsize = sqlite3_column_int(sel, 1);
        int64_t id = sqlite3_column_int64(sel, 0);

        rc = sqlite3_prepare_v2(db, "DELETE FROM item WHERE _rowid_ = ?1",
                                -1, &del, NULL);
        if(rc != SQLITE_OK) {
            TRACE(TRACE_ERROR, "SQLITE", "SQL Error at %s:%d",
                  __FUNCTION__, __LINE__);
            sqlite3_finalize(sel);
            db_rollback(db);
            return;
        }
        sqlite3_bind_int(del, 1, id);
        rc = sqlite3_step(del);
        sqlite3_finalize(del);

        if(rc != SQLITE_DONE) {
            sqlite3_finalize(sel);
            db_rollback(db);
            return;
        }

        currentsize -= itemsize;
        pruned_bytes += itemsize;
        pruned_items++;
        if(currentsize <= limit)
            break;
    }
    TRACE(TRACE_DEBUG, "CACHE",
          "Pruned %d items, %"PRId64" bytes from cache",
          pruned_items, pruned_bytes);
    estimated_cache_size = currentsize;
    sqlite3_finalize(sel);
    db_commit(db);

}