📄 database_op.c
字号:
dbproc->rownum = dbproc->rowindex + 1 ;
for (i = 0; i < select_dp->F; i++)
{
/*char title[MAX_VNAME_LEN]; */
/* Turn off high-order bit of datatype (in this example, it does not matter if the column is NOT NULL). */
sqlnul ((unsigned short *)&(select_dp->T[i]), (unsigned short *)&(select_dp->T[i]), &null_ok);
/*
VARCHAR2 1 char[n]
NUMBER 2 char[n] ( n <= 22)
INTEGER 3 int
FLOAT 4 float
STRING 5 char[n+1]
VARNUM 6 char[n] (n <= 22)
DECIMAL 7 float
LONG 8 char[n]
VARCHAR 9 char[n+2]
ROWID 11 char[n]
DATE 12 char[n]
VARRAW 15 char[n]
RAW 23 unsigned char[n]
LONG RAW 24 unsigned char[n]
UNSIGNED 68 unsigned int
DISPLAY 91 char[n]
LONG VARCHAR 94 char[n+4]
LONG VARRAW 95 unsigned char[n+4]
CHAR 96 char[n]
CHARF 96 char[n]
CHARZ 97 char[n+1]
*/
switch (select_dp->T[i])
{
case 1 : /* CHAR datatype: no change in length needed, except possibly for TO_CHAR conversions (not handled here). */
break;
case 2 : /* NUMBER datatype: use sqlprc() to extract precision and scale. */
sqlprc ((unsigned long *)&(select_dp->L[i]), &precision, &scale);
/* Allow for maximum size of NUMBER. */
if (precision == 0) precision = 40;
/* Also allow for decimal point and possible sign. */
/* convert NUMBER datatype to FLOAT if scale > 0,INT otherwise. */
if (scale > 0) select_dp->L[i] = sizeof(float);
else select_dp->L[i] = sizeof(int);
break;
case 8 : /* LONG datatype */
select_dp->L[i] = 240;
break;
case 11 : /* ROWID datatype */
case 104 : /* Universal ROWID datatype */
select_dp->L[i] = 18;
break;
case 12 : /* DATE datatype */
select_dp->L[i] = 9;
break;
case 23 : /* RAW datatype */
break;
case 24 : /* LONG RAW datatype */
select_dp->L[i] = 240;
break;
}
/* Allocate space for the select-list data values.sqlald() reserves a pointer location for V[i] but does not allocate the full space for the pointer. */
if (select_dp->T[i] != 2)
{
select_dp->V[i] = (char *) realloc(select_dp->V[i],
select_dp->L[i] + 1);
}
else
select_dp->V[i] = (char *) realloc(select_dp->V[i],
select_dp->L[i]);
/* Print column headings, right-justifying number column headings. */
/* Copy to temporary buffer in case name is null-terminated */
/* strncpy(title, select_dp->S[i], select_dp->C[i]);
if (select_dp->T[i] == 2)
if (scale > 0)
printf ("%.*s ", select_dp->L[i]+3, title);
else
printf ("%.*s ", select_dp->L[i], title);
else
printf("%-.*s ", select_dp->L[i], title);
*/
/* Coerce ALL datatypes except for LONG RAW and NUMBER to character. */
if (select_dp->T[i] != 24 && select_dp->T[i] != 2) select_dp->T[i] = 1;
/* Coerce the datatypes of NUMBERs to float or int depending on the scale. */
if (select_dp->T[i] == 2)
{
if (scale > 0)
select_dp->T[i] = 4; /* float */
else
select_dp->T[i] = 3; /* int */
}
}
}
return SUCCEED ;
}
/*
该函数判断数据库返回结果,操作DBPROC_STR的特定字段
SUCCEED NO_MORE_RESULTS
*/
RETCODE dbresults (DBPROC_STR *dbproc)
{
if( NULL == dbproc ) return NO_MORE_RESULTS;
if( dbproc->sqlerror < 0 ) return NO_MORE_RESULTS ;
if( dbproc->rowindex != dbproc->rownum ) return SUCCEED ;
return NO_MORE_RESULTS ;
}
/*
绑定值,绑定存储值的位子
*/
RETCODE dbbind (DBPROC_STR *dbproc,int colnum,int vartype,DBINT varlen,BYTE *destvar)
{
if( colnum <= 0 ) return FAIL ;
if( colnum > dbproc->colnum ) return FAIL ;
if( colnum >= MAXPOINTNUM ) return FAIL ;
/*
当前仅支持此类型
*/
if( NTBSTRINGBIND != vartype )
{
printf("\n!!!!!!!!!!!!!UNKNOWN TYPE %d !!!!!!!!\n\n",vartype);
exit(0);/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
}
dbproc->ppbuff[colnum - 1 ] = destvar ;
dbproc->pbufftype[colnum - 1 ] = vartype ;
return FAIL ;
}
/*
获得本次执行返回多少列
*/
int dbnumcols (DBPROC_STR *dbproc)
{
return dbproc->colnum ;
}
/*
将下一条值赋值到绑定的变量上
*/
STATUS dbnextrow (DBPROC_STR *dbprocess)
{
int i ;
if( NULL == dbprocess ) return NO_MORE_ROWS ;
/* FETCH each row selected and print the column values. */
/* EXEC SQL CONTEXT USE :dbprocess->ctx; */
/* EXEC SQL WHENEVER NOT FOUND GOTO end_select_loop; */
/* EXEC SQL CONTEXT USE :dbprocess->ctx; */
/* EXEC SQL AT :dbprocess->connName FETCH CCC USING DESCRIPTOR select_dp; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 12;
sqlstm.arrsiz = 5;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )330;
sqlstm.selerr = (unsigned short)1;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqfoff = ( int )0;
sqlstm.sqfmod = (unsigned int )2;
sqlstm.sqhstv[0] = ( void *)select_dp;
sqlstm.sqhstl[0] = (unsigned int )0;
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.sqhstv[1] = ( void *)(dbprocess->connName);
sqlstm.sqhstl[1] = (unsigned int )20;
sqlstm.sqhsts[1] = ( int )0;
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.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(&(dbprocess->ctx), &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode == 1403) goto end_select_loop;
}
/* Since each variable returned has been coerced to a character string, int, or float very little processing is required here. This routine just prints out the values on the terminal. */
for (i = 0; i < select_dp->F; i++)
{
if( NULL == dbprocess->ppbuff[i] ) continue ;
if (*select_dp->I[i] < 0)
{
switch(dbprocess->pbufftype[i])
{
case NTBSTRINGBIND :
/*
if (select_dp->T[i] == 4)
sprintf ("%-*c ",(int)select_dp->L[i]+3, ' ');
else
printf ("%-*c ",(int)select_dp->L[i], ' ');
*/
strcpy(dbprocess->ppbuff[i],"");
break;
case CHARBIND:
*((char*)dbprocess->ppbuff[i]) = 0 ;
break ;
case INTBIND:
*((int*)dbprocess->ppbuff[i]) = 0 ;
break ;
default:
/*
* ERROR ! not support type!
*/
dbprocess->sqlerror = -50001;
return NO_MORE_ROWS ;
}
}
else
{
switch(dbprocess->pbufftype[i])
{
case NTBSTRINGBIND :
if (select_dp->T[i] == 3) /* int datatype */
sprintf (dbprocess->ppbuff[i],"%*d", (int)select_dp->L[i], *(int *)select_dp->V[i]);
else if (select_dp->T[i] == 4) /* float datatype */
sprintf (dbprocess->ppbuff[i],"%*.2f", (int)select_dp->L[i], *(float *)select_dp->V[i]);
else /* character string */
sprintf (dbprocess->ppbuff[i],"%-*.*s", (int)select_dp->L[i],(int)select_dp->L[i], select_dp->V[i]);
break;
case CHARBIND:
*((char*)dbprocess->ppbuff[i]) = *(char*) select_dp->V[i] ;
break ;
case INTBIND:
*((int*)dbprocess->ppbuff[i]) = *(int*) select_dp->V[i] ;
break ;
default:
/*
* ERROR ! not support type!
*/
dbprocess->sqlerror = -50001;
return NO_MORE_ROWS ;
}
}
}
return SUCCEED ;
end_select_loop :
dbprocess->rownum = dbprocess->rowindex ;
return NO_MORE_ROWS ;
}
/*
判断该连接是否正常
*/
DBBOOL dbdead (DBPROC_STR *a)
{
char chbuff[8];
chbuff[0]='\0';
/* EXEC SQL WHENEVER NOT FOUND GOTO end_select_loop; */
/* EXEC SQL CONTEXT USE :a->ctx; */
/* EXEC SQL AT :a->connName SELECT 'A' INTO :chbuff FROM DUAL ; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 12;
sqlstm.arrsiz = 5;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.stmt = "select 'A' into :b1 from DUAL ";
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )353;
sqlstm.selerr = (unsigned short)1;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)chbuff;
sqlstm.sqhstl[0] = (unsigned int )8;
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.sqhstv[1] = ( void *)(a->connName);
sqlstm.sqhstl[1] = (unsigned int )20;
sqlstm.sqhsts[1] = ( int )0;
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.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(&(a->ctx), &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode == 1403) goto end_select_loop;
}
if ('A' != chbuff[0])
{
return FAIL ;
}
return SUCCEED ;
end_select_loop:
return FAIL ;
}
/*
该函数释放dbopen产生的内存,同时断开数据库连接
需要进一步的考虑!
*/
void dbexit (void)
{
int i,iLen ,iIndex ;
/* EXEC SQL WHENEVER SQLERROR CONTINUE; */
iLen = sizeof(AllOpenProcess)/sizeof(DBPROC_STR * );
for ( iIndex = 0 ; iIndex < iLen ; iIndex ++ )
{
if( NULL != AllOpenProcess[iIndex] )
{
/*
* 此处开始断开数据库连接!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*/
/* EXEC SQL CONTEXT USE : AllOpenProcess[iIndex]->ctx; */
/* EXEC SQL WHENEVER NOT FOUND GOTO end_select_loop; */
/* Close the cursor. */
/* EXEC SQL AT :AllOpenProcess[iIndex]->connName CLOSE CCC; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 12;
sqlstm.arrsiz = 5;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )376;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)(AllOpenProcess[iIndex]->connName);
sqlstm.sqhstl[0] = (unsigned int )20;
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(&(AllOpenProcess[iIndex]->ctx), &sqlctx, &sqlstm, &sqlfpn);
}
/* EXEC SQL AT :AllOpenProcess[iIndex]->connName COMMIT WORK RELEASE; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 12;
sqlstm.arrsiz = 5;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )395;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)(AllOpenProcess[iIndex]->connName);
sqlstm.sqhstl[0] = (unsigned int )20;
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(&(AllOpenProcess[iIndex]->ctx), &sqlctx, &sqlstm, &sqlfpn);
}
free(AllOpenProcess[iIndex]);
AllOpenProcess[iIndex] = NULL ;
}
}
if( select_dp )
{
for (i = 0; i < MAXPOINTNUM; i++)
{
if (select_dp->V[i] != (char *) 0)
free(select_dp->V[i]);
free(select_dp->I[i]); /* MAXPOINTNUM were allocated. */
}
/* Free space used by the descriptors themselves. */
sqlclu(select_dp);
select_dp = NULL ;
}
return;
}
#endif
#ifdef MSSQL_PLATFORM
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -