中国开发网: 论坛: 程序员情感CBD: 贴子 264275
nostalgic
主控程序
主控程序完成了数据库连接,同时通过调用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);
}

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录