User: kz Date: 06/01/03 08:04:19 Modified: /dba/connectivity/source/drivers/odbc/ OResultSet.cxx
Log: INTEGRATION: CWS dba202c (1.61.28); FILE MERGED 2005/12/02 11:36:18 oj 1.61.28.1: #127795# new method for columnbinding File Changes: Directory: /dba/connectivity/source/drivers/odbc/ ================================================= File [changed]: OResultSet.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/drivers/odbc/OResultSet.cxx?r1=1.61&r2=1.62 Delta lines: +138 -117 ----------------------- --- OResultSet.cxx 5 Oct 2005 14:18:41 -0000 1.61 +++ OResultSet.cxx 3 Jan 2006 16:04:16 -0000 1.62 @@ -194,7 +194,6 @@ // ------------------------------------------------------------------------- OResultSet::~OResultSet() { - OSL_ENSURE(m_aBindVector.empty(),"Bind vector mot released!"); delete m_pRowStatusArray; delete m_pSkipDeletedSet; } @@ -235,134 +234,154 @@ return map; } // ------------------------------------------------------------------------- -void OResultSet::allocBuffer() +SQLRETURN OResultSet::unbind(sal_Bool _bUnbindHandle) { - Reference< XResultSetMetaData > xMeta = getMetaData(); - sal_Int32 nLen = xMeta->getColumnCount(); - - m_aBindVector.reserve(nLen+1); - m_aBindVector.push_back(TVoidPtr(0,0)); // the first is reserved for the bookmark - m_aRow.resize(nLen+1); + SQLRETURN nRet = 0; + if ( _bUnbindHandle ) + nRet = N3SQLFreeStmt(m_aStatementHandle,SQL_UNBIND); - for(sal_Int32 i = 1;i<=nLen;++i) + if ( m_aBindVector.size() > 1 ) { - sal_Int32 nType = xMeta->getColumnType(i); - m_aRow[i].setTypeKind( nType ); - switch (nType) + TVoidVector::iterator pValue = m_aBindVector.begin() + 1; + TVoidVector::iterator pEnd = m_aBindVector.end(); + for(; pValue != pEnd; ++pValue) + { + switch (pValue->second) { case DataType::CHAR: case DataType::VARCHAR: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new ::rtl::OString(),nType)); + delete static_cast< ::rtl::OString* >((void*)(pValue->first)); break; case DataType::BIGINT: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new sal_Int64(0),nType)); + delete static_cast< sal_Int64* >((void*)(pValue->first)); break; case DataType::DECIMAL: case DataType::NUMERIC: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new ::rtl::OString(),nType)); + delete static_cast< ::rtl::OString* >((void*)(pValue->first)); break; case DataType::REAL: case DataType::DOUBLE: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new double(0.0),nType)); + delete static_cast< double* >((void*)(pValue->first)); break; case DataType::LONGVARCHAR: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new char[2],nType)); // dient nur zum auffinden + delete [] static_cast< char* >((void*)(pValue->first)); break; case DataType::LONGVARBINARY: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new char[2],nType)); // dient nur zum auffinden + delete [] static_cast< char* >((void*)(pValue->first)); break; case DataType::DATE: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new DATE_STRUCT,nType)); + delete static_cast< DATE_STRUCT* >((void*)(pValue->first)); break; case DataType::TIME: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new TIME_STRUCT,nType)); + delete static_cast< TIME_STRUCT* >((void*)(pValue->first)); break; case DataType::TIMESTAMP: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new TIMESTAMP_STRUCT,nType)); + delete static_cast< TIMESTAMP_STRUCT* >((void*)(pValue->first)); break; case DataType::BIT: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new sal_Int8(0),nType)); - break; case DataType::TINYINT: + delete static_cast< sal_Int8* >((void*)(pValue->first)); + break; case DataType::SMALLINT: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new sal_Int16(0),nType)); + delete static_cast< sal_Int16* >((void*)(pValue->first)); break; case DataType::INTEGER: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new sal_Int32(0),nType)); + delete static_cast< sal_Int32* >((void*)(pValue->first)); break; case DataType::FLOAT: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new float(0),nType)); + delete static_cast< float* >((void*)(pValue->first)); break; case DataType::BINARY: case DataType::VARBINARY: - m_aBindVector.push_back(TVoidPtr((sal_Int64)new sal_Int8[xMeta->getPrecision(i)],nType)); + delete static_cast< sal_Int8* >((void*)(pValue->first)); break; - default: - OSL_ENSURE(0,"Unknown type"); - m_aBindVector.push_back(TVoidPtr(0,nType)); } } - m_aLengthVector.resize(nLen + 1); + m_aBindVector.clear(); + m_aBindVector.push_back(TVoidPtr(0,0)); // the first is reserved for the bookmark + } + return nRet; } // ------------------------------------------------------------------------- -void OResultSet::releaseBuffer() +TVoidPtr OResultSet::allocBindColumn(sal_Int32 _nType,sal_Int32 _nColumnIndex) { - TVoidVector::iterator pValue = m_aBindVector.begin() + 1; - TVoidVector::iterator pEnd = m_aBindVector.end(); - for(; pValue != pEnd; ++pValue) - { - switch (pValue->second) + TVoidPtr aPair; + switch (_nType) { case DataType::CHAR: case DataType::VARCHAR: - delete static_cast< ::rtl::OString* >((void*)(pValue->first)); + aPair = TVoidPtr((sal_Int64)new ::rtl::OString(),_nType); break; case DataType::BIGINT: - delete static_cast< sal_Int64* >((void*)(pValue->first)); + aPair = TVoidPtr((sal_Int64)new sal_Int64(0),_nType); break; case DataType::DECIMAL: case DataType::NUMERIC: - delete static_cast< ::rtl::OString* >((void*)(pValue->first)); + aPair = TVoidPtr((sal_Int64)new ::rtl::OString(),_nType); break; case DataType::REAL: case DataType::DOUBLE: - delete static_cast< double* >((void*)(pValue->first)); + aPair = TVoidPtr((sal_Int64)new double(0.0),_nType); break; case DataType::LONGVARCHAR: - delete [] static_cast< char* >((void*)(pValue->first)); + aPair = TVoidPtr((sal_Int64)new char[2],_nType); // dient nur zum auffinden break; case DataType::LONGVARBINARY: - delete [] static_cast< char* >((void*)(pValue->first)); + aPair = TVoidPtr((sal_Int64)new char[2],_nType); // dient nur zum auffinden break; case DataType::DATE: - delete static_cast< DATE_STRUCT* >((void*)(pValue->first)); + aPair = TVoidPtr((sal_Int64)new DATE_STRUCT,_nType); break; case DataType::TIME: - delete static_cast< TIME_STRUCT* >((void*)(pValue->first)); + aPair = TVoidPtr((sal_Int64)new TIME_STRUCT,_nType); break; case DataType::TIMESTAMP: - delete static_cast< TIMESTAMP_STRUCT* >((void*)(pValue->first)); + aPair = TVoidPtr((sal_Int64)new TIMESTAMP_STRUCT,_nType); break; case DataType::BIT: - delete static_cast< sal_Int8* >((void*)(pValue->first)); - break; case DataType::TINYINT: + aPair = TVoidPtr((sal_Int64)new sal_Int8(0),_nType); + break; case DataType::SMALLINT: - delete static_cast< sal_Int16* >((void*)(pValue->first)); + aPair = TVoidPtr((sal_Int64)new sal_Int16(0),_nType); break; case DataType::INTEGER: - delete static_cast< sal_Int32* >((void*)(pValue->first)); + aPair = TVoidPtr((sal_Int64)new sal_Int32(0),_nType); break; case DataType::FLOAT: - delete static_cast< float* >((void*)(pValue->first)); + aPair = TVoidPtr((sal_Int64)new float(0),_nType); break; case DataType::BINARY: case DataType::VARBINARY: - delete static_cast< sal_Int8* >((void*)(pValue->first)); + aPair = TVoidPtr((sal_Int64)new sal_Int8[m_aRow[_nColumnIndex].getSequence().getLength()],_nType); break; + default: + OSL_ENSURE(0,"Unknown type"); + aPair = TVoidPtr(0,_nType); } + return aPair; +} +// ------------------------------------------------------------------------- +void OResultSet::allocBuffer() +{ + Reference< XResultSetMetaData > xMeta = getMetaData(); + sal_Int32 nLen = xMeta->getColumnCount(); + + m_aBindVector.reserve(nLen+1); + m_aBindVector.push_back(TVoidPtr(0,0)); // the first is reserved for the bookmark + m_aRow.resize(nLen+1); + + for(sal_Int32 i = 1;i<=nLen;++i) + { + sal_Int32 nType = xMeta->getColumnType(i); + m_aRow[i].setTypeKind( nType ); } - m_aBindVector.clear(); + m_aLengthVector.resize(nLen + 1); +} +// ------------------------------------------------------------------------- +void OResultSet::releaseBuffer() +{ + unbind(sal_False); m_aLengthVector.clear(); } // ------------------------------------------------------------------------- @@ -864,7 +883,7 @@ } catch(SQLException e) { - nRet = N3SQLFreeStmt(m_aStatementHandle,SQL_UNBIND); + nRet = unbind(); throw; } @@ -879,7 +898,7 @@ nRet = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_RELATIVE,0); // OJ 06.03.2004 // sometimes we got an error but we are not interested in anymore #106047# OJ // OTools::ThrowException(m_pStatement->getOwnConnection(),nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this); - nRet = N3SQLFreeStmt(m_aStatementHandle,SQL_UNBIND); + nRet = unbind(); OTools::ThrowException(m_pStatement->getOwnConnection(),nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this); if(m_pSkipDeletedSet) @@ -927,7 +946,7 @@ fillNeededData(nRet = N3SQLSetPos(m_aStatementHandle,1,SQL_UPDATE,SQL_LOCK_NO_CHANGE)); OTools::ThrowException(m_pStatement->getOwnConnection(),nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this); // now unbind all columns so we can fetch all columns again with SQLGetData - nRet = N3SQLFreeStmt(m_aStatementHandle,SQL_UNBIND); + nRet = unbind(); OSL_ENSURE(nRet == SQL_SUCCESS,"Could not unbind the columns!"); } // ------------------------------------------------------------------------- @@ -969,7 +988,7 @@ m_nLastColumnPos = 0; // first unbound all columns - SQLRETURN nRet = N3SQLFreeStmt(m_aStatementHandle,SQL_UNBIND); + SQLRETURN nRet = unbind(); OSL_ENSURE(nRet == SQL_SUCCESS,"Could not unbind columns!"); // SQLRETURN nRet = N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_ARRAY_SIZE ,(SQLPOINTER)1,SQL_IS_INTEGER); m_bInserting = sal_True; @@ -987,7 +1006,8 @@ checkDisposed(OResultSet_BASE::rBHelper.bDisposed); columnIndex = mapColumn(columnIndex); - void* pData = reinterpret_cast<void*>(m_aBindVector[columnIndex].first); + m_aBindVector.push_back(allocBindColumn(OTools::MapOdbcType2Jdbc(_nType),columnIndex)); + void* pData = reinterpret_cast<void*>(m_aBindVector.rbegin()->first); OSL_ENSURE(pData != NULL,"Data for update is NULL!"); OTools::bindValue( m_pStatement->getOwnConnection(), m_aStatementHandle, @@ -1010,7 +1030,8 @@ columnIndex = mapColumn(columnIndex); - void* pData = reinterpret_cast<void*>(m_aBindVector[columnIndex].first); + m_aBindVector.push_back(allocBindColumn(DataType::CHAR,columnIndex)); + void* pData = reinterpret_cast<void*>(m_aBindVector.rbegin()->first); OTools::bindValue(m_pStatement->getOwnConnection(),m_aStatementHandle,columnIndex,SQL_CHAR,0,0,(sal_Int8*)NULL,pData,&m_aLengthVector[columnIndex],**this,m_nTextEncoding,m_pStatement->getOwnConnection()->useOldDateFormat()); } // ------------------------------------------------------------------------- --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
