📄 serverdb.c
字号:
return(DBTYPE_UNKNOWN); }}/********************************************************************//* 函数: LoadEntryRcItem *//* 原型: int LoadEntryRc(char* pszItemID, char* pszItemValue); *//* 参数: pszItemID -- 项目标志号 *//* pszItemValue-- 项目取值 *//* 返回: 0 = 提取成功 *//* -9 = 提取出错 *//********************************************************************/int LoadEntryRcItem(char* pszItemID, char* pszItemValue){ FILE* fileRc; char pszLine[256]; char *p,*q; int nFoundFlag; if((fileRc=fopen(pszRcPath,"rt"))==NULL) return(-9); /* 读取配置 */ *pszItemValue='\0'; nFoundFlag=0; while(fgets(pszLine,255,fileRc)!=NULL) { p=(char*)strchr(pszLine,'='); if(p==NULL) continue; *(p++)='\0'; q=(char*)strchr(p,'\n'); if(q!=NULL) *q='\0'; if(strcmp(pszLine,pszItemID)==0) { strcpy(pszItemValue,p); nFoundFlag=1; break; } } fclose(fileRc); return( (nFoundFlag==1)? 0 : -9);}/******************************************************//* 函数:ConnectSQLServer *//* 用途:注册到数据库服务器 *//* 原型:sword ConnectSQLServer(text* username, *//* text* password, *//* text* servername); *//* 参数:username -- 注册名 *//* password -- 密码 *//* servername--数据库连接名 *//* 返回:0 -- 成功; -1 -- 失败。 *//* 附注: *//******************************************************/sword ConnectSQLServer(text *pszUsername, text* pszPassword, text* pszServerName){ if(olog(&lda, (ub1 *)hda, pszUsername, -1, pszPassword, -1, (text *)pszServerName, -1, (ub4)OCI_LM_DEF)) return -1; else return 0;}/******************************************************//* 函数:describe_define *//* 用途:定义SELECT字段 *//* 原型:sword describe_define(Cda_Def *cda); *//* 参数: *//* 返回:字段数目,-1表示出错 *//******************************************************/sword describe_define(Cda_Def *cda){ sword col, deflen, deftyp; static ub1 *defptr; int i; /* Describe the select-list items. */ for (col = 0; col < MAX_SELECT_LIST_SIZE; col++) { desc[col].buflen = MAX_ITEM_BUFFER_SIZE; if (odescr(cda, col + 1, &desc[col].dbsize, &desc[col].dbtype, &desc[col].buf[0], &desc[col].buflen, &desc[col].dsize, &desc[col].precision, &desc[col].scale, &desc[col].nullok)) { /* Break on end of select list. */ if (cda->rc == VAR_NOT_IN_LIST) break; else { oci_error(cda); return -1; } } /* adjust sizes and types for display */ /* Return string simply */ /* switch (desc[col].dbtype) */ /* { */ /* case NUMBER_TYPE: */ /* desc[col].dbsize = numwidth; */ /* Handle NUMBER with scale as float. */ /* if (desc[col].scale != 0) */ /* { */ /* defptr = (ub1 *) &def[col].flt_buf; */ /* deflen = (sword) sizeof(float); */ /* deftyp = FLOAT_TYPE; */ /* desc[col].dbtype = FLOAT_TYPE; */ /* } */ /* else */ /* { */ /* defptr = (ub1 *) &def[col].int_buf; */ /* deflen = (sword) sizeof(sword); */ /* deftyp = INT_TYPE; */ /* desc[col].dbtype = INT_TYPE; */ /* } */ /* break; */ /* default: */ /* if(desc[col].dbtype == DATE_TYPE) */ /* desc[col].dbsize = 9; */ /* if (desc[col].dbtype == ROWID_TYPE) */ /* desc[col].dbsize = 18; */ /* defptr = def[col].buf; */ /* deflen = desc[col].dbsize > MAX_ITEM_BUFFER_SIZE ? */ /* MAX_ITEM_BUFFER_SIZE : desc[col].dbsize + 1; */ /* deftyp = STRING_TYPE; */ /* break; */ /* } */ switch (desc[col].dbtype) { case NUMBER_TYPE: desc[col].dbsize = numwidth; /* Handle NUMBER with scale as float. */ if (desc[col].scale != 0) { /*defptr = (ub1 *) &def[col].flt_buf;*/ deflen = 40; deftyp = STRING_TYPE; desc[col].dbtype = FLOAT_TYPE; } else { /*defptr = (ub1 *) &def[col].int_buf;*/ deflen = 40; deftyp = STRING_TYPE; desc[col].dbtype = INT_TYPE; } break; default: if(desc[col].dbtype == DATE_TYPE) desc[col].dbsize = 9; if (desc[col].dbtype == ROWID_TYPE) desc[col].dbsize = 18; defptr = def[col].buf; deflen = desc[col].dbsize > MAX_ITEM_BUFFER_SIZE ? MAX_ITEM_BUFFER_SIZE : desc[col].dbsize + 1; deftyp = STRING_TYPE; break; } if(odefin(cda, col + 1, def[col].buf, deflen, STRING_TYPE, /*deftyp,*/ -1, &def[col].indp, (text *) 0, -1, -1, &def[col].col_retlen, &def[col].col_retcode)) { oci_error(cda); return -1; } } /* 去掉字段名称后多余的空白 */ for(i=0;i<col;i++) TrimRight((char*)desc[i].buf); return col;}/******************************************************//* 函数:do_prevbinds *//* 用途:检查外部变量 *//* 原型:sword do_prevbinds(text* stmt_buf); *//* 参数: *//* 返回:参与绑定的变量个数 *//* 附注: *//******************************************************/sword do_prevbinds(text* stmt_buf){ text sqlres[16192]; text tname[MAX_SQL_IDENTIFIER+1]; sword in_literal, n; text *cp, *ph; sword i, found; text *pres,*pval,*pname; myuserlog("Before changing:",(char*)stmt_buf); pres=sqlres; for(nOCIOutNum=0,in_literal=FALSE,cp=stmt_buf;*cp&&nOCIOutNum<MAX_OUT_LIST_SIZE;cp++) { if(*cp=='\'') /* 进入字符串 */ in_literal=~in_literal; pname=tname; if(*cp==':'&&!in_literal) /* 遇到一个外部变量 */ { *(pname++)=*cp; *(pres++)=*cp; for(ph=++cp,n=0;*cp&&(isalnum(*cp)||*cp=='_');cp++,n++) { *(pres++)=*cp; *(pname++)=*cp; } *pname='\0'; /* 保存一个输出变量名称 */ found=0; for(i=0;i<nOCIOutNum;i++) { if(striequal((char*)tname,(char*)szOutNames[i])) { found=1; break; } } if(!found) { strcpy((char*)szOutNames[nOCIOutNum],(char*)tname); strcpy((char*)szOutValues[nOCIOutNum],""); ++nOCIOutNum; i=nOCIOutNum-1; } /* 找到一个变量,看后续有无初始值 */ for(;isspace(*cp)&&*cp;cp++) /* 跳过空白 */ ; if(strncmp((char*)cp,":=",2)==0) /* 找到初始值 */ { cp+=2; /* 提取初始值 */ for(++cp;isspace(*cp)&&*cp;cp++) /* 跳过空白 */ ; /* 提取值,两种可能:字符串和数值 */ pval=&(szOutValues[i][0]); if(*cp=='\'') /* 字符串 */ { for(++cp;(*cp!='\'')&&*cp;cp++) *(pval++)=*cp; ++cp;*pval='\0'; } else if(isdigit(*cp)) { for(;(isdigit(*cp)||(*cp=='.'))&&*cp;cp++) *(pval++)=*cp; *pval='\0'; } else { nOCIErrNo=ERROR_SQL_FORMAT; return(-1); } } else --cp; } else *(pres++)=*cp; } *pres='\0'; if(nOCIOutNum>0) sprintf((char*)stmt_buf,"begin\n %s; end;",sqlres); else strcpy((char*)stmt_buf,(char*)sqlres); myuserlog("After Changing :",(char*)stmt_buf); for(i=0;i<nOCIOutNum;i++) { userlog("Variable %d: %s\n",i,szOutNames[i]); } return nOCIOutNum;}/******************************************************//* 函数:do_postbinds *//* 用途:绑定变量 *//* 原型:sword do_binds(Cda_Def *cda); *//* 参数: *//* 返回:参与绑定的变量个数 *//* 附注: *//******************************************************/sword do_postbinds(Cda_Def *cda){ sword i; for(i=0;i<nOCIOutNum;i++) { if(obndrv(cda,(text*)&(szOutNames[i][0]),-1,(ub1 *)&szOutValues[i][0],-1, VARCHAR2_TYPE,-1,(sb2 *)&sbNullFlag[i],(text *)0,-1,-1)) { oci_error(cda); return -1; } } return 0;}/******************************************************//* 函数:oci_error *//* 用途:报告OCI操作错误 *//* 原型:void oci_error(Cda_Def *cda); *//* 参数: *//* 返回:无 *//******************************************************/void oci_error(Cda_Def *cda){ text msg[512]; sword n; nOCIErrNo=cda->rc; n = oerhms(&lda,cda->rc,msg,(sword)sizeof(msg)); sprintf((char*)szOCIErrMsg,"%s:%.*s", oci_func_tab[cda->fc],n, msg);}int striequal(char* s1, char* s2){ char *p,*q; char c1,c2; for(p=s1,q=s2;*p&&*q;++p,++q) { if(*p!=*q) { c1=*p;c2=*q; if((c1>='a')&&(c1<='z')) c1-='a'-'A'; if((c2>='a')&&(c2<='z')) c2-='a'-'A'; if(c1!=c2) return(0); } } return( (*q==*p)? 1:0);}/*int isspace(char c){ return(((c==' ')||(c=='\t')||(c=='\n'))?1:0);}*/void TrimRight(char* p){ char *q=p; while(*p==' ')p++; while(*p)p++; *p='\0'; while((p>q)&&(*(p-1)==' ')) --p; *(p+1)='\0';}void SetStrByte4(char* pbyte, int n){ int i; for(i=3;i>=0;i--) { pbyte[i]=(unsigned char)(n%256); n=n/256; }}int GetStrByte4(char* pbyte){ int i; int n=0; for(i=0;i<4;i++) n=n*256+(unsigned char)pbyte[i]; return n;}void SetStrByte2(char* pbyte, int n){ pbyte[0]=(unsigned char)(n/256); pbyte[1]=(unsigned char)(n%256);}int GetStrByte2(char* pbyte){ return((unsigned char)pbyte[0]*256+(unsigned char)pbyte[1]);}void DebugPrint(char * buf, long len){ char tmp[8192]; char *p; size_t tlen=0,slen; int i,j; return; tlen+=sprintf(tmp+tlen,"\n--------------Send buffer ----------------\n\n"); for(i=0;i<len;i++) tlen+=sprintf(tmp+tlen,"[%0.2X]",(unsigned char)*(buf+i)); tlen+=sprintf(tmp+tlen,"\n------------------------------------------\n"); for(i=0;i<len;i++) tlen+=sprintf(tmp+tlen,"[%c]",(unsigned char)*(buf+i)); tlen+=sprintf(tmp+tlen,"\n------------------------------------------\n"); userlog(tmp);}void DebugPrintHeader(PacketQR* hdr){ return; userlog("Packet Header ==>\nPacketID=%4c\nPacketLen=%d\nUserID=%4c\n" "TranID=%d\nNextFlag=%c\nRowLimits=%d\nSQLType=%c\nDataPart=%6c\n", hdr->PacketID,GetStrByte4(hdr->PacketLen), hdr->UserID,GetStrByte4(hdr->TranID), hdr->NextFlag,GetStrByte4(hdr->RowLimits), hdr->SQLType,hdr->DataPart);} void myuserlog(char *hdr, char *str){ char buf[81]; char *p=str; int len; userlog("%s\n",hdr); while(strlen(p)>80) { strncpy(buf,p,80); buf[80]='\0'; userlog("%s\n",buf); p+=80; } userlog("%s\n",p);} void DoCommit(Lda_Def *lda){ if(tpgetlev()==0) { ocom(lda); }}void DoRollback(Lda_Def *lda){ if(tpgetlev()==0) { orol(lda); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -