点击(此处)折叠或打开
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include"atmi.h"
-
#include"fml.h"
-
#include"account.fml.h"
-
#include"math.h"
-
#include"userlog.h"
-
-
-
//int account_id;
-
//float amts,amt,acct_bal;
-
-
//add by myself
-
EXEC SQL BEGIN DECLARE SECTION;
-
char userid[20]="owner/abc1234";
-
char remoteDB[20]="mydb";
-
char data[2];
-
int account_id;
-
int amt,acct_bal;
-
char amts[10];
-
EXEC SQL END DECLARE SECTION;
-
-
EXEC SQL INCLUDE sqlca;
-
-
void sqlerror();
-
-
void DEPOSIT(TPSVCINFO *transb){
-
FBFR *transf=(FBFR*)transb->data;
-
account_id=Fvall(transf,ACCOUNT_ID,0);//函数的具体作用
-
-
-
Fget(transf,SAMOUNT,0,amts,0);//此函数的作用
-
sscanf(amts,"%f",&amt);
-
-
//add by myself
-
EXEC SQL WHENEVER SQLERROR DO sqlerror();
-
//此处不需要指定连接,由tuxedo通过GROUP的OPENINFO进行连接
-
//EXEC SQL CONNECT :userid USING :remoteDB;
-
-
EXEC SQL DECLARE dacur CURSOR FOR
-
SELECT BALANCE
-
FROM ACCOUNT
-
WHERE ACCOUNT_ID=:account_id;
-
EXEC SQL OPEN dacur;
-
EXEC SQL FETCH dacur INTO :acct_bal;
-
-
acct_bal+=amt;
-
EXEC SQL update ACCOUNT set BALANCE = :acct_bal
-
where ACCOUNT_ID = :account_id;
-
EXEC SQL close dacur;
-
//add by myself
-
//EXEC SQL COMMIT WORK RELEASE;
-
-
sprintf(amts,"$%d",acct_bal);
-
Fchg(transf,SBALANCE,0,amts,(FLDLEN)0);//
-
-
tpreturn(TPSUCCESS,0,transb->data,0L,0);
-
}
-
-
-
void WITHDRAWAL(TPSVCINFO *transb){
-
FBFR *transf=(FBFR*)transb->data;
-
account_id=Fvall(transf,ACCOUNT_ID,0);
-
Fget(transf,SAMOUNT,0,amts,0);
-
sscanf(amts,"%f",&amt);
-
-
//add by myself
-
EXEC SQL WHENEVER SQLERROR DO sqlerror();
-
//EXEC SQL CONNECT :userid USING :remoteDB;
-
-
EXEC SQL declare wacur cursor for
-
select BALANCE from ACCOUNT where ACCOUNT_ID= :account_id;
-
EXEC SQL open wacur;
-
EXEC SQL fetch wacur into :acct_bal;
-
//EXEC SQL close wacur;
-
if(amt>acct_bal){
-
if(fabs(acct_bal-amt)>0.01){
-
Fchg(transf,STATLIN,0,"Account overdraft",(FLDLEN)0);
-
EXEC SQL close wacur;
-
tpreturn(TPFAIL,0,transb->data,0L,0);
-
}
-
amt=acct_bal;
-
}
-
acct_bal-=amt;
-
EXEC SQL update ACCOUNT set BALANCE = :acct_bal
-
where ACCOUNT_ID = :account_id;
-
EXEC SQL close wacur;
-
//add by myself
-
//EXEC SQL COMMIT WORK RELEASE;
-
-
sprintf(amts,"$%d",acct_bal);
-
Fchg(transf,SBALANCE,0,amts,(FLDLEN)0);
-
-
tpreturn(TPSUCCESS,0,transb->data,0L,0);
-
}
-
-
void INQUERY(TPSVCINFO *transb){
-
userlog("INQUERY receive request from client!\n");
-
-
FBFR *transf=(FBFR*)transb->data;
-
account_id=Fvall(transf,ACCOUNT_ID,0);
-
-
-
-
//add by myself
-
EXEC SQL WHENEVER SQLERROR DO sqlerror();
-
//EXEC SQL CONNECT :userid USING :remoteDB;
-
-
//EXEC SQL declare icur cursor for
-
// select BALANCE from ACCOUNT where ACCOUNT_ID = :account_id;
-
-
//EXEC SQL open icur;
-
//EXEC SQL fetch icur into :acct_bal;
-
//EXEC SQL close icur;
-
-
EXEC SQL select BALANCE into :acct_bal from ACCOUNT where ACCOUNT_ID=:account_id;
-
if(sqlca.sqlcode!=0){
-
userlog("select from EMP failure,sqlcode=%ld, sqlerr=%s\n",sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);
-
tpreturn(TPFAIL,0,NULL,0L,0);
-
}
-
userlog("BALANCE=%d",acct_bal);
-
-
//add by myself
-
//EXEC SQL COMMIT WORK RELEASE;
-
-
sprintf(amts,"$%d",acct_bal);//%.2f不能进行有效转换,所以amts为0.0
-
//userlog("amts=%s",amts);
-
Fchg(transf,SBALANCE,0,amts,(FLDLEN)0);
-
Fchg(transf,FORMNAM,0,"CBLANCE",(FLDLEN)0);
-
-
tpreturn(TPSUCCESS,0,transb->data,0L,0);
-
}
-
-
-
void sqlerror(){
-
EXEC SQL WHENEVER SQLERROR CONTINUE;
-
EXEC SQL ROLLBACK WORK RELEASE;
-
printf("-----pro*c connect error!----n");
-
exit(-1);
- }
XFER.c
点击(此处)折叠或打开
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include"atmi.h"
-
#include"tx.h"
-
#include"account.fml.h"
-
#include"fml.h"
-
-
long db_id,cr_id;
-
//char t_amts[10];
-
-
#ifdef TRANSACTION_MODE
-
void TRANSFER_XA(TPSVCINFO *transb){
-
#else
-
void TRANSFER_NOXA(TPSVCINFO *transb){
-
#endif
-
long olen;
-
FBFR *transf=(FBFR*)transb->data;
-
-
db_id=Fvall(transf,ACCOUNT_ID,0);
-
cr_id=Fvall(transf,ACCOUNT_ID,1);
-
//Fget(transf,SAMOUNT,0,t_amts,0);
-
//sscanf(amts,"%f",&amt);
-
-
//构造参数
-
//FBFR *inbuf=(FBFR*)tpalloc("FML",NULL,1024);
-
//Fchg(inbuf,SAMOUNT,0,(char*)t_amts,(FLDLEN)0);
-
-
#ifdef TRANSACTION_MODE
-
tpbegin(60,0);
-
#endif
-
Fchg(transf,ACCOUNT_ID,0,(char*)db_id,(FLDLEN)0);
-
//取款
-
int ret1=tpcall("WITHDRAWAL",(char*)transf,0,(char**)&transf,(long*)&olen,0);
-
//system("do shutdown");
-
//存款
-
Fchg(transf,ACCOUNT_ID,0,(char*)cr_id,(FLDLEN)0);
-
int ret2=tpcall("DEPOST",(char*)transf,0,(char**)&transf,(long*)&olen,0);
-
//system("do boot");
-
if((ret1==0)&&(ret2==0)){
-
#ifdef TRANSACTION_MODE
-
tpcommit(0);
-
#endif
-
tpreturn(TPSUCCESS,0,transb->data,0L,0);
-
}else{
-
#ifdef TRANSACTION_MODE
-
tpabort(0);
-
#endif
-
tpreturn(TPFAIL,0,transb->data,0L,0);
-
}
- }
bankclt.c
点击(此处)折叠或打开
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include"atmi.h"
-
#include"fml.h"
-
#include"account.fml.h"
-
-
int Balance(long accountid);
-
-
int main(int argc,char *argv[]){
-
long aid1,aid2,samount,olen;
-
aid1=10000;
-
aid2=20000;
-
samount=10;//转账金额
-
-
-
if(tpinit((TPINIT*)NULL)==-1){
-
fprintf(stderr,"tpinit failed!\n");
-
exit(-1);
-
}
-
//申请缓冲区
-
FBFR *fbfr=(FBFR*)tpalloc("FML",NULL,1024);
-
if(fbfr==NULL){
-
fprintf(stderr,"tpalloc failed!\n");
-
tpterm();
-
exit(-1);
-
}
-
-
#ifdef TRANSACTION_MODE
-
fprintf(stdout,"\nRun under Transaction Mode...\n");
-
#else
-
fprintf(stdout,"\nRun under NON-Transaction Mode...\n");
-
#endif
-
-
fprintf(stdout,"\nBalance of account before transfer\n");
-
fprintf(stdout,"--------------------------------------\n");
-
Balance(10000);
-
Balance(20000);
-
-
fprintf(stdout,"\nTransfer $10 from account 10000 to 20000...\n");
-
fprintf(stdout,"-----------------------------------------------\n");
-
-
//构造入参
-
Fchg(fbfr,ACCOUNT_ID,0,(char*)&aid1,(FLDLEN)0);
-
Fchg(fbfr,ACCOUNT_ID,1,(char*)&aid2,(FLDLEN)0);
-
Fchg(fbfr,SAMOUNT,0,(char*)&samount,(FLDLEN)0);
-
-
#ifdef TRANSACTION_MODE
-
int ret1=tpcall("TRANSFER_XA",(char*)fbfr,0,(char**)&fbfr,(long*)&olen,0);
-
#else
-
int ret1=tpcall("TRANSFER_NOXA",(char*)fbfr,0,(char**)&fbfr,(long*)&olen,0);
-
#endif
-
-
if(ret1==-1)
-
fprintf(stdout,"\nTransfer Failed!\n");
-
else
-
fprintf(stdout,"\nTransfer Successful!\n");
-
-
-
fprintf(stdout,"\nBalance of account after transfer\n");
-
fprintf(stdout,"--------------------------------------\n");
-
Balance(aid1);
-
Balance(aid2);
-
-
return 0;
-
}
-
-
int Balance(long account_id){
-
long olen;
-
FBFR *fbfr=(FBFR*)tpalloc("FML",NULL,1024);
-
if(fbfr==NULL){
-
fprintf(stderr,"tpalloc failed!\n");
-
tpterm();
-
exit(-1);
-
}
-
Fchg(fbfr,ACCOUNT_ID,0,(char*)&account_id,0);
-
if(tpcall("INQUERY",(char*)fbfr,0L,(char**)&fbfr,(long*)&olen,0)==-1){
-
fprintf(stderr,"Can not send request to service INQUERY\n");
-
tpfree((char*)fbfr);
-
tpterm();
-
exit(1);
-
}
-
fprintf(stdout,"Account_id=%d,Account_Balance=%s\n",account_id,(char*)Ffind(fbfr,SBALANCE,0,0));
-
return 0;
- }
编译服务器端程序用到的Makefile:
点击(此处)折叠或打开
-
ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
-
INCLDIR= -I. -I$ORACLE_HOME/precomp/public -I$ORACLE_HOME/rdbms/public -I$ORACLE_HOME/rdbms/demo -I$ORACLE_HOME/plsql/public -I$ORACLE_HOME/network/public
-
DFLAGS= -DPRECOMP -DLINUX -D_GNU_SOURCE -DSLTS_ENABLE -DSLMXMX_ENABLE -D_REENTRANT -DNS_THREADS
-
CFLAGS= -O3
-
LIBPATH= -L/u01/oracle/product/8.1.7/lib/
-
LIBS=-lclntsh -ldl -lm
-
-
conn:TLR_ORA.pc
-
proc parse=no iname=TLR_ORA.pc include=$(ORACLE_HOME)/precomp/public
-
-
buildserver -r Oracle_XA -o depositserver -f TLR_ORA.c -s DEPOSIT:DEPOSIT
-
buildserver -r Oracle_XA -o withdrawalserver -f TLR_ORA.c -s WITHDRAWAL:WITHDRAWAL
-
buildserver -r Oracle_XA -o inqueryserver -f TLR_ORA.c -s INQUERY:INQUERY
-
clean:
- rm *.lis tp*
编译XFER和客户端命令:
点击(此处)折叠或打开
-
buildclient -o bankclient -f bankclt.c -w
- buildserver -s TRANSFER_XA -o XFERserver -f XFER.c
运行结果:
点击(此处)折叠或打开
-
[tuxapp@localhost TLR]$ ./bankclient
-
-
Run under Transaction Mode...
-
-
Balance of account before transfer
-
--------------------------------------
-
Account_id=10000,Account_Balance=$610
-
Account_id=20000,Account_Balance=$990
-
-
Transfer $10 from account 10000 to 20000...
-
-----------------------------------------------
-
-
Transfer
-
-
Balance of account after transfer
-
--------------------------------------
-
Account_id=10000,Account_Balance=$610
- Account_id=20000,Account_Balance=$990
点击(此处)折叠或打开