summaryrefslogtreecommitdiff
path: root/connectivity/source/drivers/odbcbase/OTools.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'connectivity/source/drivers/odbcbase/OTools.cxx')
-rw-r--r--connectivity/source/drivers/odbcbase/OTools.cxx908
1 files changed, 0 insertions, 908 deletions
diff --git a/connectivity/source/drivers/odbcbase/OTools.cxx b/connectivity/source/drivers/odbcbase/OTools.cxx
deleted file mode 100644
index 8c816a5fb6..0000000000
--- a/connectivity/source/drivers/odbcbase/OTools.cxx
+++ /dev/null
@@ -1,908 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_connectivity.hxx"
-#include "odbc/OTools.hxx"
-#include "odbc/OFunctions.hxx"
-#include <com/sun/star/sdbc/DataType.hpp>
-#include <osl/diagnose.h>
-#include "odbc/OConnection.hxx"
-#include "diagnose_ex.h"
-#include <rtl/logfile.hxx>
-#include <rtl/ustrbuf.hxx>
-
-
-#include <string.h>
-#include <string>
-#include <algorithm>
-
-using namespace connectivity::odbc;
-using namespace com::sun::star::uno;
-using namespace com::sun::star::sdbc;
-using namespace com::sun::star::util;
-
-void OTools::getValue( OConnection* _pConnection,
- SQLHANDLE _aStatementHandle,
- sal_Int32 columnIndex,
- SQLSMALLINT _nType,
- sal_Bool &_bWasNull,
- const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _xInterface,
- void* _pValue,
- SQLLEN _nSize) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "odbc", "Ocke.Janssen@sun.com", "OTools::getValue" );
- SQLLEN pcbValue = SQL_NULL_DATA;
- OTools::ThrowException(_pConnection,
- (*(T3SQLGetData)_pConnection->getOdbcFunction(ODBC3SQLGetData))(_aStatementHandle,
- (SQLUSMALLINT)columnIndex,
- _nType,
- _pValue,
- _nSize,
- &pcbValue),
- _aStatementHandle,SQL_HANDLE_STMT,_xInterface,sal_False);
- _bWasNull = pcbValue == SQL_NULL_DATA;
-}
-// -----------------------------------------------------------------------------
-void OTools::bindParameter( OConnection* _pConnection,
- SQLHANDLE _hStmt,
- sal_Int32 nPos,
- sal_Int8*& pDataBuffer,
- sal_Int8* pLenBuffer,
- SQLSMALLINT _nODBCtype,
- sal_Bool _bUseWChar,
- sal_Bool _bUseOldTimeDate,
- const void* _pValue,
- const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _xInterface,
- rtl_TextEncoding _nTextEncoding)
- throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "odbc", "Ocke.Janssen@sun.com", "OTools::bindParameter" );
- SQLRETURN nRetcode;
- SQLSMALLINT fSqlType;
- SQLSMALLINT fCType;
- SQLLEN nMaxLen = 0;
- SQLLEN* pLen = (SQLLEN*)pLenBuffer;
- SQLULEN nColumnSize=0;
- SQLSMALLINT nDecimalDigits=0;
-
- OTools::getBindTypes(_bUseWChar,_bUseOldTimeDate,_nODBCtype,fCType,fSqlType);
-
- OTools::bindData(_nODBCtype,_bUseWChar,pDataBuffer,pLen,_pValue,_nTextEncoding,nColumnSize);
- if ((nColumnSize == 0) && (fSqlType == SQL_CHAR || fSqlType == SQL_VARCHAR || fSqlType == SQL_LONGVARCHAR))
- nColumnSize = 1;
-
- if(fSqlType == SQL_LONGVARCHAR || fSqlType == SQL_LONGVARBINARY)
- memcpy(pDataBuffer,&nPos,sizeof(nPos));
-
- nRetcode = (*(T3SQLBindParameter)_pConnection->getOdbcFunction(ODBC3SQLBindParameter))(_hStmt,
- (SQLUSMALLINT)nPos,
- SQL_PARAM_INPUT,
- fCType,
- fSqlType,
- nColumnSize,
- nDecimalDigits,
- pDataBuffer,
- nMaxLen,
- pLen);
-
- OTools::ThrowException(_pConnection,nRetcode,_hStmt,SQL_HANDLE_STMT,_xInterface);
-}
-// -----------------------------------------------------------------------------
-void OTools::bindData( SQLSMALLINT _nOdbcType,
- sal_Bool _bUseWChar,
- sal_Int8 *&_pData,
- SQLLEN*& pLen,
- const void* _pValue,
- rtl_TextEncoding _nTextEncoding,
- SQLULEN& _nColumnSize)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "odbc", "Ocke.Janssen@sun.com", "OTools::bindData" );
- _nColumnSize = 0;
-
- switch (_nOdbcType)
- {
- case SQL_CHAR:
- case SQL_VARCHAR:
- case SQL_DECIMAL:
- if(_bUseWChar)
- {
- *pLen = SQL_NTS;
- ::rtl::OUString sStr(*(::rtl::OUString*)_pValue);
- _nColumnSize = sStr.getLength();
- *((rtl::OUString*)_pData) = sStr;
-
- // Pointer on Char*
- _pData = (sal_Int8*)((rtl::OUString*)_pData)->getStr();
- }
- else
- {
- ::rtl::OString aString(::rtl::OUStringToOString(*(::rtl::OUString*)_pValue,_nTextEncoding));
- *pLen = SQL_NTS;
- _nColumnSize = aString.getLength();
- memcpy(_pData,aString.getStr(),aString.getLength());
- ((sal_Int8*)_pData)[aString.getLength()] = '\0';
- }
- break;
-
- case SQL_BIGINT:
- *((sal_Int64*)_pData) = *(sal_Int64*)_pValue;
- *pLen = sizeof(sal_Int64);
- _nColumnSize = *pLen;
- break;
-
- case SQL_NUMERIC:
- if(_bUseWChar)
- {
- ::rtl::OUString aString = rtl::OUString::valueOf(*(double*)_pValue);
- _nColumnSize = aString.getLength();
- *pLen = _nColumnSize;
- *((rtl::OUString*)_pData) = aString;
- // Pointer on Char*
- _pData = (sal_Int8*)((rtl::OUString*)_pData)->getStr();
- }
- else
- {
- ::rtl::OString aString = ::rtl::OString::valueOf(*(double*)_pValue);
- _nColumnSize = aString.getLength();
- *pLen = _nColumnSize;
- memcpy(_pData,aString.getStr(),aString.getLength());
- ((sal_Int8*)_pData)[_nColumnSize] = '\0';
- } break;
- case SQL_BIT:
- case SQL_TINYINT:
- *((sal_Int8*)_pData) = *(sal_Int8*)_pValue;
- *pLen = sizeof(sal_Int8);
- break;
-
- case SQL_SMALLINT:
- *((sal_Int16*)_pData) = *(sal_Int16*)_pValue;
- *pLen = sizeof(sal_Int16);
- break;
- case SQL_INTEGER:
- *((sal_Int32*)_pData) = *(sal_Int32*)_pValue;
- *pLen = sizeof(sal_Int32);
- break;
- case SQL_FLOAT:
- *((float*)_pData) = *(float*)_pValue;
- *pLen = sizeof(float);
- break;
- case SQL_REAL:
- case SQL_DOUBLE:
- *((double*)_pData) = *(double*)_pValue;
- *pLen = sizeof(double);
- break;
- case SQL_BINARY:
- case SQL_VARBINARY:
- {
- const ::com::sun::star::uno::Sequence< sal_Int8 >* pSeq = static_cast< const ::com::sun::star::uno::Sequence< sal_Int8 >* >(_pValue);
- OSL_ENSURE(pSeq,"OTools::bindData: Sequence is null!");
-
- if(pSeq)
- {
- _pData = (sal_Int8*)pSeq->getConstArray();
- *pLen = pSeq->getLength();
- }
- }
- break;
- case SQL_LONGVARBINARY:
- {
- sal_Int32 nLen = 0;
- nLen = ((const ::com::sun::star::uno::Sequence< sal_Int8 > *)_pValue)->getLength();
- *pLen = (SQLLEN)SQL_LEN_DATA_AT_EXEC(nLen);
- }
- break;
- case SQL_LONGVARCHAR:
- {
- sal_Int32 nLen = 0;
- if(_bUseWChar)
- nLen = sizeof(sal_Unicode) * ((::rtl::OUString*)_pValue)->getLength();
- else
- {
- ::rtl::OString aString(::rtl::OUStringToOString(*(::rtl::OUString*)_pValue,_nTextEncoding));
- nLen = aString.getLength();
- }
- *pLen = (SQLLEN)SQL_LEN_DATA_AT_EXEC(nLen);
- } break;
- case SQL_DATE:
- *(DATE_STRUCT*)_pData = *(DATE_STRUCT*)_pValue;
- *pLen = (SQLLEN)sizeof(DATE_STRUCT);
- _nColumnSize = 10;
- break;
- case SQL_TIME:
- *(TIME_STRUCT*)_pData = *(TIME_STRUCT*)_pValue;
- *pLen = (SQLLEN)sizeof(TIME_STRUCT);
- _nColumnSize = 8;
- break;
- case SQL_TIMESTAMP:
- *(TIMESTAMP_STRUCT*)_pData = *(TIMESTAMP_STRUCT*)_pValue;
- *pLen = (SQLLEN)sizeof(TIMESTAMP_STRUCT);
- _nColumnSize = 19;
- break;
- }
-}
-// -------------------------------------------------------------------------
-void OTools::bindValue( OConnection* _pConnection,
- SQLHANDLE _aStatementHandle,
- sal_Int32 columnIndex,
- SQLSMALLINT _nType,
- SQLSMALLINT _nMaxLen,
- const void* _pValue,
- void* _pData,
- SQLLEN *pLen,
- const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _xInterface,
- rtl_TextEncoding _nTextEncoding,
- sal_Bool _bUseOldTimeDate) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "odbc", "Ocke.Janssen@sun.com", "OTools::bindValue" );
- SQLRETURN nRetcode;
- SQLSMALLINT fSqlType;
- SQLSMALLINT fCType;
- SQLLEN nMaxLen = _nMaxLen;
-
- OTools::getBindTypes( sal_False,
- _bUseOldTimeDate,
- _nType,
- fCType,
- fSqlType);
-
- if (columnIndex != 0 && !_pValue)
- {
- *pLen = SQL_NULL_DATA;
- nRetcode = (*(T3SQLBindCol)_pConnection->getOdbcFunction(ODBC3SQLBindCol))(_aStatementHandle,
- (SQLUSMALLINT)columnIndex,
- fCType,
- _pData,
- nMaxLen,
- pLen
- );
- }
- else
- {
- try
- {
- switch (_nType)
- {
- case SQL_CHAR:
- case SQL_VARCHAR:
- {
- ::rtl::OString aString(::rtl::OUStringToOString(*(::rtl::OUString*)_pValue,_nTextEncoding));
- *pLen = SQL_NTS;
- *((::rtl::OString*)_pData) = aString;
- _nMaxLen = (SQLSMALLINT)aString.getLength();
-
- // Pointer on Char*
- _pData = (void*)aString.getStr();
- } break;
- case SQL_BIGINT:
- *((sal_Int64*)_pData) = *(sal_Int64*)_pValue;
- *pLen = sizeof(sal_Int64);
- break;
- case SQL_DECIMAL:
- case SQL_NUMERIC:
- {
- ::rtl::OString aString = ::rtl::OString::valueOf(*(double*)_pValue);
- _nMaxLen = (SQLSMALLINT)aString.getLength();
- *pLen = _nMaxLen;
- *((::rtl::OString*)_pData) = aString;
- // Pointer on Char*
- _pData = (void*)((::rtl::OString*)_pData)->getStr();
- } break;
- case SQL_BIT:
- case SQL_TINYINT:
- *((sal_Int8*)_pData) = *(sal_Int8*)_pValue;
- *pLen = sizeof(sal_Int8);
- break;
-
- case SQL_SMALLINT:
- *((sal_Int16*)_pData) = *(sal_Int16*)_pValue;
- *pLen = sizeof(sal_Int16);
- break;
- case SQL_INTEGER:
- *((sal_Int32*)_pData) = *(sal_Int32*)_pValue;
- *pLen = sizeof(sal_Int32);
- break;
- case SQL_FLOAT:
- *((float*)_pData) = *(float*)_pValue;
- *pLen = sizeof(float);
- break;
- case SQL_REAL:
- case SQL_DOUBLE:
- *((double*)_pData) = *(double*)_pValue;
- *pLen = sizeof(double);
- break;
- case SQL_BINARY:
- case SQL_VARBINARY:
- {
- _pData = (void*)((const ::com::sun::star::uno::Sequence< sal_Int8 > *)_pValue)->getConstArray();
- *pLen = ((const ::com::sun::star::uno::Sequence< sal_Int8 > *)_pValue)->getLength();
- } break;
- case SQL_LONGVARBINARY:
- {
- _pData = (void*)(sal_IntPtr)(columnIndex);
- sal_Int32 nLen = 0;
- nLen = ((const ::com::sun::star::uno::Sequence< sal_Int8 > *)_pValue)->getLength();
- *pLen = (SQLLEN)SQL_LEN_DATA_AT_EXEC(nLen);
- }
- break;
- case SQL_LONGVARCHAR:
- {
- _pData = (void*)(sal_IntPtr)(columnIndex);
- sal_Int32 nLen = 0;
- nLen = ((::rtl::OUString*)_pValue)->getLength();
- *pLen = (SQLLEN)SQL_LEN_DATA_AT_EXEC(nLen);
- } break;
- case SQL_DATE:
- *pLen = sizeof(DATE_STRUCT);
- *((DATE_STRUCT*)_pData) = *(DATE_STRUCT*)_pValue;
- break;
- case SQL_TIME:
- *pLen = sizeof(TIME_STRUCT);
- *((TIME_STRUCT*)_pData) = *(TIME_STRUCT*)_pValue;
- break;
- case SQL_TIMESTAMP:
- *pLen = sizeof(TIMESTAMP_STRUCT);
- *((TIMESTAMP_STRUCT*)_pData) = *(TIMESTAMP_STRUCT*)_pValue;
- break;
- }
- }
- catch ( ... )
- {
- }
-
- nRetcode = (*(T3SQLBindCol)_pConnection->getOdbcFunction(ODBC3SQLBindCol))(_aStatementHandle,
- (SQLUSMALLINT)columnIndex,
- fCType,
- _pData,
- nMaxLen,
- pLen
- );
- }
-
- OTools::ThrowException(_pConnection,nRetcode,_aStatementHandle,SQL_HANDLE_STMT,_xInterface);
-}
-// -----------------------------------------------------------------------------
-void OTools::ThrowException(OConnection* _pConnection,
- SQLRETURN _rRetCode,
- SQLHANDLE _pContext,
- SQLSMALLINT _nHandleType,
- const Reference< XInterface >& _xInterface,
- sal_Bool _bNoFound,
- rtl_TextEncoding _nTextEncoding) throw(SQLException)
-{
- switch(_rRetCode)
- {
- case SQL_NEED_DATA:
- case SQL_STILL_EXECUTING:
- case SQL_SUCCESS:
-
- case SQL_SUCCESS_WITH_INFO:
- return;
- case SQL_NO_DATA_FOUND:
- if(_bNoFound)
- return; // no need to throw a exception
- case SQL_ERROR: break;
-
-
- case SQL_INVALID_HANDLE: OSL_FAIL("SdbODBC3_SetStatus: SQL_INVALID_HANDLE");
- throw SQLException();
- }
-
- // Additional Information on the latest ODBC-functioncall available
- // SQLError provides this Information.
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "odbc", "Ocke.Janssen@sun.com", "OTools::ThrowException" );
-
- SDB_ODBC_CHAR szSqlState[5];
- SQLINTEGER pfNativeError;
- SDB_ODBC_CHAR szErrorMessage[SQL_MAX_MESSAGE_LENGTH];
- szErrorMessage[0] = '\0';
- SQLSMALLINT pcbErrorMsg = 0;
-
- // Information for latest operation:
- // when hstmt != SQL_NULL_HSTMT is (Used from SetStatus in SdbCursor, SdbTable, ...),
- // then the status of the latest statments will be fetched, without the Status of the last
- // Statments of this connection [what in this case will probably be the same, but the Reference
- // Manual isn't totally clear in this...].
- // corresponding for hdbc.
- SQLRETURN n = (*(T3SQLGetDiagRec)_pConnection->getOdbcFunction(ODBC3SQLGetDiagRec))(_nHandleType,_pContext,1,
- szSqlState,
- &pfNativeError,
- szErrorMessage,sizeof szErrorMessage - 1,&pcbErrorMsg);
- OSL_UNUSED( n );
- OSL_ENSURE(n != SQL_INVALID_HANDLE,"SdbODBC3_SetStatus: SQLError returned SQL_INVALID_HANDLE");
- OSL_ENSURE(n == SQL_SUCCESS || n == SQL_SUCCESS_WITH_INFO || n == SQL_NO_DATA_FOUND || n == SQL_ERROR,"SdbODBC3_SetStatus: SQLError failed");
-
- // For the Return Code of SQLError see ODBC 2.0 Programmer's Reference Page 287ff
- throw SQLException( ::rtl::OUString((char *)szErrorMessage,pcbErrorMsg,_nTextEncoding),
- _xInterface,
- ::rtl::OUString((char *)szSqlState,5,_nTextEncoding),
- pfNativeError,
- Any()
- );
-
-}
-// -------------------------------------------------------------------------
-Sequence<sal_Int8> OTools::getBytesValue(OConnection* _pConnection,
- SQLHANDLE _aStatementHandle,
- sal_Int32 columnIndex,
- SQLSMALLINT _fSqlType,
- sal_Bool &_bWasNull,
- const Reference< XInterface >& _xInterface) throw(SQLException, RuntimeException)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "odbc", "Ocke.Janssen@sun.com", "OTools::getBytesValue" );
- char aCharArray[2048];
- // First try to fetch the data with the little Buffer:
- SQLLEN nMaxLen = sizeof aCharArray - 1;
- // GETDATA(SQL_C_CHAR,aCharArray,nMaxLen);
- SQLLEN pcbValue = 0;
- OTools::ThrowException(_pConnection,(*(T3SQLGetData)_pConnection->getOdbcFunction(ODBC3SQLGetData))(_aStatementHandle,
- (SQLUSMALLINT)columnIndex,
- _fSqlType,
- (SQLPOINTER)aCharArray,
- nMaxLen,
- &pcbValue),
- _aStatementHandle,SQL_HANDLE_STMT,_xInterface);
-
- _bWasNull = pcbValue == SQL_NULL_DATA;
- if(_bWasNull)
- return Sequence<sal_Int8>();
-
- SQLINTEGER nBytes = pcbValue != SQL_NO_TOTAL ? std::min(pcbValue, nMaxLen) : nMaxLen;
- if ( ((pcbValue == SQL_NO_TOTAL) || pcbValue > nMaxLen) && aCharArray[nBytes-1] == 0 && nBytes > 0 )
- --nBytes;
- Sequence<sal_Int8> aData((sal_Int8*)aCharArray, nBytes);
-
- // It is about Binariy Data, a String, that for StarView is to long or
- // the driver kan't predict the length of the data - as well as save the
- // MemoryStream.
- while ((pcbValue == SQL_NO_TOTAL) || pcbValue > nMaxLen)
- {
- // At Strings the Buffer won't be completly used
- // (The last Byte is always a NULL-Byte, however it won't be counted with pcbValue)
- if (pcbValue != SQL_NO_TOTAL && (pcbValue - nMaxLen) < nMaxLen)
- nBytes = pcbValue - nMaxLen;
- else
- nBytes = nMaxLen;
-
- // While there is a "truncation"-Warning, proceed with fetching Data.
- OTools::ThrowException(_pConnection,(*(T3SQLGetData)_pConnection->getOdbcFunction(ODBC3SQLGetData))(_aStatementHandle,
- (SQLUSMALLINT)columnIndex,
- SQL_C_BINARY,
- &aCharArray,
- (SQLINTEGER)nBytes,
- &pcbValue),
- _aStatementHandle,SQL_HANDLE_STMT,_xInterface);
- sal_Int32 nLen = aData.getLength();
- aData.realloc(nLen + nBytes);
- memcpy(aData.getArray() + nLen, aCharArray, nBytes);
- }
- return aData;
-}
-// -------------------------------------------------------------------------
-::rtl::OUString OTools::getStringValue(OConnection* _pConnection,
- SQLHANDLE _aStatementHandle,
- sal_Int32 columnIndex,
- SQLSMALLINT _fSqlType,
- sal_Bool &_bWasNull,
- const Reference< XInterface >& _xInterface,
- rtl_TextEncoding _nTextEncoding) throw(SQLException, RuntimeException)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "odbc", "Ocke.Janssen@sun.com", "OTools::getStringValue" );
- ::rtl::OUStringBuffer aData;
- switch(_fSqlType)
- {
- case SQL_WVARCHAR:
- case SQL_WCHAR:
- case SQL_WLONGVARCHAR:
- {
- sal_Unicode waCharArray[2048];
- // read the unicode data
- SQLLEN nMaxLen = (sizeof(waCharArray) / sizeof(sal_Unicode)) - 1;
-
- SQLLEN pcbValue=0;
- OTools::ThrowException(_pConnection,(*(T3SQLGetData)_pConnection->getOdbcFunction(ODBC3SQLGetData))(_aStatementHandle,
- (SQLUSMALLINT)columnIndex,
- SQL_C_WCHAR,
- &waCharArray,
- (SQLLEN)nMaxLen*sizeof(sal_Unicode),
- &pcbValue),
- _aStatementHandle,SQL_HANDLE_STMT,_xInterface);
- _bWasNull = pcbValue == SQL_NULL_DATA;
- if(_bWasNull)
- return ::rtl::OUString();
- // at failure the GETDATA-Makro will stop with returning,
- // at NULL with break!
- SQLLEN nRealSize = 0;
- if ( pcbValue > -1 )
- nRealSize = pcbValue / sizeof(sal_Unicode);
- SQLLEN nLen = pcbValue != SQL_NO_TOTAL ? std::min(nRealSize, nMaxLen) : (nMaxLen-1);
- waCharArray[nLen] = 0;
- aData.append(waCharArray,nLen);
-
- // It is about Binariy Data, a String, that for StarView is to long or
- // the driver kan't predict the length of the data - as well as save the
- // MemoryStream.
- while ((pcbValue == SQL_NO_TOTAL ) || nLen > nMaxLen)
- {
- // At Strings the Buffer won't be completly used
- // (The last Byte is always a NULL-Byte, however it won't be counted with pcbValue)
- if (pcbValue != SQL_NO_TOTAL && (pcbValue - nMaxLen) < nMaxLen)
- nLen = pcbValue - nMaxLen;
- else
- nLen = nMaxLen;
-
- // While there is a "truncation"-Warning, proceed with fetching Data.
- OTools::ThrowException(_pConnection,(*(T3SQLGetData)_pConnection->getOdbcFunction(ODBC3SQLGetData))(_aStatementHandle,
- (SQLUSMALLINT)columnIndex,
- SQL_C_WCHAR,
- &waCharArray,
- (SQLLEN)nLen+1,
- &pcbValue),
- _aStatementHandle,SQL_HANDLE_STMT,_xInterface);
- nRealSize = 0;
- if ( pcbValue > -1 )
- nRealSize = pcbValue / sizeof(sal_Unicode);
- nLen = pcbValue != SQL_NO_TOTAL ? std::min(nRealSize, nMaxLen) : (nMaxLen-1);
- waCharArray[nLen] = 0;
-
- aData.append(::rtl::OUString(waCharArray));
- }
- }
- break;
- default:
- {
- char aCharArray[2048];
- // First try to fetch the data with the little Buffer:
- SQLLEN nMaxLen = sizeof aCharArray - 1;
- SQLLEN pcbValue = 0;
- OTools::ThrowException(_pConnection,(*(T3SQLGetData)_pConnection->getOdbcFunction(ODBC3SQLGetData))(_aStatementHandle,
- (SQLUSMALLINT)columnIndex,
- SQL_C_CHAR,
- &aCharArray,
- nMaxLen,
- &pcbValue),
- _aStatementHandle,SQL_HANDLE_STMT,_xInterface);
- _bWasNull = pcbValue == SQL_NULL_DATA;
- if(_bWasNull)
- return ::rtl::OUString();
-
- SQLLEN nLen = pcbValue != SQL_NO_TOTAL ? std::min(pcbValue, nMaxLen) : (nMaxLen-1);
- aCharArray[nLen] = 0;
- if ( ((pcbValue == SQL_NO_TOTAL) || pcbValue > nMaxLen) && aCharArray[nLen-1] == 0 && nLen > 0 )
- --nLen;
- aData.append(::rtl::OUString((const sal_Char*)aCharArray,nLen, _nTextEncoding));
-
- // It is about Binariy Data, a String, that for StarView is to long or
- // the driver kan't predict the length of the data - as well as save the
- // MemoryStream.
- while ((pcbValue == SQL_NO_TOTAL) || pcbValue > nMaxLen)
- {
- // While there is a "truncation"-Warning, proceed with fetching Data.
- OTools::ThrowException(_pConnection,(*(T3SQLGetData)_pConnection->getOdbcFunction(ODBC3SQLGetData))(_aStatementHandle,
- (SQLUSMALLINT)columnIndex,
- SQL_C_CHAR,
- &aCharArray,
- (SQLINTEGER)nMaxLen,
- &pcbValue),
- _aStatementHandle,SQL_HANDLE_STMT,_xInterface);
- nLen = pcbValue != SQL_NO_TOTAL ? std::min(pcbValue, nMaxLen) : (nMaxLen-1);
- if ( ((pcbValue == SQL_NO_TOTAL) || pcbValue > nMaxLen) && aCharArray[nLen-1] == 0 && nLen > 0 )
- --nLen;
- aCharArray[nLen] = 0;
-
- aData.append(::rtl::OUString((const sal_Char*)aCharArray,nLen,_nTextEncoding));
- }
-
- }
- }
-
- return aData.makeStringAndClear();
-}
-// -------------------------------------------------------------------------
-void OTools::GetInfo(OConnection* _pConnection,
- SQLHANDLE _aConnectionHandle,
- SQLUSMALLINT _nInfo,
- ::rtl::OUString &_rValue,
- const Reference< XInterface >& _xInterface,
- rtl_TextEncoding _nTextEncoding) throw(SQLException, RuntimeException)
-{
- char aValue[512];
- SQLSMALLINT nValueLen=0;
- OTools::ThrowException(_pConnection,
- (*(T3SQLGetInfo)_pConnection->getOdbcFunction(ODBC3SQLGetInfo))(_aConnectionHandle,_nInfo,aValue,(sizeof aValue)-1,&nValueLen),
- _aConnectionHandle,SQL_HANDLE_DBC,_xInterface);
-
- _rValue = ::rtl::OUString(aValue,nValueLen,_nTextEncoding);
-}
-// -------------------------------------------------------------------------
-void OTools::GetInfo(OConnection* _pConnection,
- SQLHANDLE _aConnectionHandle,
- SQLUSMALLINT _nInfo,
- sal_Int32 &_rValue,
- const Reference< XInterface >& _xInterface) throw(SQLException, RuntimeException)
-{
- SQLSMALLINT nValueLen;
- _rValue = 0; // in case the driver uses only 16 of the 32 bits (as it does, for example, for SQL_CATALOG_LOCATION)
- OTools::ThrowException(_pConnection,
- (*(T3SQLGetInfo)_pConnection->getOdbcFunction(ODBC3SQLGetInfo))(_aConnectionHandle,_nInfo,&_rValue,sizeof _rValue,&nValueLen),
- _aConnectionHandle,SQL_HANDLE_DBC,_xInterface);
-}
-// -------------------------------------------------------------------------
-void OTools::GetInfo(OConnection* _pConnection,
- SQLHANDLE _aConnectionHandle,
- SQLUSMALLINT _nInfo,
- SQLUINTEGER &_rValue,
- const Reference< XInterface >& _xInterface) throw(SQLException, RuntimeException)
-{
- SQLSMALLINT nValueLen;
- _rValue = 0; // in case the driver uses only 16 of the 32 bits (as it does, for example, for SQL_CATALOG_LOCATION)
- OTools::ThrowException(_pConnection,
- (*(T3SQLGetInfo)_pConnection->getOdbcFunction(ODBC3SQLGetInfo))(_aConnectionHandle,_nInfo,&_rValue,sizeof _rValue,&nValueLen),
- _aConnectionHandle,SQL_HANDLE_DBC,_xInterface);
-}
-// -------------------------------------------------------------------------
-void OTools::GetInfo(OConnection* _pConnection,
- SQLHANDLE _aConnectionHandle,
- SQLUSMALLINT _nInfo,
- SQLUSMALLINT &_rValue,
- const Reference< XInterface >& _xInterface) throw(SQLException, RuntimeException)
-{
- SQLSMALLINT nValueLen;
- _rValue = 0; // in case the driver uses only 16 of the 32 bits (as it does, for example, for SQL_CATALOG_LOCATION)
- OTools::ThrowException(_pConnection,
- (*(T3SQLGetInfo)_pConnection->getOdbcFunction(ODBC3SQLGetInfo))(_aConnectionHandle,_nInfo,&_rValue,sizeof _rValue,&nValueLen),
- _aConnectionHandle,SQL_HANDLE_DBC,_xInterface);
-}
-// -------------------------------------------------------------------------
-void OTools::GetInfo(OConnection* _pConnection,
- SQLHANDLE _aConnectionHandle,
- SQLUSMALLINT _nInfo,
- sal_Bool &_rValue,
- const Reference< XInterface >& _xInterface) throw(SQLException, RuntimeException)
-{
- SQLSMALLINT nValueLen;
- OTools::ThrowException(_pConnection,
- (*(T3SQLGetInfo)_pConnection->getOdbcFunction(ODBC3SQLGetInfo))(_aConnectionHandle,_nInfo,&_rValue,sizeof _rValue,&nValueLen),
- _aConnectionHandle,SQL_HANDLE_DBC,_xInterface);
-}
-// -------------------------------------------------------------------------
-sal_Int32 OTools::MapOdbcType2Jdbc(sal_Int32 _nType)
-{
- sal_Int32 nValue = DataType::VARCHAR;
- switch(_nType)
- {
- case SQL_BIT:
- nValue = DataType::BIT;
- break;
- case SQL_TINYINT:
- nValue = DataType::TINYINT;
- break;
- case SQL_SMALLINT:
- nValue = DataType::SMALLINT;
- break;
- case SQL_INTEGER:
- nValue = DataType::INTEGER;
- break;
- case SQL_BIGINT:
- nValue = DataType::BIGINT;
- break;
- case SQL_FLOAT:
- nValue = DataType::FLOAT;
- break;
- case SQL_REAL:
- nValue = DataType::REAL;
- break;
- case SQL_DOUBLE:
- nValue = DataType::DOUBLE;
- break;
- case SQL_NUMERIC:
- nValue = DataType::NUMERIC;
- break;
- case SQL_DECIMAL:
- nValue = DataType::DECIMAL;
- break;
- case SQL_WCHAR:
- case SQL_CHAR:
- nValue = DataType::CHAR;
- break;
- case SQL_WVARCHAR:
- case SQL_VARCHAR:
- nValue = DataType::VARCHAR;
- break;
- case SQL_WLONGVARCHAR:
- case SQL_LONGVARCHAR:
- nValue = DataType::LONGVARCHAR;
- break;
- case SQL_TYPE_DATE:
- case SQL_DATE:
- nValue = DataType::DATE;
- break;
- case SQL_TYPE_TIME:
- case SQL_TIME:
- nValue = DataType::TIME;
- break;
- case SQL_TYPE_TIMESTAMP:
- case SQL_TIMESTAMP:
- nValue = DataType::TIMESTAMP;
- break;
- case SQL_BINARY:
- nValue = DataType::BINARY;
- break;
- case SQL_VARBINARY:
- case SQL_GUID:
- nValue = DataType::VARBINARY;
- break;
- case SQL_LONGVARBINARY:
- nValue = DataType::LONGVARBINARY;
- break;
- default:
- OSL_ASSERT(!"Invalid type");
- }
- return nValue;
-}
-//--------------------------------------------------------------------
-// jdbcTypeToOdbc
-// Convert the JDBC SQL type to the correct ODBC type
-//--------------------------------------------------------------------
-sal_Int32 OTools::jdbcTypeToOdbc(sal_Int32 jdbcType)
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "odbc", "Ocke.Janssen@sun.com", "OTools::jdbcTypeToOdbc" );
- // For the most part, JDBC types match ODBC types. We'll
- // just convert the ones that we know are different
-
- sal_Int32 odbcType = jdbcType;
-
- switch (jdbcType)
- {
- case DataType::DATE:
- odbcType = SQL_DATE;
- break;
- case DataType::TIME:
- odbcType = SQL_TIME;
- break;
- case DataType::TIMESTAMP:
- odbcType = SQL_TIMESTAMP;
- break;
- }
-
- return odbcType;
-}
-//-----------------------------------------------------------------------------
-void OTools::getBindTypes(sal_Bool _bUseWChar,
- sal_Bool _bUseOldTimeDate,
- SQLSMALLINT _nOdbcType,
- SQLSMALLINT& fCType,
- SQLSMALLINT& fSqlType
- )
-{
- RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "odbc", "Ocke.Janssen@sun.com", "OTools::getBindTypes" );
- switch(_nOdbcType)
- {
- case SQL_CHAR: if(_bUseWChar)
- {
- fCType = SQL_C_WCHAR;
- fSqlType = SQL_WCHAR;
- }
- else
- {
- fCType = SQL_C_CHAR;
- fSqlType = SQL_CHAR;
- }
- break;
- case SQL_VARCHAR: if(_bUseWChar)
- {
- fCType = SQL_C_WCHAR;
- fSqlType = SQL_WVARCHAR;
- }
- else
- {
- fCType = SQL_C_CHAR;
- fSqlType = SQL_VARCHAR;
- }
- break;
- case SQL_LONGVARCHAR: if(_bUseWChar)
- {
- fCType = SQL_C_WCHAR;
- fSqlType = SQL_WLONGVARCHAR;
- }
- else
- {
- fCType = SQL_C_CHAR;
- fSqlType = SQL_LONGVARCHAR;
- }
- break;
- case SQL_DECIMAL: fCType = _bUseWChar ? SQL_C_WCHAR : SQL_C_CHAR;
- fSqlType = SQL_DECIMAL; break;
- case SQL_NUMERIC: fCType = _bUseWChar ? SQL_C_WCHAR : SQL_C_CHAR;
- fSqlType = SQL_NUMERIC; break;
- case SQL_BIT: fCType = SQL_C_TINYINT;
- fSqlType = SQL_INTEGER; break;
- case SQL_TINYINT: fCType = SQL_C_TINYINT;
- fSqlType = SQL_TINYINT; break;
- case SQL_SMALLINT: fCType = SQL_C_SHORT;
- fSqlType = SQL_SMALLINT; break;
- case SQL_INTEGER: fCType = SQL_C_LONG;
- fSqlType = SQL_INTEGER; break;
- case SQL_BIGINT: fCType = SQL_C_SBIGINT;
- fSqlType = SQL_BIGINT; break;
- case SQL_FLOAT: fCType = SQL_C_FLOAT;
- fSqlType = SQL_FLOAT; break;
- case SQL_REAL: fCType = SQL_C_DOUBLE;
- fSqlType = SQL_REAL; break;
- case SQL_DOUBLE: fCType = SQL_C_DOUBLE;
- fSqlType = SQL_DOUBLE; break;
- case SQL_BINARY: fCType = SQL_C_BINARY;
- fSqlType = SQL_BINARY; break;
- case SQL_VARBINARY:
- fCType = SQL_C_BINARY;
- fSqlType = SQL_VARBINARY; break;
- case SQL_LONGVARBINARY: fCType = SQL_C_BINARY;
- fSqlType = SQL_LONGVARBINARY; break;
- case SQL_DATE:
- if(_bUseOldTimeDate)
- {
- fCType = SQL_C_DATE;
- fSqlType = SQL_DATE;
- }
- else
- {
- fCType = SQL_C_TYPE_DATE;
- fSqlType = SQL_TYPE_DATE;
- }
- break;
- case SQL_TIME:
- if(_bUseOldTimeDate)
- {
- fCType = SQL_C_TIME;
- fSqlType = SQL_TIME;
- }
- else
- {
- fCType = SQL_C_TYPE_TIME;
- fSqlType = SQL_TYPE_TIME;
- }
- break;
- case SQL_TIMESTAMP:
- if(_bUseOldTimeDate)
- {
- fCType = SQL_C_TIMESTAMP;
- fSqlType = SQL_TIMESTAMP;
- }
- else
- {
- fCType = SQL_C_TYPE_TIMESTAMP;
- fSqlType = SQL_TYPE_TIMESTAMP;
- }
- break;
- default: fCType = SQL_C_BINARY;
- fSqlType = SQL_LONGVARBINARY; break;
- }
-}
-
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */