📄 pbserver.cpp
字号:
#include <stdio.h>
#include <atmi.h>
#include <userlog.h>
#include <fml32.h>
#include "tbl_fml.h"
EXEC SQL INCLUDE sqlca;
/*RELEASE_CURSOR=YES 使PROC 在执行后释放与嵌入SQL有关资源*/
EXEC ORACLE OPTION (RELEASE_CURSOR = YES);
#define SQLNOTFOUND 1403 /*SELECT没取到数据*/
#define SQLNULL -1405 /*当取出的值是null时,sqlca.sqlcode = -1405*/
#define _DEBUG_ /*调试*/
/*如果在表中是字符型的变量(CHAR,VARCHAR,VARCHAR2,定义为CHAR,长度为表中的长度加1,
整型定义为LONG或INT,浮点型定义为DOUBLE或FLOAT,如果是特别大的数,如:NUMBER(15)可定义
为CHAR型,但要做改变)*/
EXEC SQL BEGIN DECLARE SECTION;
varchar vc_user[20];
char c_user[30]="";
char c_passwd[30]="";
/*定义输入参数:*/
long al_empno=0;
long al_mgr=0;
long al_deptno=0;
char ac_ename[11]="";
char ac_job[10]="";
char ac_hiredate[20]="";
double af_sal=0;
double af_comm=0;
long l_errno=0;
long l_return=0;
char c_errtext[256]="";
char c_tmp[256]="";
char ac_nodeno[9]="";
char ac_begin_date[8]="";
char ac_end_date[8]="";
char c_code[3]="";
char c_content[15]="";
char c_amount[13]="";
char c_litter[13]="";
char c_nodename[61]="";
/*重新定义STRING变量,使其自动加上'\0',如果是CHAR形的则不能重新定义成STRING变量*/
EXEC SQL VAR ac_ename IS STRING(11);
EXEC SQL VAR ac_job IS STRING(11);
EXEC SQL VAR ac_hiredate IS STRING(11);
EXEC SQL VAR c_tmp IS STRING(11);
EXEC SQL VAR ac_nodeno IS STRING(9);
EXEC SQL VAR ac_begin_date IS STRING(8);
EXEC SQL VAR ac_end_date IS STRING(8);
EXEC SQL VAR c_code IS STRING(3);
EXEC SQL VAR c_content IS STRING(15);
EXEC SQL VAR c_amount IS STRING(13);
EXEC SQL VAR c_litter IS STRING(13);
EXEC SQL VAR c_nodename IS STRING(61);
/*定义指示器变量*/
/*short ind_empno=0;
short ind_mgr=0;
short ind_deptno=0;
short ind_ename=0;
short ind_job=0;
short ind_hiredate=0;
short ind_sal=0;
short ind_comm=0;
*/
EXEC SQL END DECLARE SECTION;
/*出错返回*/
int tux_return(FBFR32 *sendbuf, char *szErrInfo,long sqlcode,char *szErrText)
{
FLDLEN32 len=0;
len=sizeof(szErrInfo);
Fchg32(sendbuf, ERRINFO, 0,szErrInfo, len);
len = sizeof(sqlcode);
Fchg32( sendbuf, SQLCODE, 0, (char *)&sqlcode, len);
len=sizeof(szErrText);
Fchg32(sendbuf, ERRTEXT, 0,szErrText, len);
tpreturn(TPFAIL, 0, (char *)sendbuf, 0L, 0);
return 0;
}
/*分配返回缓冲区并初始化*/
FBFR32* IniSendBuf(int iSize)
{
FBFR32 *sendbuf=NULL;
FLDLEN32 len=0;
sendbuf = (FBFR32 *)tpalloc( "FML32",NULL,iSize);
if(sendbuf==(FBFR32 *)NULL)
{
userlog("tpalloc() failure\n");
return NULL;
}
len = Fsizeof32(sendbuf);
(void)Finit32(sendbuf,len);
(void)Fchg32(sendbuf, ERRINFO, 0, "", (FLDLEN32)0);
(void)Fchg32(sendbuf, SQLCODE, 0, 0, (FLDLEN32)0);
(void)Fchg32(sendbuf, ERRTEXT, 0, "", (FLDLEN32)0);
return sendbuf;
}
/*
int tpsvrinit(argc, argv)
int argc;
char *argv[];
{
//连接数据库
strcpy(vc_user.arr,"scott/tiger");
vc_user.len=11;
exec sql connect :vc_user;
if(sqlca.sqlcode!=0)
{
tpreturn(TPFAIL, 0, 0, 0L, 0);
}
strcpy(vc_user.arr,"test_hs/boc_hs");
vc_user.len=14;
exec sql connect :vc_user;
if(sqlca.sqlcode!=0)
{
tpreturn(TPFAIL, 0, 0, 0L, 0);
}
return 0;
}
void tpsvrdone()
{
tpclose();
}
*/
int tpsvrinit(argc, argv)
int argc;
char *argv[];
{
if (tpopen() == -1) {
(void)userlog("tpsvrinit: failed to open database due to ");
switch (tperrno) {
case TPEOS:
//(void)userlog("tpopen failed, Unix error %d\n",Uunixerr);
break;
case TPERELEASE:
(void)userlog("tpopen failed, Incompatible release\n");
break;
default:
(void)userlog("tpopen failed, tperrno: %d\n",tperrno);
}
argv = argv; argc = argc;
return(-1);
}
userlog("tpopen() ok******************\n");
return 0;
}
void
tpsvrdone()
{
if (tpclose() == -1) {
(void)userlog("tpsrvdone: failed to close database due to ");
switch (tperrno) {
case TPEOS:
//(void)userlog("tpclose failed, Unix error %d\n", Uunixerr);
break;
case TPERELEASE:
(void)userlog("tpclose failed, Incompatible release\n");
break;
default:
(void)userlog("tpclose failed, tperrno: %d\n",tperrno);
}
}
userlog("tpdone() ok******************\n");
}
/*EMP_SEL SERVICES*/
EMP_SEL(TPSVCINFO *rqst)
{
FBFR32 *rcvbuf=NULL;
FBFR32 *sendbuf=NULL;
FLDLEN32 len=0;
int i=0;
int ret=0;
int iOc=0;
/*分配返回缓冲区并初始化*/
sendbuf = IniSendBuf(20480);
if(sendbuf==NULL)
{
tpreturn( TPFAIL, 0, (char *)sendbuf, 0, 0 );
}
/*从EMP表中取数据*/
EXEC SQL DECLARE cur_emp_select CURSOR FOR
SELECT EMPNO, ENAME,JOB,MGR,to_char(HIREDATE,'yyyy/mm/dd hh24:mi:ss'),SAL,COMM,DEPTNO FROM EMP;
if(sqlca.sqlcode!=0)
{
tux_return(sendbuf,"DECLARE CURSOR:cur_emp_select出错",sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);
}
EXEC SQL OPEN cur_emp_select;
if(sqlca.sqlcode!=0)
{
EXEC SQL CLOSE cur_emp_select;
tux_return(sendbuf,"OPEN CURSOR:cur_emp_select出错",sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);
}
i = 0;
while(1)
{
al_empno=0;
strcpy(ac_ename,"");
strcpy(ac_job,"");
al_mgr=0;
strcpy(ac_hiredate,"");
af_sal=0;
af_comm=0;
al_deptno=0;
/*EXEC SQL FETCH authors INTO :al_empno :ind_empno, :ac_ename :ind_ename,:ac_job :ind_job,:al_mgr :ind_mgr,:ac_hiredate :ind_hiredate,:af_sal :ind_sal,:af_comm :ind_comm,:al_deptno :ind_deptno;
*/
EXEC SQL FETCH cur_emp_select INTO :al_empno, :ac_ename,:ac_job,:al_mgr,:ac_hiredate,:af_sal,:af_comm,:al_deptno;
if( sqlca.sqlcode == SQLNOTFOUND)
{
break;
}
/*当取出的值是null时,sqlca.sqlcode = -1405*/
if ((sqlca.sqlcode != 0)&&(sqlca.sqlcode!= SQLNULL))
{
/*FETCH CURSOR失败 */
EXEC SQL CLOSE cur_emp_select;
tux_return(sendbuf,"FETCH CURSOR 出错",sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);
}
/*对null的处理有两种分法1,采用指示器变量,2,在FETCH之前,给变量赋初直,并处理sqlca.sqlcode = -1405的情况
采用指示器变量时,取出的值是null时,sqlca.sqlcode 也不会等于 -1405
如果取出的是null,字符新型则使它等于空串,数字型的使它为0
if(ind_empno == -1) al_empno=0;
if(ind_ename == -1) strcpy(ac_ename,"");
if(ind_job == -1) strcpy(ac_job,"");
if(ind_mgr == -1) al_mgr = 0;
if(ind_hiredate == -1) strcpy(ac_hiredate,"");
if(ind_sal == -1) af_sal =0;
if(ind_comm == -1) af_comm = 0;
if(ind_deptno == -1) al_deptno=0;
*/
#ifdef _DEBUG_
userlog("FETCHED ROW:%d\t%s\t%s\t%d\t%s\t%f\t%f\t%d\n",al_empno,ac_ename,ac_job,al_mgr,ac_hiredate,af_sal,af_comm,al_deptno);
#endif
len = sizeof(al_empno);
if(Fchg32( sendbuf, EMPNO, i, (char *)&al_empno, (FLDLEN32)len )<0)
{
EXEC SQL CLOSE cur_emp_select;
tux_return(sendbuf,"Fchg32(EMPNO) 出错",0,(char *)Fstrerror32(Ferror32));
}
len = sizeof(ac_ename);
if(Fchg32( sendbuf, ENAME, i, ac_ename,len )<0)
{
EXEC SQL CLOSE cur_emp_select;
tux_return(sendbuf,"Fchg32(ENAME) 出错",0,(char *)Fstrerror32(Ferror32));
}
len = sizeof(ac_job);
if(Fchg32( sendbuf, JOB, i, ac_job,len )<0)
{
EXEC SQL CLOSE cur_emp_select;
tux_return(sendbuf,"Fchg32(JOB) 出错",0,(char *)Fstrerror32(Ferror32));
}
len = sizeof(al_mgr);
if(Fchg32( sendbuf, MGR, i, (char*)&al_mgr,len )<0)
{
EXEC SQL CLOSE cur_emp_select;
tux_return(sendbuf,"Fchg32(MGR) 出错",0,(char *)Fstrerror32(Ferror32));
}
len = sizeof(ac_hiredate);
if(Fchg32( sendbuf, HIREDATE, i, ac_hiredate,len )<0)
{
EXEC SQL CLOSE cur_emp_select;
tux_return(sendbuf,"Fchg32(HIREDATE) 出错",0,(char *)Fstrerror32(Ferror32));
}
len=sizeof(af_sal);
if(Fchg32( sendbuf, SAL, i, (char *)&af_sal, len )<0)
{
EXEC SQL CLOSE cur_emp_select;
tux_return(sendbuf,"Fchg32(SAL) 出错",0,(char *)Fstrerror32(Ferror32));
}
len = sizeof(af_comm);
if(Fchg32( sendbuf, COMM, i, (char*)&af_comm,len )<0)
{
EXEC SQL CLOSE cur_emp_select;
tux_return(sendbuf,"Fchg32(COMM) 出错",0,(char *)Fstrerror32(Ferror32));
}
len = sizeof(al_deptno);
if(Fchg32( sendbuf, DEPTNO, i, (char *)&al_deptno,len )<0)
{
EXEC SQL CLOSE cur_emp_select;
tux_return(sendbuf,"Fchg32(DEPTNO) 出错",0,(char *)Fstrerror32(Ferror32));
}
i++;
}
EXEC SQL CLOSE cur_emp_select;
if (sqlca.sqlcode != 0)
{
/*CLOSE CURSOR失败*/
tux_return(sendbuf,"CLOSE CURSOR 出错",sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);
}
#ifdef _DEBUG_
Fprint32(sendbuf);
#endif
tpreturn( TPSUCCESS, 0, (char *)sendbuf, 0, 0 );
}
/*EMP_PROC SERVICES*/
EMP_PROC(TPSVCINFO *rqst)
{
FBFR32 *sendbuf=NULL;
FLDLEN32 len=0;
/*分配返回缓冲区并初始化*/
sendbuf = IniSendBuf(20480);
if(sendbuf==NULL)
{
tpreturn( TPFAIL, 0, (char *)sendbuf, 0, 0 );
}
/*调用存储过程*/
userlog("开始调用存储过程up_pb_emp\n");
al_empno=8888;
strcpy(ac_ename,"存储过程");
EXEC SQL EXECUTE
BEGIN
up_db_emp(:al_empno,:ac_ename,:l_return,:l_errno,:c_errtext);
END;
END-EXEC;
if (l_return != 0)
{
tux_return(sendbuf,"调用UP_PB_EMP存储过程出错",l_errno,c_errtext);
}
userlog("调用存储过程up_pb_emp结束\n");
tpreturn( TPSUCCESS, 0, (char *)sendbuf, 0, 0 );
}
/*EMP_UP SERVICES*/
EMP_UP(TPSVCINFO *rqst)
{
FBFR32 *rcvbuf=NULL;
FBFR32 *sendbuf=NULL;
FLDLEN32 len=0;
int i=0;
int iRet=0;
int iOc=0;
int iRows=0;
/*分配返回缓冲区并初始化*/
sendbuf = IniSendBuf(20480);
if(sendbuf==NULL)
{
tpreturn( TPFAIL, 0, (char *)sendbuf, 0, 0 );
}
/*接收客户端来的数据*/
rcvbuf = (FBFR32 *)rqst->data;
#ifdef _DEBUG_
fprintf(stdout,"EMP_UP begin Fprint32......");
Fprint32(rcvbuf);
fprintf(stdout,"EMP_UP end Fprint32......");
#endif
/*客户端传送的行数*/
if(Ffindlast32(rcvbuf, EMPNO, &iRows, &len)== NULL)
{
tux_return(sendbuf,"Ffindlast32(EMPNO) 出错",0,(char *)Fstrerror32(Ferror32));
}
/*begin the transaction*/
if (tpbegin(30, 0) == -1)
{
tux_return(sendbuf,"tpbegin()出错",0,(char *)tpstrerror(tperrno));
}
/*进行数据更新*/
for(i=0;i<iRows;i++)
{
len=sizeof(al_empno);
if(Fget32(rcvbuf,EMPNO,i,(char *)&al_empno,&len) == -1)
{
tux_return(sendbuf,"Fget32(EMPNO) 出错",0,(char *)Fstrerror32(Ferror32));
}
len = sizeof(ac_ename);
ac_ename[0]='\0';
if(Fget32(rcvbuf,ENAME,i,ac_ename,&len)== -1)
{
tux_return(sendbuf,"Fget32(ENAME) 出错",0,(char *)Fstrerror32(Ferror32));
}
len=sizeof(ac_job);
ac_job[0]='\0';
if(Fget32(rcvbuf,JOB,i,ac_job,&len)== -1)
{
tux_return(sendbuf,"Fget32(JOB) 出错",0,(char *)Fstrerror32(Ferror32));
}
len = sizeof(al_mgr);
if(Fget32(rcvbuf,MGR,i,(char*)&al_mgr,&len) == -1)
{
tux_return(sendbuf,"Fget32(MGR) 出错",0,(char *)Fstrerror32(Ferror32));
}
len=sizeof(ac_hiredate);
ac_hiredate[0]='\0';
if(Fget32(rcvbuf,HIREDATE,i,ac_hiredate,&len) == -1)
{
tux_return(sendbuf,"Fget32(HIREDATE) 出错",0,(char *)Fstrerror32(Ferror32));
}
len=sizeof(af_sal);
if(Fget32(rcvbuf,SAL,i,(char *)&af_sal,&len) == -1)
{
tux_return(sendbuf,"Fget32(SAL) 出错",0,(char *)Fstrerror32(Ferror32));
}
len=sizeof(af_comm);
if(Fget32(rcvbuf,COMM,i,(char*)&af_comm,&len) == -1)
{
tux_return(sendbuf,"Fget32(COMM) 出错",0,(char *)Fstrerror32(Ferror32));
}
len=sizeof(al_deptno);
if(Fget32(rcvbuf,DEPTNO,i,(char*)&al_deptno,&len) == -1)
{
tux_return(sendbuf,"Fget32(DEPTNO) 出错",0,(char *)Fstrerror32(Ferror32));
}
#ifdef _DEBUG_
userlog("@@@DATA FROM CLIENT :%d\t%s\t%s\t%d\t%s\t%f\t%f\t%d\n",al_empno,ac_ename,ac_job,al_mgr,ac_hiredate,af_sal,af_comm,al_deptno);
#endif
EXEC SQL delete from emp where empno = :al_empno;
if((sqlca.sqlcode != 0)&&(sqlca.sqlcode != SQLNOTFOUND))
{
/*EXEC SQL ROLLBACK;*/
tpabort(0);
tux_return(sendbuf,"从表EMP中删除记录出错",sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);
}
EXEC SQL insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (:al_empno,:ac_ename,:ac_job,:al_mgr,to_date(:ac_hiredate,'yyyy/mm/dd hh24:mi:ss'),:af_sal,:af_comm,:al_deptno);
if(sqlca.sqlcode!=0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -