[阅读: 946] 2005-12-22 11:16:07
主控程序完成了数据库连接,同时通过调用TUXEDO的标志函数实现与前台系统通信的功能,并控制了交易的事务完整性,通过主控程序完成了对各个原子交易的调用,充分实现了业务处理通过原子交易封装的思想。
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% ProgramName : %%
%% %%
%% SystemName : 邮政外币储蓄应用系统 %%
%% %%
%% SubSystem : 系统应用主控 %%
%% %%
%% OS & Environment : AIX 4.3, ANSI C compiler, Oracle proc %%
%% %%
%% Version : 2.0 %%
%% %%
%% Description : 系统应用主控模板 %%
%% %%
%% Date postion author description %%
%% ----------------------------------------------------------------- %%
%% 1998/09/18 Guangdong X.N. Create For NHXL %%
%% 1998/11/08 Guangdong D.M. Modify For NHXL %%
%% 2000/11 Guangdong HouYanMin Modify %%
%% 2002/04 Hebei D.M. Modify For HBYC %%
%% 2003/07/31 BeiJing hjh adapt For UniPost %%
%% 2003/08/22 BeiJing YBSZS Modify For UniPost %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
*/
/*
*STDPRG_CHECK.ec :含有柜员检查和机构检查、授权检查
*在内的主控程序!
*/
/*
*该主控程序统一维护.
*使用者需要修改"<>"部分,将其替换为APSERVER本身的内容.
*
*"<>.h"是主控必须使用的头文件.
*需要主控包括的其它头文件, 可以登记在文件"user_include_file"中.
*
*
*开发时定义 DEBUG 方式.
*正式运行时定义 NODEBUG 方式.
*/
EXEC SQL include "CLRACC.h";
EXEC SQL include "user_include_file";
EXEC SQL include sqlca;
EXEC SQL include oraca;
void
sql_error()
{
char ret_tmp[50];
memset( ret_tmp, 0, sizeof( ret_tmp ));
(void)userlog( "Sql error,code[%d]!\n", sqlca.sqlcode );
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK RELEASE;
}
tpsvrinit(argc, argv)
int argc;
char * argv[];
{
EXEC SQL BEGIN DECLARE SECTION;
char dbname[50];
char passwd[50];
EXEC SQL END DECLARE SECTION;
if ( getenv( "SYSMNG_DBASE" ) != NULL )
strcpy( dbname, getenv( "SYSMNG_DBASE" ));
if ( getenv( "SYSMNG_DBASE_PWD" ) != NULL )
strcpy( passwd, getenv( "SYSMNG_DBASE_PWD" ));
(void)userlog("Boot From Run_Para Database: dbname=[%s]\n", dbname);
EXEC SQL CONNECT :dbname IDENTIFIED BY :passwd;
(void)userlog("Boot From Run_Para Database: dbname=[%s]sqlcode[%ld]passwd[%s]\n", dbname, sqlca.sqlcode, passwd);
/** 准备FML链表 **/
if ( PubGetFmlLink("00") < 0 ) /* 准备公共变量 */
{
(void)userlog( "PubGetFmlLink 00 error \n" );
EXEC SQL COMMIT RELEASE ;
return (-1);
}
if ( PubGetFmlLink("42") < 0 )
{
(void)userlog( "PubGetFmlLink ## error \n" );
EXEC SQL COMMIT RELEASE ;
return (-1);
}
FmlLinkTrace();
/** 准备处理批链表 **/
if ( PubGetBatLink("42") )
{
(void)userlog( "PubGetBatLink ## error \n" );
EXEC SQL COMMIT RELEASE ;
return (-1);
}
BatLinkTrace();
EXEC SQL COMMIT WORK RELEASE;
/** 打开应用数据库 **/
if (tpopen() < 0)
{
(void)userlog( "tpsvrinit: failed to open database due to " );
switch (tperrno)
{
case TPEOS:
(void)userlog( "tpopen failed, Unix error tpeos \n" );
break;
case TPERELEASE:
(void)userlog("tpopen failed, Incompatible release tperelease \n" );
break;
default:
(void)userlog( "tpopen failed, tperrno: \n" );
}
return (-1);
}
return (0);
}
void
tpsvrdone()
{
FMLLINK_t *cur1;
BATLINK_t *cur2;
/** 关闭应用数据库 **/
if (tpclose() < 0) {
(void)userlog("tpsrvdone: failed to close database due to ");
switch (tperrno)
{
case TPEOS:
(void)userlog("tpclose failed tpeos\n");
break;
case TPERELEASE:
(void)userlog("tpclose failed, Incompatible release tperelease \n");
break;
default:
(void)userlog("tpclose failed, tperrno: %d\n",tperrno);
}
}
/** 释放链表 **/
cur1 = BufHead;
while ( cur1 != NULL )
{
BufHead = BufHead->next;
free(cur1);
cur1 = BufHead;
}
cur2 = BatHead;
while ( cur2 != NULL )
{
BatHead = BatHead->next;
free(cur2);
cur2 = BatHead;
}
(void)userlog("Apserver down, free memory ok \n");
}
/** 主控服务程序 **/
STDSVC( msg )
TPSVCINFO *msg;
{
long ret_val = 0;
struct s_bat traninfo;
time_t process_begin;
time_t process_end;
char s_time[30];
char s_time1[30];
char s_time2[30];
char timestr[30+1];
memset (&traninfo, 0, sizeof (struct s_bat));
memset (timestr, 0, sizeof(timestr));
InitSysVar();
strncpy(_TranNo, msg->name, 6);
sprintf(RunLogFile, "%s%c%c%c%c",
RUNLOG, _TranNo[0], _TranNo[1], _TranNo[2], _TranNo[3]);
sprintf(ErrLogFile, "%s%c%c%c%c",
ERRLOG, _TranNo[0], _TranNo[1], _TranNo[2], _TranNo[3]);
FAPP = (FBFR32 *)msg->data;
#ifdef DISPDEBUG
WriteTrace( _TranNo, "上传包结构为:", FAPP );
#endif
/*
memset ( s_time, 0, sizeof (s_time) );
process_begin = time(NULL);
GetMTime( s_time );
strcpy(s_time1, s_time);
*/
GetMTime( timestr );
CBSLog(RunLogFile, "\n[ A new service %s begin %s ]\n", _TranNo, timestr );
/** 公共处理一: 组织下传池 **/
if ( (FDWN=(FBFR32 *)tpalloc("FML32", NULL, MAXDYSIZE)) == NULL )
{
CBSLog(RunLogFile, "下传池内存空间分配错误 \n");
TuxErr("FML内存分配错误!", tperrno);
_HostStat=1;
_MsgType=1; /** 0:显示不停顿 1:显示停顿 **/
strcpy( _HostMsgCode, "503001" );
GetMsg();
Fchg32(FAPP, ReadFldid("_HostStat"), 0, (char *)&_HostStat, 0);
Fchg32(FDWN, ReadFldid("_MsgType"), 0, (char *)&_MsgType, 0);
Fchg32(FDWN, ReadFldid("_HostMsg"), 0, _HostMsg, 0);
WriteTrace( _TranNo, "上传包结构为:", FAPP );
WriteTrace( _TranNo, "下传包结构为:", FAPP );
_AppErrNo = -1;
tpreturn(TPSUCCESS, _AppErrNo, (char *)FAPP, 0L, 0);
}
/* 公共处理二: 取得交易控制信息
* traninfo.flag[0]; 0-other; 1-account trans; 2-admin trans; 3-query trans;
* traninfo.flag[1]: 0-no verify no supervise; 1-verify; 2-supervise; 3-all;
* traninfo.flag[2]: 0-no check inst stat ; 1-check inst stat;
* traninfo.flag[3]: 0-no check teller login ; 1-check teller login;
* traninfo.flag[4]: 0-interval running;1-contuine running for normal trans;
* traninfo.flag[5]: 0-interval running;1-contuine running for cancel trans;
* traninfo.flag[6]: 0-interval running;1-contuine running for verify trans;
* traninfo.flag[7]: 0-interval running;1-contuine running for resend trans;
*/
if ( GetSvcInfo( _TranNo, &traninfo ) )
{
CBSLog(RunLogFile, "读交易码[%s]详细信息出错 ! \n", _TranNo);
AppErr("读交易码详细信息出错!", -1);
_HostStat=1;
_MsgType=1;
_AppErrNo = -1;
strcpy( _HostMsgCode, "503002" );
GetMsg();
Fchg32(FDWN, ReadFldid("_HostStat"), 0, (char *)&_HostStat, 0);
Fchg32(FDWN, ReadFldid("_MsgType"), 0, (char *)&_MsgType, 0);
Fchg32(FDWN, ReadFldid("_HostMsg"), 0, _HostMsg, 0);
WriteTrace( _TranNo, "上传包结构为:", FAPP );
tpfree ( (char *) FAPP );
WriteTrace( _TranNo, "下传包结构为:", FDWN );
tpreturn(TPSUCCESS, _AppErrNo, (char *)FDWN, 0L, 0);
}
/** 公共处理三: 校验上传包 **/
if ( ChkPkgMac( &traninfo ) )
{
CBSLog(RunLogFile, "MAC校验出错! \n");
AppErr("MAC校验错误!", -1);
_HostStat=1;
_MsgType=1;
strcpy( _HostMsgCode, "503003" );
GetMsg();
Fchg32(FDWN, ReadFldid("_HostStat"), 0, (char *)&_HostStat, 0);
Fchg32(FDWN, ReadFldid("_MsgType"), 0, (char *)&_MsgType, 0);
Fchg32(FDWN, ReadFldid("_HostMsg"), 0, _HostMsg, 0);
WriteTrace( _TranNo, "上传包结构为:", FAPP );
tpfree ( (char *) FAPP );
WriteTrace( _TranNo, "下传包结构为:", FDWN );
_AppErrNo = -1;
tpreturn(TPSUCCESS, _AppErrNo, (char *)FDWN, 0L, 0);
}
#ifdef DEBUG
CBSLog( RunLogFile, "ChkPkgMac ok!\n" );
#endif
/** 公共处理四: 取得公共系统变量的值 **/
if ( GetPubVar() )
{
CBSLog(RunLogFile, "取系统变量出错! \n");
AppErr("取系统变量错误!", -1);
_HostStat=1;
_MsgType=1;
strcpy( _HostMsg, "503004" );
GetMsg();
Fchg32(FDWN, ReadFldid("_HostStat"), 0, (char *)&_HostStat, 0);
Fchg32(FDWN, ReadFldid("_MsgType"), 0, (char *)&_MsgType, 0);
Fchg32(FDWN, ReadFldid("_HostMsg"), 0, _HostMsg, 0);
WriteTrace( _TranNo, "上传包结构为:", FAPP );
tpfree ( (char *) FAPP );
WriteTrace( _TranNo, "下传包结构为:", FDWN );
_AppErrNo = -1;
tpreturn(TPSUCCESS, _AppErrNo, (char *)FDWN, 0L, 0);
}
/** 公共处理五: 检查系统状态 **/
if ( ChkSysStatus( &traninfo ) )
{
_HostStat=1;
_MsgType=1;
strcpy( _HostMsgCode, "503005" );
GetMsg();
Fchg32(FDWN, ReadFldid("_HostStat"), 0, (char *)&_HostStat, 0);
Fchg32(FDWN, ReadFldid("_MsgType"), 0, (char *)&_MsgType, 0);
Fchg32(FDWN, ReadFldid("_HostMsg"), 0, _HostMsg, 0);
WriteTrace( _TranNo, "上传包结构为:", FAPP );
tpfree ( (char *) FAPP );
WriteTrace( _TranNo, "下传包结构为:", FDWN );
_AppErrNo = -1;
tpreturn(TPSUCCESS, _AppErrNo, (char *)FDWN, 0L, 0);
}
#ifdef DEBUG
CBSLog( RunLogFile, "系统主控: 系统状态检查成功!\n" );
#endif
/** 公共处理六: 检查机构状态 **/
if ( ChkInstStatus( &traninfo ) )
{
_HostStat=1;
_MsgType=1;
GetMsg();
Fchg32(FDWN, ReadFldid("_HostStat"), 0, (char *)&_HostStat, 0);
Fchg32(FDWN, ReadFldid("_MsgType"), 0, (char *)&_MsgType, 0);
Fchg32(FDWN, ReadFldid("_HostMsg"), 0, _HostMsg, 0);
WriteTrace( _TranNo, "上传包结构为:", FAPP );
tpfree ( (char *) FAPP );
WriteTrace( _TranNo, "下传包结构为:", FDWN );
_AppErrNo = -1;
tpreturn(TPSUCCESS, _AppErrNo, (char *)FDWN, 0L, 0);
}
#ifdef DEBUG
CBSLog( RunLogFile, "系统主控: 机构检查成功!\n" );
#endif
/** 公共处理七: 检查柜员状态 **/
if ( ChkTlrStatus( &traninfo ) )
{
_HostStat=1;
_MsgType=1;
GetMsg();
Fchg32(FDWN, ReadFldid("_HostStat"), 0, (char *)&_HostStat, 0);
Fchg32(FDWN, ReadFldid("_MsgType"), 0, (char *)&_MsgType, 0);
Fchg32(FDWN, ReadFldid("_HostMsg"), 0, _HostMsg, 0);
tpfree ( (char *) FAPP );
WriteTrace( _TranNo, "下传包结构为:", FDWN );
_AppErrNo = -1;
tpreturn(TPSUCCESS, _AppErrNo, (char *)FDWN, 0L, 0);
}
#ifdef DEBUG
CBSLog( RunLogFile, "系统主控: 柜员检查成功!\n" );
#endif
/** 公共处理八: 设置事务 **/
if ( SetTransaction(_TranNo, traninfo.flag[0]) < 0)
{
CBSLog(RunLogFile, "事务设置出错! \n");
tpreturn(TPSUCCESS, _AppErrNo, (char *)FAPP, 0L, 0);
}
#ifdef DEBUG
DispSysVar();
#endif
memset (s_time,0,sizeof (s_time));
GetMTime( s_time );
CBSLog(RunLogFile, "\n[ The service %s atom running at %s with _CltSeqno %s (_TranFlag【%d】)]\n", _TranNo, s_time, _CltSeqno, _TranFlag);
/** 执行原子交易处理批名 **/
switch ( _TranFlag )
{
case 0:
ret_val = ProcBatch( traninfo.common, traninfo.flag[4] );
break;
case 1:
ret_val = ProcBatch( traninfo.cancel, traninfo.flag[5] );
break;
case 2:
ret_val = ProcBatch( traninfo.verify, traninfo.flag[6] );
break;
case 3:
ret_val = ProcBatch( traninfo.resend, traninfo.flag[7] );
break;
default:
CBSLog(RunLogFile, "_TranFlag [%d] invaild !\n", _TranFlag);
_MsgType=1;
Fchg32(FDWN, ReadFldid("_MsgType"), 0, (char *)&_MsgType, 0);
ret_val = -999;
break;
}
if ( ret_val != 0 )
{
CBSLog( RunLogFile, "ProcBatch Running Error, ret=[%d]Code[%s]_CltSeqNo[%s]!\n", ret_val, _HostMsgCode, _CltSeqno );
AppErr("批处理错误!", 0);
_HostStat=1;
GetMsg();
Fchg32(FDWN, ReadFldid("_HostStat"), 0, (char *)&_HostStat, 0);
Fchg32(FDWN, ReadFldid("_MsgType"), 0, (char *)&_MsgType, 0);
Fchg32(FDWN, ReadFldid("_HostMsg"), 0, _HostMsg, 0);
/*
if ( tpabort( 0 ) == -1 )
(void)userlog("%s: failed to abort transaction!\n", _TranNo);
*/
if ( _PwdErrFlag == 1 )
EXEC SQL COMMIT WORK;
else
EXEC SQL ROLLBACK WORK;
tpfree ( (char *) FAPP );
_AppErrNo = ret_val;
/* Add by DengJun on 2004.5.28 *
* 异地交易异常的处理 */
if ( ret_val == 9998 || ret_val == 9999 )
{
_AppErrNo = 0;
_MsgType = 2;
}
tpreturn(TPSUCCESS, _AppErrNo, (char *)FDWN, 0L, 0);
}
/* 不可逆密码处理 */
EXEC SQL COMMIT WORK;
/*
if ( _TMODEL && tpcommit( 0 ) == -1 )
{
(void)userlog("%s: failed to commit transaction!\n", _TranNo);
tpfree ( (char *) FAPP );
_AppErrNo = -1;
tpreturn(TPSUCCESS, _AppErrNo, (char *)FDWN, 0L, 0);
}
*/
_AppErrNo = 0;
if ( WriteTranGather( ) )
{
CBSLog(RunLogFile, "警告: 登记交易采集表失败!\n");
}
/*
process_end = time(NULL);
GetMTime( s_time );
strcpy( s_time2, s_time );
*/
GetMTime( timestr );
CBSLog(RunLogFile, "[The service %s with %s end during %s (_TranFlag【%d】)]\n\n",
_TranNo, _CltSeqno, timestr, _TranFlag );
_HostStat=0;
_AppErrNo = 0;
strcpy( _HostMsgCode, "000000" );
GetMsg();
Fchg32(FDWN, ReadFldid("_HostStat"), 0, (char *)&_HostStat, 0);
Fchg32(FDWN, ReadFldid("_PsbkLineNo"), 0, (char *)&_PsbkLineNo, 0);
Fchg32(FDWN, ReadFldid("_MorePage"), 0, (char *)&_MorePage, 0);
Fchg32(FDWN, ReadFldid("_MsgType"), 0, (char *)&_MsgType, 0);
Fchg32(FDWN, ReadFldid("_HostMsg"), 0, _HostMsg, 0);
tpfree ( (char *) FAPP );
#ifdef DISPDEBUG
WriteTrace( _TranNo, "下传包结构为:", FDWN );
#endif
tpreturn(TPSUCCESS, _AppErrNo, (char *)FDWN, 0L, 0);
return(0);
}