?? serverdb.c
字號:
DoCommit(&lda) ; else DoRollback(&lda); } SetStrByte2(rowbuf,rownum); userlog("last packet:%d\n",rownum); sendlen=PacketSelectQR(sendbuf,fdbuf,fdlen,rownum, rowbuf,rowlen,1); /* 分配緩沖區(qū)用于發(fā)送內(nèi)容 */ tpbuf=tpalloc("CARRAY",NULL,sendlen); memcpy(tpbuf,sendbuf,sendlen); userlog("tpsend,rowlen=%d,trownum=%d\n",sendlen,trownum); DebugPrint(tpbuf,100); tpsend(svcinfo->cd,tpbuf,sendlen,TPNOTIME,&revent); /* 可能要增加對tpsend返回結果的處理 */ DebugPrintHeader((PacketQR*)tpbuf); sprintf((char*)szOCIErrMsg,"提取到%d行記錄!",trownum); userlog("%s\n",szOCIErrMsg); tpreturn(TPSUCCESS,0,tpbuf,sendlen,0); return; } /* if(cda.rc!=NULL_VALUE_RETURNED) { oci_error(&cda); goto FailReturn; } */ } ++trownum; /* userlog("Fetch %d/%d row...\n",rownum,trownum); */ if((trownum>nOCIRowLimits)&&(nOCIRowLimits>0)) continue; ++rownum; for(col = 0; col < nOCIFieldNum ; col++) { /* 檢查NULL值 */ if (def[col].indp<0) /* 追加一個空字段 */ { *rowpos='\0'; rowpos+=LEN_BYTE_1; rowlen+=LEN_BYTE_1; } else /* 追加一個字段內(nèi)容 */ { /* switch (desc[col].dbtype) { case FLOAT_TYPE: fdvallen=sprintf(rowpos+LEN_BYTE_1,"%f",def[col].flt_buf); break; case INT_TYPE: fdvallen=sprintf(rowpos+LEN_BYTE_1,"%d",def[col].int_buf); break; default: fdvallen=sprintf(rowpos+LEN_BYTE_1,"%s", def[col].buf); break; } */ fdvallen=sprintf(rowpos+LEN_BYTE_1,"%s",def[col].buf); /* userlog("%d\n",fdvallen); */ *(unsigned char*)rowpos=fdvallen; rowpos+=LEN_BYTE_1+fdvallen; rowlen+=LEN_BYTE_1+fdvallen; } } /* 追加\n */ *rowpos='\n'; rowpos++; rowlen++; if(rowlen+PACKET_MIN_LEN+800>=MAX_SENDBUF_LEN) { SetStrByte2(rowbuf,rownum); userlog("continue packet %d\n",rownum); sendlen=PacketSelectQR(sendbuf,fdbuf,fdlen,rownum, rowbuf,rowlen,0); /* 分配緩沖區(qū)用于發(fā)送內(nèi)容 */ tpbuf=tpalloc("CARRAY",NULL,sendlen); memcpy(tpbuf,sendbuf,sendlen); DebugPrint(tpbuf,100); DebugPrintHeader((PacketQR*)tpbuf); userlog("tpsend,rowlen=%d,trownum=%d\n",sendlen,trownum); tpsend(svcinfo->cd,tpbuf,sendlen,TPNOTIME,&revent); /* 可能要增加對tpsend返回結果的處理 */ /* 重新初始化新的記錄組 */ rownum=0; *rowbuf='\0'; rowpos=rowbuf+LEN_BYTE_2; rowlen=LEN_BYTE_2; ++nOCIPacketNo; } }FailReturn: /* 與數(shù)據(jù)庫斷開連接,嘗試重新連接 */ if(nOCIErrNo==3114) { tmStart=time(NULL); while(time(NULL)<tmStart+10) { retcode=ReConnectSQLServer(); if(retcode==0) goto RestartSQLProcess; if(retcode==-2) break; } } if(nOCITranID==0) { if(nOCIErrNo==0) DoCommit(&lda) ; else DoRollback(&lda); } printf("nOCIErrNo=%d,szOCIErrMsg=%s\n",nOCIErrNo,szOCIErrMsg); sendlen=PacketNonselectQR(sendbuf); /* 分配緩沖區(qū)用于發(fā)送內(nèi)容 */ tpbuf=tpalloc("CARRAY",NULL,sendlen); memcpy(tpbuf,sendbuf,sendlen); userlog("%s\n",szOCIErrMsg); DebugPrint(tpbuf,sendlen); /* tpreturn(TPFAIL,nOCIErrNo,tpbuf,sendlen,0); */ tpreturn(TPSUCCESS,nOCIErrNo,tpbuf,sendlen,0);}/********************************************************************//* 函數(shù): PacketInit *//* 用途: 初始化數(shù)據(jù)包頭結構 *//* 原型: void PacketInit(PacketQR* packet); *//* 參數(shù): packet -- 數(shù)據(jù)包頭 *//* 返回: 無 *//********************************************************************/void PacketInit(PacketQR *packet){ int i; memset(packet,'\0',sizeof(PacketQR)); strcpy(packet->PacketID,"8899"); SetStrByte4(packet->PacketLen,sizeof(PacketQR)); strcpy(packet->UserID,"8899"); SetStrByte4(packet->TranID,nOCITranID); packet->NextFlag='N'; for(i=0;i<i;i++) packet->DataPart[i]='N'; packet->SQLType='X';}/********************************************************************//* 函數(shù): UnpacketSQL *//* 用途: 解包SQL(暫時不做過多檢查) *//* 原型: int UnpacketSQL(char* buf,long len,char* pszSQL); *//* 參數(shù): buf -- 數(shù)據(jù)包緩沖區(qū) *//* len -- 數(shù)據(jù)包長度 *//* pszSQL -- 存放提取出的SQL語句 *//* 返回: 0 = 成功,同時在pszSQL中存放SQL語句 *//* -1 = 失敗,如格式錯誤等 *//********************************************************************/int UnpacketSQL(char* buf,long len,char* pszSQL){ PacketQR* hdr; PartDesc* part; hdr=(PacketQR*)buf;#ifdef _DEBUG DebugPrintHeader(hdr);#endif nOCITranID=GetStrByte4(hdr->TranID); nOCIRowLimits=GetStrByte4(hdr->RowLimits); userlog("nOCIRowLimits=%d\n",nOCIRowLimits); userlog("TranID=%d\n",nOCITranID); /* 檢查頭是否正常(不含SQL語句視為非法) */ if(hdr->DataPart[DATA_SQL]!='Y') return(-1); part=(PartDesc*)(buf+sizeof(PacketQR)+DATA_SQL*sizeof(PartDesc));#ifdef _DEBUG printf("part=(%d,%d)\n",GetStrByte2(part->PartLen),GetStrByte2(part->PartShift));#endif strncpy(pszSQL,buf+GetStrByte2(part->PartShift),GetStrByte2(part->PartLen)); pszSQL[GetStrByte2(part->PartLen)]='\0'; myuserlog("SQLStatement:",pszSQL); return(0);}/* 函數(shù),打包數(shù)據(jù) *//********************************************************************//* 函數(shù): PacketNonselectQR *//* 用途: 打包數(shù)據(jù)(對非SQL Select類型) *//* 原型: int PacketNonselectQR(char* buf); *//* 參數(shù): buf -- 數(shù)據(jù)包緩沖區(qū) *//* 返回: >0 ,數(shù)據(jù)包長度 *//********************************************************************/int PacketNonselectQR(char *buf){ PacketQR* hdr; PartDesc* partRC, *partOD, *partOV; int partRCLen, partODLen, partOVLen; int partRCShift, partODShift, partOVShift; int len1,len2; char szODBuf[2048]; char szOVBuf[2048]; hdr=(PacketQR*)buf; PacketInit(hdr); hdr->NextFlag='N'; /* 無后續(xù)結果 */ hdr->DataPart[DATA_SQL]='N'; /* 無SQL語句 */ hdr->DataPart[DATA_RETCODE]='Y'; /* 有返回碼 */ partRC=(PartDesc*)(buf+sizeof(PacketQR)); partRCLen=LEN_BYTE_4+strlen((char*)szOCIErrMsg); SetStrByte2(partRC->PartLen,partRCLen); if((nOCIOutNum>0)&&(nOCIErrNo==0)) { hdr->DataPart[DATA_OUTDESC]='Y'; /* (暫時)無輸出變量 */ hdr->DataPart[DATA_OUTDATA]='Y'; partODLen=PacketOutDesc(szODBuf); partOVLen=PacketOutValue(szOVBuf); partOD=(PartDesc*)(buf+sizeof(PacketQR)+sizeof(PartDesc)); partOV=(PartDesc*)(buf+sizeof(PacketQR)+2*sizeof(PartDesc)); partRCShift=sizeof(PacketQR)+3*sizeof(PartDesc); partODShift=partRCShift+partRCLen; partOVShift=partODShift+partODLen; SetStrByte2(partRC->PartShift,partRCShift); SetStrByte2(partOD->PartLen,partODLen); SetStrByte2(partOD->PartShift,partODShift); SetStrByte2(partOV->PartLen,partOVLen); SetStrByte2(partOV->PartShift,partOVShift); } else { partRCShift=sizeof(PacketQR)+sizeof(PartDesc); SetStrByte2(partRC->PartShift,partRCShift); hdr->DataPart[DATA_OUTDESC]='N'; /* (暫時)無輸出變量 */ hdr->DataPart[DATA_OUTDATA]='N'; } hdr->DataPart[DATA_FDDESC]='N'; /* 無字段清單 */ hdr->DataPart[DATA_ROWS]='N'; /* 無返回記錄集 */ switch(nOCIFunction) { case(FT_SELECT): hdr->SQLType=ST_SELECT; break; case(FT_UPDATE): hdr->SQLType=ST_UPDATE; break; case(FT_INSERT): hdr->SQLType=ST_INSERT; break; case(FT_DELETE): hdr->SQLType=ST_DELETE; break; default: hdr->SQLType=ST_UNKNOWN; break; } /* 用RowLimits字段返回受影響的記錄數(shù) */ SetStrByte4(hdr->RowLimits,nOCIAffectedRow); /* 填寫返回碼信息(5位返回碼+錯誤信息) */ SetStrByte4(buf+partRCShift,nOCIErrNo); strncpy(buf+partRCShift+LEN_BYTE_4,(char*)szOCIErrMsg,strlen((char*)szOCIErrMsg)); if((nOCIOutNum>0)&&(nOCIErrNo==0)) { memcpy(buf+partODShift,szODBuf,partODLen); memcpy(buf+partOVShift,szOVBuf,partOVLen); return(sizeof(PacketQR)+3*sizeof(PartDesc)+partRCLen+partODLen+partOVLen); } else return(sizeof(PacketQR)+sizeof(PartDesc)+partRCLen);}/********************************************************************//* 函數(shù): PacketSelectQR *//* 用途: 打包數(shù)據(jù)(針對SQL SELECT) *//* 原型: int PacketSelectQR(char* buf,char* fdbuf, long fdlen, *//* int rownum, char* rowbuf,long rowlen,int ok); *//* 參數(shù): buf -- 數(shù)據(jù)包緩沖區(qū) *//* fdbuf -- 字段清單緩沖區(qū) *//* fdlen -- 字段清單緩沖區(qū)長度 *//* rownum -- 記錄行數(shù) *//* rowbuf -- 已打包的記錄的緩沖區(qū) *//* rowlen -- 記錄緩沖區(qū)長度 *//* ok -- 包結束標志(1=結束;0=未結束) *//* 返回: >0 生成的數(shù)據(jù)包長度 *//* 附注: 對于第一個數(shù)據(jù)包要求包含字段清單 *//* 對最后一個數(shù)據(jù)包包含處理碼信息 *//* 包序號在全程變量nOCIPacketNo中 *//********************************************************************/int PacketSelectQR(char *buf,char*fdbuf,long fdlen,int rownum, char*rowbuf,long rowlen,int ok){ PacketQR* hdr; char * pos; int partno=0; int len1,len2; PartDesc* partRetCode; PartDesc* partFDDesc; PartDesc* partRows; hdr=(PacketQR*)buf; PacketInit(hdr); hdr->NextFlag=(ok?'N':'Y'); /* ok=1是最后包;=0非最后包 */ hdr->DataPart[DATA_SQL]='N'; /* 無SQL語句 */ hdr->DataPart[DATA_RETCODE]=(ok?'Y':'N'); /* ok=1最后包有返回碼*/ hdr->DataPart[DATA_OUTDESC]='N'; /* (暫時)無輸出變量 */ hdr->DataPart[DATA_OUTDATA]='N'; hdr->DataPart[DATA_FDDESC]=((nOCIPacketNo==0)?'Y':'N'); /* 在第一個包中返回字段清單 */ hdr->DataPart[DATA_ROWS]=((rownum>0)?'Y':'N'); /* rownum表示記錄行數(shù)*/ hdr->SQLType=ST_SELECT; /* 是SQL Select語句 */ /* 填寫返回碼信息(5位返回碼+錯誤信息) */ /* 有返回碼,填寫描述信息 */ pos=buf+sizeof(PacketQR); if(hdr->DataPart[DATA_RETCODE]=='Y') { partRetCode=(PartDesc*)pos; len1=LEN_BYTE_4+strlen((char*)szOCIErrMsg); SetStrByte2(partRetCode->PartLen,len1); SetStrByte2(partRetCode->PartShift,0); pos+=sizeof(PartDesc); ++partno; } if(hdr->DataPart[DATA_FDDESC]=='Y') { partFDDesc=(PartDesc*)pos; SetStrByte2(partFDDesc->PartLen,fdlen); SetStrByte2(partFDDesc->PartShift,0); pos+=sizeof(PartDesc); ++partno; } if(hdr->DataPart[DATA_ROWS]=='Y') { partRows=(PartDesc*)pos; SetStrByte2(partRows->PartLen,rowlen); SetStrByte2(partRows->PartShift,0); pos+=sizeof(PartDesc); ++partno; } /* 安排實際位置 */ if(hdr->DataPart[DATA_RETCODE]=='Y') { len1=(size_t)(pos-buf); SetStrByte2(partRetCode->PartShift,len1); /* 拷貝數(shù)據(jù) */ SetStrByte4(pos,nOCIErrNo); strncpy(pos+LEN_BYTE_4,(char*)szOCIErrMsg,strlen((char*)szOCIErrMsg)); pos+=GetStrByte2(partRetCode->PartLen); } if(hdr->DataPart[DATA_FDDESC]=='Y') { len1=(size_t)(pos-buf); len2=GetStrByte2(partFDDesc->PartLen); SetStrByte2(partFDDesc->PartShift,len1); /* 拷貝數(shù)據(jù) */ memcpy(pos,fdbuf,len2); pos+=len2; } if(hdr->DataPart[DATA_ROWS]=='Y') { len1=(size_t)(pos-buf); SetStrByte2(partRows->PartShift,len1); /* 拷貝數(shù)據(jù) */ memcpy(pos,rowbuf,rowlen); pos+=rowlen; } return((size_t)(pos-buf));}int PacketOutDesc(char *odbuf){ char *pos=odbuf; int i, len=0; *pos=nOCIOutNum; len+=LEN_BYTE_1; for(i=0;i<nOCIOutNum;i++) { pos=odbuf+len; len+=sprintf(pos,"%s?S?0?0\n",szOutNames[i]); } userlog("%s\n",odbuf); return(len);}int PacketOutValue(char *ovbuf){ char *pos=ovbuf; int i, len=0,flen; for(i=0;i<nOCIOutNum;i++) { if(sbNullFlag[i]<0) *szOutValues[i]='\0'; flen=strlen((char*)szOutValues[i]); *pos=flen; len++;pos++; strncpy(pos,(char*)szOutValues[i],flen); len+=flen;pos+=flen; } *pos='\0'; userlog("%s,%d\n",ovbuf,len); return(len);}/********************************************************************//* 函數(shù): PacketFDDesc *//* 用途: 打包字段清單 *//* 原型: int PacketFDDesc(char* fdbuf); *//* 參數(shù): fdbuf -- 字段緩沖區(qū) *//* 返回: >0 生成的數(shù)據(jù)包長度 *//* 附注: 字段緩沖區(qū)格式: 個數(shù)(int)+字段信息 *//* 字段信息:名稱?類型?寬度?小數(shù)點后位數(shù)+回車 *//********************************************************************/int PacketFDDesc(char *fdbuf){ char *pos=fdbuf; int i, len=0; char c; *pos=nOCIFieldNum; len+=LEN_BYTE_1; for(i=0;i<nOCIFieldNum;i++) { pos=fdbuf+len; len+=sprintf(pos,"%s?%c?%d?%d\n",desc[i].buf,ConvertDBType(desc[i].dbtype),desc[i].dbsize,desc[i].scale); } userlog("%s\n",fdbuf); return(len);}/********************************************************************//* 函數(shù): ConvertDBType *//* 用途: 轉換數(shù)據(jù)類型代碼 *//* 原型: char ConvertDBType(sb2 dbtype); *//* 參數(shù): dbtype -- SQL Server返回的數(shù)據(jù)類型 *//* 返回: 用于發(fā)送的數(shù)據(jù)類型 *//********************************************************************/char ConvertDBType(sb2 dbtype){ switch(dbtype) { case(VARCHAR2_TYPE): /* VARCHAR2,STRING==>DBTYPE_STRING */ case(STRING_TYPE): return(DBTYPE_STRING); case(INT_TYPE): /* INT_TYPE ==>DBTYPE_INT */ return(DBTYPE_INT); case(NUMBER_TYPE): /* NUMBER_TYPE,FLOAT_TYPE==>DBTYPE_FLOAT */ case(FLOAT_TYPE): return(DBTYPE_FLOAT); case(ROWID_TYPE): /* ROWID_TYPE ==>DBTYPE_STRING */ return(DBTYPE_STRING); /* 可能有問題 */ case(DATE_TYPE): /* DATE_TYPE ==>DBTYPE_DATE */ return(DBTYPE_DATE); default:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -