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

📄 database_op.c

📁 当前不少单位在进行系统改造升级时
💻 C
📖 第 1 页 / 共 4 页
字号:
#ifdef F
# undef F
#endif

#ifdef S
# undef S
#endif
#ifdef L
# undef L
#endif
 
struct SQLDA {
  /* ub4    */ int        N; /* Descriptor size in number of entries        */
  /* text** */ char     **V; /* Ptr to Arr of addresses of main variables   */
  /* ub4*   */ int       *L; /* Ptr to Arr of lengths of buffers            */
  /* sb2*   */ short     *T; /* Ptr to Arr of types of buffers              */
  /* sb2**  */ short    **I; /* Ptr to Arr of addresses of indicator vars   */
  /* sb4    */ int        F; /* Number of variables found by DESCRIBE       */
  /* text** */ char     **S; /* Ptr to Arr of variable name pointers        */
  /* ub2*   */ short     *M; /* Ptr to Arr of max lengths of var. names     */
  /* ub2*   */ short     *C; /* Ptr to Arr of current lengths of var. names */
  /* text** */ char     **X; /* Ptr to Arr of ind. var. name pointers       */
  /* ub2*   */ short     *Y; /* Ptr to Arr of max lengths of ind. var. names */
  /* ub2*   */ short     *Z; /* Ptr to Arr of cur lengths of ind. var. names */
  };
 
typedef struct SQLDA SQLDA;
 
#endif

/* ----------------- */
/* defines for sqlda */
/* ----------------- */

#define SQLSQLDAAlloc(arg1, arg2, arg3, arg4) sqlaldt(arg1, arg2, arg3, arg4) 

#define SQLSQLDAFree(arg1, arg2) sqlclut(arg1, arg2) 





/* EXEC SQL WHENEVER NOT FOUND CONTINUE ; */ 

/* EXEC SQL WHENEVER SQLWARNING CONTINUE ; */ 

/* EXEC SQL WHENEVER SQLERROR CONTINUE ; */ 


char    dyn_statement[1024];

SQLDA *select_dp = NULL;


#define  MAXCOLNUM 126
#define  MAXCOLVALUE 1024

char chValueBuff[MAXCOLNUM][MAXCOLVALUE]={0};



/* Maximum lengths of the _names_ of the
select-list items or indicator variables. */
#define MAX_VNAME_LEN     80
#define MAX_INAME_LEN     80

typedef struct Securepair
{
	struct Securepair	*next;
	char		*labelname;
	char		*labelvalue;
} SECLABELS;


typedef struct loginrec
{
	char	chLogName[256];
	char	chLogPass[256];
} LOGINREC_STR;


enum SQLTYPE_ENUM{SQL_NULL=0,SQL_SELECT,SQL_INSERT,SQL_UPDATE,SQL_DELETE};

struct dbprocess {
	sql_context ctx;
	char connName[20];
	
	enum SQLTYPE_ENUM sqltype ;/*当前sql语句类型,包括查询select  insert update delete,通过在sqldata中查找上述字符串获得*/
	long	rowindex ;	/*执行本次sql后,被取出的行的数目/下次需要取出的索引*/
	long	rownum ;	/*本次sql得到的行数目*/
	long	colnum ;	/*当前列数目*/
	long	sqlerror ;/*SQL语句错误号*/
	void *	ppbuff[MAXPOINTNUM] ;	/*当前绑定了字段的内存地址*/
	long	pbufftype[MAXPOINTNUM] ;
	char	sqldata[SQLDATALEN] ; /*当前sql语句值,在执行后更改上面的rowindex,rownum,colnum*/
};
typedef struct dbprocess    DBPROC_STR;


DBPROC_STR * AllOpenProcess[20]={0};
EHANDLEFUNC ehandfunc = 0 ;
MHANDLEFUNC mhandfunc = 0 ;








RETCODE dbinit		(void)
{
	int i ;
	

	if( select_dp ) return SUCCEED ;

    if ((select_dp =sqlald (MAXPOINTNUM, MAX_VNAME_LEN, MAX_INAME_LEN)) == (SQLDA *) 0)
    {
        fprintf(stderr,"Cannot allocate memory for select descriptor.");
        return FAIL;
    }
	
    select_dp->N = MAXPOINTNUM;
	
    /* Allocate the pointers to the indicator variables, and the
	actual data. */
    for (i = 0; i < MAXPOINTNUM; i++) {
        select_dp->I[i] = (short *) malloc(sizeof(short));
        select_dp->V[i] = (char *) malloc(1);
    }
	
	return SUCCEED;
}


void errhandlefunc()
{
	if( ehandfunc )
		(*ehandfunc)(0,0,0,0,"","") ;
}
void mhandlefunc()
{
	if( mhandfunc )
		(*mhandfunc)(0,0,0,0,"","","",0) ;
}

EHANDLEFUNC dberrhandle  (EHANDLEFUNC handler)
{
	ehandfunc  =  handler ;
/*	EXEC SQL WHENEVER SQLERROR DO errhandlefunc() ;*/
	return 0 ;
}

MHANDLEFUNC dbmsghandle  (MHANDLEFUNC handler)
{
	mhandfunc = handler ;
/*	EXEC SQL WHENEVER SQLWARNING DO mhandlefunc() ;*/
	return 0 ;
}

void *	dblogin (void)
{
	LOGINREC_STR * rec ;
	rec = (LOGINREC_STR*)malloc(sizeof(LOGINREC_STR)) ;
	if( NULL == rec ) return rec ;
	memset(rec,0,sizeof(LOGINREC_STR));
	return rec;
}



RETCODE dbsetlname  (LOGINREC_STR *lptr,char *values,int type)
{
	if( NULL == lptr || NULL == values ) return FAIL ;
	if( (DBSETUSER != type) &&(DBSETPWD != type) ) return FAIL ;

	if( DBSETUSER == type )
	{
		if( strlen(values) >= sizeof(lptr->chLogName) ) return FAIL ;
		strcpy( lptr->chLogName,values) ;
	}
	
	if( DBSETPWD == type )
	{
		if( strlen(values) >= sizeof(lptr->chLogPass) ) return FAIL ;
		strcpy( lptr->chLogPass,values) ;
	}
	return SUCCEED ;
}







/*
该函数内进行数据库连接尝试
*/
DBPROCESS *dbopen	(LOGINREC_STR *logon_ptr,char *servername)
{
	int iLen ,iIndex ;
	DBPROC_STR * dbprocess ;

   /* EXEC SQL BEGIN DECLARE SECTION; */ 

	/* VARCHAR  username[256]; */ 
struct { unsigned short len; unsigned char arr[256]; } username;

	/* VARCHAR  password[256]; */ 
struct { unsigned short len; unsigned char arr[256]; } password;

	/* VARCHAR	 dbstring[256]; */ 
struct { unsigned short len; unsigned char arr[256]; } dbstring;

    /* EXEC SQL END DECLARE SECTION; */ 

	
	if( NULL == logon_ptr ) return NULL ;

	dbprocess = (DBPROC_STR*)malloc(sizeof(DBPROC_STR));
	if( NULL == dbprocess ) return NULL ;

	memset(dbprocess,0,sizeof(DBPROC_STR));

	iLen = sizeof(AllOpenProcess)/sizeof(DBPROC_STR * );
	
	for ( iIndex = 0 ; iIndex < iLen ; iIndex ++ )
	{
		if( NULL == AllOpenProcess[iIndex] ) 
		{
			AllOpenProcess[iIndex] = dbprocess ;
			sprintf(dbprocess->connName,"conn%d",iIndex);
			break ;
		}
	}
	
	if( iIndex == iLen ) 
	{
		free(dbprocess) ;
		dbprocess  = NULL ;
	}

/*
此处进行连接尝试!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!	
 */
	strncpy((char *) username.arr, logon_ptr->chLogName, sizeof(username.arr));
	username.len = strlen((char *) username.arr);
	strncpy((char *) password.arr, logon_ptr->chLogPass, sizeof(password.arr));
	password.len = strlen((char *) password.arr);

    /* EXEC SQL CONTEXT ALLOCATE :dbprocess->ctx; */ 

{
    struct sqlexd sqlstm;
    sqlstm.sqlvsn = 12;
    sqlstm.arrsiz = 1;
    sqlstm.sqladtp = &sqladt;
    sqlstm.sqltdsp = &sqltds;
    sqlstm.stmt = "";
    sqlstm.iters = (unsigned int  )1;
    sqlstm.offset = (unsigned int  )5;
    sqlstm.cud = sqlcud0;
    sqlstm.sqlest = (unsigned char  *)&sqlca;
    sqlstm.sqlety = (unsigned short)256;
    sqlstm.occurs = (unsigned int  )0;
    sqlstm.sqhstv[0] = (         void  *)&(dbprocess->ctx);
    sqlstm.sqhstl[0] = (unsigned int  )sizeof(void *);
    sqlstm.sqhsts[0] = (         int  )0;
    sqlstm.sqindv[0] = (         void  *)0;
    sqlstm.sqinds[0] = (         int  )0;
    sqlstm.sqharm[0] = (unsigned int  )0;
    sqlstm.sqadto[0] = (unsigned short )0;
    sqlstm.sqtdso[0] = (unsigned short )0;
    sqlstm.sqphsv = sqlstm.sqhstv;
    sqlstm.sqphsl = sqlstm.sqhstl;
    sqlstm.sqphss = sqlstm.sqhsts;
    sqlstm.sqpind = sqlstm.sqindv;
    sqlstm.sqpins = sqlstm.sqinds;
    sqlstm.sqparm = sqlstm.sqharm;
    sqlstm.sqparc = sqlstm.sqharc;
    sqlstm.sqpadto = sqlstm.sqadto;
    sqlstm.sqptdso = sqlstm.sqtdso;
    sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}


    /* EXEC SQL CONTEXT USE :dbprocess->ctx; */ 


	if( NULL == servername )
	{
		/* EXEC SQL CONNECT :username IDENTIFIED BY :password AT:dbprocess->connName ; */ 

{
  struct sqlexd sqlstm;
  sqlstm.sqlvsn = 12;
  sqlstm.arrsiz = 5;
  sqlstm.sqladtp = &sqladt;
  sqlstm.sqltdsp = &sqltds;
  sqlstm.iters = (unsigned int  )10;
  sqlstm.offset = (unsigned int  )24;
  sqlstm.cud = sqlcud0;
  sqlstm.sqlest = (unsigned char  *)&sqlca;
  sqlstm.sqlety = (unsigned short)256;
  sqlstm.occurs = (unsigned int  )0;
  sqlstm.sqhstv[0] = (         void  *)&username;
  sqlstm.sqhstl[0] = (unsigned int  )258;
  sqlstm.sqhsts[0] = (         int  )258;
  sqlstm.sqindv[0] = (         void  *)0;
  sqlstm.sqinds[0] = (         int  )0;
  sqlstm.sqharm[0] = (unsigned int  )0;
  sqlstm.sqadto[0] = (unsigned short )0;
  sqlstm.sqtdso[0] = (unsigned short )0;
  sqlstm.sqhstv[1] = (         void  *)&password;
  sqlstm.sqhstl[1] = (unsigned int  )258;
  sqlstm.sqhsts[1] = (         int  )258;
  sqlstm.sqindv[1] = (         void  *)0;
  sqlstm.sqinds[1] = (         int  )0;
  sqlstm.sqharm[1] = (unsigned int  )0;
  sqlstm.sqadto[1] = (unsigned short )0;
  sqlstm.sqtdso[1] = (unsigned short )0;
  sqlstm.sqhstv[4] = (         void  *)(dbprocess->connName);
  sqlstm.sqhstl[4] = (unsigned int  )20;
  sqlstm.sqhsts[4] = (         int  )20;
  sqlstm.sqindv[4] = (         void  *)0;
  sqlstm.sqinds[4] = (         int  )0;
  sqlstm.sqharm[4] = (unsigned int  )0;
  sqlstm.sqadto[4] = (unsigned short )0;
  sqlstm.sqtdso[4] = (unsigned short )0;
  sqlstm.sqphsv = sqlstm.sqhstv;
  sqlstm.sqphsl = sqlstm.sqhstl;
  sqlstm.sqphss = sqlstm.sqhsts;
  sqlstm.sqpind = sqlstm.sqindv;
  sqlstm.sqpins = sqlstm.sqinds;
  sqlstm.sqparm = sqlstm.sqharm;
  sqlstm.sqparc = sqlstm.sqharc;
  sqlstm.sqpadto = sqlstm.sqadto;
  sqlstm.sqptdso = sqlstm.sqtdso;
  sqlstm.sqlcmax = (unsigned int )100;
  sqlstm.sqlcmin = (unsigned int )2;
  sqlstm.sqlcincr = (unsigned int )1;
  sqlstm.sqlctimeout = (unsigned int )0;
  sqlstm.sqlcnowait = (unsigned int )0;
  sqlcxt(&(dbprocess->ctx), &sqlctx, &sqlstm, &sqlfpn);
}


	}
	else
	{
		strncpy((char*)dbstring.arr,servername,sizeof(dbstring.arr) ) ;
		dbstring.len = strlen((char*)dbstring.arr);
		/* EXEC SQL CONNECT :username IDENTIFIED BY :password  AT:dbprocess->connName USING :dbstring ; */ 

{
  struct sqlexd sqlstm;
  sqlstm.sqlvsn = 12;
  sqlstm.arrsiz = 5;
  sqlstm.sqladtp = &sqladt;
  sqlstm.sqltdsp = &sqltds;
  sqlstm.iters = (unsigned int  )10;
  sqlstm.offset = (unsigned int  )59;
  sqlstm.cud = sqlcud0;
  sqlstm.sqlest = (unsigned char  *)&sqlca;
  sqlstm.sqlety = (unsigned short)256;
  sqlstm.occurs = (unsigned int  )0;
  sqlstm.sqhstv[0] = (         void  *)&username;
  sqlstm.sqhstl[0] = (unsigned int  )258;
  sqlstm.sqhsts[0] = (         int  )258;
  sqlstm.sqindv[0] = (         void  *)0;
  sqlstm.sqinds[0] = (         int  )0;
  sqlstm.sqharm[0] = (unsigned int  )0;
  sqlstm.sqadto[0] = (unsigned short )0;
  sqlstm.sqtdso[0] = (unsigned short )0;
  sqlstm.sqhstv[1] = (         void  *)&password;
  sqlstm.sqhstl[1] = (unsigned int  )258;
  sqlstm.sqhsts[1] = (         int  )258;
  sqlstm.sqindv[1] = (         void  *)0;
  sqlstm.sqinds[1] = (         int  )0;
  sqlstm.sqharm[1] = (unsigned int  )0;
  sqlstm.sqadto[1] = (unsigned short )0;
  sqlstm.sqtdso[1] = (unsigned short )0;
  sqlstm.sqhstv[2] = (         void  *)&dbstring;
  sqlstm.sqhstl[2] = (unsigned int  )258;
  sqlstm.sqhsts[2] = (         int  )258;
  sqlstm.sqindv[2] = (         void  *)0;
  sqlstm.sqinds[2] = (         int  )0;
  sqlstm.sqharm[2] = (unsigned int  )0;
  sqlstm.sqadto[2] = (unsigned short )0;
  sqlstm.sqtdso[2] = (unsigned short )0;
  sqlstm.sqhstv[4] = (         void  *)(dbprocess->connName);
  sqlstm.sqhstl[4] = (unsigned int  )20;
  sqlstm.sqhsts[4] = (         int  )20;
  sqlstm.sqindv[4] = (         void  *)0;
  sqlstm.sqinds[4] = (         int  )0;
  sqlstm.sqharm[4] = (unsigned int  )0;
  sqlstm.sqadto[4] = (unsigned short )0;
  sqlstm.sqtdso[4] = (unsigned short )0;
  sqlstm.sqphsv = sqlstm.sqhstv;
  sqlstm.sqphsl = sqlstm.sqhstl;
  sqlstm.sqphss = sqlstm.sqhsts;
  sqlstm.sqpind = sqlstm.sqindv;
  sqlstm.sqpins = sqlstm.sqinds;
  sqlstm.sqparm = sqlstm.sqharm;
  sqlstm.sqparc = sqlstm.sqharc;
  sqlstm.sqpadto = sqlstm.sqadto;
  sqlstm.sqptdso = sqlstm.sqtdso;
  sqlstm.sqlcmax = (unsigned int )100;
  sqlstm.sqlcmin = (unsigned int )2;
  sqlstm.sqlcincr = (unsigned int )1;
  sqlstm.sqlctimeout = (unsigned int )0;
  sqlstm.sqlcnowait = (unsigned int )0;
  sqlcxt(&(dbprocess->ctx), &sqlctx, &sqlstm, &sqlfpn);
}


	}
	
	if (sqlca.sqlcode < 0 ) 
	{
		printf("\n%d %s\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
		printf("CONNECT ERROR!");		
		return FAIL ;
	}

	return (DBPROCESS*)dbprocess ;
}

void	dbloginfree (LOGINREC_STR *loginptr)
{
	if( NULL != loginptr ) 
	{
		memset( loginptr,0,sizeof(LOGINREC_STR));
		free(loginptr) ;
	}
}


/*
该函数仅仅拷贝命令,做简单的命令检查
 */
RETCODE dbcmd		(DBPROC_STR *dbproc,const char *cmdstring)
{
	long l_len ;
	char * pSelect , *pInsert , *pUpdate,*pDelete ,*pMin;

	if( NULL == dbproc || NULL == cmdstring ) return FAIL ;
	/*
	仅仅拷贝命令,做简单的命令检查!!!!!!!!!!!!!!!!!!!!!
	*/

	l_len = strlen(cmdstring) ;
	if(	l_len >= sizeof(dbproc->sqldata) )  return FAIL ;
	memcpy( dbproc->sqldata, cmdstring , l_len + 1) ;
	strupr(dbproc->sqldata);

	dbproc->colnum  =0 ;
	dbproc->rowindex = 0 ;
	dbproc->rownum = 0 ;
	memset(dbproc->ppbuff,0,sizeof(dbproc->ppbuff));
	memset(dbproc->pbufftype,0,sizeof(dbproc->pbufftype));
	
/*分析命令类型*/	
	pSelect = strstr(dbproc->sqldata,"SELECT");
	pInsert = strstr(dbproc->sqldata,"INSERT");
	pUpdate = strstr(dbproc->sqldata,"UPDATE");
	pDelete = strstr(dbproc->sqldata,"DELETE");
	
	pMin = dbproc->sqldata + strlen(dbproc->sqldata) ;
	dbproc->sqltype = SQL_NULL ;
	if( (pSelect) && (pSelect < pMin) ) { pMin = pSelect ;dbproc->sqltype = SQL_SELECT ; }
	if( (pInsert) && (pInsert < pMin) ) { pMin = pInsert ;dbproc->sqltype = SQL_INSERT ; }
	if( (pUpdate) && (pUpdate < pMin) ) { pMin = pUpdate ;dbproc->sqltype = SQL_UPDATE ; }
	if( (pDelete) && (pDelete < pMin) ) { pMin = pDelete ;dbproc->sqltype = SQL_DELETE ; }

	if( SQL_NULL == dbproc->sqltype ) 
	{
		dbproc->sqlerror = -1 ;
		return FAIL ;
	}

	return SUCCEED ;
}


/*
该函数	执行命令
 */
RETCODE dbsqlexec	(DBPROC_STR *dbproc)
{
	int i,null_ok, precision, scale;
	/* EXEC SQL BEGIN DECLARE SECTION; */ 

	/* VARCHAR  chSqlStr[SQLDATALEN]; */ 
struct { unsigned short len; unsigned char arr[4096]; } chSqlStr;

    /* EXEC SQL END DECLARE SECTION; */ 


	if( NULL == dbproc ) return FAIL ;
	
	if( SQL_NULL == dbproc->sqltype ) return FAIL ;
	
	dbproc->colnum = 0 ;
	dbproc->rowindex = 0 ;
	dbproc->rownum = 0 ;
	dbproc->sqlerror = 0 ;
	memset( dbproc->ppbuff,0,sizeof(dbproc->ppbuff) );
	memset(dbproc->pbufftype,0,sizeof(dbproc->pbufftype));

	strcpy(chSqlStr.arr,dbproc->sqldata);
	chSqlStr.len = strlen(chSqlStr.arr);
	
	if( SQL_INSERT == dbproc->sqltype ||
		SQL_UPDATE == dbproc->sqltype ||
		SQL_DELETE == dbproc->sqltype 
		)
	{
		/* EXEC SQL CONTEXT USE :dbproc->ctx; */ 

		/* EXEC SQL AT :dbproc->connName execute immediate :chSqlStr ; */ 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -