?? tocidirpath.cpp
字號(hào):
#include <iostream.h>#include <string.h>#include <stdlib.h>#include <ctype.h>#include <math.h>#include <oratypes.h>#include <ocidfn.h>#include <ocidem.h>#include <ociapr.h>#include <oci.h>#include <oci8dp.h>#include "TOCIQuery.h"#include "TOCIDirPath.h"#include "strcasecmp.h"static void errprint(dvoid *errhp, ub4 htype, sb4 *errcodep){ text errbuf[512]; if (errhp) { sb4 errcode; if (errcodep == (sb4 *)0) errcodep = &errcode; (void) OCIErrorGet((dvoid *)errhp, (ub4) 1, (text *) NULL, errcodep, errbuf, (ub4) sizeof(errbuf), htype); (void) printf("Error - %.*s\n", 512, errbuf); }}TOCIDirPath::TOCIDirPath(TOCIDatabase *pdbConnect,char *strTableName){ if(!pdbConnect->fConnected) throw TOCIException("", ERR_GENERAL, "TOCIDirPath(pdbConnect): Can not create a TOCIDirPath when the database is not connected"); // Initialize all data member m_hDirPathCtx = NULL; m_hError = NULL; m_hDirPathCA = NULL; m_hDirPathStr = NULL; m_FieldAssigned = NULL; m_strTableName[0] = '\0'; m_strSchameName[0] = '\0'; m_uMaxRows = 0; m_uMaxCols = 0; m_bPrepared = FALSE; m_uRowSize = 0; m_uBufSize = 0; m_uBufCurPos = 0; m_iRowOff = 0; m_iErrorNo = 0; m_lSaveCount = 0; m_inData = (void *)NULL; m_pDB = pdbConnect; //create a new session and begin this session /* m_pSession = new TOCISession(m_pDB); m_pSession->sessionBegin(); */ //cout<<"session created"<<endl; m_Query = new TOCIQuery(m_pDB /*,m_pSession*/); /* OCIHandleAlloc((dvoid *)m_pDB->hEnv,(dvoid **)&m_hError, (ub4)OCI_HTYPE_ERROR,(size_t)0,(dvoid **)0); */ m_hError = m_pDB->hDBErr; //allocate an initialize direct path context m_iErrorNo = OCIHandleAlloc((dvoid *)m_pDB->hEnv,(dvoid **)&m_hDirPathCtx, (ub4)OCI_HTYPE_DIRPATH_CTX, (size_t)0,(dvoid **)0); checkError(); if(strTableName!=NULL) setTableName(strTableName); m_iBufferSize = 256*1024; //cout<<"setTableName ok"<<endl; }TOCIDirPath::~TOCIDirPath(){ if(m_FieldAssigned) { delete []m_FieldAssigned; } OCIHandleFree((dvoid *)m_hDirPathCA,(ub4)OCI_HTYPE_DIRPATH_COLUMN_ARRAY); OCIHandleFree((dvoid *)m_hDirPathStr,(ub4)OCI_HTYPE_DIRPATH_STREAM); OCIHandleFree((dvoid *)m_hDirPathCtx,(ub4)OCI_HTYPE_DIRPATH_CTX); delete m_Query; /*m_pSession->sessionEnd(); delete m_pSession; */}OCIDate TOCIDirPath::strToOCIDate(char * str){ OCIDate date; uword invalid; if ( strcasecmp(str,"sysdate")==0){ OCIDateSysDate(m_hError,&date); } else { int yyyy,mm,dd,hh24,mi,ss; yyyy = (str[0]-'0')*1000+(str[1]-'0')*100+(str[2]-'0')*10+str[3]-'0'; mm = (str[4]-'0')*10+str[5]-'0'; dd = (str[6]-'0')*10+str[7]-'0'; hh24 = (str[8]-'0')*10+str[9]-'0'+1; mi = (str[10]-'0')*10+str[11]-'0'+1; ss = (str[12]-'0')*10+str[13]-'0'+1; OCIDateSetDate(&date,yyyy,mm,dd); OCIDateSetTime(&date,hh24,mi,ss); } if ( OCIDateCheck( m_hError,&date, &invalid)!=OCI_SUCCESS){ cout<<"OCIDateCheck Error"<<endl; errprint(m_hError, OCI_HTYPE_ERROR, &m_iErrorNo); throw 1; }; return date;}void TOCIDirPath::setTableName(char *strTableName){ char strSQL[256]; if(!strTableName&&!*strTableName) return; strcpy(m_strTableName , strTableName); //create temp table instance for get table information sprintf(strSQL,"select * from %s where rownum<0",m_strTableName); m_Query->setSQL(strSQL); m_Query->open(); m_uMaxCols = m_Query->fieldCount(); //get field list information if(m_FieldAssigned) { delete []m_FieldAssigned; } m_FieldAssigned = new bool[m_uMaxCols]; }void TOCIDirPath::setSchameName(char *strSchameName){ if(!strSchameName&&!*strSchameName) return; strcpy(m_strSchameName , strSchameName); }void TOCIDirPath::setBufferSize(int iSize){ m_iBufferSize = iSize;}long TOCIDirPath::getSaveCount(){ return m_lSaveCount;}void TOCIDirPath::prepare(){ if(m_bPrepared) throw TOCIException("",ERR_GENERAL,"TOCIDriPath::prepare can't prepare on prepared object"); //set DirPathCtx attribute OCI_ATTR_NAME value m_iErrorNo = OCIAttrSet((dvoid *)m_hDirPathCtx,(ub4)OCI_HTYPE_DIRPATH_CTX, (dvoid *)m_strTableName,(ub4)strlen(m_strTableName), (ub4)OCI_ATTR_NAME,m_hError); checkError(); //set DirPathCtx attribute OCI_ATTR_NAME value if(m_strSchameName[0]) { m_iErrorNo = OCIAttrSet((dvoid *)m_hDirPathCtx,(ub4)OCI_HTYPE_DIRPATH_CTX, (dvoid *)m_strSchameName,(ub4)strlen(m_strSchameName), (ub4)OCI_ATTR_SCHEMA_NAME,m_hError); checkError(); } m_iErrorNo = OCIAttrSet((dvoid *)m_hDirPathCtx,(ub4)OCI_HTYPE_DIRPATH_CTX, (dvoid *)&m_iBufferSize,(ub4)4, (ub4)OCI_ATTR_BUF_SIZE,m_hError); checkError(); m_iErrorNo = OCIAttrSet((dvoid *)m_hDirPathCtx,(ub4)OCI_HTYPE_DIRPATH_CTX, (dvoid *)&m_uMaxCols,(ub4)0, (ub4)OCI_ATTR_NUM_COLS,m_hError); checkError(); //set parallel/* unsigned p=1; m_iErrorNo = OCIAttrSet((dvoid *)m_hDirPathCtx,(ub4)OCI_HTYPE_DIRPATH_CTX, (dvoid *)&p,(ub4)0, (ub4)OCI_ATTR_DIRPATH_PARALLEL,m_hError); checkError();*/ //get columns parameter list OCIParam *ColListDescCtx; ub1 ParamType; m_iErrorNo = OCIAttrGet((dvoid *)m_hDirPathCtx,(ub4)OCI_HTYPE_DIRPATH_CTX, (dvoid **)&ColListDescCtx,(ub4 *)0, (ub4)OCI_ATTR_LIST_COLUMNS,m_hError); checkError(); //get attributes of the column parameter list m_iErrorNo = OCIAttrGet((dvoid *)ColListDescCtx,OCI_DTYPE_PARAM, (dvoid *)&ParamType,(ub4 *)0, OCI_ATTR_PTYPE, m_hError); if(ParamType!=OCI_PTYPE_LIST) throw TOCIException("",ERR_GENERAL,"setTableName: expected ParamType of OCI_PTYPE_LIST"); OCIParam *ColDesc; char colName[256]; int colType; int colSize; for(int i=0,pos=1; i<m_uMaxCols;i++,pos++) { m_iErrorNo = OCIParamGet((dvoid *)ColListDescCtx,(ub4)OCI_DTYPE_PARAM, m_hError,(dvoid **)&ColDesc,(ub1)pos); checkError(); strcpy(colName,m_Query->field(i).name); switch((*m_Query).field(i).type) { case INT_TYPE: colSize = m_Query->field(i).precision; colType = SQLT_CHR; m_iErrorNo = OCIAttrSet((dvoid *)ColDesc,(ub4)OCI_DTYPE_PARAM, (dvoid *)&colSize,(ub4)0, (ub4)OCI_ATTR_PRECISION,m_hError); colSize = m_Query->field(i).size; break; case STRING_TYPE: colSize = m_Query->field(i).size; colType = SQLT_CHR; break; case DATE_TYPE: colSize = 14;//m_Query->field(i).size; //cout<<"OCIDate size:"<<sizeof(OCIDate)<<endl; colType = SQLT_CHR; char * datemask = "yyyymmddhh24miss"; OCIAttrSet((dvoid *)ColDesc, (ub4)OCI_DTYPE_PARAM, (dvoid *)datemask, (ub4)0, (ub4)OCI_ATTR_DATEFORMAT, m_hError); break; } //column name m_iErrorNo = OCIAttrSet((dvoid *)ColDesc,(ub4)OCI_DTYPE_PARAM, (dvoid *)colName,(ub4)strlen(colName), (ub4)OCI_ATTR_NAME,m_hError); checkError(); //column data type m_iErrorNo = OCIAttrSet((dvoid *)ColDesc,(ub4)OCI_DTYPE_PARAM, (dvoid *)&colType,(ub4)0, (ub4)OCI_ATTR_DATA_TYPE,m_hError); checkError(); //column max size m_iErrorNo = OCIAttrSet((dvoid *)ColDesc,(ub4)OCI_DTYPE_PARAM, (dvoid *)&colSize,(ub4)0, (ub4)OCI_ATTR_DATA_SIZE,m_hError); checkError(); m_uRowSize += colSize; m_iErrorNo = OCIDescriptorFree((dvoid *)ColDesc,(ub4)OCI_DTYPE_PARAM); checkError(); } m_iErrorNo = OCIDescriptorFree((dvoid *)ColListDescCtx,(ub4)OCI_DTYPE_PARAM); checkError(); m_iErrorNo = OCIDirPathPrepare(m_hDirPathCtx,m_pDB->hDBSvc,m_hError); checkError(); m_iErrorNo = OCIHandleAlloc((dvoid *)m_hDirPathCtx,(dvoid **)&m_hDirPathCA, (ub4)OCI_HTYPE_DIRPATH_COLUMN_ARRAY, (size_t)0,(dvoid **)0); checkError(); m_iErrorNo = OCIHandleAlloc((dvoid *)m_hDirPathCtx,(dvoid **)&m_hDirPathStr, (ub4)OCI_HTYPE_DIRPATH_STREAM, (size_t)0,(dvoid **)0); checkError(); m_iErrorNo = OCIAttrGet((dvoid *)m_hDirPathCA,(ub4)OCI_HTYPE_DIRPATH_COLUMN_ARRAY, (dvoid *)&m_uMaxRows,(ub4 *)0, (ub4)OCI_ATTR_NUM_ROWS,m_hError); checkError(); //cout<<"m_uMaxRows:"<<m_uMaxRows<<endl;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -