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; }
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); }
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; }
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); }
/** * 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; }
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; }
/* ****** 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); }
/////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// //系统模拟入账 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; }
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; //*/ }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
/////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// //系统模拟入账 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; }
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; }
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); }
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", ¤tsize)) { 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); }