⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pbserver.cpp

📁 tuxede下面的编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -