📄 tociquery.cpp
字号:
{ ub1 innerBuf[MAX_LOB_BUFFER_LENGTH]; ub4 remainder, nActual, nTry; ub4 flushedAmount = 0, offset = 1; if (fParentQuery->fBof || fParentQuery->fEof) throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "asBlobBuffer()", name); if (type != SQLT_BLOB) throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "asLobBuffer()"); OCILobGetLength(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, &remainder); *lobLength = nActual = nTry = remainder; try { if (iBlobBufCnt<remainder){ if (buf) delete []buf; buf = new unsigned char[sizeof(ub1) * remainder]; iBlobBufCnt=remainder; } } catch (...) { throw TOCIException(fParentQuery->fSqlStmt, ERR_NOMORE_MEMORY_BE_ALLOCATED, "asBlobBuffer()", __LINE__); } nTry = nActual = MAX_LOB_BUFFER_LENGTH; while (remainder) { fParentQuery->fErrorNo = OCILobRead(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, &nActual, (ub4)offset, (dvoid *)innerBuf, (ub4) nTry, (dvoid *)0, (sb4 (*)(dvoid *, CONST dvoid *, ub4, ub1)) 0, (ub2) 0, (ub1) SQLCS_IMPLICIT); fParentQuery->checkError(); memcpy( (buf) + offset -1, innerBuf, nActual); if (nActual<=0) break; offset += nActual; remainder -= nActual; }}void TOCIField::loadFromFile(const char *fileName){ ub4 remainder, nActual, nTry, offset = 1;//从文件中读取的剩余数据量 ub1 buf[MAX_LOB_BUFFER_LENGTH]; ub4 LobLength; ub4 flushedAmount = 0; FILE *fileHandle ; if (fParentQuery->fBof || fParentQuery->fEof) throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "LoadFromFile()", name); if (type != SQLT_BLOB) throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "LoadFromFile()"); if( (fileHandle = fopen(fileName, (const char *) "rb")) == NULL ) throw TOCIException(fParentQuery->fSqlStmt, ERR_FILE_IO, "LoadFromFile()", fileName); fseek(fileHandle,0,SEEK_END); remainder = ftell(fileHandle); fseek(fileHandle, 0, 0); fParentQuery->fErrorNo = OCILobGetLength(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, &LobLength); fParentQuery->checkError(); fParentQuery->fErrorNo = OCILobTrim(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, 0); fParentQuery->checkError(); /* enable the BLOB locator for buffering operations */ fParentQuery->fErrorNo = OCILobEnableBuffering(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob); fParentQuery->checkError(); while ( (remainder > 0) && !feof(fileHandle)) { nActual = nTry = (remainder > MAX_LOB_BUFFER_LENGTH) ? MAX_LOB_BUFFER_LENGTH : remainder; if (fread((void *)buf, (size_t)nTry, (size_t)1, fileHandle) != (size_t)1) throw TOCIException(fParentQuery->fSqlStmt, ERR_MEM_BUFFER_IO, name, fileName, __LINE__); fParentQuery->fErrorNo = OCILobWrite(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, &nActual, offset, (dvoid *) buf, (ub4) nTry, OCI_ONE_PIECE, (dvoid *)0, (sb4 (*)(dvoid *, dvoid *, ub4 *, ub1 *)) 0, (ub2) 0, (ub1) SQLCS_IMPLICIT); if ( fParentQuery->fErrorNo != OCI_SUCCESS) { fclose(fileHandle); fParentQuery->checkError(); } flushedAmount += nTry; remainder -= nTry; offset += nTry; //incase the internal buffer is not big enough for the lob , flush the buffer content to db after some interval: if (flushedAmount >= LOB_FLUSH_BUFFER_SIZE) { flushedAmount = 0; fParentQuery->fErrorNo = OCILobFlushBuffer(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, OCI_LOB_BUFFER_NOFREE); fParentQuery->checkError(); } } if ( flushedAmount ) { fParentQuery->fErrorNo = OCILobFlushBuffer(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, OCI_LOB_BUFFER_NOFREE); fParentQuery->checkError(); } fclose(fileHandle);}void TOCIField::loadFromBuffer(unsigned char *buf, unsigned int bufLength){ ub1 innerBuf[MAX_LOB_BUFFER_LENGTH]; ub4 remainder, nActual, nTry; ub4 flushedAmount = 0, offset = 1; if (fParentQuery->fBof || fParentQuery->fEof) throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "LoadFromBuffer()", name); if (type != SQLT_BLOB) throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "LoadFromBuffer()"); fParentQuery->fErrorNo = OCILobTrim(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, 0); fParentQuery->checkError(); remainder = bufLength; /* enable the BLOB locator for buffering operations */ fParentQuery->fErrorNo = OCILobEnableBuffering(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob); fParentQuery->checkError(); while (remainder > 0) { nActual = nTry = (remainder > MAX_LOB_BUFFER_LENGTH) ? MAX_LOB_BUFFER_LENGTH : remainder; memcpy(innerBuf, buf + offset-1, nActual); fParentQuery->fErrorNo = OCILobWrite(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, &nActual, offset, (dvoid *)innerBuf, (ub4)nTry, OCI_ONE_PIECE, (dvoid *)0, (sb4 (*)(dvoid *, dvoid *, ub4 *, ub1 *)) 0, (ub2) 0, (ub1) SQLCS_IMPLICIT); fParentQuery->checkError(); flushedAmount += nTry; remainder -= nTry; offset += nTry; if (flushedAmount >= LOB_FLUSH_BUFFER_SIZE) { flushedAmount = 0; fParentQuery->fErrorNo = OCILobFlushBuffer(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, OCI_LOB_BUFFER_NOFREE); fParentQuery->checkError(); } } if ( flushedAmount ) { fParentQuery->fErrorNo = OCILobFlushBuffer(fParentQuery->db->hDBSvc, fParentQuery->hErr, hBlob, OCI_LOB_BUFFER_NOFREE); fParentQuery->checkError(); }}double TOCIField::asFloat(){ double iRet; int status; if (fParentQuery->fBof || fParentQuery->fEof) throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "asFloat()", name); if ( isNULL() ) return 0; if ( (type == FLOAT_TYPE) || ( type == INT_TYPE) ){ if ( (status=OCINumberToReal(fParentQuery->hErr, (OCINumber *)(fDataBuf + (size+1) * fParentQuery->fCurrRow ),sizeof(iRet), &iRet))!= OCI_SUCCESS) { fParentQuery->checkError(); } return iRet; } else throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "asFloat()");}char* TOCIField::asDateTimeString(){ int year, month, day, hour, minute, second; if (fParentQuery->fBof || fParentQuery->fEof) throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "asDateTimeString()", name); if (type != DATE_TYPE) throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "asDateTimeString()"); else { this->asDateTimeInternal(year, month, day, hour, minute, second); if ( year == 0 ) sprintf( (char *)fStrBuffer, NULL_STRING); else sprintf( (char *)fStrBuffer,"%d-%d-%d %d:%d:%d", year, month, day, hour, minute,second); return (char *)fStrBuffer; }}void TOCIField::asDateTime(int &year, int &month, int &day, int &hour, int &minute, int &second){ if (fParentQuery->fBof || fParentQuery->fEof) throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "asDateTime()", name); if (type != DATE_TYPE) throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "asDateTime()"); else this->asDateTimeInternal(year, month, day, hour, minute, second);}void TOCIField::asDateTimeInternal(int &year, int &month, int &day, int &hour, int &minute, int &second){ unsigned char cc,yy,mm,dd,hh,mi,ss; ub1 *data; if ( isNULL() ) { year = 0; month = 0; day = 0; hour = 0; minute = 0; second = 0; return; } data = fDataBuf + 7 * (fParentQuery->fCurrRow); cc=data[0]; yy=data[1]; mm=data[2]; dd=data[3]; hh=data[4]-1; mi=data[5]-1; ss=data[6]-1; cc=(unsigned char)abs(cc-100); yy=(unsigned char)abs(yy-100); year = (unsigned int)cc*100 + (unsigned int) yy; month = mm; day = dd; hour = hh; minute = mi; second = ss;}int TOCIField::asInteger(){ int iRet=0,status; if (fParentQuery->fBof || fParentQuery->fEof) throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "asInteger()", name); if (type != INT_TYPE && type != FLOAT_TYPE) throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "asInteger()"); else { if ( (status=OCINumberToInt(fParentQuery->hErr, (OCINumber *)(fDataBuf + (size+1) * fParentQuery->fCurrRow ),sizeof(iRet), OCI_NUMBER_SIGNED,&iRet))!= OCI_SUCCESS) { fParentQuery->checkError(); } return iRet; }}long TOCIField::asLong(){ long iRet=0,status; if (fParentQuery->fBof || fParentQuery->fEof) throw TOCIException(fParentQuery->fSqlStmt, ERR_NO_DATASET, "asLong()", name); if (type != INT_TYPE && type != FLOAT_TYPE) throw TOCIException(fParentQuery->fSqlStmt, ERR_DATA_TYPE_CONVERT, name, type, "asLong()"); else { if ( (status=OCINumberToInt(fParentQuery->hErr, (OCINumber *)(fDataBuf + (size+1) * fParentQuery->fCurrRow ),sizeof(iRet), OCI_NUMBER_SIGNED, &iRet))!= OCI_SUCCESS) { fParentQuery->checkError(); } return iRet; }}/*********** TOCIQuery Implementation************/TOCIQuery::TOCIQuery(TOCIDatabase *oradb){ if (! oradb->fConnected) throw TOCIException("", ERR_GENERAL, "TOCIQuery(TOCIDatabase &db): Can not declare a TOCIQuery when the database is not connected"); fFetched = 0; fPrefetchRows = 1; fCurrRow = 0; fTotalRowsFetched = 0; fBof = false; fEof = false;//Added begin at ver : 0.0.0.6#ifdef __DEBUG__ bExecuteFlag = false;#endif//Added end at ver : 0.0.0.6 nTransTimes = 0; db = oradb; fActivated = false; fFieldCount = 0; fParamCount = 0; fSqlStmt = NULL; paramList = NULL; fieldList = NULL; fErrorNo = OCIHandleAlloc(db->hEnv, (dvoid **) &hErr,(ub4) OCI_HTYPE_ERROR,(size_t) 0, (dvoid **) 0); checkError(); fErrorNo = OCIHandleAlloc(db->hEnv, (dvoid **)&hStmt, OCI_HTYPE_STMT, 0, 0); checkError(); //fErrorNo = OCIHandleAlloc(db->hEnv, (dvoid **)&hTrans, OCI_HTYPE_TRANS, 0, 0); //checkError();}TOCIQuery::TOCIQuery(TOCIDatabase *oradb,TOCISession *session){ if (! session->m_bActive) throw TOCIException("", ERR_GENERAL, "TOCIQuery(TOCIDatabase &db): Can not declare a TOCIQuery when the database is not connected"); fFetched = 0; fPrefetchRows = 1; fCurrRow = 0; fTotalRowsFetched = 0; fBof = false; fEof = false;//Added begin at ver : 0.0.0.6#ifdef __DEBUG__ bExecuteFlag = false;#endif//Added end at ver : 0.0.0.6 nTransTimes = 0; db = oradb; fActivated = false; fFieldCount = 0; fParamCount = 0; fSqlStmt = NULL; paramList = NULL; fieldList = NULL;/* hUser = session->m_hSession;*/ hErr = session->m_hError; /*hSvc = session->m_hSrvCtx; */ fErrorNo = OCIHandleAlloc(db->hEnv, (dvoid **)&hStmt, OCI_HTYPE_STMT, 0, 0); checkError(); //fErrorNo = OCIHandleAlloc(db->hEnv, (dvoid **)&hTrans, OCI_HTYPE_TRANS, 0, 0); //checkError(); }TOCIQuery::~TOCIQuery(){ if (fSqlStmt != NULL) delete[] fSqlStmt; if (fParamCount >0) delete[] paramList; if (fFieldCount >0) delete[] fieldList; if (nTransTimes) { //fErrorNo = OCITransRollback(db->hDBSvc, hErr, OCI_DEFAULT); //checkError(); }//Added begin at ver : 0.0.0.6#ifdef __DEBUG__ if(bExecuteFlag) userlog("TOCIQuery执行了Execute()但是没有提交或回滚,可能造成锁表。"); #endif//Added end at ver : 0.0.0.6/* OCISessionEnd (hSvc, hErr, hUser, OCI_DEFAULT);*/ OCIHandleFree(hStmt, OCI_HTYPE_STMT); //OCIHandleFree(hTrans,OCI_HTYPE_TRANS); /*OCIHandleFree(hSvc, OCI_HTYPE_SVCCTX); OCIHandleFree(hUser,OCI_HTYPE_SESSION); */ OCIHandleFree(hErr,OCI_HTYPE_ERROR);}void TOCIQuery::close(){ if (! fActivated) return; if (fSqlStmt != NULL) { delete[] fSqlStmt; fSqlStmt = NULL; } if (fParamCount > 0) { delete[] paramList; paramList = NULL; } if (fFieldCount > 0) { delete[] fieldList; fieldList = NULL; } fFieldCount = 0; fParamCount = 0; fActivated = false; fFetched = 0; fPrefetchRows = PREFETCH_ROWS; fCurrRow = 0; fTotalRowsFetched = 0;}bool TOCIQuery::commit(){ bool exeSuccess = false;//Added begin at ver : 0.0.0.6#ifdef __DEBUG__ bExecuteFlag = false;#endif//Added end at ver : 0.0.0.6 fErrorNo = OCITransCommit(db->hDBSvc, hErr, OCI_DEFAULT); checkError(); if (fErrorNo == OCI_SUCCESS) nTransTimes = 0; return (fErrorNo == OCI_SUCCESS); }bool TOCIQuery::rollback(){ bool exeSuccess = false;//Added begin at ver : 0.0.0.6#ifdef __DEBUG__ bExecuteFlag = false;#endif//Added end at ver : 0.0.0.6 fErrorNo = OCITransRollback(db->hDBSvc, hErr, OCI_DEFAULT); if (fErrorNo == OCI_SUCCESS) { nTransTimes = 0; exeSuccess = true; } else checkError(); return exeSuccess;}void TOCIQuery::getFieldsDef(){ char temp[20]; TOCIField *pCurrField; OCIParam *param = (OCIParam *)0; ub4 counter; //计数器,在循环语句中实用 ub4 nColumnCount; //在分析sqlstmt后,获得的列数目 //以下参数的长度参见"OCI Programmer's" Guide P208 , 6-10 text *columnName; //字段名称 ub4 columnNameLength,j; //字段名称长度 unsigned int ub2 innerDataSize; //数据长度 unsigned short ub2 innerDataType; //Oracle 内部数据类型 signed short ub2 innerPrecision; //包括小数点的总位数, ub1 is a bug in documentation? sb1 innerScale; //小数点个数 ub1 innerIsNULL; //是否允许为空值
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -