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]

Reply via email to