summaryrefslogtreecommitdiff
path: root/connectivity/source/drivers/odbc
diff options
context:
space:
mode:
Diffstat (limited to 'connectivity/source/drivers/odbc')
-rw-r--r--connectivity/source/drivers/odbc/OConnection.cxx539
-rw-r--r--connectivity/source/drivers/odbc/ODatabaseMetaData.cxx1593
-rw-r--r--connectivity/source/drivers/odbc/ODriver.cxx209
-rw-r--r--connectivity/source/drivers/odbc/OFunctions.cxx338
-rw-r--r--connectivity/source/drivers/odbc/OPreparedStatement.cxx1063
-rw-r--r--connectivity/source/drivers/odbc/OResultSet.cxx2051
-rw-r--r--connectivity/source/drivers/odbc/OResultSetMetaData.cxx254
-rw-r--r--connectivity/source/drivers/odbc/OStatement.cxx1004
-rw-r--r--connectivity/source/drivers/odbc/OTools.cxx545
-rw-r--r--connectivity/source/drivers/odbc/makefile.mk177
-rw-r--r--connectivity/source/drivers/odbc/odbc.map8
-rw-r--r--connectivity/source/drivers/odbc/odbc.xml70
-rw-r--r--connectivity/source/drivers/odbc/oservices.cxx212
13 files changed, 8063 insertions, 0 deletions
diff --git a/connectivity/source/drivers/odbc/OConnection.cxx b/connectivity/source/drivers/odbc/OConnection.cxx
new file mode 100644
index 000000000000..db68e9948559
--- /dev/null
+++ b/connectivity/source/drivers/odbc/OConnection.cxx
@@ -0,0 +1,539 @@
+/*************************************************************************
+ *
+ * $RCSfile: OConnection.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:14:23 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+#ifndef _CONNECTIVITY_OTOOLS_HXX_
+#include "odbc/OTools.hxx"
+#endif
+#ifndef _CONNECTIVITY_ODBC_OCONNECTION_HXX_
+#include "odbc/OConnection.hxx"
+#endif
+#ifndef _CONNECTIVITY_ODBC_ODATABASEMETADATA_HXX_
+#include "odbc/ODatabaseMetaData.hxx"
+#endif
+#ifndef _CONNECTIVITY_RESOURCE_HRC_
+#include "Resource.hrc"
+#endif
+#ifndef _CONNECTIVITY_MODULECONTEXT_HXX_
+#include "ModuleContext.hxx"
+#endif
+#ifndef _CONNECTIVITY_ODBC_OFUNCTIONS_HXX_
+#include "odbc/OFunctions.hxx"
+#endif
+#ifndef _CONNECTIVITY_ODBC_ODRIVER_HXX_
+#include "odbc/ODriver.hxx"
+#endif
+#ifndef _CONNECTIVITY_ODBC_OSTATEMENT_HXX_
+#include "odbc/OStatement.hxx"
+#endif
+#ifndef _CONNECTIVITY_ODBC_OPREPAREDSTATEMENT_HXX_
+#include "odbc/OPreparedStatement.hxx"
+#endif
+#ifndef _COM_SUN_STAR_SDBC_COLUMNVALUE_HPP_
+#include <com/sun/star/sdbc/ColumnValue.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
+#include <com/sun/star/sdbc/XRow.hpp>
+#endif
+#ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_
+#include <com/sun/star/lang/DisposedException.hpp>
+#endif
+
+using namespace connectivity::odbc;
+
+//------------------------------------------------------------------------------
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::sdbc;
+// --------------------------------------------------------------------------------
+OConnection::OConnection(const SQLHANDLE _pDriverHandle,ODBCDriver* _pDriver)
+ : OConnection_BASE(m_aMutex),
+ OSubComponent<OConnection>((::cppu::OWeakObject*)_pDriver),
+ m_pDriverHandleCopy(_pDriverHandle),
+ m_pDriver(_pDriver),
+ m_bClosed(sal_False),
+ m_xMetaData(NULL)
+{
+ ModuleContext::AddRef();
+}
+//-----------------------------------------------------------------------------
+OConnection::~OConnection()
+{
+ if(!isClosed( ))
+ close();
+ ModuleContext::ReleaseRef();
+}
+//-----------------------------------------------------------------------------
+void SAL_CALL OConnection::release() throw(RuntimeException)
+{
+ relase_ChildImpl();
+ OConnection_BASE::release();
+}
+
+//-----------------------------------------------------------------------------
+SQLRETURN OConnection::OpenConnection(const ::rtl::OUString& aConnectStr,sal_Int32 nTimeOut, sal_Bool bSilent)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ if (m_aConnectionHandle == SQL_NULL_HANDLE)
+ return -1;
+
+ sal_Bool bReadOnly; //weil Methode statisch hier noch einmal ein lokales bReadOnly
+ SQLRETURN nSQLRETURN = 0;
+ SDB_ODBC_CHAR szConnStrOut[4096];
+ SDB_ODBC_CHAR szConnStrIn[2048];
+ SWORD cbConnStrOut;
+ memset(szConnStrOut,'\0',4096);
+ memset(szConnStrIn,'\0',2048);
+ ::rtl::OString aConStr(::rtl::OUStringToOString(aConnectStr,osl_getThreadTextEncoding()));
+ memcpy(szConnStrIn, (SDB_ODBC_CHAR*) aConStr.getStr(), ::std::min<sal_Int32>((sal_Int32)2048,aConStr.getLength()));
+
+
+ N3SQLSetConnectAttr(m_aConnectionHandle,SQL_ATTR_LOGIN_TIMEOUT,(SQLPOINTER)nTimeOut,SQL_IS_INTEGER);
+ // Verbindung aufbauen
+
+#ifdef LINUX
+
+ nSQLRETURN = N3SQLDriverConnect(m_aConnectionHandle,
+ NULL,
+ szConnStrIn,
+ (SQLSMALLINT) ::std::min((sal_Int32)2048,aConStr.getLength()),
+ szConnStrOut,
+ (SQLSMALLINT) sizeof szConnStrOut,
+ &cbConnStrOut,
+ SQL_DRIVER_NOPROMPT);
+ if (nSQLRETURN == SQL_ERROR || nSQLRETURN == SQL_NO_DATA || SQL_SUCCESS_WITH_INFO == nSQLRETURN)
+ return nSQLRETURN;
+#else
+
+ SQLUSMALLINT nSilent = bSilent ? SQL_DRIVER_NOPROMPT : SQL_DRIVER_COMPLETE;
+ nSQLRETURN = N3SQLDriverConnect(m_aConnectionHandle,
+ NULL,
+ szConnStrIn,
+ (SQLSMALLINT) ::std::min<sal_Int32>((sal_Int32)2048,aConStr.getLength()),
+ szConnStrOut,
+ (SQLSMALLINT) sizeof szConnStrOut,
+ &cbConnStrOut,
+ nSilent);
+ if (nSQLRETURN == SQL_ERROR || nSQLRETURN == SQL_NO_DATA)
+ return nSQLRETURN;
+
+#endif //LINUX
+
+ try
+ {
+ ::rtl::OUString aVal;
+ OTools::GetInfo(m_aConnectionHandle,SQL_DATA_SOURCE_READ_ONLY,aVal,*this);
+ bReadOnly = !aVal.compareToAscii("Y");
+ }
+ catch(...)
+ {
+ bReadOnly = sal_True;
+ }
+
+#ifndef MAC
+ // autocoomit ist immer default
+
+ if (!bReadOnly)
+ N3SQLSetConnectAttr(m_aConnectionHandle,SQL_ATTR_AUTOCOMMIT,(SQLPOINTER)SQL_AUTOCOMMIT_ON,SQL_IS_INTEGER);
+#endif
+
+ return nSQLRETURN;
+}
+//-----------------------------------------------------------------------------
+SQLRETURN OConnection::Construct(const ::rtl::OUString& url,const Sequence< PropertyValue >& info) throw(SQLException)
+{
+ osl_incrementInterlockedCount( &m_refCount );
+ m_aConnectionHandle = SQL_NULL_HANDLE;
+
+ // Connection allozieren
+ N3SQLAllocHandle(SQL_HANDLE_DBC,m_pDriverHandleCopy,&m_aConnectionHandle);
+ if(m_aConnectionHandle == SQL_NULL_HANDLE)
+ throw SQLException();
+
+ sal_Int32 nLen = url.indexOf(':');
+ nLen = url.indexOf(':',nLen+1);
+ ::rtl::OUString aDSN(url.copy(nLen+1)),aUID,aPWD;
+
+ sal_Int32 nTimeout = 20;
+ sal_Bool bSilent = sal_True;
+ const PropertyValue *pBegin = info.getConstArray();
+ const PropertyValue *pEnd = pBegin + info.getLength();
+ for(;pBegin != pEnd;++pBegin)
+ {
+ if(!pBegin->Name.compareToAscii("Timeout"))
+ pBegin->Value >>= nTimeout;
+ else if(!pBegin->Name.compareToAscii("Silent"))
+ pBegin->Value >>= bSilent;
+ else if(!pBegin->Name.compareToAscii("user"))
+ {
+ pBegin->Value >>= aUID;
+ aDSN = aDSN + ::rtl::OUString::createFromAscii(";UID=") + aUID;
+ }
+ else if(!pBegin->Name.compareToAscii("password"))
+ {
+ pBegin->Value >>= aPWD;
+ aDSN = aDSN + ::rtl::OUString::createFromAscii(";PWD=") + aPWD;
+ }
+ }
+
+ SQLRETURN nSQLRETURN = OpenConnection(aDSN,nTimeout, bSilent);
+ if (nSQLRETURN == SQL_ERROR || nSQLRETURN == SQL_NO_DATA)
+ {
+ OTools::ThrowException(nSQLRETURN,m_aConnectionHandle,SQL_HANDLE_DBC,*this);
+ }
+ else if(SQL_SUCCESS_WITH_INFO == nSQLRETURN) // this driver does not support odbc3
+ {
+ }
+ osl_decrementInterlockedCount( &m_refCount );
+ return nSQLRETURN;
+}
+// XServiceInfo
+// --------------------------------------------------------------------------------
+IMPLEMENT_SERVICE_INFO(OConnection, "com.sun.star.sdbc.drivers.odbc.OConnection", "com.sun.star.sdbc.Connection")
+
+// --------------------------------------------------------------------------------
+Reference< XStatement > SAL_CALL OConnection::createStatement( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+ OStatement* pStmt = new OStatement(this);
+ m_aStatements.push_back(WeakReferenceHelper(*pStmt));
+ return pStmt;
+}
+// --------------------------------------------------------------------------------
+Reference< XPreparedStatement > SAL_CALL OConnection::prepareStatement( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+ if(m_aTypeInfo.empty())
+ buildTypeInfo();
+ OPreparedStatement* pStmt = new OPreparedStatement(this,m_aTypeInfo,sql);
+ m_aStatements.push_back(WeakReferenceHelper(*pStmt));
+ return pStmt;
+}
+// --------------------------------------------------------------------------------
+Reference< XPreparedStatement > SAL_CALL OConnection::prepareCall( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+ return NULL;
+}
+// --------------------------------------------------------------------------------
+::rtl::OUString SAL_CALL OConnection::nativeSQL( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ ::rtl::OString aSql(::rtl::OUStringToOString(sql.getStr(),osl_getThreadTextEncoding()));
+ char pOut[2048];
+ SQLINTEGER nOutLen;
+ OTools::ThrowException(N3SQLNativeSql(m_aConnectionHandle,(SDB_ODBC_CHAR*)aSql.getStr(),aSql.getLength(),(SDB_ODBC_CHAR*)pOut,2048,&nOutLen),m_aConnectionHandle,SQL_HANDLE_DBC,*this);
+ return ::rtl::OUString(pOut,nOutLen,osl_getThreadTextEncoding());
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL OConnection::setAutoCommit( sal_Bool autoCommit ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ OTools::ThrowException(N3SQLSetConnectAttr(m_aConnectionHandle,
+ SQL_ATTR_AUTOCOMMIT,
+ (SQLPOINTER)((autoCommit) ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF) ,SQL_IS_INTEGER),
+ m_aConnectionHandle,SQL_HANDLE_DBC,*this);
+}
+// --------------------------------------------------------------------------------
+sal_Bool SAL_CALL OConnection::getAutoCommit( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ sal_uInt32 nOption = 0;
+ OTools::ThrowException(N3SQLGetConnectAttr(m_aConnectionHandle,
+ SQL_ATTR_AUTOCOMMIT, &nOption,0,0),m_aConnectionHandle,SQL_HANDLE_DBC,*this);
+ return nOption == SQL_AUTOCOMMIT_ON ;
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL OConnection::commit( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ OTools::ThrowException(N3SQLEndTran(SQL_HANDLE_DBC,m_aConnectionHandle,SQL_COMMIT),m_aConnectionHandle,SQL_HANDLE_DBC,*this);
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL OConnection::rollback( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ OTools::ThrowException(N3SQLEndTran(SQL_HANDLE_DBC,m_aConnectionHandle,SQL_ROLLBACK),m_aConnectionHandle,SQL_HANDLE_DBC,*this);
+}
+// --------------------------------------------------------------------------------
+sal_Bool SAL_CALL OConnection::isClosed( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ return OConnection_BASE::rBHelper.bDisposed;
+}
+// --------------------------------------------------------------------------------
+Reference< XDatabaseMetaData > SAL_CALL OConnection::getMetaData( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ if(!m_xMetaData.is())
+ m_xMetaData = new ODatabaseMetaData(m_aConnectionHandle,this);
+
+ return m_xMetaData;
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL OConnection::setReadOnly( sal_Bool readOnly ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ OTools::ThrowException(
+ N3SQLSetConnectAttr(m_aConnectionHandle,SQL_ATTR_ACCESS_MODE,(SQLPOINTER)readOnly,SQL_IS_INTEGER),
+ m_aConnectionHandle,SQL_HANDLE_DBC,*this);
+}
+// --------------------------------------------------------------------------------
+sal_Bool SAL_CALL OConnection::isReadOnly( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_DATA_SOURCE_READ_ONLY,aValue,*this);
+ return aValue == ::rtl::OUString::createFromAscii("Y");
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL OConnection::setCatalog( const ::rtl::OUString& catalog ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ ::rtl::OString aCat(::rtl::OUStringToOString(catalog.getStr(),osl_getThreadTextEncoding()));
+ OTools::ThrowException(
+ N3SQLSetConnectAttr(m_aConnectionHandle,SQL_ATTR_CURRENT_CATALOG,(SDB_ODBC_CHAR*)aCat.getStr(),SQL_NTS),
+ m_aConnectionHandle,SQL_HANDLE_DBC,*this);
+}
+// --------------------------------------------------------------------------------
+::rtl::OUString SAL_CALL OConnection::getCatalog( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ sal_Int32 nValueLen;
+ char pCat[1024];
+ OTools::ThrowException(
+ N3SQLGetConnectAttr(m_aConnectionHandle,SQL_ATTR_CURRENT_CATALOG,(SDB_ODBC_CHAR*)pCat,1024,&nValueLen),
+ m_aConnectionHandle,SQL_HANDLE_DBC,*this);
+
+ return ::rtl::OUString(pCat,nValueLen,osl_getThreadTextEncoding());
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL OConnection::setTransactionIsolation( sal_Int32 level ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ OTools::ThrowException(N3SQLSetConnectAttr(m_aConnectionHandle,
+ SQL_ATTR_TXN_ISOLATION,
+ (SQLPOINTER)level,SQL_IS_INTEGER),
+ m_aConnectionHandle,SQL_HANDLE_DBC,*this);
+}
+// --------------------------------------------------------------------------------
+sal_Int32 SAL_CALL OConnection::getTransactionIsolation( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ sal_Int32 nTxn = 0;
+ SQLINTEGER nValueLen;
+ OTools::ThrowException(
+ N3SQLGetConnectAttr(m_aConnectionHandle,SQL_ATTR_TXN_ISOLATION,&nTxn,sizeof nTxn,&nValueLen),
+ m_aConnectionHandle,SQL_HANDLE_DBC,*this);
+ return nTxn;
+}
+// --------------------------------------------------------------------------------
+Reference< ::com::sun::star::container::XNameAccess > SAL_CALL OConnection::getTypeMap( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ return NULL;
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL OConnection::setTypeMap( const Reference< ::com::sun::star::container::XNameAccess >& typeMap ) throw(SQLException, RuntimeException)
+{
+}
+// --------------------------------------------------------------------------------
+// XCloseable
+void SAL_CALL OConnection::close( ) throw(SQLException, RuntimeException)
+{
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OConnection_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+ }
+ dispose();
+}
+// --------------------------------------------------------------------------------
+// XWarningsSupplier
+Any SAL_CALL OConnection::getWarnings( ) throw(SQLException, RuntimeException)
+{
+ return Any();
+}
+// --------------------------------------------------------------------------------
+void SAL_CALL OConnection::clearWarnings( ) throw(SQLException, RuntimeException)
+{
+}
+//--------------------------------------------------------------------
+void OConnection::buildTypeInfo() throw( SQLException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+
+ Reference< XResultSet> xRs = getMetaData ()->getTypeInfo ();
+ Reference< XRow> xRow(xRs,UNO_QUERY);
+ // Information for a single SQL type
+
+ // Loop on the result set until we reach end of file
+
+ while (xRs->next ())
+ {
+ OTypeInfo aInfo;
+ aInfo.aTypeName = xRow->getString (1);
+ aInfo.nType = xRow->getShort (2);
+ aInfo.nPrecision = xRow->getInt (3);
+ aInfo.aLiteralPrefix = xRow->getString (4);
+ aInfo.aLiteralSuffix = xRow->getString (5);
+ aInfo.aCreateParams = xRow->getString (6);
+ aInfo.bNullable = xRow->getBoolean (7) == ColumnValue::NULLABLE;
+ aInfo.bCaseSensitive = xRow->getBoolean (8);
+ aInfo.nSearchType = xRow->getShort (9);
+ aInfo.bUnsigned = xRow->getBoolean (10);
+ aInfo.bCurrency = xRow->getBoolean (11);
+ aInfo.bAutoIncrement = xRow->getBoolean (12);
+ aInfo.aLocalTypeName = xRow->getString (13);
+ aInfo.nMinimumScale = xRow->getShort (14);
+ aInfo.nMaximumScale = xRow->getShort (15);
+ aInfo.nNumPrecRadix = xRow->getInt (18);
+
+
+
+ // Now that we have the type info, save it
+ // in the Hashtable if we don't already have an
+ // entry for this SQL type.
+
+ m_aTypeInfo.push_back(aInfo);
+ }
+
+ // Close the result set/statement.
+
+ Reference< XCloseable> xClose(xRs,UNO_QUERY);
+ xClose->close();
+}
+//------------------------------------------------------------------------------
+void OConnection::disposing()
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+
+
+ // m_aTables.disposing();
+ for (OWeakRefArray::iterator i = m_aStatements.begin(); m_aStatements.end() != i; ++i)
+ {
+ Reference< XComponent > xComp(i->get(), UNO_QUERY);
+ if (xComp.is())
+ xComp->dispose();
+ }
+ m_aStatements.clear();
+
+ OTools::ThrowException(N3SQLDisconnect(m_aConnectionHandle),m_aConnectionHandle,SQL_HANDLE_DBC,*this);
+ m_bClosed = sal_True;
+ m_xMetaData = NULL;
+
+ dispose_ChildImpl();
+ OConnection_BASE::disposing();
+
+// for (OWeakRefArray::iterator j = m_aComposers.begin(); m_aComposers.end() != j; j++)
+// {
+// Reference< XComponent > xComp(j->get(), UNO_QUERY);
+// if (xComp.is())
+// xComp->dispose();
+// }
+// m_aComposers.clear();
+}
+
+
diff --git a/connectivity/source/drivers/odbc/ODatabaseMetaData.cxx b/connectivity/source/drivers/odbc/ODatabaseMetaData.cxx
new file mode 100644
index 000000000000..e9b81e3dd70f
--- /dev/null
+++ b/connectivity/source/drivers/odbc/ODatabaseMetaData.cxx
@@ -0,0 +1,1593 @@
+/*************************************************************************
+ *
+ * $RCSfile: ODatabaseMetaData.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:14:23 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_ODBC_ODATABASEMETADATA_HXX_
+#include "odbc/ODatabaseMetaData.hxx"
+#endif
+#ifndef _CONNECTIVITY_OTOOLS_HXX_
+#include "odbc/OTools.hxx"
+#endif
+#ifndef _CONNECTIVITY_ODBC_ORESULTSET_HXX_
+#include "odbc/OResultSet.hxx"
+#endif
+#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
+#include <com/sun/star/sdbc/DataType.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBC_RESULTSETTYPE_HPP_
+#include <com/sun/star/sdbc/ResultSetType.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBC_RESULTSETCONCURRENCY_HPP_
+#include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
+#endif
+#ifndef _CONNECTIVITY_OFUNCTIONDEFS_HXX_
+#include "odbc/OFunctiondefs.hxx"
+#endif
+
+
+using namespace connectivity::odbc;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::sdbc;
+
+ODatabaseMetaData::ODatabaseMetaData(const SQLHANDLE _pHandle,OConnection* _pCon)
+ : m_aConnectionHandle(_pHandle),m_pConnection(_pCon)
+{
+ m_pConnection->acquire();
+}
+// -------------------------------------------------------------------------
+ODatabaseMetaData::~ODatabaseMetaData()
+{
+ if (m_pConnection)
+ m_pConnection->release();
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTypeInfo( ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openTypeInfo();
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getCatalogs( ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openCatalogs();
+ return xRef;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getCatalogSeparator( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aVal;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CATALOG_NAME_SEPARATOR,aVal,*this);
+
+ return aVal;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getSchemas( ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openSchemas();
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumnPrivileges(
+ const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table,
+ const ::rtl::OUString& columnNamePattern ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openColumnPrivileges(catalog,schema,table,columnNamePattern);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getColumns(
+ const Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern,
+ const ::rtl::OUString& columnNamePattern ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openColumns(catalog,schemaPattern,tableNamePattern,columnNamePattern);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTables(
+ const Any& catalog, const ::rtl::OUString& schemaPattern,
+ const ::rtl::OUString& tableNamePattern, const Sequence< ::rtl::OUString >& types ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openTables(catalog,schemaPattern,tableNamePattern,types);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getProcedureColumns(
+ const Any& catalog, const ::rtl::OUString& schemaPattern,
+ const ::rtl::OUString& procedureNamePattern, const ::rtl::OUString& columnNamePattern ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openProcedureColumns(catalog,schemaPattern,procedureNamePattern,columnNamePattern);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getProcedures(
+ const Any& catalog, const ::rtl::OUString& schemaPattern,
+ const ::rtl::OUString& procedureNamePattern ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openProcedures(catalog,schemaPattern,procedureNamePattern);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getVersionColumns(
+ const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openVersionColumns(catalog,schema,table);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxBinaryLiteralLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_BINARY_LITERAL_LEN,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxRowSize( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_ROW_SIZE,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxCatalogNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_CATALOG_NAME_LEN,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxCharLiteralLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_CHAR_LITERAL_LEN,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_COLUMN_NAME_LEN,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInIndex( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_COLUMNS_IN_INDEX,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxCursorNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_CURSOR_NAME_LEN,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxConnections( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_ACTIVE_CONNECTIONS,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInTable( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_COLUMNS_IN_TABLE,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxStatementLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_STATEMENT_LEN,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxTableNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_TABLE_NAME_LEN,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxTablesInSelect( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_TABLES_IN_SELECT,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getExportedKeys(
+ const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openExportedKeys(catalog,schema,table);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getImportedKeys(
+ const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openImportedKeys(catalog,schema,table);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getPrimaryKeys(
+ const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openPrimaryKeys(catalog,schema,table);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getIndexInfo(
+ const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table,
+ sal_Bool unique, sal_Bool approximate ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openIndexInfo(catalog,schema,table,unique,approximate);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getBestRowIdentifier(
+ const Any& catalog, const ::rtl::OUString& schema, const ::rtl::OUString& table, sal_Int32 scope,
+ sal_Bool nullable ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openBestRowIdentifier(catalog,schema,table,scope,nullable);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTablePrivileges(
+ const Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openTablePrivileges(catalog,schemaPattern,tableNamePattern);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getCrossReference(
+ const Any& primaryCatalog, const ::rtl::OUString& primarySchema,
+ const ::rtl::OUString& primaryTable, const Any& foreignCatalog,
+ const ::rtl::OUString& foreignSchema, const ::rtl::OUString& foreignTable ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openForeignKeys(primaryCatalog,primarySchema.toChar() == '%' ? &primarySchema : NULL,&primaryTable,
+ foreignCatalog, foreignSchema.toChar() == '%' ? &foreignSchema : NULL,&foreignTable);
+ return xRef;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::doesMaxRowSizeIncludeBlobs( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aVal;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_ROW_SIZE_INCLUDES_LONG,aVal,*this);
+ return aVal.toChar() == 'Y';
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::storesLowerCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_QUOTED_IDENTIFIER_CASE,nValue,*this);
+ return nValue == SQL_IC_LOWER;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::storesLowerCaseIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_IDENTIFIER_CASE,nValue,*this);
+ return nValue == SQL_IC_LOWER;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::storesMixedCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_QUOTED_IDENTIFIER_CASE,nValue,*this);
+ return nValue == SQL_IC_MIXED;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::storesMixedCaseIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_IDENTIFIER_CASE,nValue,*this);
+ return nValue == SQL_IC_MIXED;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::storesUpperCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_QUOTED_IDENTIFIER_CASE,nValue,*this);
+ return nValue == SQL_IC_UPPER;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::storesUpperCaseIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_IDENTIFIER_CASE,nValue,*this);
+ return nValue == SQL_IC_UPPER;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsAlterTableWithAddColumn( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_ALTER_TABLE,nValue,*this);
+ return nValue == SQL_AT_ADD_COLUMN;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsAlterTableWithDropColumn( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_ALTER_TABLE,nValue,*this);
+ return nValue == SQL_AT_DROP_COLUMN;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxIndexLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_INDEX_SIZE,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsNonNullableColumns( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_NON_NULLABLE_COLUMNS,nValue,*this);
+ return nValue == SQL_NNC_NON_NULL;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getCatalogTerm( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aVal;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CATALOG_TERM,aVal,*this);
+ return aVal;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getIdentifierQuoteString( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aVal;
+ OTools::GetInfo(m_aConnectionHandle,SQL_IDENTIFIER_QUOTE_CHAR,aVal,*this);
+ return aVal;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getExtraNameCharacters( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aVal;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SPECIAL_CHARACTERS,aVal,*this);
+ return aVal;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsDifferentTableCorrelationNames( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
+ return nValue != SQL_CN_NONE;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::isCatalogAtStart( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CATALOG_LOCATION,nValue,*this);
+ return nValue == SQL_CL_START;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::dataDefinitionIgnoredInTransactions( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_TXN_CAPABLE,nValue,*this);
+ return nValue == SQL_TC_DDL_IGNORE;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::dataDefinitionCausesTransactionCommit( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_TXN_CAPABLE,nValue,*this);
+ return nValue == SQL_TC_DDL_COMMIT;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsDataManipulationTransactionsOnly( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_TXN_CAPABLE,nValue,*this);
+ return nValue == SQL_TC_DML;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsDataDefinitionAndDataManipulationTransactions( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_TXN_CAPABLE,nValue,*this);
+ return nValue == SQL_TC_ALL;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsPositionedDelete( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_DYNAMIC_CURSOR_ATTRIBUTES1,nValue,*this);
+ return (nValue & SQL_CA1_POS_DELETE) == SQL_CA1_POS_DELETE;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsPositionedUpdate( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_DYNAMIC_CURSOR_ATTRIBUTES1,nValue,*this);
+ return (nValue & SQL_CA1_POS_UPDATE) == SQL_CA1_POS_UPDATE;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenStatementsAcrossRollback( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CURSOR_ROLLBACK_BEHAVIOR,nValue,*this);
+ return nValue == SQL_CB_PRESERVE || nValue == SQL_CB_CLOSE;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenStatementsAcrossCommit( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CURSOR_COMMIT_BEHAVIOR,nValue,*this);
+ return nValue == SQL_CB_PRESERVE || nValue == SQL_CB_CLOSE;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenCursorsAcrossCommit( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CURSOR_COMMIT_BEHAVIOR,nValue,*this);
+ return nValue == SQL_CB_PRESERVE;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsOpenCursorsAcrossRollback( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CURSOR_ROLLBACK_BEHAVIOR,nValue,*this);
+ return nValue == SQL_CB_PRESERVE;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsTransactionIsolationLevel( sal_Int32 level ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_TXN_ISOLATION_OPTION,nValue,*this);
+ return (nValue & level) == level;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInDataManipulation( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SCHEMA_USAGE,nValue,*this);
+ return (nValue & SQL_SU_DML_STATEMENTS) == SQL_SU_DML_STATEMENTS;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92FullSQL( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SQL_CONFORMANCE,nValue,*this);
+ return nValue == SQL_SC_SQL92_FULL;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92EntryLevelSQL( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SQL_CONFORMANCE,nValue,*this);
+ return nValue == SQL_SC_SQL92_ENTRY;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsIntegrityEnhancementFacility( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aStr;
+ OTools::GetInfo(m_aConnectionHandle,SQL_INTEGRITY,aStr,*this);
+ return aStr.toChar() == 'Y';
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInIndexDefinitions( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SCHEMA_USAGE,nValue,*this);
+ return (nValue & SQL_SU_INDEX_DEFINITION) == SQL_SU_INDEX_DEFINITION;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInTableDefinitions( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SCHEMA_USAGE,nValue,*this);
+ return (nValue & SQL_SU_TABLE_DEFINITION) == SQL_SU_TABLE_DEFINITION;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInTableDefinitions( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CATALOG_USAGE,nValue,*this);
+ return (nValue & SQL_CU_TABLE_DEFINITION) == SQL_CU_TABLE_DEFINITION;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInIndexDefinitions( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CATALOG_USAGE,nValue,*this);
+ return (nValue & SQL_CU_INDEX_DEFINITION) == SQL_CU_INDEX_DEFINITION;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInDataManipulation( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CATALOG_USAGE,nValue,*this);
+ return (nValue & SQL_CU_DML_STATEMENTS) == SQL_CU_DML_STATEMENTS;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsOuterJoins( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_OJ_CAPABILITIES,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getTableTypes( ) throw(SQLException, RuntimeException)
+{
+ SQLHANDLE hStmt;
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&hStmt);
+
+ OResultSet* pResult = new OResultSet(hStmt);
+ Reference< XResultSet > xRef = pResult;
+ pResult->openTablesTypes();
+ return xRef;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxStatements( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_CONCURRENT_ACTIVITIES,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxProcedureNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_PROCEDURE_NAME_LEN,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxSchemaNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_SCHEMA_NAME_LEN,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsTransactions( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_TXN_CAPABLE,nValue,*this);
+ return nValue != SQL_TC_NONE;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::allProceduresAreCallable( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_ACCESSIBLE_PROCEDURES,aValue,*this);
+ return aValue.toChar() == 'Y';
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsStoredProcedures( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_PROCEDURES,aValue,*this);
+ return aValue.toChar() == 'Y';
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsSelectForUpdate( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_DYNAMIC_CURSOR_ATTRIBUTES1,nValue,*this);
+ return (nValue & SQL_CA1_POSITIONED_UPDATE) == SQL_CA1_POSITIONED_UPDATE;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::allTablesAreSelectable( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_ACCESSIBLE_TABLES,aValue,*this);
+ return aValue.toChar() == 'Y';
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::isReadOnly( ) throw(SQLException, RuntimeException)
+{
+ sal_Bool bValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_DATA_SOURCE_READ_ONLY,bValue,*this);
+ return bValue;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::usesLocalFiles( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_FILE_USAGE,nValue,*this);
+ return nValue == SQL_FILE_CATALOG;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::usesLocalFilePerTable( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_FILE_USAGE,nValue,*this);
+ return nValue == SQL_FILE_TABLE;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsTypeConversion( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_FUNCTIONS,nValue,*this);
+ return (nValue & SQL_FN_CVT_CONVERT) == SQL_FN_CVT_CONVERT;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::nullPlusNonNullIsNull( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONCAT_NULL_BEHAVIOR,nValue,*this);
+ return nValue == SQL_CB_NULL;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsColumnAliasing( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_COLUMN_ALIAS,aValue,*this);
+ return aValue.toChar() == 'Y';
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsTableCorrelationNames( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
+ return nValue != SQL_CN_NONE;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsConvert( sal_Int32 fromType, sal_Int32 toType ) throw(SQLException, RuntimeException)
+{
+ if(fromType == toType)
+ return sal_True;
+
+ sal_Int32 nValue=0;
+ switch(fromType)
+ {
+ case DataType::BIT:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_BIT,nValue,*this);
+ break;
+ case DataType::TINYINT:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_TINYINT,nValue,*this);
+ break;
+ case DataType::SMALLINT:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_SMALLINT,nValue,*this);
+ break;
+ case DataType::INTEGER:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_INTEGER,nValue,*this);
+ break;
+ case DataType::BIGINT:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_BIGINT,nValue,*this);
+ break;
+ case DataType::FLOAT:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_FLOAT,nValue,*this);
+ break;
+ case DataType::REAL:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_REAL,nValue,*this);
+ break;
+ case DataType::DOUBLE:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_DOUBLE,nValue,*this);
+ break;
+ case DataType::NUMERIC:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_NUMERIC,nValue,*this);
+ break;
+ case DataType::DECIMAL:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_DECIMAL,nValue,*this);
+ break;
+ case DataType::CHAR:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_CHAR,nValue,*this);
+ break;
+ case DataType::VARCHAR:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_VARCHAR,nValue,*this);
+ break;
+ case DataType::LONGVARCHAR:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_LONGVARCHAR,nValue,*this);
+ break;
+ case DataType::DATE:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_DATE,nValue,*this);
+ break;
+ case DataType::TIME:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_TIME,nValue,*this);
+ break;
+ case DataType::TIMESTAMP:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_TIMESTAMP,nValue,*this);
+ break;
+ case DataType::BINARY:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_BINARY,nValue,*this);
+ break;
+ case DataType::VARBINARY:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_VARBINARY,nValue,*this);
+ break;
+ case DataType::LONGVARBINARY:
+ OTools::GetInfo(m_aConnectionHandle,SQL_CONVERT_LONGVARBINARY,nValue,*this);
+ break;
+ case DataType::SQLNULL:
+ // OTools::GetInfo(m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
+ break;
+ case DataType::OTHER:
+ // OTools::GetInfo(m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
+ break;
+ case DataType::OBJECT:
+ // OTools::GetInfo(m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
+ break;
+ case DataType::DISTINCT:
+ // OTools::GetInfo(m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
+ break;
+ case DataType::STRUCT:
+ // OTools::GetInfo(m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
+ break;
+ case DataType::ARRAY:
+ // OTools::GetInfo(m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
+ break;
+ case DataType::BLOB:
+ // OTools::GetInfo(m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
+ break;
+ case DataType::CLOB:
+ // OTools::GetInfo(m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
+ break;
+ case DataType::REF:
+ // OTools::GetInfo(m_aConnectionHandle,SQL_CORRELATION_NAME,nValue,*this);
+ break;
+ }
+ sal_Bool bConvert = sal_False;
+ switch(toType)
+ {
+ case DataType::BIT:
+ bConvert = (nValue & SQL_CVT_BIT) == SQL_CVT_BIT;
+ break;
+ case DataType::TINYINT:
+ bConvert = (nValue & SQL_CVT_TINYINT) == SQL_CVT_TINYINT;
+ break;
+ case DataType::SMALLINT:
+ bConvert = (nValue & SQL_CVT_SMALLINT) == SQL_CVT_SMALLINT;
+ break;
+ case DataType::INTEGER:
+ bConvert = (nValue & SQL_CVT_INTEGER) == SQL_CVT_INTEGER;
+ break;
+ case DataType::BIGINT:
+ bConvert = (nValue & SQL_CVT_BIGINT) == SQL_CVT_BIGINT;
+ break;
+ case DataType::FLOAT:
+ bConvert = (nValue & SQL_CVT_FLOAT) == SQL_CVT_FLOAT;
+ break;
+ case DataType::REAL:
+ bConvert = (nValue & SQL_CVT_REAL) == SQL_CVT_REAL;
+ break;
+ case DataType::DOUBLE:
+ bConvert = (nValue & SQL_CVT_DOUBLE) == SQL_CVT_DOUBLE;
+ break;
+ case DataType::NUMERIC:
+ bConvert = (nValue & SQL_CVT_NUMERIC) == SQL_CVT_NUMERIC;
+ break;
+ case DataType::DECIMAL:
+ bConvert = (nValue & SQL_CVT_DECIMAL) == SQL_CVT_DECIMAL;
+ break;
+ case DataType::CHAR:
+ bConvert = (nValue & SQL_CVT_CHAR) == SQL_CVT_CHAR;
+ break;
+ case DataType::VARCHAR:
+ bConvert = (nValue & SQL_CVT_VARCHAR) == SQL_CVT_VARCHAR;
+ break;
+ case DataType::LONGVARCHAR:
+ bConvert = (nValue & SQL_CVT_LONGVARCHAR) == SQL_CVT_LONGVARCHAR;
+ break;
+ case DataType::DATE:
+ bConvert = (nValue & SQL_CVT_DATE) == SQL_CVT_DATE;
+ break;
+ case DataType::TIME:
+ bConvert = (nValue & SQL_CVT_TIME) == SQL_CVT_TIME;
+ break;
+ case DataType::TIMESTAMP:
+ bConvert = (nValue & SQL_CVT_TIMESTAMP) == SQL_CVT_TIMESTAMP;
+ break;
+ case DataType::BINARY:
+ bConvert = (nValue & SQL_CVT_BINARY) == SQL_CVT_BINARY;
+ break;
+ case DataType::VARBINARY:
+ bConvert = (nValue & SQL_CVT_VARBINARY) == SQL_CVT_VARBINARY;
+ break;
+ case DataType::LONGVARBINARY:
+ bConvert = (nValue & SQL_CVT_LONGVARBINARY) == SQL_CVT_LONGVARBINARY;
+ break;
+ }
+
+ return bConvert;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsExpressionsInOrderBy( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_EXPRESSIONS_IN_ORDERBY,aValue,*this);
+ return aValue.toChar() == 'Y';
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsGroupBy( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_GROUP_BY,nValue,*this);
+ return nValue != SQL_GB_NOT_SUPPORTED;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsGroupByBeyondSelect( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_GROUP_BY,nValue,*this);
+ return nValue != SQL_GB_GROUP_BY_CONTAINS_SELECT;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsGroupByUnrelated( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_GROUP_BY,nValue,*this);
+ return nValue == SQL_GB_NO_RELATION;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsMultipleTransactions( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MULTIPLE_ACTIVE_TXN,aValue,*this);
+ return aValue.toChar() == 'Y';
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsMultipleResultSets( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MULT_RESULT_SETS,aValue,*this);
+ return aValue.toChar() == 'Y';
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsLikeEscapeClause( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_LIKE_ESCAPE_CLAUSE,aValue,*this);
+ return aValue.toChar() == 'Y';
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsOrderByUnrelated( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_ORDER_BY_COLUMNS_IN_SELECT,aValue,*this);
+ return aValue.toChar() == 'N';
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsUnion( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_UNION,nValue,*this);
+ return (nValue & SQL_U_UNION) == SQL_U_UNION;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsUnionAll( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_UNION,nValue,*this);
+ return (nValue & SQL_U_UNION_ALL) == SQL_U_UNION_ALL;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsMixedCaseIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_IDENTIFIER_CASE,nValue,*this);
+ return nValue == SQL_IC_MIXED;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsMixedCaseQuotedIdentifiers( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_QUOTED_IDENTIFIER_CASE,nValue,*this);
+ return nValue == SQL_IC_MIXED;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedAtEnd( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_NULL_COLLATION,nValue,*this);
+ return nValue == SQL_NC_END;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedAtStart( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_NULL_COLLATION,nValue,*this);
+ return nValue == SQL_NC_START;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedHigh( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_NULL_COLLATION,nValue,*this);
+ return nValue == SQL_NC_HIGH;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::nullsAreSortedLow( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_NULL_COLLATION,nValue,*this);
+ return nValue == SQL_NC_LOW;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInProcedureCalls( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SCHEMA_USAGE,nValue,*this);
+ return nValue & SQL_SU_PROCEDURE_INVOCATION;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsSchemasInPrivilegeDefinitions( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SCHEMA_USAGE,nValue,*this);
+ return nValue & SQL_SU_PRIVILEGE_DEFINITION;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInProcedureCalls( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CATALOG_USAGE,nValue,*this);
+ return nValue & SQL_CU_PROCEDURE_INVOCATION;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsCatalogsInPrivilegeDefinitions( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CATALOG_USAGE,nValue,*this);
+ return nValue & SQL_CU_PRIVILEGE_DEFINITION;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsCorrelatedSubqueries( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SUBQUERIES,nValue,*this);
+ return (nValue & SQL_SQ_CORRELATED_SUBQUERIES) == SQL_SQ_CORRELATED_SUBQUERIES;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInComparisons( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SUBQUERIES,nValue,*this);
+ return (nValue & SQL_SQ_COMPARISON) == SQL_SQ_COMPARISON;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInExists( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SUBQUERIES,nValue,*this);
+ return (nValue & SQL_SQ_EXISTS) == SQL_SQ_EXISTS;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInIns( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SUBQUERIES,nValue,*this);
+ return (nValue & SQL_SQ_IN) == SQL_SQ_IN;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsSubqueriesInQuantifieds( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SUBQUERIES,nValue,*this);
+ return (nValue & SQL_SQ_QUANTIFIED) == SQL_SQ_QUANTIFIED;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsANSI92IntermediateSQL( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SQL_CONFORMANCE,nValue,*this);
+ return nValue == SQL_SC_SQL92_INTERMEDIATE;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getURL( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue = ::rtl::OUString::createFromAscii("sdbc:odbc:");
+ OTools::GetInfo(m_aConnectionHandle,SQL_DATA_SOURCE_NAME,aValue,*this);
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getUserName( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_USER_NAME,aValue,*this);
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getDriverName( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_DRIVER_NAME,aValue,*this);
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getDriverVersion( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_DRIVER_ODBC_VER,aValue,*this);
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getDatabaseProductVersion( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_DRIVER_VER,aValue,*this);
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getDatabaseProductName( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_DBMS_NAME,aValue,*this);
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getProcedureTerm( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_PROCEDURE_TERM,aValue,*this);
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getSchemaTerm( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SCHEMA_TERM,aValue,*this);
+ return aValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMajorVersion( ) throw(RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_DRIVER_VER,aValue,*this);
+ return aValue.copy(0,aValue.indexOf('.')).toInt32();
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getDefaultTransactionIsolation( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SUBQUERIES,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getDriverMinorVersion( ) throw(RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_DRIVER_VER,aValue,*this);
+ return aValue.copy(0,aValue.lastIndexOf('.')).toInt32();
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getSQLKeywords( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_KEYWORDS,aValue,*this);
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getSearchStringEscape( ) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SEARCH_PATTERN_ESCAPE,aValue,*this);
+ return aValue;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getStringFunctions( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_STRING_FUNCTIONS,nValue,*this);
+ if(nValue & SQL_FN_STR_ASCII)
+ aValue = ::rtl::OUString::createFromAscii("ASCII,");
+ if(nValue & SQL_FN_STR_BIT_LENGTH)
+ aValue += ::rtl::OUString::createFromAscii("BIT_LENGTH,");
+ if(nValue & SQL_FN_STR_CHAR)
+ aValue += ::rtl::OUString::createFromAscii("CHAR,");
+ if(nValue & SQL_FN_STR_CHAR_LENGTH)
+ aValue += ::rtl::OUString::createFromAscii("CHAR_LENGTH,");
+ if(nValue & SQL_FN_STR_CHARACTER_LENGTH)
+ aValue += ::rtl::OUString::createFromAscii("CHARACTER_LENGTH,");
+ if(nValue & SQL_FN_STR_CONCAT)
+ aValue += ::rtl::OUString::createFromAscii("CONCAT,");
+ if(nValue & SQL_FN_STR_DIFFERENCE)
+ aValue += ::rtl::OUString::createFromAscii("DIFFERENCE,");
+ if(nValue & SQL_FN_STR_INSERT)
+ aValue += ::rtl::OUString::createFromAscii("INSERT,");
+ if(nValue & SQL_FN_STR_LCASE)
+ aValue += ::rtl::OUString::createFromAscii("LCASE,");
+ if(nValue & SQL_FN_STR_LEFT)
+ aValue += ::rtl::OUString::createFromAscii("LEFT,");
+ if(nValue & SQL_FN_STR_LENGTH)
+ aValue += ::rtl::OUString::createFromAscii("LENGTH,");
+ if(nValue & SQL_FN_STR_LOCATE)
+ aValue += ::rtl::OUString::createFromAscii("LOCATE,");
+ if(nValue & SQL_FN_STR_LOCATE_2)
+ aValue += ::rtl::OUString::createFromAscii("LOCATE_2,");
+ if(nValue & SQL_FN_STR_LTRIM)
+ aValue += ::rtl::OUString::createFromAscii("LTRIM,");
+ if(nValue & SQL_FN_STR_OCTET_LENGTH)
+ aValue += ::rtl::OUString::createFromAscii("OCTET_LENGTH,");
+ if(nValue & SQL_FN_STR_POSITION)
+ aValue += ::rtl::OUString::createFromAscii("POSITION,");
+ if(nValue & SQL_FN_STR_REPEAT)
+ aValue += ::rtl::OUString::createFromAscii("REPEAT,");
+ if(nValue & SQL_FN_STR_REPLACE)
+ aValue += ::rtl::OUString::createFromAscii("REPLACE,");
+ if(nValue & SQL_FN_STR_RIGHT)
+ aValue += ::rtl::OUString::createFromAscii("RIGHT,");
+ if(nValue & SQL_FN_STR_RTRIM)
+ aValue += ::rtl::OUString::createFromAscii("RTRIM,");
+ if(nValue & SQL_FN_STR_SOUNDEX)
+ aValue += ::rtl::OUString::createFromAscii("SOUNDEX,");
+ if(nValue & SQL_FN_STR_SPACE)
+ aValue += ::rtl::OUString::createFromAscii("SPACE,");
+ if(nValue & SQL_FN_STR_SUBSTRING)
+ aValue += ::rtl::OUString::createFromAscii("SUBSTRING,");
+ if(nValue & SQL_FN_STR_UCASE)
+ aValue += ::rtl::OUString::createFromAscii("UCASE,");
+
+
+ return aValue.copy(0,aValue.lastIndexOf(','));
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getTimeDateFunctions( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_TIMEDATE_FUNCTIONS,nValue,*this);
+
+ if(nValue & SQL_FN_TD_CURRENT_DATE)
+ aValue = ::rtl::OUString::createFromAscii("CURRENT_DATE,");
+ if(nValue & SQL_FN_TD_CURRENT_TIME)
+ aValue += ::rtl::OUString::createFromAscii("CURRENT_TIME,");
+ if(nValue & SQL_FN_TD_CURRENT_TIMESTAMP)
+ aValue += ::rtl::OUString::createFromAscii("CURRENT_TIMESTAMP,");
+ if(nValue & SQL_FN_TD_CURDATE)
+ aValue += ::rtl::OUString::createFromAscii("CURDATE,");
+ if(nValue & SQL_FN_TD_CURTIME)
+ aValue += ::rtl::OUString::createFromAscii("CURTIME,");
+ if(nValue & SQL_FN_TD_DAYNAME)
+ aValue += ::rtl::OUString::createFromAscii("DAYNAME,");
+ if(nValue & SQL_FN_TD_DAYOFMONTH)
+ aValue += ::rtl::OUString::createFromAscii("DAYOFMONTH,");
+ if(nValue & SQL_FN_TD_DAYOFWEEK)
+ aValue += ::rtl::OUString::createFromAscii("DAYOFWEEK,");
+ if(nValue & SQL_FN_TD_DAYOFYEAR)
+ aValue += ::rtl::OUString::createFromAscii("DAYOFYEAR,");
+ if(nValue & SQL_FN_TD_EXTRACT)
+ aValue += ::rtl::OUString::createFromAscii("EXTRACT,");
+ if(nValue & SQL_FN_TD_HOUR)
+ aValue += ::rtl::OUString::createFromAscii("HOUR,");
+ if(nValue & SQL_FN_TD_MINUTE)
+ aValue += ::rtl::OUString::createFromAscii("MINUTE,");
+ if(nValue & SQL_FN_TD_MONTH)
+ aValue += ::rtl::OUString::createFromAscii("MONTH,");
+ if(nValue & SQL_FN_TD_MONTHNAME)
+ aValue += ::rtl::OUString::createFromAscii("MONTHNAME,");
+ if(nValue & SQL_FN_TD_NOW)
+ aValue += ::rtl::OUString::createFromAscii("NOW,");
+ if(nValue & SQL_FN_TD_QUARTER)
+ aValue += ::rtl::OUString::createFromAscii("QUARTER,");
+ if(nValue & SQL_FN_TD_SECOND)
+ aValue += ::rtl::OUString::createFromAscii("SECOND,");
+ if(nValue & SQL_FN_TD_TIMESTAMPADD)
+ aValue += ::rtl::OUString::createFromAscii("TIMESTAMPADD,");
+ if(nValue & SQL_FN_TD_TIMESTAMPDIFF)
+ aValue += ::rtl::OUString::createFromAscii("TIMESTAMPDIFF,");
+ if(nValue & SQL_FN_TD_WEEK)
+ aValue += ::rtl::OUString::createFromAscii("WEEK,");
+ if(nValue & SQL_FN_TD_YEAR)
+ aValue += ::rtl::OUString::createFromAscii("YEAR,");
+
+ return aValue.copy(0,aValue.lastIndexOf(','));
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getSystemFunctions( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_SYSTEM_FUNCTIONS,nValue,*this);
+
+ if(nValue & SQL_FN_SYS_DBNAME)
+ aValue += ::rtl::OUString::createFromAscii("DBNAME,");
+ if(nValue & SQL_FN_SYS_IFNULL)
+ aValue += ::rtl::OUString::createFromAscii("IFNULL,");
+ if(nValue & SQL_FN_SYS_USERNAME)
+ aValue += ::rtl::OUString::createFromAscii("USERNAME,");
+
+ return aValue.copy(0,aValue.lastIndexOf(','));
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODatabaseMetaData::getNumericFunctions( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ ::rtl::OUString aValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_NUMERIC_FUNCTIONS,nValue,*this);
+
+ if(nValue & SQL_FN_NUM_ABS)
+ aValue += ::rtl::OUString::createFromAscii("ABS,");
+ if(nValue & SQL_FN_NUM_ACOS)
+ aValue += ::rtl::OUString::createFromAscii("ACOS,");
+ if(nValue & SQL_FN_NUM_ASIN)
+ aValue += ::rtl::OUString::createFromAscii("ASIN,");
+ if(nValue & SQL_FN_NUM_ATAN)
+ aValue += ::rtl::OUString::createFromAscii("ATAN,");
+ if(nValue & SQL_FN_NUM_ATAN2)
+ aValue += ::rtl::OUString::createFromAscii("ATAN2,");
+ if(nValue & SQL_FN_NUM_CEILING)
+ aValue += ::rtl::OUString::createFromAscii("CEILING,");
+ if(nValue & SQL_FN_NUM_COS)
+ aValue += ::rtl::OUString::createFromAscii("COS,");
+ if(nValue & SQL_FN_NUM_COT)
+ aValue += ::rtl::OUString::createFromAscii("COT,");
+ if(nValue & SQL_FN_NUM_DEGREES)
+ aValue += ::rtl::OUString::createFromAscii("DEGREES,");
+ if(nValue & SQL_FN_NUM_EXP)
+ aValue += ::rtl::OUString::createFromAscii("EXP,");
+ if(nValue & SQL_FN_NUM_FLOOR)
+ aValue += ::rtl::OUString::createFromAscii("FLOOR,");
+ if(nValue & SQL_FN_NUM_LOG)
+ aValue += ::rtl::OUString::createFromAscii("LOGF,");
+ if(nValue & SQL_FN_NUM_LOG10)
+ aValue += ::rtl::OUString::createFromAscii("LOG10,");
+ if(nValue & SQL_FN_NUM_MOD)
+ aValue += ::rtl::OUString::createFromAscii("MOD,");
+ if(nValue & SQL_FN_NUM_PI)
+ aValue += ::rtl::OUString::createFromAscii("PI,");
+ if(nValue & SQL_FN_NUM_POWER)
+ aValue += ::rtl::OUString::createFromAscii("POWER,");
+ if(nValue & SQL_FN_NUM_RADIANS)
+ aValue += ::rtl::OUString::createFromAscii("RADIANS,");
+ if(nValue & SQL_FN_NUM_RAND)
+ aValue += ::rtl::OUString::createFromAscii("RAND,");
+ if(nValue & SQL_FN_NUM_ROUND)
+ aValue += ::rtl::OUString::createFromAscii("ROUND,");
+ if(nValue & SQL_FN_NUM_SIGN)
+ aValue += ::rtl::OUString::createFromAscii("SIGN,");
+ if(nValue & SQL_FN_NUM_SIN)
+ aValue += ::rtl::OUString::createFromAscii("SIN,");
+ if(nValue & SQL_FN_NUM_SQRT)
+ aValue += ::rtl::OUString::createFromAscii("SQRT,");
+ if(nValue & SQL_FN_NUM_TAN)
+ aValue += ::rtl::OUString::createFromAscii("TAN,");
+ if(nValue & SQL_FN_NUM_TRUNCATE)
+ aValue += ::rtl::OUString::createFromAscii("TRUNCATE,");
+
+
+ return aValue.copy(0,aValue.lastIndexOf(','));
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsExtendedSQLGrammar( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_ODBC_INTERFACE_CONFORMANCE,nValue,*this);
+ return nValue == SQL_OIC_LEVEL2;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsCoreSQLGrammar( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_ODBC_INTERFACE_CONFORMANCE,nValue,*this);
+ return nValue == SQL_OIC_CORE;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsMinimumSQLGrammar( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_ODBC_INTERFACE_CONFORMANCE,nValue,*this);
+ return nValue == SQL_OIC_LEVEL1;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsFullOuterJoins( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_OJ_CAPABILITIES,nValue,*this);
+ return (nValue & SQL_OJ_FULL) == SQL_OJ_FULL;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsLimitedOuterJoins( ) throw(SQLException, RuntimeException)
+{
+ return supportsFullOuterJoins( );
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInGroupBy( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_COLUMNS_IN_GROUP_BY,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInOrderBy( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_COLUMNS_IN_ORDER_BY,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxColumnsInSelect( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_COLUMNS_IN_SELECT,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODatabaseMetaData::getMaxUserNameLength( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_MAX_USER_NAME_LEN,nValue,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsResultSetType( sal_Int32 setType ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ OTools::GetInfo(m_aConnectionHandle,SQL_CURSOR_SENSITIVITY,nValue,*this);
+ return (nValue & setType) == setType;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsResultSetConcurrency( sal_Int32 setType, sal_Int32 concurrency ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ SQLUSMALLINT nAskFor;
+ switch(setType)
+ {
+ case ResultSetType::FORWARD_ONLY:
+ nAskFor = SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2;
+ break;
+ case ResultSetType::SCROLL_INSENSITIVE:
+ nAskFor = SQL_STATIC_CURSOR_ATTRIBUTES2;
+ break;
+ case ResultSetType::SCROLL_SENSITIVE:
+ nAskFor = SQL_DYNAMIC_CURSOR_ATTRIBUTES2;
+ break;
+ }
+
+ OTools::GetInfo(m_aConnectionHandle,nAskFor,nValue,*this);
+ sal_Bool bRet = sal_False;
+ switch(concurrency)
+ {
+ case ResultSetConcurrency::READ_ONLY:
+ bRet = (nValue & SQL_CA2_READ_ONLY_CONCURRENCY) == SQL_CA2_READ_ONLY_CONCURRENCY;
+ break;
+ case ResultSetConcurrency::UPDATABLE:
+ bRet = (nValue & SQL_CA2_OPT_VALUES_CONCURRENCY) == SQL_CA2_OPT_VALUES_CONCURRENCY;
+ break;
+ }
+ return bRet;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::ownUpdatesAreVisible( sal_Int32 setType ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ SQLUSMALLINT nAskFor;
+ switch(setType)
+ {
+ case ResultSetType::FORWARD_ONLY:
+ nAskFor = SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2;
+ break;
+ case ResultSetType::SCROLL_INSENSITIVE:
+ nAskFor = SQL_STATIC_CURSOR_ATTRIBUTES2;
+ break;
+ case ResultSetType::SCROLL_SENSITIVE:
+ nAskFor = SQL_DYNAMIC_CURSOR_ATTRIBUTES2;
+ break;
+ }
+
+ OTools::GetInfo(m_aConnectionHandle,nAskFor,nValue,*this);
+ return (nValue & SQL_CA2_SENSITIVITY_UPDATES) == SQL_CA2_SENSITIVITY_UPDATES;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::ownDeletesAreVisible( sal_Int32 setType ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ SQLUSMALLINT nAskFor;
+ switch(setType)
+ {
+ case ResultSetType::FORWARD_ONLY:
+ nAskFor = SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2;
+ break;
+ case ResultSetType::SCROLL_INSENSITIVE:
+ nAskFor = SQL_STATIC_CURSOR_ATTRIBUTES2;
+ break;
+ case ResultSetType::SCROLL_SENSITIVE:
+ nAskFor = SQL_DYNAMIC_CURSOR_ATTRIBUTES2;
+ break;
+ }
+
+ OTools::GetInfo(m_aConnectionHandle,nAskFor,nValue,*this);
+ return (nValue & SQL_CA2_SENSITIVITY_DELETIONS) == SQL_CA2_SENSITIVITY_DELETIONS;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::ownInsertsAreVisible( sal_Int32 setType ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 nValue;
+ SQLUSMALLINT nAskFor;
+ switch(setType)
+ {
+ case ResultSetType::FORWARD_ONLY:
+ nAskFor = SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2;
+ break;
+ case ResultSetType::SCROLL_INSENSITIVE:
+ nAskFor = SQL_STATIC_CURSOR_ATTRIBUTES2;
+ break;
+ case ResultSetType::SCROLL_SENSITIVE:
+ nAskFor = SQL_DYNAMIC_CURSOR_ATTRIBUTES2;
+ break;
+ }
+
+ OTools::GetInfo(m_aConnectionHandle,nAskFor,nValue,*this);
+ return (nValue & SQL_CA2_SENSITIVITY_ADDITIONS) == SQL_CA2_SENSITIVITY_ADDITIONS;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::othersUpdatesAreVisible( sal_Int32 setType ) throw(SQLException, RuntimeException)
+{
+ return ownUpdatesAreVisible(setType);
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::othersDeletesAreVisible( sal_Int32 setType ) throw(SQLException, RuntimeException)
+{
+ return ownDeletesAreVisible(setType);
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::othersInsertsAreVisible( sal_Int32 setType ) throw(SQLException, RuntimeException)
+{
+ return ownInsertsAreVisible(setType);
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::updatesAreDetected( sal_Int32 setType ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::deletesAreDetected( sal_Int32 setType ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::insertsAreDetected( sal_Int32 setType ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL ODatabaseMetaData::supportsBatchUpdates( ) throw(SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+Reference< XResultSet > SAL_CALL ODatabaseMetaData::getUDTs( const Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& typeNamePattern, const Sequence< sal_Int32 >& types ) throw(SQLException, RuntimeException)
+{
+ return NULL;
+}
+// -------------------------------------------------------------------------
+Reference< XConnection > SAL_CALL ODatabaseMetaData::getConnection( ) throw(SQLException, RuntimeException)
+{
+ return (Reference< XConnection >)m_pConnection;//new OConnection(m_aConnectionHandle);
+}
+// -------------------------------------------------------------------------
+
+
diff --git a/connectivity/source/drivers/odbc/ODriver.cxx b/connectivity/source/drivers/odbc/ODriver.cxx
new file mode 100644
index 000000000000..c3f1c3489082
--- /dev/null
+++ b/connectivity/source/drivers/odbc/ODriver.cxx
@@ -0,0 +1,209 @@
+/*************************************************************************
+ *
+ * $RCSfile: ODriver.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:14:23 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_ODBC_ODRIVER_HXX_
+#include "odbc/ODriver.hxx"
+#endif
+#ifndef _CONNECTIVITY_ODBC_OCONNECTION_HXX_
+#include "odbc/OConnection.hxx"
+#endif
+#ifndef _CONNECTIVITY_ODBC_OFUNCTIONS_HXX_
+#include "odbc/OFunctions.hxx"
+#endif
+
+using namespace connectivity::odbc;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::sdbc;
+// --------------------------------------------------------------------------------
+ODBCDriver::ODBCDriver() : ODriver_BASE(m_aMutex),m_pDriverHandle(SQL_NULL_HANDLE)
+{
+}
+// --------------------------------------------------------------------------------
+void ODBCDriver::disposing()
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+
+
+ for (OWeakRefArray::iterator i = m_xConnections.begin(); m_xConnections.end() != i; ++i)
+ {
+ Reference< XComponent > xComp(i->get(), UNO_QUERY);
+ if (xComp.is())
+ xComp->dispose();
+ }
+ m_xConnections.clear();
+
+ ODriver_BASE::disposing();
+}
+
+// static ServiceInfo
+//------------------------------------------------------------------------------
+rtl::OUString ODBCDriver::getImplementationName_Static( ) throw(RuntimeException)
+{
+ return rtl::OUString::createFromAscii("com.sun.star.sdbc.ODBCDriver");
+}
+//------------------------------------------------------------------------------
+Sequence< ::rtl::OUString > ODBCDriver::getSupportedServiceNames_Static( ) throw (RuntimeException)
+{
+ Sequence< ::rtl::OUString > aSNS( 1 );
+ aSNS[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbc.Driver");
+ return aSNS;
+}
+
+//------------------------------------------------------------------
+::rtl::OUString SAL_CALL ODBCDriver::getImplementationName( ) throw(RuntimeException)
+{
+ return getImplementationName_Static();
+}
+
+//------------------------------------------------------------------
+sal_Bool SAL_CALL ODBCDriver::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException)
+{
+ Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames());
+ const ::rtl::OUString* pSupported = aSupported.getConstArray();
+ for (sal_Int32 i=0; i<aSupported.getLength(); ++i, ++pSupported)
+ if (pSupported->equals(_rServiceName))
+ return sal_True;
+
+ return sal_False;
+}
+
+//------------------------------------------------------------------
+Sequence< ::rtl::OUString > SAL_CALL ODBCDriver::getSupportedServiceNames( ) throw(RuntimeException)
+{
+ return getSupportedServiceNames_Static();
+}
+
+//------------------------------------------------------------------
+::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL connectivity::odbc::ODBCDriver_CreateInstance(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) throw( ::com::sun::star::uno::Exception )
+{
+ return *(new ODBCDriver());
+}
+// --------------------------------------------------------------------------------
+Reference< XConnection > SAL_CALL ODBCDriver::connect( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw(SQLException, RuntimeException)
+{
+ if(!m_pDriverHandle)
+ {
+ ::rtl::OUString aPath;
+ if(!EnvironmentHandle(aPath))
+ throw SQLException(aPath,*this,::rtl::OUString(),1000,Any());
+ }
+ OConnection* pCon = new OConnection(m_pDriverHandle,this);
+ pCon->Construct(url,info);
+ Reference< XConnection > xCon = pCon;
+ m_xConnections.push_back(WeakReferenceHelper(*pCon));
+
+ return xCon;
+}
+// --------------------------------------------------------------------------------
+sal_Bool SAL_CALL ODBCDriver::acceptsURL( const ::rtl::OUString& url )
+ throw(SQLException, RuntimeException)
+{
+ if(!url.compareTo(::rtl::OUString::createFromAscii("sdbc:odbc:"),10))
+ {
+ return sal_True;
+ }
+ return sal_False;
+}
+// --------------------------------------------------------------------------------
+Sequence< DriverPropertyInfo > SAL_CALL ODBCDriver::getPropertyInfo( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw(SQLException, RuntimeException)
+{
+ return Sequence< DriverPropertyInfo >();
+}
+// --------------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODBCDriver::getMajorVersion( ) throw(RuntimeException)
+{
+ return 1;
+}
+// --------------------------------------------------------------------------------
+sal_Int32 SAL_CALL ODBCDriver::getMinorVersion( ) throw(RuntimeException)
+{
+ return 0;
+}
+// --------------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// ODBC Environment (gemeinsam fuer alle Connections):
+SQLHANDLE ODBCDriver::EnvironmentHandle(::rtl::OUString &_rPath)
+{
+ // Ist (fuer diese Instanz) bereits ein Environment erzeugt worden?
+ if (!m_pDriverHandle)
+ {
+ SQLHANDLE h = SQL_NULL_HANDLE;
+ // Environment allozieren
+
+ // ODBC-DLL jetzt laden:
+ if (!LoadLibrary_ODBC3(_rPath))
+ return SQL_NULL_HANDLE;
+
+ if (N3SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&h) != SQL_SUCCESS)
+ return SQL_NULL_HANDLE;
+
+ // In globaler Struktur merken ...
+ m_pDriverHandle = (void *) h;
+ SQLRETURN nError = N3SQLSetEnvAttr(h, SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_UINTEGER);
+ //N3SQLSetEnvAttr(h, SQL_ATTR_CONNECTION_POOLING,(SQLPOINTER) SQL_CP_ONE_PER_HENV, SQL_IS_INTEGER);
+ }
+
+ return m_pDriverHandle;
+}
+
+
diff --git a/connectivity/source/drivers/odbc/OFunctions.cxx b/connectivity/source/drivers/odbc/OFunctions.cxx
new file mode 100644
index 000000000000..5a50bf38bc7d
--- /dev/null
+++ b/connectivity/source/drivers/odbc/OFunctions.cxx
@@ -0,0 +1,338 @@
+/*************************************************************************
+ *
+ * $RCSfile: OFunctions.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:14:23 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+//--------------------------------------------------------------------------
+#ifndef _CONNECTIVITY_ODBC_OFUNCTIONS_HXX_
+#include "odbc/OFunctions.hxx"
+#endif
+
+// Implib-Definitionen fuer ODBC-DLL/shared library:
+
+using namespace connectivity;
+
+// -------------------------------------------------------------------------
+sal_Bool connectivity::LoadLibrary_ADABAS(::rtl::OUString &_rPath)
+{
+ static sal_Bool bLoaded = sal_False;
+ static oslModule pODBCso = NULL;
+
+ if (bLoaded)
+ return TRUE;
+
+ char *pPath =getenv("DBROOT");
+ if(pPath)
+ {
+
+#if ( defined(SOLARIS) && defined(SPARC)) || defined(LINUX)
+ _rPath = ::rtl::OUString::createFromAscii(pPath);
+ _rPath += ::rtl::OUString::createFromAscii("/lib/");
+#endif
+ }
+#if defined(WIN) || defined(WNT)
+ _rPath += ::rtl::OUString::createFromAscii("SQLOD32.DLL");
+#elif ( defined(SOLARIS) && defined(SPARC)) || defined(LINUX)
+ _rPath += ::rtl::OUString::createFromAscii("odbclib.so");
+#else
+ return sal_False;
+#endif
+
+ pODBCso = osl_loadModule( _rPath.pData,SAL_LOADMODULE_NOW );
+ if( !pODBCso)
+ return sal_False;
+
+
+ return bLoaded = LoadFunctions(pODBCso,sal_False);
+}
+// -------------------------------------------------------------------------
+// Dynamisches Laden der DLL/shared lib und Adressen der Funktionen besorgen:
+// Liefert TRUE bei Erfolg.
+sal_Bool connectivity::LoadLibrary_ODBC3(::rtl::OUString &_rPath)
+{
+ static sal_Bool bLoaded = sal_False;
+ static oslModule pODBCso = NULL;
+
+ if (bLoaded)
+ return TRUE;
+#ifdef WIN
+ _rPath = ::rtl::OUString::createFromAscii("ODBC.DLL");
+
+#endif
+#ifdef WNT
+ _rPath = ::rtl::OUString::createFromAscii("ODBC32.DLL");
+#endif
+#ifdef UNX
+ _rPath = ::rtl::OUString::createFromAscii("libodbc.so");
+#endif
+#ifdef OS2
+ _rPath = ::rtl::OUString::createFromAscii("ODBC");
+#endif
+
+ pODBCso = osl_loadModule( _rPath.pData,SAL_LOADMODULE_NOW );
+ if( !pODBCso)
+#ifdef OS2
+ {
+ delete pODBCso;
+ _rPath = ::rtl::OUString::createFromAscii("WOD402");
+ pODBCso = osl_loadModule( _rPath.pData,SAL_LOADMODULE_NOW );
+ if( !pODBCso)
+ return sal_False;
+ }
+#else
+ return sal_False;
+#endif
+
+ return bLoaded = connectivity::LoadFunctions(pODBCso);
+}
+// -------------------------------------------------------------------------
+
+sal_Bool connectivity::LoadFunctions(oslModule pODBCso, sal_Bool _bDS)
+{
+
+ if( ( connectivity::pODBC3SQLAllocHandle = (T3SQLAllocHandle)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLAllocHandle").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLConnect = (T3SQLConnect)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLConnect").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLDriverConnect = (T3SQLDriverConnect)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLDriverConnect").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLBrowseConnect = (T3SQLBrowseConnect)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLBrowseConnect").pData )) == NULL )
+ return sal_False;
+ if(_bDS && ( connectivity::pODBC3SQLDataSources = (T3SQLDataSources)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLDataSources").pData )) == NULL )
+ return sal_False;
+ if(_bDS && ( connectivity::pODBC3SQLDrivers = (T3SQLDrivers)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLDrivers").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLGetInfo = (T3SQLGetInfo)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLGetInfo").pData )) == NULL )
+ return sal_False;
+ if(_bDS && ( connectivity::pODBC3SQLGetFunctions = (T3SQLGetFunctions)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLGetFunctions").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLGetTypeInfo = (T3SQLGetTypeInfo)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLGetTypeInfo").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLSetConnectAttr = (T3SQLSetConnectAttr)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLSetConnectAttr").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLGetConnectAttr = (T3SQLGetConnectAttr)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLGetConnectAttr").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLSetEnvAttr = (T3SQLSetEnvAttr)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLSetEnvAttr").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLGetEnvAttr = (T3SQLGetEnvAttr)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLGetEnvAttr").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLSetStmtAttr = (T3SQLSetStmtAttr)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLSetStmtAttr").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLGetStmtAttr = (T3SQLGetStmtAttr)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLGetStmtAttr").pData )) == NULL )
+ return sal_False;
+ /*if( ( connectivity::pODBC3SQLSetDescField = (T3SQLSetDescField)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLSetDescField").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLGetDescField = (T3SQLGetDescField)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLGetDescField").pData )) == NULL )
+ return sal_False;*/
+ /*if( ( connectivity::pODBC3SQLGetDescRec = (T3SQLGetDescRec)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLGetDescRec").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLSetDescRec = (T3SQLSetDescRec)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLSetDescRec").pData )) == NULL )
+ return sal_False;*/
+ if( ( connectivity::pODBC3SQLPrepare = (T3SQLPrepare)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLPrepare").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLBindParameter = (T3SQLBindParameter)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLBindParameter").pData )) == NULL )
+ return sal_False;
+// if( ( connectivity::pODBC3SQLGetCursorName = (T3SQLGetCursorName)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLGetCursorName").pData )) == NULL )
+// return sal_False;
+ if( ( connectivity::pODBC3SQLSetCursorName = (T3SQLSetCursorName)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLSetCursorName").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLExecute = (T3SQLExecute)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLExecute").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLExecDirect = (T3SQLExecDirect)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLExecDirect").pData )) == NULL )
+ return sal_False;
+ /*if( ( connectivity::pODBC3SQLNativeSql = (T3SQLNativeSql)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLNativeSql").pData )) == NULL )
+ return sal_False;*/
+ if( ( connectivity::pODBC3SQLDescribeParam = (T3SQLDescribeParam)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLDescribeParam").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLNumParams = (T3SQLNumParams)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLNumParams").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLParamData = (T3SQLParamData)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLParamData").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLPutData = (T3SQLPutData)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLPutData").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLRowCount = (T3SQLRowCount)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLRowCount").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLNumResultCols = (T3SQLNumResultCols)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLNumResultCols").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLDescribeCol = (T3SQLDescribeCol)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLDescribeCol").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLColAttribute = (T3SQLColAttribute)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLColAttribute").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLBindCol = (T3SQLBindCol)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLBindCol").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLFetch = (T3SQLFetch)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLFetch").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLFetchScroll = (T3SQLFetchScroll)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLFetchScroll").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLGetData = (T3SQLGetData)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLGetData").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLSetPos = (T3SQLSetPos)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLSetPos").pData )) == NULL )
+ return sal_False;
+ if( _bDS && ( connectivity::pODBC3SQLBulkOperations = (T3SQLBulkOperations)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLBulkOperations").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLMoreResults = (T3SQLMoreResults)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLMoreResults").pData )) == NULL )
+ return sal_False;
+ /*if( ( connectivity::pODBC3SQLGetDiagField = (T3SQLGetDiagField)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLGetDiagField").pData )) == NULL )
+ return sal_False;*/
+ if( ( connectivity::pODBC3SQLGetDiagRec = (T3SQLGetDiagRec)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLGetDiagRec").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLColumnPrivileges = (T3SQLColumnPrivileges)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLColumnPrivileges").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLColumns = (T3SQLColumns)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLColumns").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLForeignKeys = (T3SQLForeignKeys)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLForeignKeys").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLPrimaryKeys = (T3SQLPrimaryKeys)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLPrimaryKeys").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLProcedureColumns = (T3SQLProcedureColumns)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLProcedureColumns").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLProcedures = (T3SQLProcedures)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLProcedures").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLSpecialColumns = (T3SQLSpecialColumns)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLSpecialColumns").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLStatistics = (T3SQLStatistics)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLStatistics").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLTablePrivileges = (T3SQLTablePrivileges)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLTablePrivileges").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLTables = (T3SQLTables)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLTables").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLFreeStmt = (T3SQLFreeStmt)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLFreeStmt").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLCloseCursor = (T3SQLCloseCursor)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLCloseCursor").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLCancel = (T3SQLCancel)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLCancel").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLEndTran = (T3SQLEndTran)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLEndTran").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLDisconnect = (T3SQLDisconnect)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLDisconnect").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLFreeHandle = (T3SQLFreeHandle)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLFreeHandle").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLGetCursorName = (T3SQLGetCursorName)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLGetCursorName").pData )) == NULL )
+ return sal_False;
+ if( ( connectivity::pODBC3SQLNativeSql = (T3SQLNativeSql)osl_getSymbol(pODBCso, ::rtl::OUString::createFromAscii("SQLNativeSql").pData )) == NULL )
+ return sal_False;
+
+ return sal_True;
+}
+// -------------------------------------------------------------------------
+
+connectivity::T3SQLAllocHandle connectivity::pODBC3SQLAllocHandle;
+connectivity::T3SQLConnect connectivity::pODBC3SQLConnect;
+connectivity::T3SQLDriverConnect connectivity::pODBC3SQLDriverConnect;
+connectivity::T3SQLBrowseConnect connectivity::pODBC3SQLBrowseConnect;
+connectivity::T3SQLDataSources connectivity::pODBC3SQLDataSources;
+connectivity::T3SQLDrivers connectivity::pODBC3SQLDrivers;
+connectivity::T3SQLGetInfo connectivity::pODBC3SQLGetInfo;
+connectivity::T3SQLGetFunctions connectivity::pODBC3SQLGetFunctions;
+connectivity::T3SQLGetTypeInfo connectivity::pODBC3SQLGetTypeInfo;
+connectivity::T3SQLSetConnectAttr connectivity::pODBC3SQLSetConnectAttr;
+connectivity::T3SQLGetConnectAttr connectivity::pODBC3SQLGetConnectAttr;
+connectivity::T3SQLSetEnvAttr connectivity::pODBC3SQLSetEnvAttr;
+connectivity::T3SQLGetEnvAttr connectivity::pODBC3SQLGetEnvAttr;
+connectivity::T3SQLSetStmtAttr connectivity::pODBC3SQLSetStmtAttr;
+connectivity::T3SQLGetStmtAttr connectivity::pODBC3SQLGetStmtAttr;
+//connectivity::T3SQLSetDescField connectivity::pODBC3SQLSetDescField;
+//connectivity::T3SQLGetDescField connectivity::pODBC3SQLGetDescField;
+//connectivity::T3SQLGetDescRec connectivity::pODBC3SQLGetDescRec;
+//connectivity::T3SQLSetDescRec connectivity::pODBC3SQLSetDescRec;
+connectivity::T3SQLPrepare connectivity::pODBC3SQLPrepare;
+connectivity::T3SQLBindParameter connectivity::pODBC3SQLBindParameter;
+//connectivity::T3SQLGetCursorName connectivity::pODBC3SQLGetCursorName;
+connectivity::T3SQLSetCursorName connectivity::pODBC3SQLSetCursorName;
+connectivity::T3SQLExecute connectivity::pODBC3SQLExecute;
+connectivity::T3SQLExecDirect connectivity::pODBC3SQLExecDirect;
+//connectivity::T3SQLNativeSql connectivity::pODBC3SQLNativeSql;
+connectivity::T3SQLDescribeParam connectivity::pODBC3SQLDescribeParam;
+connectivity::T3SQLNumParams connectivity::pODBC3SQLNumParams;
+connectivity::T3SQLParamData connectivity::pODBC3SQLParamData;
+connectivity::T3SQLPutData connectivity::pODBC3SQLPutData;
+connectivity::T3SQLRowCount connectivity::pODBC3SQLRowCount;
+connectivity::T3SQLNumResultCols connectivity::pODBC3SQLNumResultCols;
+connectivity::T3SQLDescribeCol connectivity::pODBC3SQLDescribeCol;
+connectivity::T3SQLColAttribute connectivity::pODBC3SQLColAttribute;
+connectivity::T3SQLBindCol connectivity::pODBC3SQLBindCol;
+connectivity::T3SQLFetch connectivity::pODBC3SQLFetch;
+connectivity::T3SQLFetchScroll connectivity::pODBC3SQLFetchScroll;
+connectivity::T3SQLGetData connectivity::pODBC3SQLGetData;
+connectivity::T3SQLSetPos connectivity::pODBC3SQLSetPos;
+connectivity::T3SQLBulkOperations connectivity::pODBC3SQLBulkOperations;
+connectivity::T3SQLMoreResults connectivity::pODBC3SQLMoreResults;
+//connectivity::T3SQLGetDiagField connectivity::pODBC3SQLGetDiagField;
+connectivity::T3SQLGetDiagRec connectivity::pODBC3SQLGetDiagRec;
+connectivity::T3SQLColumnPrivileges connectivity::pODBC3SQLColumnPrivileges;
+connectivity::T3SQLColumns connectivity::pODBC3SQLColumns;
+connectivity::T3SQLForeignKeys connectivity::pODBC3SQLForeignKeys;
+connectivity::T3SQLPrimaryKeys connectivity::pODBC3SQLPrimaryKeys;
+connectivity::T3SQLProcedureColumns connectivity::pODBC3SQLProcedureColumns;
+connectivity::T3SQLProcedures connectivity::pODBC3SQLProcedures;
+connectivity::T3SQLSpecialColumns connectivity::pODBC3SQLSpecialColumns;
+connectivity::T3SQLStatistics connectivity::pODBC3SQLStatistics;
+connectivity::T3SQLTablePrivileges connectivity::pODBC3SQLTablePrivileges;
+connectivity::T3SQLTables connectivity::pODBC3SQLTables;
+connectivity::T3SQLFreeStmt connectivity::pODBC3SQLFreeStmt;
+connectivity::T3SQLCloseCursor connectivity::pODBC3SQLCloseCursor;
+connectivity::T3SQLCancel connectivity::pODBC3SQLCancel;
+connectivity::T3SQLEndTran connectivity::pODBC3SQLEndTran;
+connectivity::T3SQLDisconnect connectivity::pODBC3SQLDisconnect;
+connectivity::T3SQLFreeHandle connectivity::pODBC3SQLFreeHandle;
+connectivity::T3SQLGetCursorName connectivity::pODBC3SQLGetCursorName;
+connectivity::T3SQLNativeSql connectivity::pODBC3SQLNativeSql;
+
+
diff --git a/connectivity/source/drivers/odbc/OPreparedStatement.cxx b/connectivity/source/drivers/odbc/OPreparedStatement.cxx
new file mode 100644
index 000000000000..40da2368fb93
--- /dev/null
+++ b/connectivity/source/drivers/odbc/OPreparedStatement.cxx
@@ -0,0 +1,1063 @@
+/*************************************************************************
+ *
+ * $RCSfile: OPreparedStatement.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:14:23 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+#ifndef _OSL_DIAGNOSE_H_
+#include <osl/diagnose.h>
+#endif
+#ifndef _CONNECTIVITY_ODBC_OPREPAREDSTATEMENT_HXX_
+#include "odbc/OPreparedStatement.hxx"
+#endif
+#ifndef _CONNECTIVITY_OBOUNPARAM_HXX_
+#include "odbc/OBoundParam.hxx"
+#endif
+#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
+#include <com/sun/star/sdbc/DataType.hpp>
+#endif
+#ifndef _CONNECTIVITY_OTOOLS_HXX_
+#include "odbc/OTools.hxx"
+#endif
+#ifndef _CONNECTIVITY_ODBC_ORESULTSETMETADATA_HXX_
+#include "odbc/OResultSetMetaData.hxx"
+#endif
+#ifndef _CONNECTIVITY_PROPERTYIDS_HXX_
+#include "propertyids.hxx"
+#endif
+#ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
+#include <cppuhelper/typeprovider.hxx>
+#endif
+#ifndef _UTL_SEQUENCE_HXX_
+#include <unotools/sequence.hxx>
+#endif
+#ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_
+#include <com/sun/star/lang/DisposedException.hpp>
+#endif
+
+using namespace connectivity;
+using namespace connectivity::odbc;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::sdbc;
+using namespace com::sun::star::sdbcx;
+using namespace com::sun::star::container;
+using namespace com::sun::star::io;
+using namespace com::sun::star::util;
+
+int OBoundParam::ASCII = 1;
+int OBoundParam::UNICODE = 2;
+int OBoundParam::BINARY = 3;
+
+IMPLEMENT_SERVICE_INFO(OPreparedStatement,"com.sun.star.sdbcx.OPreparedStatement","com.sun.star.sdbc.PreparedStatement");
+
+OPreparedStatement::OPreparedStatement( OConnection* _pConnection,const ::std::vector<OTypeInfo>& _TypeInfo,const ::rtl::OUString& sql)
+ : OStatement_BASE2( _pConnection ),m_aTypeInfo(_TypeInfo)
+{
+ ::rtl::OString aSql(::rtl::OUStringToOString(sql,osl_getThreadTextEncoding()));
+ N3SQLPrepare(m_aStatementHandle,(SDB_ODBC_CHAR *) aSql.getStr(),aSql.getLength());
+ initBoundParam();
+}
+// -------------------------------------------------------------------------
+
+Any SAL_CALL OPreparedStatement::queryInterface( const Type & rType ) throw(RuntimeException)
+{
+ Any aRet = OStatement_BASE2::queryInterface(rType);
+ if(!aRet.hasValue())
+ aRet = ::cppu::queryInterface( rType,
+ static_cast< XPreparedStatement*>(this),
+ static_cast< XParameters*>(this),
+ static_cast< XPreparedBatchExecution*>(this),
+ static_cast< XResultSetMetaDataSupplier*>(this));
+ return aRet;
+}
+// -------------------------------------------------------------------------
+::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL OPreparedStatement::getTypes( ) throw(::com::sun::star::uno::RuntimeException)
+{
+ ::cppu::OTypeCollection aTypes( ::getCppuType( (const ::com::sun::star::uno::Reference< XPreparedStatement > *)0 ),
+ ::getCppuType( (const ::com::sun::star::uno::Reference< XParameters > *)0 ),
+ ::getCppuType( (const ::com::sun::star::uno::Reference< XResultSetMetaDataSupplier > *)0 ),
+ ::getCppuType( (const ::com::sun::star::uno::Reference< XPreparedBatchExecution > *)0 ));
+
+ return ::utl::concatSequences(aTypes.getTypes(),OStatement_BASE2::getTypes());
+}
+// -------------------------------------------------------------------------
+
+Reference< XResultSetMetaData > SAL_CALL OPreparedStatement::getMetaData( ) throw(SQLException, RuntimeException)
+{
+ if(m_xMetaData.is())
+ m_xMetaData = new OResultSetMetaData(m_aStatementHandle);
+ return m_xMetaData;
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::close( ) throw(SQLException, RuntimeException)
+{
+ // Close/clear our result set
+ clearMyResultSet ();
+
+ // Reset last warning message
+
+ try {
+ clearWarnings ();
+ if (m_aStatementHandle != SQL_NULL_HSTMT)
+ {
+ N3SQLFreeStmt (m_aStatementHandle, SQL_DROP);
+ m_aStatementHandle = SQL_NULL_HSTMT;
+ FreeParams();
+ }
+ }
+ catch (SQLException & ex) {
+ // If we get an error, ignore
+ }
+
+ // Remove this Statement object from the Connection object's
+ // list
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OPreparedStatement::execute( ) throw(SQLException, RuntimeException)
+{
+ sal_Bool hasResultSet = sal_False;
+ SQLWarning warning;
+ sal_Bool needData = sal_False;
+
+ // Reset warnings
+
+ clearWarnings ();
+
+ // Reset the statement handle, warning and saved Resultset
+
+ reset();
+
+ // Call SQLExecute
+
+ try
+ {
+ SQLRETURN nReturn = N3SQLExecute(m_aStatementHandle);
+
+ OTools::ThrowException(nReturn,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ needData = nReturn == SQL_NEED_DATA;
+
+ // Now loop while more data is needed (i.e. a data-at-
+ // execution parameter was given). For each parameter
+ // that needs data, put the data from the input stream.
+
+ while (needData) {
+
+ // Get the parameter number that requires data
+
+ sal_Int32* paramIndex = 0;
+ nReturn = N3SQLParamData(m_aStatementHandle,(SQLPOINTER*)&paramIndex);
+
+ // If the parameter index is -1, there is no
+ // more data required
+
+ if (*paramIndex == -1)
+ needData = sal_False;
+ else
+ {
+ // Now we have the proper parameter
+ // index, get the data from the input
+ // stream and do a SQLPutData
+ putParamData (*paramIndex);
+ }
+ }
+
+ }
+ catch (SQLWarning& ex)
+ {
+
+ // Save pointer to warning and save with ResultSet
+ // object once it is created.
+
+ warning = ex;
+ }
+
+ // Now loop while more data is needed (i.e. a data-at-
+ // execution parameter was given). For each parameter
+ // that needs data, put the data from the input stream.
+
+ while (needData) {
+
+ // Get the parameter number that requires data
+
+ sal_Int32* paramIndex = 0;
+ N3SQLParamData (m_aStatementHandle,(SQLPOINTER*)&paramIndex);
+
+ // If the parameter index is -1, there is no more
+ // data required
+
+ if (*paramIndex == -1) {
+ needData = sal_False;
+ }
+ else {
+ // Now we have the proper parameter index,
+ // get the data from the input stream
+ // and do a SQLPutData
+ putParamData(*paramIndex);
+ }
+ }
+
+ // Now determine if there is a result set associated with
+ // the SQL statement that was executed. Get the column
+ // count, and if it is not zero, there is a result set.
+
+ if (getColumnCount () > 0)
+ hasResultSet = sal_True;
+
+
+ return hasResultSet;
+}
+// -------------------------------------------------------------------------
+
+sal_Int32 SAL_CALL OPreparedStatement::executeUpdate( ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 numRows = -1;
+
+ // Execute the statement. If execute returns sal_False, a
+ // row count exists.
+
+ if (!execute())
+ numRows = getUpdateCount ();
+ else {
+
+ // No update count was produced (a ResultSet was). Raise
+ // an exception
+
+ throw SQLException(::rtl::OUString::createFromAscii("No row count was produced"),
+ *this,
+ ::rtl::OUString(),0,Any());
+ }
+ return numRows;
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setString( sal_Int32 parameterIndex, const ::rtl::OUString& x ) throw(SQLException, RuntimeException)
+{
+ setChar(parameterIndex, DataType::CHAR, 0, x);
+}
+// -------------------------------------------------------------------------
+
+Reference< XConnection > SAL_CALL OPreparedStatement::getConnection( ) throw(SQLException, RuntimeException)
+{
+ return (Reference< XConnection >)m_pConnection;
+}
+// -------------------------------------------------------------------------
+
+Reference< XResultSet > SAL_CALL OPreparedStatement::executeQuery( ) throw(SQLException, RuntimeException)
+{
+ Reference< XResultSet > rs = NULL;
+
+ if (execute())
+ rs = getResultSet(sal_False);
+
+ else {
+
+ // No ResultSet was produced. Raise an exception
+
+ throw SQLException(::rtl::OUString::createFromAscii("No ResultSet was produced"),
+ *this,
+ ::rtl::OUString(),0,Any());
+ }
+ return rs;
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setBoolean( sal_Int32 parameterIndex, sal_Bool x ) throw(SQLException, RuntimeException)
+{
+ sal_Int32 value = 0;
+
+ // If the parameter is sal_True, set the value to 1
+ if (x) {
+ value = 1;
+ }
+
+ // Set the parameter as if it were an integer
+ setInt (parameterIndex, value);
+}
+// -------------------------------------------------------------------------
+#define PREP_BIND_PARAM(_ty,_jt) \
+ bindParameter( m_aStatementHandle, \
+ parameterIndex, \
+ bindBuf,getLengthBuf(parameterIndex), \
+ _jt, \
+ sal_False,sal_False,&x,(Reference <XInterface>)*this)
+
+
+
+void SAL_CALL OPreparedStatement::setByte( sal_Int32 parameterIndex, sal_Int8 x ) throw(SQLException, RuntimeException)
+{
+ // Allocate a buffer to be used in binding. This will be
+ // a 'permanent' buffer that the bridge will fill in with
+ // the bound data in native format.
+ if( !parameterIndex || parameterIndex > numParams)
+ throw SQLException(STAT_INVALID_INDEX,*this,::rtl::OUString::createFromAscii("07009"),0,Any());
+
+ sal_Int8* bindBuf = allocBindBuf(parameterIndex, 4);
+ PREP_BIND_PARAM(sal_Int8,SQL_TINYINT);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setDate( sal_Int32 parameterIndex, const Date& aData ) throw(SQLException, RuntimeException)
+{
+ // Allocate a buffer to be used in binding. This will be
+ // a 'permanent' buffer that the bridge will fill in with
+ // the bound data in native format.
+
+ if( !parameterIndex || parameterIndex > numParams)
+ throw SQLException(STAT_INVALID_INDEX,*this,::rtl::OUString::createFromAscii("07009"),0,Any());
+
+ sal_Int8* bindBuf = allocBindBuf (parameterIndex, 32);
+
+
+ DATE_STRUCT x = OTools::DateToOdbcDate(aData);
+ PREP_BIND_PARAM(DATE_STRUCT,DataType::DATE);
+}
+// -------------------------------------------------------------------------
+
+
+void SAL_CALL OPreparedStatement::setTime( sal_Int32 parameterIndex, const Time& aVal ) throw(SQLException, RuntimeException)
+{
+ // Allocate a buffer to be used in binding. This will be
+ // a 'permanent' buffer that the bridge will fill in with
+ // the bound data in native format.
+ if( !parameterIndex || parameterIndex > numParams)
+ throw SQLException(STAT_INVALID_INDEX,*this,::rtl::OUString::createFromAscii("07009"),0,Any());
+
+ sal_Int8* bindBuf = allocBindBuf (parameterIndex, 32);
+
+ TIME_STRUCT x = OTools::TimeToOdbcTime(aVal);
+ PREP_BIND_PARAM(TIME_STRUCT,DataType::TIME);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setTimestamp( sal_Int32 parameterIndex, const DateTime& aVal ) throw(SQLException, RuntimeException)
+{
+ // Allocate a buffer to be used in binding. This will be
+ // a 'permanent' buffer that the bridge will fill in with
+ // the bound data in native format.
+ if( !parameterIndex || parameterIndex > numParams)
+ throw SQLException(STAT_INVALID_INDEX,*this,::rtl::OUString::createFromAscii("07009"),0,Any());
+
+ sal_Int8* bindBuf = allocBindBuf (parameterIndex, 32);
+
+ TIMESTAMP_STRUCT x = OTools::DateTimeToTimestamp(aVal);
+ PREP_BIND_PARAM(TIMESTAMP_STRUCT,DataType::TIMESTAMP);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setDouble( sal_Int32 parameterIndex, double x ) throw(SQLException, RuntimeException)
+{
+ // Allocate a buffer to be used in binding. This will be
+ // a 'permanent' buffer that the bridge will fill in with
+ // the bound data in native format.
+ if( !parameterIndex || parameterIndex > numParams)
+ throw SQLException(STAT_INVALID_INDEX,*this,::rtl::OUString::createFromAscii("07009"),0,Any());
+
+ sal_Int8* bindBuf = allocBindBuf (parameterIndex, 8);
+ PREP_BIND_PARAM(double,DataType::DOUBLE);
+}
+
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setFloat( sal_Int32 parameterIndex, float x ) throw(SQLException, RuntimeException)
+{
+ // Allocate a buffer to be used in binding. This will be
+ // a 'permanent' buffer that the bridge will fill in with
+ // the bound data in native format.
+ if( !parameterIndex || parameterIndex > numParams)
+ throw SQLException(STAT_INVALID_INDEX,*this,::rtl::OUString::createFromAscii("07009"),0,Any());
+
+ sal_Int8* bindBuf = allocBindBuf (parameterIndex, 8);
+ PREP_BIND_PARAM(float,DataType::FLOAT);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setInt( sal_Int32 parameterIndex, sal_Int32 x ) throw(SQLException, RuntimeException)
+{
+ // Allocate a buffer to be used in binding. This will be
+ // a 'permanent' buffer that the bridge will fill in with
+ // the bound data in native format.
+ if( !parameterIndex || parameterIndex > numParams)
+ throw SQLException(STAT_INVALID_INDEX,*this,::rtl::OUString::createFromAscii("07009"),0,Any());
+
+ sal_Int8* bindBuf = allocBindBuf (parameterIndex, 4);
+ PREP_BIND_PARAM(sal_Int32,DataType::INTEGER);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setLong( sal_Int32 parameterIndex, sal_Int64 aVal ) throw(SQLException, RuntimeException)
+{
+ // Allocate a buffer to be used in binding. This will be
+ // a 'permanent' buffer that the bridge will fill in with
+ // the bound data in native format.
+
+ if( !parameterIndex || parameterIndex > numParams)
+ throw SQLException(STAT_INVALID_INDEX,*this,::rtl::OUString::createFromAscii("07009"),0,Any());
+
+ sal_Int8 *bindBuf = allocBindBuf (parameterIndex, 8);
+ float x = (float)aVal;
+ PREP_BIND_PARAM(float,DataType::BIGINT);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setNull( sal_Int32 parameterIndex, sal_Int32 sqlType ) throw(SQLException, RuntimeException)
+{
+ // Get the buffer needed for the length
+ if( !parameterIndex || parameterIndex > numParams)
+ throw SQLException(STAT_INVALID_INDEX,*this,::rtl::OUString::createFromAscii("07009"),0,Any());
+
+ sal_Int8* lenBuf = getLengthBuf (parameterIndex);
+ *lenBuf = SQL_NULL_DATA;
+ UDWORD prec = 0;
+ if (sqlType == SQL_CHAR)
+ prec = 1;
+
+ N3SQLBindParameter(m_aStatementHandle,
+ parameterIndex,
+ SQL_PARAM_INPUT,
+ SQL_C_DEFAULT,
+ sqlType,
+ prec,
+ 0,
+ NULL,
+ 0,
+ (SDWORD*)lenBuf
+ );
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setClob( sal_Int32 parameterIndex, const Reference< XClob >& x ) throw(SQLException, RuntimeException)
+{
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setBlob( sal_Int32 parameterIndex, const Reference< XBlob >& x ) throw(SQLException, RuntimeException)
+{
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setArray( sal_Int32 parameterIndex, const Reference< XArray >& x ) throw(SQLException, RuntimeException)
+{
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setRef( sal_Int32 parameterIndex, const Reference< XRef >& x ) throw(SQLException, RuntimeException)
+{
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setObjectWithInfo( sal_Int32 parameterIndex, const Any& x, sal_Int32 sqlType, sal_Int32 scale ) throw(SQLException, RuntimeException)
+{
+ // For each known SQL Type, call the appropriate
+ // set routine
+
+ switch (sqlType)
+ {
+ case DataType::CHAR:
+ setString (parameterIndex, *(::rtl::OUString*) x.getValue());
+ break;
+
+ case DataType::VARCHAR:
+ setChar (parameterIndex, sqlType, 0, *(::rtl::OUString*) x.getValue());
+ break;
+
+ case DataType::LONGVARCHAR:
+ setChar (parameterIndex, sqlType, 0, *(::rtl::OUString*) x.getValue());
+ break;
+
+ case DataType::BIT:
+ setBoolean (parameterIndex,*(sal_Bool*) x.getValue());
+ break;
+
+ case DataType::TINYINT:
+ setByte (parameterIndex, *(sal_Int8*)x.getValue());
+ break;
+
+ case DataType::SMALLINT:
+ setShort (parameterIndex, *(short*)x.getValue());
+ break;
+
+ case DataType::INTEGER:
+ setInt (parameterIndex,*(sal_Int32*)x.getValue ());
+ break;
+
+ case DataType::BIGINT:
+ // setLong (parameterIndex,((sal_Int32) x).longValue ());
+ break;
+
+ case DataType::REAL:
+ setFloat (parameterIndex, *(float*)x.getValue ());
+ break;
+
+ case DataType::FLOAT:
+ setFloat (parameterIndex, *(float*)x.getValue ());
+ break;
+
+ case DataType::DOUBLE:
+ setDouble (parameterIndex,*(double*)x.getValue ());
+ break;
+
+ case DataType::BINARY:
+ setBytes (parameterIndex, *(Sequence<sal_Int8>*)x.getValue());
+ break;
+
+ case DataType::VARBINARY:
+ case DataType::LONGVARBINARY:
+ {
+ Sequence<sal_Int8> y;
+ x >>= y;
+
+ if ( y.getLength() > 2000 )
+ {
+ // setBinaryStream (parameterIndex, y, y.getLength());
+ }
+ else
+ {
+ setBinary (parameterIndex, sqlType, y);
+ }
+ }
+
+ break;
+
+ case DataType::DATE:
+ setDate (parameterIndex,*(Date*) x.getValue());
+ break;
+
+ case DataType::TIME:
+ setTime (parameterIndex, *(Time*)x.getValue());
+ break;
+
+ case DataType::TIMESTAMP:
+ setTimestamp (parameterIndex,*(DateTime*)x.getValue());
+ break;
+
+ default:
+ {
+ ::rtl::OUString aVal = ::rtl::OUString::createFromAscii("Unknown SQL Type for PreparedStatement.setObject (SQL Type=");
+ aVal += ::rtl::OUString::valueOf(sqlType);
+ throw SQLException( aVal,
+ *this,
+ ::rtl::OUString(),0,Any());
+ }
+
+ }
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setObjectNull( sal_Int32 parameterIndex, sal_Int32 sqlType, const ::rtl::OUString& typeName ) throw(SQLException, RuntimeException)
+{
+ setNull(parameterIndex,sqlType);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setObject( sal_Int32 parameterIndex, const Any& x ) throw(SQLException, RuntimeException)
+{
+ // setObject (parameterIndex, x, sqlType, 0);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setShort( sal_Int32 parameterIndex, sal_Int16 x ) throw(SQLException, RuntimeException)
+{
+ // Allocate a buffer to be used in binding. This will be
+ // a 'permanent' buffer that the bridge will fill in with
+ // the bound data in native format.
+ if( !parameterIndex || parameterIndex > numParams)
+ throw SQLException(STAT_INVALID_INDEX,*this,::rtl::OUString::createFromAscii("07009"),0,Any());
+
+ sal_Int8* bindBuf = allocBindBuf (parameterIndex, 4);
+ PREP_BIND_PARAM(sal_Int16,DataType::SMALLINT);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setBytes( sal_Int32 parameterIndex, const Sequence< sal_Int8 >& x ) throw(SQLException, RuntimeException)
+{
+ if ( x.getLength() > 2000 )
+ {
+ // setBinaryStream (parameterIndex, new java.io.ByteArrayInputStream(x), x.length);
+ }
+ else
+ {
+ setBinary (parameterIndex, DataType::BINARY, x);
+ }
+}
+// -------------------------------------------------------------------------
+
+
+void SAL_CALL OPreparedStatement::setCharacterStream( sal_Int32 parameterIndex, const Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(SQLException, RuntimeException)
+{
+ setStream (parameterIndex, x, length, DataType::LONGVARCHAR,OBoundParam::ASCII);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::setBinaryStream( sal_Int32 parameterIndex, const Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(SQLException, RuntimeException)
+{
+ setStream (parameterIndex, x, length, DataType::LONGVARBINARY,OBoundParam::BINARY);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::clearParameters( ) throw(SQLException, RuntimeException)
+{
+ N3SQLFreeStmt (m_aStatementHandle, SQL_RESET_PARAMS);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OPreparedStatement::clearBatch( ) throw(SQLException, RuntimeException)
+{
+ // clearParameters( );
+ // m_aBatchList.erase();
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OPreparedStatement::addBatch( ) throw(SQLException, RuntimeException)
+{
+}
+// -------------------------------------------------------------------------
+
+Sequence< sal_Int32 > SAL_CALL OPreparedStatement::executeBatch( ) throw(SQLException, RuntimeException)
+{
+ return Sequence< sal_Int32 > ();
+}
+// -------------------------------------------------------------------------
+
+//====================================================================
+// methods
+//====================================================================
+
+//--------------------------------------------------------------------
+// initBoundParam
+// Initialize the bound parameter objects
+//--------------------------------------------------------------------
+
+void OPreparedStatement::initBoundParam () throw(SQLException)
+{
+ // Get the number of parameters
+ numParams = 0;
+ N3SQLNumParams (m_aStatementHandle,(short*)&numParams);
+
+ // There are parameter markers, allocate the bound
+ // parameter objects
+
+ if (numParams > 0)
+ {
+ // Allocate an array of bound parameter objects
+
+ boundParams = new OBoundParam[numParams];
+
+ // Allocate and initialize each bound parameter
+
+ for (sal_Int32 i = 0; i < numParams; i++)
+ {
+ boundParams[i] = OBoundParam();
+ boundParams[i].initialize ();
+ }
+ }
+}
+// -------------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+// allocBindBuf
+// Allocate storage for the permanent data buffer for the bound
+// parameter.
+//--------------------------------------------------------------------
+
+sal_Int8* OPreparedStatement::allocBindBuf( sal_Int32 index,sal_Int32 bufLen)
+{
+ sal_Int8* b = NULL;
+
+ // Sanity check the parameter number
+
+ if ((index >= 1) &&
+ (index <= numParams))
+ {
+ b = boundParams[index - 1].allocBindDataBuffer(bufLen);
+ }
+
+ return b;
+}
+// -------------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+// getDataBuf
+// Gets the data buffer for the given parameter index
+//--------------------------------------------------------------------
+
+sal_Int8* OPreparedStatement::getDataBuf (sal_Int32 index)
+{
+ sal_Int8* b = NULL;
+
+ // Sanity check the parameter number
+
+ if ((index >= 1) &&
+ (index <= numParams))
+ {
+ b = boundParams[index - 1].getBindDataBuffer ();
+ }
+
+ return b;
+}
+// -------------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+// getLengthBuf
+// Gets the length buffer for the given parameter index
+//--------------------------------------------------------------------
+
+sal_Int8* OPreparedStatement::getLengthBuf (sal_Int32 index)
+{
+ sal_Int8* b = NULL;
+
+ // Sanity check the parameter number
+
+ if ((index >= 1) &&
+ (index <= numParams))
+ {
+ b = boundParams[index - 1].getBindLengthBuffer ();
+ }
+
+ return b;
+}
+// -------------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+// getParamLength
+// Returns the length of the given parameter number. When each
+// parameter was bound, a 4-sal_Int8 buffer was given to hold the
+// length (stored in native format). Get the buffer, convert the
+// buffer from native format, and return it. If the length is -1,
+// the column is considered to be NULL.
+//--------------------------------------------------------------------
+
+sal_Int32 OPreparedStatement::getParamLength ( sal_Int32 index)
+{
+ sal_Int32 paramLen = SQL_NULL_DATA;
+
+ // Sanity check the parameter number
+
+ if ((index >= 1) &&
+ (index <= numParams)) {
+
+ // Now get the length of the parameter from the
+ // bound param array. -1 is returned if it is NULL.
+ long n = 0;
+ memcpy (&n, boundParams[index -1].getBindLengthBuffer (), sizeof (n));
+ paramLen = n;
+ }
+ return paramLen;
+}
+// -------------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+// putParamData
+// Puts parameter data from a previously bound input stream. The
+// input stream was bound using SQL_LEN_DATA_AT_EXEC.
+//--------------------------------------------------------------------
+
+void OPreparedStatement::putParamData (sal_Int32 index) throw(SQLException)
+{
+ // We'll transfer up to maxLen at a time
+ sal_Int32 maxLen = MAX_PUT_DATA_LENGTH;
+ sal_Int32 bufLen;
+ sal_Int32 realLen;
+ // sal_Int8* buf = new sal_Int8[maxLen];
+ Sequence< sal_Int8 > buf(maxLen);
+ sal_Bool endOfStream = sal_False;
+
+ // Sanity check the parameter index
+ if ((index < 1) ||
+ (index > numParams))
+ {
+ return;
+ }
+
+ // Get the information about the input stream
+
+ Reference< XInputStream> inputStream = boundParams[index - 1].getInputStream ();
+ sal_Int32 inputStreamLen = boundParams[index - 1].getInputStreamLen ();
+ sal_Int32 inputStreamType = boundParams[index - 1].getStreamType ();
+
+ // Loop while more data from the input stream
+
+ while (!endOfStream)
+ {
+
+ // Read some data from the input stream
+
+ try {
+ bufLen = inputStream->readBytes(buf,maxLen);
+ }
+ catch (IOException& ex) {
+
+ // If an I/O exception was generated, turn
+ // it into a SQLException
+
+ throw SQLException(ex.Message,*this,::rtl::OUString(),0,Any());
+ }
+
+ // -1 as the number of bytes read indicates that
+ // there is no more data in the input stream
+
+ if (bufLen == -1)
+ {
+
+ // Sanity check to ensure that all the data we said we
+ // had was read. If not, raise an exception
+
+ if (inputStreamLen != 0) {
+ throw SQLException (::rtl::OUString::createFromAscii("End of InputStream reached before satisfying length specified when InputStream was set"),
+ *this,
+ ::rtl::OUString(),0,Any());
+ }
+ endOfStream = sal_True;
+ break;
+ }
+
+ // If we got more bytes than necessary, truncate
+ // the buffer by re-setting the buffer length. Also,
+ // indicate that we don't need to read any more.
+
+ if (bufLen > inputStreamLen)
+ {
+ bufLen = inputStreamLen;
+ endOfStream = sal_True;
+ }
+
+ realLen = bufLen;
+
+ // For UNICODE streams, strip off the high sal_Int8 and set the
+ // number of actual bytes present. It is assumed that
+ // there are 2 bytes present for every UNICODE character - if
+ // not, then that's not our problem
+
+ if (inputStreamType == OBoundParam::UNICODE)
+ {
+ realLen = bufLen / 2;
+
+ for (sal_Int32 ii = 0; ii < realLen; ii++)
+ buf[ii] = buf[(ii * 2) + 1];
+ }
+
+ // Put the data
+
+ N3SQLPutData (m_aStatementHandle, buf.getArray(), realLen);
+
+ // Decrement the number of bytes still needed
+
+ inputStreamLen -= bufLen;
+
+
+ // If there is no more data to be read, exit loop
+
+ if (inputStreamLen == 0)
+ endOfStream = sal_True;
+ }
+}
+// -------------------------------------------------------------------------
+//--------------------------------------------------------------------
+// getPrecision
+// Given a SQL type, return the maximum precision for the column.
+// Returns -1 if not known
+//--------------------------------------------------------------------
+
+sal_Int32 OPreparedStatement::getPrecision ( sal_Int32 sqlType)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ sal_Int32 prec = -1;
+ OTypeInfo aInfo;
+ aInfo.nType = sqlType;
+ if (m_aTypeInfo.size())
+ {
+ ::std::vector<OTypeInfo>::const_iterator aIter = ::std::find(m_aTypeInfo.begin(),m_aTypeInfo.end(),aInfo);
+ if(aIter != m_aTypeInfo.end())
+ prec = (*aIter).nPrecision;
+ }
+ return prec;
+}
+
+//--------------------------------------------------------------------
+// setStream
+// Sets an input stream as a parameter, using the given SQL type
+//--------------------------------------------------------------------
+
+void OPreparedStatement::setStream (
+ sal_Int32 ParameterIndex,
+ const Reference< XInputStream>& x,
+ sal_Int32 length,
+ sal_Int32 SQLtype,
+ sal_Int32 streamType)
+ throw(SQLException)
+{
+ if( !ParameterIndex || ParameterIndex > numParams)
+ throw SQLException(STAT_INVALID_INDEX,*this,::rtl::OUString::createFromAscii("07009"),0,Any());
+ // Get the buffer needed for the length
+
+ sal_Int8* lenBuf = getLengthBuf(ParameterIndex);
+
+ // Allocate a new buffer for the parameter data. This buffer
+ // will be returned by SQLParamData (it is set to the parameter
+ // number, a 4-sal_Int8 integer)
+
+ sal_Int8* dataBuf = allocBindBuf (ParameterIndex, 4);
+
+ // Bind the parameter with SQL_LEN_DATA_AT_EXEC
+ SWORD Ctype = SQL_C_CHAR;
+ SDWORD atExec = SQL_LEN_DATA_AT_EXEC (length);
+ memcpy (dataBuf, &ParameterIndex, sizeof(ParameterIndex));
+ memcpy (lenBuf, &atExec, sizeof (atExec));
+
+ if ((SQLtype == SQL_BINARY) || (SQLtype == SQL_VARBINARY) || (SQLtype == SQL_LONGVARBINARY))
+ Ctype = SQL_C_BINARY;
+
+
+ N3SQLBindParameter(m_aStatementHandle, ParameterIndex,SQL_PARAM_INPUT,Ctype,
+ SQLtype, length,0, dataBuf, sizeof(ParameterIndex),(SDWORD*)lenBuf);
+
+ // Save the input stream
+
+ boundParams[ParameterIndex - 1].setInputStream (x, length);
+
+ // Set the stream type
+
+ boundParams[ParameterIndex - 1].setStreamType (streamType);
+}
+// -------------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+// setChar
+// Binds the given string to the given SQL type
+//--------------------------------------------------------------------
+void OPreparedStatement::setChar(sal_Int32 parameterIndex,
+ sal_Int32 SQLtype,
+ sal_Int32 scale,
+ const ::rtl::OUString& x)
+ throw(SQLException)
+{
+ // ::rtl::OString x1(::rtl::OUStringToOString(x,osl_getThreadTextEncoding()));
+
+ if( !parameterIndex || parameterIndex > numParams)
+ throw SQLException(STAT_INVALID_INDEX,*this,::rtl::OUString::createFromAscii("07009"),0,Any());
+
+ sal_Int8* bindBuf = allocBindBuf (parameterIndex,x.getLength());
+
+ // Get the precision for this SQL type. If the precision
+ // is out of bounds, set it to our default
+
+// sal_Int32 precision = getPrecision (SQLtype);
+//
+// if ((precision < 0) || (precision > 2000))
+// precision = 2000;
+//
+ // bindParameter(m_aStatementHandle,parameterIndex,bindBuf);
+ PREP_BIND_PARAM(char*,SQLtype);
+
+// // Make a copy of the data
+// SDWORD lBuf = x.getLength();
+// memcpy (bindBuf, x.getStr(), lBuf);
+// bindBuf[lBuf] = '\0';
+// precision = lBuf;
+//
+// SQLINTEGER nNTS = SQL_NTS;
+//
+// SQLRETURN nRet = N3SQLBindParameter(m_aStatementHandle, parameterIndex,SQL_PARAM_INPUT,
+// SQLtype,SQL_C_CHAR, precision, scale, bindBuf,lBuf, &nNTS);
+//
+}
+// -------------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+// setBinary
+// Binds the given sal_Int8 array to the given SQL type
+//--------------------------------------------------------------------
+
+void OPreparedStatement::setBinary (sal_Int32 parameterIndex,sal_Int32 SQLtype,
+ const Sequence< sal_Int8 >& x) throw(SQLException)
+{
+ // Allocate a buffer to be used in binding. This will be
+ // a 'permanent' buffer that the bridge will fill in with
+ // the bound data in native format.
+ if( !parameterIndex || parameterIndex > numParams)
+ throw SQLException(STAT_INVALID_INDEX,*this,::rtl::OUString::createFromAscii("07009"),0,Any());
+
+ sal_Int8* bindBuf = allocBindBuf (parameterIndex,x.getLength());
+
+ // Get the buffer needed for the length
+
+ // sal_Int8* lenBuf = getLengthBuf (parameterIndex);
+ bindParameter< Sequence< sal_Int8 > >( m_aStatementHandle,
+ parameterIndex,
+ bindBuf,getLengthBuf(parameterIndex),
+ SQLtype,
+ sal_False,sal_False,&x,(Reference <XInterface>)*this);
+
+
+ // N3SQLBindInParameterBinary (m_aStatementHandle, parameterIndex,
+ // SQLtype, x.getConstArray(), bindBuf, lenBuf, buffers);
+
+}
+// -------------------------------------------------------------------------
+
+void OPreparedStatement::FreeParams()
+{
+ delete boundParams;
+}
+// -------------------------------------------------------------------------
+
+
diff --git a/connectivity/source/drivers/odbc/OResultSet.cxx b/connectivity/source/drivers/odbc/OResultSet.cxx
new file mode 100644
index 000000000000..fbf4538f6d56
--- /dev/null
+++ b/connectivity/source/drivers/odbc/OResultSet.cxx
@@ -0,0 +1,2051 @@
+/*************************************************************************
+ *
+ * $RCSfile: OResultSet.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:14:23 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+#ifndef _CONNECTIVITY_ODBC_ORESULTSET_HXX_
+#include "odbc/OResultSet.hxx"
+#endif
+#ifndef _CONNECTIVITY_PROPERTYIDS_HXX_
+#include "propertyids.hxx"
+#endif
+#ifndef _CONNECTIVITY_OTOOLS_HXX_
+#include "odbc/OTools.hxx"
+#endif
+#ifndef _CONNECTIVITY_ODBC_ORESULTSETMETADATA_HXX_
+#include "odbc/OResultSetMetaData.hxx"
+#endif
+#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
+#include <com/sun/star/sdbc/DataType.hpp>
+#endif
+#ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBCX_COMPAREBOOKMARK_HPP_
+#include <com/sun/star/sdbcx/CompareBookmark.hpp>
+#endif
+#ifndef _UTL_PROPERTY_HXX_
+#include <unotools/property.hxx>
+#endif
+#ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_
+#include <com/sun/star/lang/DisposedException.hpp>
+#endif
+#ifndef _UTL_SEQUENCE_HXX_
+#include <unotools/sequence.hxx>
+#endif
+#ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
+#include <cppuhelper/typeprovider.hxx>
+#endif
+#ifndef _CPPUHELPER_EXTRACT_HXX_
+#include <cppuhelper/extract.hxx>
+#endif
+//#ifndef _CONNECTIVITY_OTOOLS_HXX_
+//#include "odbc/OTools.hxx"
+//#endif
+
+using namespace connectivity::odbc;
+using namespace cppu;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::sdbc;
+using namespace com::sun::star::sdbcx;
+using namespace com::sun::star::container;
+using namespace com::sun::star::io;
+using namespace com::sun::star::util;
+//------------------------------------------------------------------------------
+// IMPLEMENT_SERVICE_INFO(OResultSet,"com.sun.star.sdbcx.OResultSet","com.sun.star.sdbc.ResultSet");
+::rtl::OUString SAL_CALL OResultSet::getImplementationName( ) throw ( RuntimeException) \
+{
+ return ::rtl::OUString::createFromAscii("com.sun.star.sdbcx.odbc.ResultSet");
+}
+// -------------------------------------------------------------------------
+ Sequence< ::rtl::OUString > SAL_CALL OResultSet::getSupportedServiceNames( ) throw( RuntimeException)
+{
+ Sequence< ::rtl::OUString > aSupported(2);
+ aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbc.ResultSet");
+ aSupported[1] = ::rtl::OUString::createFromAscii("com.sun.star.sdbcx.ResultSet");
+ return aSupported;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL OResultSet::supportsService( const ::rtl::OUString& _rServiceName ) throw( RuntimeException)
+{
+ Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames());
+ const ::rtl::OUString* pSupported = aSupported.getConstArray();
+ for (sal_Int32 i=0; i<aSupported.getLength(); ++i, ++pSupported)
+ if (pSupported->equals(_rServiceName))
+ return sal_True;
+
+ return sal_False;
+}
+
+// -------------------------------------------------------------------------
+OResultSet::OResultSet(SQLHANDLE _pStatementHandle ,OStatement_Base* pStmt) : OResultSet_BASE(m_aMutex)
+ ,OPropertySetHelper(OResultSet_BASE::rBHelper)
+ ,m_aStatement((OWeakObject*)pStmt)
+ ,m_aStatementHandle(_pStatementHandle)
+ ,m_aConnectionHandle(pStmt->getConnectionHandle())
+ ,m_nRowPos(0)
+ ,m_bLastRecord(sal_False)
+ ,m_bEOF(sal_False)
+ ,m_bFreeHandle(sal_False)
+ ,m_xMetaData(NULL)
+ ,m_bInserting(sal_False)
+ ,m_nLastColumnPos(0)
+{
+ osl_incrementInterlockedCount( &m_refCount );
+ m_pRowStatusArray = new SQLUSMALLINT[1]; // the default value
+ N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_STATUS_PTR,m_pRowStatusArray,SQL_IS_POINTER);
+
+ SQLSMALLINT nValueLen = 0;
+ N3SQLGetInfo(m_aConnectionHandle,SQL_GETDATA_EXTENSIONS,&nValueLen,sizeof nValueLen,&nValueLen);
+ SQLINTEGER nCurType = 0;
+ N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_CURSOR_TYPE,&nCurType,SQL_IS_UINTEGER,0);
+
+ allocBuffer((SQL_GD_ANY_ORDER & nValueLen) != SQL_GD_ANY_ORDER && nCurType != SQL_CURSOR_FORWARD_ONLY);
+ osl_decrementInterlockedCount( &m_refCount );
+}
+// -------------------------------------------------------------------------
+OResultSet::OResultSet(SQLHANDLE _pStatementHandle ) : OResultSet_BASE(m_aMutex)
+ ,OPropertySetHelper(OResultSet_BASE::rBHelper)
+ ,m_aStatement(NULL)
+ ,m_aStatementHandle(_pStatementHandle)
+ ,m_aConnectionHandle(NULL)
+ ,m_nRowPos(0)
+ ,m_bLastRecord(sal_False)
+ ,m_bEOF(sal_False)
+ ,m_bFreeHandle(sal_False)
+ ,m_xMetaData(NULL)
+ ,m_bInserting(sal_False)
+ ,m_nLastColumnPos(0)
+{
+ osl_incrementInterlockedCount( &m_refCount );
+ m_pRowStatusArray = new SQLUSMALLINT[1]; // the default value
+ osl_decrementInterlockedCount( &m_refCount );
+ // allocBuffer();
+}
+
+// -------------------------------------------------------------------------
+OResultSet::~OResultSet()
+{
+ delete m_pRowStatusArray;
+ if(m_aBindVector.size())
+ releaseBuffer();
+}
+// -------------------------------------------------------------------------
+void OResultSet::disposing(void)
+{
+ OPropertySetHelper::disposing();
+
+ ::osl::MutexGuard aGuard(m_aMutex);
+ if(m_bFreeHandle)
+ {
+ N3SQLFreeStmt(m_aStatementHandle,SQL_CLOSE);
+ N3SQLFreeHandle(SQL_HANDLE_STMT,m_aStatementHandle);
+ m_aStatementHandle = NULL;
+ }
+ m_aStatement = NULL;
+ m_xMetaData = NULL;
+}
+// -------------------------------------------------------------------------
+void OResultSet::allocBuffer(sal_Bool _bAllocRow)
+{
+ m_bFetchData = !_bAllocRow;
+ m_aBindVector.push_back(NULL); // the first is reserved for the bookmark
+ Reference< XResultSetMetaData > xMeta = getMetaData();
+ sal_Int32 nLen = xMeta->getColumnCount();
+ for(sal_Int32 i = 1;i<=nLen;++i)
+ {
+ switch (xMeta->getColumnType(i))
+ {
+ case DataType::CHAR:
+ case DataType::VARCHAR:
+ m_aBindVector.push_back(new ::rtl::OString());
+ break;
+ case DataType::DECIMAL:
+ case DataType::NUMERIC:
+ case DataType::BIGINT:
+ m_aBindVector.push_back(new ::rtl::OString());
+ break;
+ case DataType::DOUBLE:
+ m_aBindVector.push_back(new double(0.0));
+ break;
+ case DataType::LONGVARCHAR:
+ m_aBindVector.push_back(new char[2]); // dient nur zum auffinden
+ break;
+ case DataType::LONGVARBINARY:
+ m_aBindVector.push_back(new char[2]); // dient nur zum auffinden
+ break;
+ case DataType::DATE:
+ m_aBindVector.push_back(new DATE_STRUCT);
+ break;
+ case DataType::TIME:
+ m_aBindVector.push_back(new TIME_STRUCT);
+ break;
+ case DataType::TIMESTAMP:
+ m_aBindVector.push_back(new TIMESTAMP_STRUCT);
+ break;
+ case DataType::BIT:
+ m_aBindVector.push_back(new sal_Int8(0));
+ break;
+ case DataType::TINYINT:
+ case DataType::SMALLINT:
+ m_aBindVector.push_back(new sal_Int16(0));
+ break;
+ case DataType::INTEGER:
+ m_aBindVector.push_back(new sal_Int32(0));
+ break;
+ case DataType::REAL:
+ m_aBindVector.push_back(new float(0));
+ break;
+ case DataType::BINARY:
+ case DataType::VARBINARY:
+ m_aBindVector.push_back(new sal_Int8[xMeta->getPrecision(i)]);
+ break;
+ }
+ }
+ m_aLengthVector.resize(nLen + 1);
+// if(_bAllocRow)
+// m_aRow.resize(nLen + 1);
+}
+// -------------------------------------------------------------------------
+void OResultSet::releaseBuffer()
+{
+ Reference< XResultSetMetaData > xMeta = getMetaData();
+ sal_Int32 nLen = xMeta->getColumnCount();
+ for(sal_Int32 i = 0;i<nLen;++i)
+ {
+ switch (xMeta->getColumnType(i+1))
+ {
+ case DataType::CHAR:
+ case DataType::VARCHAR:
+ delete (::rtl::OString*) m_aBindVector[i];
+ break;
+ case DataType::DECIMAL:
+ case DataType::NUMERIC:
+ case DataType::BIGINT:
+ delete (::rtl::OString*) m_aBindVector[i];
+ break;
+ case DataType::DOUBLE:
+ m_aBindVector.push_back(new double(0.0));
+ break;
+ case DataType::LONGVARCHAR:
+ delete (char*) m_aBindVector[i];
+ break;
+ case DataType::LONGVARBINARY:
+ delete (char*) m_aBindVector[i];
+ break;
+ case DataType::DATE:
+ delete (DATE_STRUCT*) m_aBindVector[i];
+ break;
+ case DataType::TIME:
+ delete (TIME_STRUCT*) m_aBindVector[i];
+ break;
+ case DataType::TIMESTAMP:
+ delete (TIMESTAMP_STRUCT*) m_aBindVector[i];
+ break;
+ case DataType::BIT:
+ delete (sal_Int8*) m_aBindVector[i];
+ break;
+ case DataType::TINYINT:
+ case DataType::SMALLINT:
+ delete (sal_Int16*) m_aBindVector[i];
+ break;
+ case DataType::INTEGER:
+ delete (sal_Int32*) m_aBindVector[i];
+ break;
+ case DataType::REAL:
+ delete (float*) m_aBindVector[i];
+ break;
+ case DataType::BINARY:
+ case DataType::VARBINARY:
+ delete (sal_Int8*) m_aBindVector[i];
+ break;
+ }
+ }
+ m_aLengthVector.clear();
+}
+// -------------------------------------------------------------------------
+Any SAL_CALL OResultSet::queryInterface( const Type & rType ) throw(RuntimeException)
+{
+ Any aRet = OPropertySetHelper::queryInterface(rType);
+ if(!aRet.hasValue())
+ aRet = OResultSet_BASE::queryInterface(rType);
+ return aRet;
+}
+// -------------------------------------------------------------------------
+ Sequence< Type > SAL_CALL OResultSet::getTypes( ) throw( RuntimeException)
+{
+ OTypeCollection aTypes( ::getCppuType( (const Reference< ::com::sun::star::beans::XMultiPropertySet > *)0 ),
+ ::getCppuType( (const Reference< ::com::sun::star::beans::XFastPropertySet > *)0 ),
+ ::getCppuType( (const Reference< ::com::sun::star::beans::XPropertySet > *)0 ));
+
+ return ::utl::concatSequences(aTypes.getTypes(),OResultSet_BASE::getTypes());
+}
+// -------------------------------------------------------------------------
+
+sal_Int32 SAL_CALL OResultSet::findColumn( const ::rtl::OUString& columnName ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ Reference< XResultSetMetaData > xMeta = getMetaData();
+ sal_Int32 nLen = xMeta->getColumnCount();
+ sal_Int32 i = 1;
+ for(;i<=nLen;++i)
+ if(xMeta->isCaseSensitive(i) ? columnName == xMeta->getColumnName(i) : columnName.equalsIgnoreCase(xMeta->getColumnName(i)))
+ break;
+ return i;
+}
+// -------------------------------------------------------------------------
+Reference< XInputStream > SAL_CALL OResultSet::getBinaryStream( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ // TODO use getBytes instead of
+ return NULL;
+}
+// -------------------------------------------------------------------------
+Reference< XInputStream > SAL_CALL OResultSet::getCharacterStream( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ // TODO use getBytes instead of
+ return NULL;
+}
+
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL OResultSet::getBoolean( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+
+// if(m_bFetchData)
+// {
+// if(columnIndex > m_nLastColumnPos)
+// fillRow(columnIndex);
+// return any2bool(m_aRow[columnIndex]);
+// }
+
+
+ return getValue(m_aStatementHandle,columnIndex,SQL_C_BIT,m_bWasNull,**this,sal_Int8(0));
+}
+// -------------------------------------------------------------------------
+
+sal_Int8 SAL_CALL OResultSet::getByte( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+// if(!m_bFetchData)
+// {
+// if(columnIndex > m_nLastColumnPos)
+// fillRow(columnIndex);
+// return getINT16(m_aRow[columnIndex]);
+// }
+
+
+ return getValue(m_aStatementHandle,columnIndex,SQL_C_CHAR,m_bWasNull,**this,sal_Int8(0));
+}
+// -------------------------------------------------------------------------
+
+Sequence< sal_Int8 > SAL_CALL OResultSet::getBytes( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+// if(!m_bFetchData)
+// {
+// if(columnIndex > m_nLastColumnPos)
+// fillRow(columnIndex);
+// return *(Sequence< sal_Int8 >*)m_aRow[columnIndex].getValue(); // no assignment because this is very expensive
+// }
+ return OTools::getBytesValue(m_aStatementHandle,columnIndex,getMetaData()->getColumnType(columnIndex),m_bWasNull,**this);
+}
+// -------------------------------------------------------------------------
+
+Date SAL_CALL OResultSet::getDate( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+// if(!m_bFetchData)
+// {
+// if(columnIndex > m_nLastColumnPos)
+// fillRow(columnIndex);
+// Date aRet;
+// m_aRow[columnIndex] >>= aRet;
+// return aRet;
+// }
+
+ DATE_STRUCT aDate;
+ aDate.day = 0;
+ aDate.month = 0;
+ aDate.year = 0;
+ aDate = getValue(m_aStatementHandle,columnIndex,SQL_C_DATE,m_bWasNull,**this,aDate);
+ return Date(aDate.day,aDate.month,aDate.year);
+}
+// -------------------------------------------------------------------------
+
+double SAL_CALL OResultSet::getDouble( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+// if(!m_bFetchData)
+// {
+// if(columnIndex > m_nLastColumnPos)
+// fillRow(columnIndex);
+// return connectivity::getDouble(m_aRow[columnIndex]);
+// }
+ return getValue(m_aStatementHandle,columnIndex,SQL_C_DOUBLE,m_bWasNull,**this,double(0.0));
+}
+// -------------------------------------------------------------------------
+
+float SAL_CALL OResultSet::getFloat( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+// if(!m_bFetchData)
+// {
+// if(columnIndex > m_nLastColumnPos)
+// fillRow(columnIndex);
+// float nRet = 0.0;
+// m_aRow[columnIndex] >>= nRet;
+// return nRet;
+// }
+ return getValue(m_aStatementHandle,columnIndex,SQL_C_FLOAT,m_bWasNull,**this,float(0));
+}
+// -------------------------------------------------------------------------
+
+sal_Int32 SAL_CALL OResultSet::getInt( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+// if(!m_bFetchData)
+// {
+// if(columnIndex > m_nLastColumnPos)
+// fillRow(columnIndex);
+// return getINT32(m_aRow[columnIndex]);
+// }
+ return getValue(m_aStatementHandle,columnIndex,SQL_C_LONG,m_bWasNull,**this,sal_Int32(0));
+}
+// -------------------------------------------------------------------------
+
+sal_Int32 SAL_CALL OResultSet::getRow( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ sal_Int32 nValue = 0;
+ N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_NUMBER,&nValue,SQL_IS_UINTEGER,0);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+
+sal_Int64 SAL_CALL OResultSet::getLong( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ return sal_Int64();
+}
+// -------------------------------------------------------------------------
+
+Reference< XResultSetMetaData > SAL_CALL OResultSet::getMetaData( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ if(!m_xMetaData.is())
+ m_xMetaData = new OResultSetMetaData(m_aStatementHandle);
+ return m_xMetaData;
+}
+// -------------------------------------------------------------------------
+Reference< XArray > SAL_CALL OResultSet::getArray( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ return NULL;
+}
+
+// -------------------------------------------------------------------------
+
+Reference< XClob > SAL_CALL OResultSet::getClob( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ return NULL;
+}
+// -------------------------------------------------------------------------
+Reference< XBlob > SAL_CALL OResultSet::getBlob( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ return NULL;
+}
+// -------------------------------------------------------------------------
+
+Reference< XRef > SAL_CALL OResultSet::getRef( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ return NULL;
+}
+// -------------------------------------------------------------------------
+
+Any SAL_CALL OResultSet::getObject( sal_Int32 columnIndex, const Reference< ::com::sun::star::container::XNameAccess >& typeMap ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ return Any();
+}
+// -------------------------------------------------------------------------
+
+sal_Int16 SAL_CALL OResultSet::getShort( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+// if(!m_bFetchData)
+// {
+// if(columnIndex > m_nLastColumnPos)
+// fillRow(columnIndex);
+// return getINT16(m_aRow[columnIndex]);
+// }
+ return getValue(m_aStatementHandle,columnIndex,SQL_C_SHORT,m_bWasNull,**this,sal_Int16(0));
+}
+// -------------------------------------------------------------------------
+
+
+::rtl::OUString SAL_CALL OResultSet::getString( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+// if(!m_bFetchData)
+// {
+// if(columnIndex > m_nLastColumnPos)
+// fillRow(columnIndex);
+// ::rtl::OUString aRet;
+// m_aRow[columnIndex] >>= aRet;
+// return aRet;
+// }
+ return OTools::getStringValue(m_aStatementHandle,columnIndex,getMetaData()->getColumnType(columnIndex),m_bWasNull,**this);
+}
+// -------------------------------------------------------------------------
+
+
+Time SAL_CALL OResultSet::getTime( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+// if(!m_bFetchData)
+// {
+// if(columnIndex > m_nLastColumnPos)
+// fillRow(columnIndex);
+// Time aRet;
+// m_aRow[columnIndex] >>= aRet;
+// return aRet;
+// }
+ TIME_STRUCT aTime={0,0,0};
+ aTime = getValue(m_aStatementHandle,columnIndex,SQL_C_TIME,m_bWasNull,**this,aTime);
+ return Time(0,aTime.second,aTime.minute,aTime.hour);
+}
+// -------------------------------------------------------------------------
+
+
+DateTime SAL_CALL OResultSet::getTimestamp( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+// if(!m_bFetchData)
+// {
+// if(columnIndex > m_nLastColumnPos)
+// fillRow(columnIndex);
+// DateTime aRet;
+// m_aRow[columnIndex] >>= aRet;
+// return aRet;
+// }
+ TIMESTAMP_STRUCT aTime={0,0,0,0,0,0,0};
+ aTime = getValue(m_aStatementHandle,columnIndex,SQL_C_TIMESTAMP,m_bWasNull,**this,aTime);
+ return DateTime(aTime.fraction*1000,aTime.second,aTime.minute,aTime.hour,aTime.day,aTime.month,aTime.year);
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OResultSet::isAfterLast( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ return m_nCurrentFetchState == SQL_NO_DATA;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL OResultSet::isFirst( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ return m_nRowPos == 1;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL OResultSet::isLast( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ return m_bEOF && m_nCurrentFetchState != SQL_NO_DATA;
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::beforeFirst( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ if(first())
+ previous();
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::afterLast( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ if(last())
+ next();
+ m_bEOF = sal_True;
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OResultSet::close( ) throw(SQLException, RuntimeException)
+{
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+ }
+ dispose();
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OResultSet::first( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_FIRST,0);
+ OTools::ThrowException(m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ sal_Bool bRet;
+ if(bRet = (m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO))
+ m_nRowPos = 1;
+ return bRet;
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OResultSet::last( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_LAST,0);
+ OTools::ThrowException(m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ // here I know definitely that I stand on the last record
+ return m_bLastRecord = (m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO);
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL OResultSet::absolute( sal_Int32 row ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_ABSOLUTE,row);
+ OTools::ThrowException(m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ sal_Bool bRet = m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO;
+ if(bRet)
+ m_nRowPos = row;
+ return bRet;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL OResultSet::relative( sal_Int32 row ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_RELATIVE,row);
+ OTools::ThrowException(m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ sal_Bool bRet = m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO;
+ if(bRet)
+ m_nRowPos += row;
+ return bRet;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL OResultSet::previous( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_PRIOR,0);
+ OTools::ThrowException(m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ sal_Bool bRet = m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO;
+ if(bRet)
+ --m_nRowPos;
+ return bRet;
+}
+// -------------------------------------------------------------------------
+Reference< XInterface > SAL_CALL OResultSet::getStatement( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ return m_aStatement.get();
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OResultSet::rowDeleted( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ return m_pRowStatusArray[0] == SQL_ROW_DELETED;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL OResultSet::rowInserted( ) throw(SQLException, RuntimeException)
+{ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ return m_pRowStatusArray[0] == SQL_ROW_ADDED;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL OResultSet::rowUpdated( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ return m_pRowStatusArray[0] == SQL_ROW_UPDATED;
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OResultSet::isBeforeFirst( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ return m_nRowPos == 0;
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OResultSet::next( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ // m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_NEXT,0);
+ m_nCurrentFetchState = N3SQLFetch(m_aStatementHandle);
+ OTools::ThrowException(m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ return m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO;
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OResultSet::wasNull( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ if(!m_bFetchData)
+ return !m_aRow[m_nLastColumnPos].hasValue();
+
+ return m_bWasNull;
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OResultSet::cancel( ) throw(RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ OTools::ThrowException(N3SQLCancel(m_aStatementHandle),m_aStatementHandle,SQL_HANDLE_STMT,*this);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::clearWarnings( ) throw(SQLException, RuntimeException)
+{
+}
+// -------------------------------------------------------------------------
+Any SAL_CALL OResultSet::getWarnings( ) throw(SQLException, RuntimeException)
+{
+ return Any();
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::insertRow( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ SQLRETURN nRet;
+ if(pODBC3SQLBulkOperations)
+ nRet = N3SQLBulkOperations(m_aStatementHandle, SQL_ADD);
+ else
+ {
+ if(isBeforeFirst())
+ next(); // must be done
+ nRet = N3SQLSetPos(m_aStatementHandle,1,SQL_ADD,SQL_LOCK_NO_CHANGE);
+ }
+ OTools::ThrowException(nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ nRet = N3SQLFreeStmt(m_aStatementHandle,SQL_UNBIND);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::updateRow( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ SQLRETURN nRet;
+ nRet = N3SQLSetPos(m_aStatementHandle,1,SQL_UPDATE,SQL_LOCK_NO_CHANGE);
+ if( nRet == SQL_NEED_DATA)
+ {
+ void * pData = NULL;
+ nRet = N3SQLParamData(m_aStatementHandle,&pData);
+ do
+ {
+ if (nRet != SQL_SUCCESS && nRet != SQL_SUCCESS_WITH_INFO && nRet != SQL_NEED_DATA)
+ break;
+
+ ::std::vector<void*>::const_iterator aFound = ::std::find(m_aBindVector.begin(),m_aBindVector.end(),pData);
+ sal_Int32 nPos = m_aBindVector.size() - (m_aBindVector.end() - aFound);
+
+ // TODO transfer long data
+ // N3SQLPutData(m_aStatementHandle,,);
+ nRet = N3SQLParamData(m_aStatementHandle,&pData);
+ }
+ while (nRet == SQL_NEED_DATA);
+
+ }
+ OTools::ThrowException(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);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::deleteRow( ) throw(SQLException, RuntimeException)
+{
+ SQLRETURN nRet = N3SQLSetPos(m_aStatementHandle,1,SQL_DELETE,SQL_LOCK_NO_CHANGE);
+ OTools::ThrowException(nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OResultSet::cancelRowUpdates( ) throw(SQLException, RuntimeException)
+{
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OResultSet::moveToInsertRow( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ // first unbound all columns
+ N3SQLFreeStmt(m_aStatementHandle,SQL_UNBIND);
+ // SQLRETURN nRet = N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_ARRAY_SIZE ,(SQLPOINTER)1,SQL_IS_INTEGER);
+ m_bInserting = sal_True;
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OResultSet::moveToCurrentRow( ) throw(SQLException, RuntimeException)
+{
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OResultSet::updateNull( sal_Int32 columnIndex ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ bindValue(m_aStatementHandle,columnIndex,SQL_CHAR,0,0,(sal_Int8*)NULL,NULL,&m_aLengthVector[columnIndex],**this);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OResultSet::updateBoolean( sal_Int32 columnIndex, sal_Bool x ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ void* pData = m_aBindVector[columnIndex];
+ bindValue<sal_Bool>(m_aStatementHandle,columnIndex,SQL_BIT,0,0,&x,pData,&m_aLengthVector[columnIndex],**this);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::updateByte( sal_Int32 columnIndex, sal_Int8 x ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ void* pData = m_aBindVector[columnIndex];
+ bindValue(m_aStatementHandle,columnIndex,SQL_CHAR,0,0,&x,pData,&m_aLengthVector[columnIndex],**this);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OResultSet::updateShort( sal_Int32 columnIndex, sal_Int16 x ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ void* pData = m_aBindVector[columnIndex];
+ bindValue(m_aStatementHandle,columnIndex,SQL_TINYINT,0,0,&x,pData,&m_aLengthVector[columnIndex],**this);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::updateInt( sal_Int32 columnIndex, sal_Int32 x ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ void* pData = m_aBindVector[columnIndex];
+ bindValue(m_aStatementHandle,columnIndex,SQL_INTEGER,0,0,&x,pData,&m_aLengthVector[columnIndex],**this);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::updateLong( sal_Int32 columnIndex, sal_Int64 x ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ throw RuntimeException();
+}
+// -----------------------------------------------------------------------
+void SAL_CALL OResultSet::updateFloat( sal_Int32 columnIndex, float x ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ void* pData = m_aBindVector[columnIndex];
+ bindValue(m_aStatementHandle,columnIndex,SQL_REAL,0,0,&x,pData,&m_aLengthVector[columnIndex],**this);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OResultSet::updateDouble( sal_Int32 columnIndex, double x ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ void* pData = m_aBindVector[columnIndex];
+ bindValue(m_aStatementHandle,columnIndex,SQL_DOUBLE,0,0,&x,pData,&m_aLengthVector[columnIndex],**this);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::updateString( sal_Int32 columnIndex, const ::rtl::OUString& x ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ void* pData = m_aBindVector[columnIndex];
+ bindValue(m_aStatementHandle,columnIndex,SQL_VARCHAR,0,0,&x,pData,&m_aLengthVector[columnIndex],**this);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::updateBytes( sal_Int32 columnIndex, const Sequence< sal_Int8 >& x ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ void* pData = m_aBindVector[columnIndex];
+ bindValue(m_aStatementHandle,columnIndex,SQL_BINARY,0,0,&x,pData,&m_aLengthVector[columnIndex],**this);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::updateDate( sal_Int32 columnIndex, const Date& x ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ void* pData = m_aBindVector[columnIndex];
+ DATE_STRUCT aVal = OTools::DateToOdbcDate(x);
+ bindValue(m_aStatementHandle,columnIndex,SQL_DATE,0,0,&aVal,pData,&m_aLengthVector[columnIndex],**this);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OResultSet::updateTime( sal_Int32 columnIndex, const Time& x ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ void* pData = m_aBindVector[columnIndex];
+ TIME_STRUCT aVal = OTools::TimeToOdbcTime(x);
+ bindValue(m_aStatementHandle,columnIndex,SQL_TIME,0,0,&aVal,pData,&m_aLengthVector[columnIndex],**this);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OResultSet::updateTimestamp( sal_Int32 columnIndex, const DateTime& x ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ void* pData = m_aBindVector[columnIndex];
+ TIMESTAMP_STRUCT aVal = OTools::DateTimeToTimestamp(x);
+ bindValue(m_aStatementHandle,columnIndex,SQL_TIMESTAMP,0,0,&aVal,pData,&m_aLengthVector[columnIndex],**this);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OResultSet::updateBinaryStream( sal_Int32 columnIndex, const Reference< XInputStream >& x, sal_Int32 length ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::updateCharacterStream( sal_Int32 columnIndex, const Reference< XInputStream >& x, sal_Int32 length ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::refreshRow( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ SQLRETURN nRet = N3SQLSetPos(m_aStatementHandle,1,SQL_REFRESH,SQL_LOCK_NO_CHANGE);
+ // m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_RELATIVE,0);
+ OTools::ThrowException(nRet,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+}
+// -------------------------------------------------------------------------
+void SAL_CALL OResultSet::updateObject( sal_Int32 columnIndex, const Any& x ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+// switch(x.getValueTypeClass())
+// {
+// case TypeClass_VOID:
+// args[0].l = NULL;
+// break;
+//
+// case TypeClass_BOOLEAN:
+// {
+// sal_Bool f;
+// x >>= f;
+// updateBoolean(columnIndex,f);
+// }
+// break;
+// case TypeClass_BYTE:
+// {
+// sal_Int8 f;
+// x >>= f;
+// updateByte(columnIndex,f);
+// }
+// break;
+// case TypeClass_SHORT:
+// case TypeClass_UNSIGNED_SHORT:
+// {
+// sal_Int16 f;
+// x >>= f;
+// updateShort(columnIndex,f);
+// }
+// break;
+// case TypeClass_LONG:
+// case TypeClass_UNSIGNED_LONG:
+// {
+// sal_Int32 f;
+// x >>= f;
+// updateInt(columnIndex,f);
+// }
+// break;
+// case TypeClass_HYPER:
+// case TypeClass_UNSIGNED_HYPER:
+// {
+// sal_Int64 f;
+// x >>= f;
+// updateLong(columnIndex,f);
+// }
+// break;
+// case TypeClass_FLOAT:
+// {
+// float f;
+// x >>= f;
+// updateFloat(columnIndex,f);
+// }
+// break;
+// case TypeClass_DOUBLE:
+// updateDouble(columnIndex,::utl::getDouble(x));
+// break;
+// case TypeClass_CHAR:
+// case TypeClass_STRING:
+// updateString(columnIndex,::utl::getString(x));
+// break;
+// case TypeClass_ENUM:
+// default:
+// OSL_ENSHURE(0,"UNKOWN TYPE for OResultSet::updateObject");
+// }
+// return;
+// // Parameter konvertieren
+// // temporaere Variable initialisieren
+// char * cSignature = "(ILjava/lang/Object;)V";
+// char * cMethodName = "updateObject";
+// // Java-Call absetzen
+// }
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OResultSet::updateNumericObject( sal_Int32 columnIndex, const Any& x, sal_Int32 scale ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ columnIndex = mapColumn(columnIndex);
+ OSL_ENSHURE(0,"OResultSet::updateNumericObject: NYI");
+// SDBThreadAttach t;
+// if( t.pEnv )
+// {
+// jvalue args[1];
+// // Parameter konvertieren
+// args[0].l =
+// // temporaere Variable initialisieren
+// char * cSignature = "(I;Ljava/lang/Object;I)V";
+// char * cMethodName = "updateObject";
+// // Java-Call absetzen
+// jmethodID mID = t.pEnv->GetMethodID( getMyClass(), cMethodName, cSignature );
+// if( mID ){
+// t.pEnv->CallVoidMethod( object, mID,columnIndex,args[0].l,scale);
+ // ThrowSQLException(t.pEnv,*this);
+// t.pEnv->DeleteLocalRef((jobject)args[0].l);
+// }
+// }
+}
+// -------------------------------------------------------------------------
+// XRowLocate
+Any SAL_CALL OResultSet::getBookmark( ) throw( SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ sal_uInt32 nValue = SQL_UB_OFF;
+ N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_USE_BOOKMARKS,&nValue,SQL_IS_UINTEGER,NULL);
+ if(nValue == SQL_UB_OFF)
+ throw SQLException();
+
+
+ return makeAny(OTools::getBytesValue(m_aStatementHandle,0,SQL_BINARY,m_bWasNull,**this));
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL OResultSet::moveToBookmark( const Any& bookmark ) throw( SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ Sequence<sal_Int8> aBookmark;
+ bookmark >>= aBookmark;
+ SQLRETURN nReturn = N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_FETCH_BOOKMARK_PTR,aBookmark.getArray(),SQL_IS_POINTER);
+
+ m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_BOOKMARK,0);
+ OTools::ThrowException(m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ return m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL OResultSet::moveRelativeToBookmark( const Any& bookmark, sal_Int32 rows ) throw( SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ Sequence<sal_Int8> aBookmark;
+ bookmark >>= aBookmark;
+ SQLRETURN nReturn = N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_FETCH_BOOKMARK_PTR,aBookmark.getArray(),SQL_IS_POINTER);
+
+ m_nCurrentFetchState = N3SQLFetchScroll(m_aStatementHandle,SQL_FETCH_BOOKMARK,rows);
+ OTools::ThrowException(m_nCurrentFetchState,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ return m_nCurrentFetchState == SQL_SUCCESS || m_nCurrentFetchState == SQL_SUCCESS_WITH_INFO;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL OResultSet::compareBookmarks( const Any& first, const Any& second ) throw( SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ return (first == second) ? CompareBookmark::EQUAL : CompareBookmark::NOT_EQUAL;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL OResultSet::hasOrderedBookmarks( ) throw( SQLException, RuntimeException)
+{
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL OResultSet::hashBookmark( const Any& bookmark ) throw( SQLException, RuntimeException)
+{
+ throw SQLException();
+}
+// -------------------------------------------------------------------------
+// XDeleteRows
+Sequence< sal_Int32 > SAL_CALL OResultSet::deleteRows( const Sequence< Any >& rows ) throw( SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OResultSet_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ SQLRETURN nReturn;
+
+ const Any* pBegin = rows.getConstArray();
+ const Any* pEnd = pBegin + rows.getLength();
+
+ typedef sal_Int8* sal_INT8;
+ sal_Int8** pArray = new sal_INT8[rows.getLength()];
+ for(sal_Int32 i=0;pBegin != pEnd;++i,++pBegin)
+ {
+ pArray[i] = ((Sequence<sal_Int8>*)pBegin->getValue())->getArray();
+ }
+
+ sal_Int32* pStatusArray = new sal_Int32[rows.getLength()];
+
+
+ nReturn = N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_STATUS_PTR ,(SQLPOINTER)pStatusArray,SQL_IS_POINTER);
+ nReturn = N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_ARRAY_SIZE ,(SQLPOINTER)rows.getLength(),SQL_IS_INTEGER);
+ sal_Int32 nLen = rows.getLength();
+ nReturn = N3SQLBindCol(m_aStatementHandle,0,SQL_C_VARBOOKMARK,pArray,rows.getLength(),&nLen);
+ nReturn = N3SQLBulkOperations(m_aStatementHandle,SQL_DELETE_BY_BOOKMARK);
+
+ delete [] pArray;
+
+ Sequence< sal_Int32 > aRet(rows.getLength());
+ for(sal_Int32 j=0;j<rows.getLength();++j)
+ {
+ aRet.getArray()[j] = pStatusArray[j] == SQL_ROW_SUCCESS;
+ }
+ delete pStatusArray;
+ delete pArray;
+ return aRet;
+}
+//------------------------------------------------------------------------------
+sal_Int32 OResultSet::getResultSetConcurrency() const throw( SQLException, RuntimeException)
+{
+ sal_uInt32 nValue;
+ N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_CONCURRENCY,&nValue,SQL_IS_UINTEGER,0);
+ return nValue;
+}
+//------------------------------------------------------------------------------
+sal_Int32 OResultSet::getResultSetType() const throw( SQLException, RuntimeException)
+{
+ sal_uInt32 nValue;
+ N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_CURSOR_SENSITIVITY,&nValue,SQL_IS_UINTEGER,0);
+ return nValue;
+}
+//------------------------------------------------------------------------------
+sal_Int32 OResultSet::getFetchDirection() const throw( SQLException, RuntimeException)
+{
+ sal_uInt32 nValue;
+ N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_CURSOR_TYPE,&nValue,SQL_IS_UINTEGER,0);
+ return nValue;
+}
+//------------------------------------------------------------------------------
+sal_Int32 OResultSet::getFetchSize() const throw( SQLException, RuntimeException)
+{
+ sal_uInt32 nValue;
+ N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_ARRAY_SIZE,&nValue,SQL_IS_UINTEGER,0);
+ return nValue;
+}
+//------------------------------------------------------------------------------
+::rtl::OUString OResultSet::getCursorName() const throw( SQLException, RuntimeException)
+{
+ SQLCHAR pName[258];
+ SQLSMALLINT nRealLen = 0;
+ N3SQLGetCursorName(m_aStatementHandle,(SQLCHAR*)pName,256,&nRealLen);
+ return ::rtl::OUString::createFromAscii((const char*)pName);
+}
+// -------------------------------------------------------------------------
+sal_Bool OResultSet::isBookmarkable() const throw( SQLException, RuntimeException)
+{
+ if(!m_aConnectionHandle)
+ return sal_False;
+
+ sal_uInt32 nValue;
+ N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_CURSOR_TYPE,&nValue,SQL_IS_UINTEGER,0);
+
+ sal_Int32 nAttr = 0;
+ switch(nValue)
+ {
+ case SQL_CURSOR_FORWARD_ONLY:
+ return sal_False;
+ break;
+ case SQL_CURSOR_STATIC:
+ OTools::GetInfo(m_aConnectionHandle,SQL_STATIC_CURSOR_ATTRIBUTES1,nAttr,*(Reference< XInterface >*)this);
+ break;
+ case SQL_CURSOR_KEYSET_DRIVEN:
+ OTools::GetInfo(m_aConnectionHandle,SQL_KEYSET_CURSOR_ATTRIBUTES1,nAttr,*(Reference< XInterface >*)this);
+ break;
+ case SQL_CURSOR_DYNAMIC:
+ OTools::GetInfo(m_aConnectionHandle,SQL_DYNAMIC_CURSOR_ATTRIBUTES1,nAttr,*(Reference< XInterface >*)this);
+ break;
+ }
+ sal_uInt32 nUseBookmark = SQL_UB_OFF;
+ N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_USE_BOOKMARKS,&nUseBookmark,SQL_IS_UINTEGER,NULL);
+
+ return (nUseBookmark != SQL_UB_OFF) && (nAttr & SQL_CA1_BOOKMARK) == SQL_CA1_BOOKMARK;
+}
+//------------------------------------------------------------------------------
+void OResultSet::setFetchDirection(sal_Int32 _par0) throw( SQLException, RuntimeException)
+{
+ N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_CURSOR_TYPE,(SQLPOINTER)_par0,SQL_IS_UINTEGER);
+}
+//------------------------------------------------------------------------------
+void OResultSet::setFetchSize(sal_Int32 _par0) throw( SQLException, RuntimeException)
+{
+ N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_ARRAY_SIZE,(SQLPOINTER)_par0,SQL_IS_UINTEGER);
+ delete m_pRowStatusArray;
+ m_pRowStatusArray = new SQLUSMALLINT[_par0];
+ N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_STATUS_PTR,m_pRowStatusArray,SQL_IS_POINTER);
+}
+// -------------------------------------------------------------------------
+IPropertyArrayHelper* OResultSet::createArrayHelper( ) const
+{
+ Sequence< Property > aProps(6);
+ Property* pProperties = aProps.getArray();
+ sal_Int32 nPos = 0;
+ DECL_PROP1IMPL(CURSORNAME, ::rtl::OUString) PropertyAttribute::READONLY);
+ DECL_PROP0(FETCHDIRECTION, sal_Int32);
+ DECL_PROP0(FETCHSIZE, sal_Int32);
+ DECL_BOOL_PROP1IMPL(ISBOOKMARKABLE) PropertyAttribute::READONLY);
+ DECL_PROP1IMPL(RESULTSETCONCURRENCY,sal_Int32) PropertyAttribute::READONLY);
+ DECL_PROP1IMPL(RESULTSETTYPE, sal_Int32) PropertyAttribute::READONLY);
+
+ return new OPropertyArrayHelper(aProps);
+}
+// -------------------------------------------------------------------------
+IPropertyArrayHelper & OResultSet::getInfoHelper()
+{
+ return *const_cast<OResultSet*>(this)->getArrayHelper();
+}
+// -------------------------------------------------------------------------
+sal_Bool OResultSet::convertFastPropertyValue(
+ Any & rConvertedValue,
+ Any & rOldValue,
+ sal_Int32 nHandle,
+ const Any& rValue )
+ throw (::com::sun::star::lang::IllegalArgumentException)
+{
+ switch(nHandle)
+ {
+ case PROPERTY_ID_ISBOOKMARKABLE:
+ case PROPERTY_ID_CURSORNAME:
+ case PROPERTY_ID_RESULTSETCONCURRENCY:
+ case PROPERTY_ID_RESULTSETTYPE:
+ throw ::com::sun::star::lang::IllegalArgumentException();
+ break;
+ case PROPERTY_ID_FETCHDIRECTION:
+ return ::utl::tryPropertyValue(rConvertedValue, rOldValue, rValue, getFetchDirection());
+ case PROPERTY_ID_FETCHSIZE:
+ return ::utl::tryPropertyValue(rConvertedValue, rOldValue, rValue, getFetchSize());
+ default:
+ ;
+ }
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+void OResultSet::setFastPropertyValue_NoBroadcast(
+ sal_Int32 nHandle,
+ const Any& rValue
+ )
+ throw (Exception)
+{
+ switch(nHandle)
+ {
+ case PROPERTY_ID_ISBOOKMARKABLE:
+ case PROPERTY_ID_CURSORNAME:
+ case PROPERTY_ID_RESULTSETCONCURRENCY:
+ case PROPERTY_ID_RESULTSETTYPE:
+ throw Exception();
+ break;
+ case PROPERTY_ID_FETCHDIRECTION:
+ setFetchDirection(getINT32(rValue));
+ break;
+ case PROPERTY_ID_FETCHSIZE:
+ setFetchSize(getINT32(rValue));
+ break;
+ default:
+ ;
+ }
+}
+// -------------------------------------------------------------------------
+void OResultSet::getFastPropertyValue(
+ Any& rValue,
+ sal_Int32 nHandle
+ ) const
+{
+ switch(nHandle)
+ {
+ case PROPERTY_ID_ISBOOKMARKABLE:
+ rValue = bool2any(isBookmarkable());
+ break;
+ case PROPERTY_ID_CURSORNAME:
+ rValue <<= getCursorName();
+ break;
+ case PROPERTY_ID_RESULTSETCONCURRENCY:
+ rValue <<= getResultSetConcurrency();
+ break;
+ case PROPERTY_ID_RESULTSETTYPE:
+ rValue <<= getResultSetType();
+ break;
+ case PROPERTY_ID_FETCHDIRECTION:
+ rValue <<= getFetchDirection();
+ break;
+ case PROPERTY_ID_FETCHSIZE:
+ rValue <<= getFetchSize();
+ break;
+ }
+}
+// -------------------------------------------------------------------------
+void OResultSet::openTypeInfo() throw(SQLException, RuntimeException)
+{
+ m_bFreeHandle = sal_True;
+ OTools::ThrowException(N3SQLGetTypeInfo(m_aStatementHandle, SQL_ALL_TYPES),m_aStatementHandle,SQL_HANDLE_STMT,*this);
+}
+//-----------------------------------------------------------------------------
+void OResultSet::openTables(const Any& catalog, const ::rtl::OUString& schemaPattern,
+ const ::rtl::OUString& tableNamePattern,
+ const Sequence< ::rtl::OUString >& types ) throw(SQLException, RuntimeException)
+{
+ m_bFreeHandle = sal_True;
+ ::rtl::OString aPKQ,aPKO,aPKN,aCOL;
+ const ::rtl::OUString *pSchemaPat = NULL;
+
+ if(schemaPattern.toChar() != '%')
+ pSchemaPat = &schemaPattern;
+ else
+ pSchemaPat = NULL;
+
+ const char *pPKQ = catalog.hasValue() ? (aPKQ = ::rtl::OUStringToOString(connectivity::getString(catalog),
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKO = pSchemaPat ? (aPKO = ::rtl::OUStringToOString(schemaPattern,
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKN = aPKN = ::rtl::OUStringToOString(tableNamePattern,
+ osl_getThreadTextEncoding()
+ ).getStr();
+
+
+ const char *pCOL = NULL;
+ const ::rtl::OUString* pBegin = types.getConstArray();
+ const ::rtl::OUString* pEnd = pBegin + types.getLength();
+ for(;pBegin != pEnd;++pBegin)
+ {
+ aCOL += ::rtl::OUStringToOString(*pBegin,
+ osl_getThreadTextEncoding()
+ );
+ aCOL += ",";
+ }
+ if(aCOL.getLength())
+ pCOL = aCOL.getStr();
+
+ SQLRETURN nRetcode = N3SQLTables(m_aStatementHandle,
+ (SDB_ODBC_CHAR *) pPKQ, catalog.hasValue() ? SQL_NTS : 0,
+ (SDB_ODBC_CHAR *) pPKO, SQL_NTS ,
+ (SDB_ODBC_CHAR *) pPKN, SQL_NTS,
+ (SDB_ODBC_CHAR *) pCOL, pCOL ? SQL_NTS : 0);
+ OTools::ThrowException(nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+
+}
+//-----------------------------------------------------------------------------
+void OResultSet::openTablesTypes( ) throw(SQLException, RuntimeException)
+{
+ m_bFreeHandle = sal_True;
+ SQLRETURN nRetcode = N3SQLTables(m_aStatementHandle,
+ 0,0,
+ 0,0,
+ 0,0,
+ (SDB_ODBC_CHAR *) SQL_ALL_TABLE_TYPES,SQL_NTS);
+ OTools::ThrowException(nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+
+ m_aColMapping.clear();
+ m_aColMapping.push_back(-1);
+ m_aColMapping.push_back(4);
+ m_xMetaData = new OResultSetMetaData(m_aStatementHandle,m_aColMapping);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openCatalogs() throw(SQLException, RuntimeException)
+{
+ m_bFreeHandle = sal_True;
+ SQLRETURN nRetcode = N3SQLTables(m_aStatementHandle,
+ (SDB_ODBC_CHAR *) SQL_ALL_CATALOGS,SQL_NTS,
+ 0,0,
+ 0,0,
+ (SDB_ODBC_CHAR *) "",SQL_NTS);
+
+ OTools::ThrowException(nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+
+ m_aColMapping.clear();
+ m_aColMapping.push_back(-1);
+ m_aColMapping.push_back(1);
+ m_xMetaData = new OResultSetMetaData(m_aStatementHandle,m_aColMapping);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openSchemas() throw(SQLException, RuntimeException)
+{
+ m_bFreeHandle = sal_True;
+ SQLRETURN nRetcode = N3SQLTables(m_aStatementHandle,
+ 0,0,
+ (SDB_ODBC_CHAR *) SQL_ALL_SCHEMAS,SQL_NTS,
+ 0,0,
+ (SDB_ODBC_CHAR *) "",SQL_NTS);
+ OTools::ThrowException(nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+
+ m_aColMapping.clear();
+ m_aColMapping.push_back(-1);
+ m_aColMapping.push_back(2);
+ m_xMetaData = new OResultSetMetaData(m_aStatementHandle,m_aColMapping);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openColumnPrivileges( const Any& catalog, const ::rtl::OUString& schema,
+ const ::rtl::OUString& table, const ::rtl::OUString& columnNamePattern )
+ throw(SQLException, RuntimeException)
+{
+ const ::rtl::OUString *pSchemaPat = NULL;
+
+ if(schema.toChar() != '%')
+ pSchemaPat = &schema;
+ else
+ pSchemaPat = NULL;
+
+ m_bFreeHandle = sal_True;
+ ::rtl::OString aPKQ,aPKO,aPKN,aCOL;
+
+ const char *pPKQ = catalog.hasValue() ? (aPKQ = ::rtl::OUStringToOString(connectivity::getString(catalog),
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKO = pSchemaPat ? (aPKO = ::rtl::OUStringToOString(schema,
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKN = aPKN = ::rtl::OUStringToOString(table,
+ osl_getThreadTextEncoding()
+ ).getStr(),
+ *pCOL = aCOL = ::rtl::OUStringToOString(columnNamePattern,
+ osl_getThreadTextEncoding()
+ ).getStr();
+
+
+ SQLRETURN nRetcode = N3SQLColumnPrivileges(m_aStatementHandle,
+ (SDB_ODBC_CHAR *) pPKQ, catalog.hasValue() ? SQL_NTS : 0,
+ (SDB_ODBC_CHAR *) pPKO, SQL_NTS ,
+ (SDB_ODBC_CHAR *) pPKN, SQL_NTS,
+ (SDB_ODBC_CHAR *) pCOL, SQL_NTS);
+ OTools::ThrowException(nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+
+
+}
+// -------------------------------------------------------------------------
+void OResultSet::openColumns( const Any& catalog, const ::rtl::OUString& schemaPattern,
+ const ::rtl::OUString& tableNamePattern, const ::rtl::OUString& columnNamePattern )
+ throw(SQLException, RuntimeException)
+{
+ const ::rtl::OUString *pSchemaPat = NULL;
+
+ if(schemaPattern.toChar() != '%')
+ pSchemaPat = &schemaPattern;
+ else
+ pSchemaPat = NULL;
+
+ m_bFreeHandle = sal_True;
+ ::rtl::OString aPKQ,aPKO,aPKN,aCOL;
+
+ const char *pPKQ = catalog.hasValue() ? (aPKQ = ::rtl::OUStringToOString(connectivity::getString(catalog),
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKO = pSchemaPat ? (aPKO = ::rtl::OUStringToOString(schemaPattern,
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKN = aPKN = ::rtl::OUStringToOString(tableNamePattern,
+ osl_getThreadTextEncoding()
+ ).getStr(),
+ *pCOL = aCOL = ::rtl::OUStringToOString(columnNamePattern,
+ osl_getThreadTextEncoding()
+ ).getStr();
+
+
+ SQLRETURN nRetcode = N3SQLColumns(m_aStatementHandle,
+ (SDB_ODBC_CHAR *) pPKQ, catalog.hasValue() ? SQL_NTS : 0,
+ (SDB_ODBC_CHAR *) pPKO, SQL_NTS ,
+ (SDB_ODBC_CHAR *) pPKN, SQL_NTS,
+ (SDB_ODBC_CHAR *) pCOL, SQL_NTS);
+
+ OTools::ThrowException(nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openProcedureColumns( const Any& catalog, const ::rtl::OUString& schemaPattern,
+ const ::rtl::OUString& procedureNamePattern,const ::rtl::OUString& columnNamePattern )
+ throw(SQLException, RuntimeException)
+{
+ const ::rtl::OUString *pSchemaPat = NULL;
+
+ if(schemaPattern.toChar() != '%')
+ pSchemaPat = &schemaPattern;
+ else
+ pSchemaPat = NULL;
+
+ m_bFreeHandle = sal_True;
+ ::rtl::OString aPKQ,aPKO,aPKN,aCOL;
+
+ const char *pPKQ = catalog.hasValue() ? (aPKQ = ::rtl::OUStringToOString(connectivity::getString(catalog),
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKO = pSchemaPat ? (aPKO = ::rtl::OUStringToOString(schemaPattern,
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKN = aPKN = ::rtl::OUStringToOString(procedureNamePattern,
+ osl_getThreadTextEncoding()
+ ).getStr(),
+ *pCOL = aCOL = ::rtl::OUStringToOString(columnNamePattern,
+ osl_getThreadTextEncoding()
+ ).getStr();
+
+
+ SQLRETURN nRetcode = N3SQLProcedureColumns(m_aStatementHandle,
+ (SDB_ODBC_CHAR *) pPKQ, catalog.hasValue() ? SQL_NTS : 0,
+ (SDB_ODBC_CHAR *) pPKO, SQL_NTS ,
+ (SDB_ODBC_CHAR *) pPKN, SQL_NTS,
+ (SDB_ODBC_CHAR *) pCOL, SQL_NTS);
+
+ OTools::ThrowException(nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openProcedures(const Any& catalog, const ::rtl::OUString& schemaPattern,
+ const ::rtl::OUString& procedureNamePattern)
+ throw(SQLException, RuntimeException)
+{
+ const ::rtl::OUString *pSchemaPat = NULL;
+
+ if(schemaPattern.toChar() != '%')
+ pSchemaPat = &schemaPattern;
+ else
+ pSchemaPat = NULL;
+
+ m_bFreeHandle = sal_True;
+ ::rtl::OString aPKQ,aPKO,aPKN,aCOL;
+
+ const char *pPKQ = catalog.hasValue() ? (aPKQ = ::rtl::OUStringToOString(connectivity::getString(catalog),
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKO = pSchemaPat ? (aPKO = ::rtl::OUStringToOString(schemaPattern,
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKN = aPKN = ::rtl::OUStringToOString(procedureNamePattern,
+ osl_getThreadTextEncoding()
+ ).getStr();
+
+
+ SQLRETURN nRetcode = N3SQLProcedures(m_aStatementHandle,
+ (SDB_ODBC_CHAR *) pPKQ, catalog.hasValue() ? SQL_NTS : 0,
+ (SDB_ODBC_CHAR *) pPKO, SQL_NTS ,
+ (SDB_ODBC_CHAR *) pPKN, SQL_NTS);
+ OTools::ThrowException(nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openSpecialColumns(sal_Bool _bRowVer,const Any& catalog, const ::rtl::OUString& schema,
+ const ::rtl::OUString& table,sal_Int32 scope, sal_Bool nullable )
+ throw(SQLException, RuntimeException)
+{
+ const ::rtl::OUString *pSchemaPat = NULL;
+
+ if(schema.toChar() != '%')
+ pSchemaPat = &schema;
+ else
+ pSchemaPat = NULL;
+
+ m_bFreeHandle = sal_True;
+ ::rtl::OString aPKQ,aPKO,aPKN,aCOL;
+
+ const char *pPKQ = catalog.hasValue() ? (aPKQ = ::rtl::OUStringToOString(connectivity::getString(catalog),
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKO = pSchemaPat ? (aPKO = ::rtl::OUStringToOString(schema,
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKN = aPKN = ::rtl::OUStringToOString(table,
+ osl_getThreadTextEncoding()
+ ).getStr();
+
+
+ SQLRETURN nRetcode = N3SQLSpecialColumns(m_aStatementHandle,_bRowVer ? SQL_ROWVER : SQL_BEST_ROWID,
+ (SDB_ODBC_CHAR *) pPKQ, catalog.hasValue() ? SQL_NTS : 0,
+ (SDB_ODBC_CHAR *) pPKO, SQL_NTS ,
+ (SDB_ODBC_CHAR *) pPKN, SQL_NTS,
+ scope,
+ nullable ? SQL_NULLABLE : SQL_NO_NULLS);
+ OTools::ThrowException(nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openVersionColumns(const Any& catalog, const ::rtl::OUString& schema,
+ const ::rtl::OUString& table) throw(SQLException, RuntimeException)
+{
+ openSpecialColumns(sal_True,catalog,schema,table,SQL_SCOPE_TRANSACTION,sal_False);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openBestRowIdentifier( const Any& catalog, const ::rtl::OUString& schema,
+ const ::rtl::OUString& table,sal_Int32 scope,sal_Bool nullable ) throw(SQLException, RuntimeException)
+{
+ openSpecialColumns(sal_False,catalog,schema,table,scope,nullable);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openForeignKeys( const Any& catalog, const ::rtl::OUString* schema,
+ const ::rtl::OUString* table,
+ const Any& catalog2, const ::rtl::OUString* schema2,
+ const ::rtl::OUString* table2) throw(SQLException, RuntimeException)
+{
+ m_bFreeHandle = sal_True;
+
+ ::rtl::OString aPKQ,aPKO,aPKN, aFKQ, aFKO, aFKN;
+
+ const char *pPKQ = catalog.hasValue() ? (aPKQ = ::rtl::OUStringToOString(connectivity::getString(catalog),
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKO = schema ? (aPKO = ::rtl::OUStringToOString(*schema,
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKN = table ? (aPKN = ::rtl::OUStringToOString(*table,
+ osl_getThreadTextEncoding()
+ )).getStr(): NULL,
+ *pFKQ = catalog2.hasValue() ? (aFKQ = ::rtl::OUStringToOString(connectivity::getString(catalog),
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pFKO = schema2 ? (aFKO = ::rtl::OUStringToOString(*schema2,
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pFKN = table2 ? (aFKN = ::rtl::OUStringToOString(*table2,
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL;
+
+
+ SQLRETURN nRetcode = N3SQLForeignKeys(m_aStatementHandle,
+ (SDB_ODBC_CHAR *) pPKQ, catalog.hasValue() ? SQL_NTS : 0,
+ (SDB_ODBC_CHAR *) pPKO, SQL_NTS ,
+ (SDB_ODBC_CHAR *) pPKN, pPKN ? SQL_NTS : 0,
+ (SDB_ODBC_CHAR *) pFKQ, catalog2.hasValue() ? SQL_NTS : 0,
+ (SDB_ODBC_CHAR *) pFKO, SQL_NTS ,
+ (SDB_ODBC_CHAR *) pFKN, SQL_NTS
+ );
+ OTools::ThrowException(nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openImportedKeys(const Any& catalog, const ::rtl::OUString& schema,
+ const ::rtl::OUString& table) throw(SQLException, RuntimeException)
+{
+ openForeignKeys(catalog,!schema.compareToAscii("%") ? &schema : NULL,&table,Any(),NULL,NULL);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openExportedKeys(const Any& catalog, const ::rtl::OUString& schema,
+ const ::rtl::OUString& table) throw(SQLException, RuntimeException)
+{
+ openForeignKeys(Any(),NULL,NULL,catalog,!schema.compareToAscii("%") ? &schema : NULL,&table);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openPrimaryKeys(const Any& catalog, const ::rtl::OUString& schema,
+ const ::rtl::OUString& table) throw(SQLException, RuntimeException)
+{
+ const ::rtl::OUString *pSchemaPat = NULL;
+
+ if(schema.toChar() != '%')
+ pSchemaPat = &schema;
+ else
+ pSchemaPat = NULL;
+
+ m_bFreeHandle = sal_True;
+ ::rtl::OString aPKQ,aPKO,aPKN,aCOL;
+
+ const char *pPKQ = catalog.hasValue() ? (aPKQ = ::rtl::OUStringToOString(connectivity::getString(catalog),
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKO = pSchemaPat ? (aPKO = ::rtl::OUStringToOString(schema,
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKN = (aPKN = ::rtl::OUStringToOString(table,
+ osl_getThreadTextEncoding()
+ )).getStr();
+
+
+ SQLRETURN nRetcode = N3SQLPrimaryKeys(m_aStatementHandle,
+ (SDB_ODBC_CHAR *) pPKQ, catalog.hasValue() ? SQL_NTS : 0,
+ (SDB_ODBC_CHAR *) pPKO, SQL_NTS ,
+ (SDB_ODBC_CHAR *) pPKN, SQL_NTS);
+ OTools::ThrowException(nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openTablePrivileges(const Any& catalog, const ::rtl::OUString& schemaPattern,
+ const ::rtl::OUString& tableNamePattern) throw(SQLException, RuntimeException)
+{
+ const ::rtl::OUString *pSchemaPat = NULL;
+
+ if(schemaPattern.toChar() != '%')
+ pSchemaPat = &schemaPattern;
+ else
+ pSchemaPat = NULL;
+
+ m_bFreeHandle = sal_True;
+ ::rtl::OString aPKQ,aPKO,aPKN;
+
+ const char *pPKQ = catalog.hasValue() ? (aPKQ = ::rtl::OUStringToOString(connectivity::getString(catalog),
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKO = pSchemaPat ? (aPKO = ::rtl::OUStringToOString(schemaPattern,
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKN = (aPKN = ::rtl::OUStringToOString(tableNamePattern,
+ osl_getThreadTextEncoding()
+ )).getStr();
+
+
+ SQLRETURN nRetcode = N3SQLTablePrivileges(m_aStatementHandle,
+ (SDB_ODBC_CHAR *) pPKQ, catalog.hasValue() ? SQL_NTS : 0,
+ (SDB_ODBC_CHAR *) pPKO, SQL_NTS ,
+ (SDB_ODBC_CHAR *) pPKN, SQL_NTS);
+ OTools::ThrowException(nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+}
+// -------------------------------------------------------------------------
+void OResultSet::openIndexInfo( const Any& catalog, const ::rtl::OUString& schema,
+ const ::rtl::OUString& table,sal_Bool unique,sal_Bool approximate )
+ throw(SQLException, RuntimeException)
+{
+ const ::rtl::OUString *pSchemaPat = NULL;
+
+ if(schema.toChar() != '%')
+ pSchemaPat = &schema;
+ else
+ pSchemaPat = NULL;
+
+ m_bFreeHandle = sal_True;
+ ::rtl::OString aPKQ,aPKO,aPKN;
+
+ const char *pPKQ = catalog.hasValue() ? (aPKQ = ::rtl::OUStringToOString(connectivity::getString(catalog),
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKO = pSchemaPat ? (aPKO = ::rtl::OUStringToOString(schema,
+ osl_getThreadTextEncoding()
+ )).getStr() : NULL,
+ *pPKN = (aPKN = ::rtl::OUStringToOString(table,
+ osl_getThreadTextEncoding()
+ )).getStr();
+
+
+ SQLRETURN nRetcode = N3SQLStatistics(m_aStatementHandle,
+ (SDB_ODBC_CHAR *) pPKQ, catalog.hasValue() ? SQL_NTS : 0,
+ (SDB_ODBC_CHAR *) pPKO, SQL_NTS ,
+ (SDB_ODBC_CHAR *) pPKN, SQL_NTS,
+ unique,
+ approximate);
+ OTools::ThrowException(nRetcode,m_aStatementHandle,SQL_HANDLE_STMT,*this);
+}
+// -------------------------------------------------------------------------
+void OResultSet::fillRow(sal_Int32 _nToColumn)
+{
+ m_bFetchData = sal_True;
+ Reference< XResultSetMetaData > xMeta = getMetaData();
+ for(sal_Int32 i=m_nLastColumnPos+1;i <= _nToColumn; ++i)
+ {
+ switch (xMeta->getColumnType(i))
+ {
+ case DataType::CHAR:
+ case DataType::VARCHAR:
+ m_aRow[i] <<= getString(i);
+ break;
+ case DataType::DECIMAL:
+ case DataType::NUMERIC:
+ case DataType::BIGINT:
+ m_aRow[i] <<= getString(i);
+ break;
+ case DataType::DOUBLE:
+ m_aRow[i] <<= getDouble(i);
+ break;
+ case DataType::LONGVARCHAR:
+ m_aRow[i] <<= getString(i);
+ break;
+ case DataType::LONGVARBINARY:
+ m_aRow[i] <<= getBytes(i);
+ break;
+ case DataType::DATE:
+ m_aRow[i] <<= getDate(i);
+ break;
+ case DataType::TIME:
+ m_aRow[i] <<= getTime(i);
+ break;
+ case DataType::TIMESTAMP:
+ m_aRow[i] <<= getTimestamp(i);
+ break;
+ case DataType::BIT:
+ m_aRow[i] = bool2any(getBoolean(i));
+ break;
+ case DataType::TINYINT:
+ m_aRow[i] <<= getByte(i);
+ break;
+ case DataType::SMALLINT:
+ m_aRow[i] <<= getShort(i);
+ break;
+ case DataType::INTEGER:
+ m_aRow[i] <<= getInt(i);
+ break;
+ case DataType::REAL:
+ m_aRow[i] <<= getFloat(i);
+ break;
+ case DataType::BINARY:
+ case DataType::VARBINARY:
+ m_aRow[i] <<= getBytes(i);
+ break;
+ }
+ }
+ m_nLastColumnPos = _nToColumn;
+ m_bFetchData = sal_False;
+}
+
+
diff --git a/connectivity/source/drivers/odbc/OResultSetMetaData.cxx b/connectivity/source/drivers/odbc/OResultSetMetaData.cxx
new file mode 100644
index 000000000000..ae35669da768
--- /dev/null
+++ b/connectivity/source/drivers/odbc/OResultSetMetaData.cxx
@@ -0,0 +1,254 @@
+/*************************************************************************
+ *
+ * $RCSfile: OResultSetMetaData.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:14:23 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_ODBC_ORESULTSETMETADATA_HXX_
+#include "odbc/OResultSetMetaData.hxx"
+#endif
+#ifndef _CONNECTIVITY_OTOOLS_HXX_
+#include "odbc/OTools.hxx"
+#endif
+
+using namespace connectivity::odbc;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::sdbc;
+
+// -------------------------------------------------------------------------
+OResultSetMetaData::~OResultSetMetaData()
+{
+}
+// -------------------------------------------------------------------------
+::rtl::OUString OResultSetMetaData::getCharColAttrib(sal_Int32 _column,sal_Int32 ident) throw(SQLException, RuntimeException)
+{
+ sal_Int32 column = _column;
+ if(_column < m_vMapping.size()) // use mapping
+ column = m_vMapping[_column];
+
+ sal_Int32 BUFFER_LEN = 128;
+ char *pName = new char[BUFFER_LEN];
+ SQLSMALLINT nRealLen=0;
+ OTools::ThrowException(N3SQLColAttribute(m_aStatementHandle,
+ column,
+ ident,
+ (SQLPOINTER)pName,
+ BUFFER_LEN,
+ &nRealLen,
+ NULL
+ ),m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ if(nRealLen > BUFFER_LEN)
+ {
+ delete pName;
+ pName = new char[nRealLen];
+ OTools::ThrowException(N3SQLColAttribute(m_aStatementHandle,
+ column,
+ ident,
+ (SQLPOINTER)pName,
+ nRealLen,
+ &nRealLen,
+ NULL
+ ),m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ }
+
+ return ::rtl::OUString::createFromAscii(pName);
+}
+// -------------------------------------------------------------------------
+sal_Int32 OResultSetMetaData::getNumColAttrib(sal_Int32 _column,sal_Int32 ident) throw(SQLException, RuntimeException)
+{
+ sal_Int32 column = _column;
+ if(_column < m_vMapping.size()) // use mapping
+ column = m_vMapping[_column];
+
+ sal_Int32 nValue=0;
+ sal_Int16 nLen = sizeof(nValue);
+ OTools::ThrowException(N3SQLColAttribute(m_aStatementHandle,
+ column,
+ ident,
+ NULL,
+ NULL,
+ NULL,
+ &nValue),m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ return nValue;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL OResultSetMetaData::getColumnDisplaySize( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getNumColAttrib(column,SQL_DESC_DISPLAY_SIZE);
+}
+// -------------------------------------------------------------------------
+
+sal_Int32 SAL_CALL OResultSetMetaData::getColumnType( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return OTools::MapOdbcType2Jdbc(getNumColAttrib(column,SQL_DESC_TYPE));
+}
+// -------------------------------------------------------------------------
+
+sal_Int32 SAL_CALL OResultSetMetaData::getColumnCount( ) throw(SQLException, RuntimeException)
+{
+ if(m_nColCount != -1)
+ return m_nColCount;
+ sal_Int16 nNumResultCols=0;
+ OTools::ThrowException(N3SQLNumResultCols(m_aStatementHandle,&nNumResultCols),m_aStatementHandle,SQL_HANDLE_STMT,*this);
+ return m_nColCount = nNumResultCols;
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OResultSetMetaData::isCaseSensitive( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getNumColAttrib(column,SQL_DESC_CASE_SENSITIVE) == SQL_TRUE;
+}
+// -------------------------------------------------------------------------
+
+::rtl::OUString SAL_CALL OResultSetMetaData::getSchemaName( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getCharColAttrib(column,SQL_DESC_SCHEMA_NAME);
+}
+// -------------------------------------------------------------------------
+
+::rtl::OUString SAL_CALL OResultSetMetaData::getColumnName( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getCharColAttrib(column,SQL_DESC_NAME);
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL OResultSetMetaData::getTableName( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getCharColAttrib(column,SQL_DESC_TABLE_NAME);
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL OResultSetMetaData::getCatalogName( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getCharColAttrib(column,SQL_DESC_CATALOG_NAME);
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL OResultSetMetaData::getColumnTypeName( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getCharColAttrib(column,SQL_DESC_TYPE_NAME
+);
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL OResultSetMetaData::getColumnLabel( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getCharColAttrib(column,SQL_DESC_LABEL);
+}
+// -------------------------------------------------------------------------
+::rtl::OUString SAL_CALL OResultSetMetaData::getColumnServiceName( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return ::rtl::OUString();
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OResultSetMetaData::isCurrency( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getNumColAttrib(column,SQL_DESC_FIXED_PREC_SCALE) == SQL_TRUE;
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OResultSetMetaData::isAutoIncrement( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getNumColAttrib(column,SQL_DESC_AUTO_UNIQUE_VALUE) == SQL_TRUE;
+}
+// -------------------------------------------------------------------------
+
+
+sal_Bool SAL_CALL OResultSetMetaData::isSigned( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getNumColAttrib(column,SQL_DESC_UNSIGNED) == SQL_FALSE;
+}
+// -------------------------------------------------------------------------
+sal_Int32 SAL_CALL OResultSetMetaData::getPrecision( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getNumColAttrib(column,SQL_DESC_PRECISION);
+}
+sal_Int32 SAL_CALL OResultSetMetaData::getScale( sal_Int32 column ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException)
+{
+ return getNumColAttrib(column,SQL_DESC_SCALE);
+}
+// -------------------------------------------------------------------------
+
+sal_Int32 SAL_CALL OResultSetMetaData::isNullable( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getNumColAttrib(column,SQL_DESC_NULLABLE);
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OResultSetMetaData::isSearchable( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getNumColAttrib(column,SQL_DESC_SEARCHABLE) != SQL_PRED_NONE;
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OResultSetMetaData::isReadOnly( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getNumColAttrib(column,SQL_DESC_UPDATABLE) == SQL_ATTR_READONLY;
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OResultSetMetaData::isDefinitelyWritable( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getNumColAttrib(column,SQL_DESC_UPDATABLE) == SQL_ATTR_WRITE;
+;
+}
+// -------------------------------------------------------------------------
+sal_Bool SAL_CALL OResultSetMetaData::isWritable( sal_Int32 column ) throw(SQLException, RuntimeException)
+{
+ return getNumColAttrib(column,SQL_DESC_UPDATABLE) == SQL_ATTR_WRITE;
+}
+// -------------------------------------------------------------------------
+
diff --git a/connectivity/source/drivers/odbc/OStatement.cxx b/connectivity/source/drivers/odbc/OStatement.cxx
new file mode 100644
index 000000000000..3fa896cdfece
--- /dev/null
+++ b/connectivity/source/drivers/odbc/OStatement.cxx
@@ -0,0 +1,1004 @@
+/*************************************************************************
+ *
+ * $RCSfile: OStatement.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:14:23 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+#ifndef _OSL_DIAGNOSE_H_
+#include <osl/diagnose.h>
+#endif
+#ifndef _CONNECTIVITY_ODBC_OSTATEMENT_HXX_
+#include "odbc/OStatement.hxx"
+#endif
+#ifndef _CONNECTIVITY_ODBC_OCONNECTION_HXX_
+#include "odbc/OConnection.hxx"
+#endif
+#ifndef _CONNECTIVITY_ODBC_ORESULTSET_HXX_
+#include "odbc/OResultSet.hxx"
+#endif
+#ifndef _CONNECTIVITY_PROPERTYIDS_HXX_
+#include "propertyids.hxx"
+#endif
+#ifndef _UTL_PROPERTY_HXX_
+#include <unotools/property.hxx>
+#endif
+#ifndef _CONNECTIVITY_OTOOLS_HXX_
+#include "odbc/OTools.hxx"
+#endif
+#ifndef _UTL_UNO3_HXX_
+#include <unotools/uno3.hxx>
+#endif
+#ifndef _OSL_THREAD_H_
+#include <osl/thread.h>
+#endif
+
+#ifndef _COM_SUN_STAR_SDBC_RESULTSETCONCURRENCY_HPP_
+#include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBC_RESULTSETTYPE_HPP_
+#include <com/sun/star/sdbc/ResultSetType.hpp>
+#endif
+#ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_
+#include <com/sun/star/lang/DisposedException.hpp>
+#endif
+#ifndef _UTL_SEQUENCE_HXX_
+#include <unotools/sequence.hxx>
+#endif
+#ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
+#include <cppuhelper/typeprovider.hxx>
+#endif
+#ifndef _CPPUHELPER_EXTRACT_HXX_
+#include <cppuhelper/extract.hxx>
+#endif
+
+#define THROW_SQL(x) \
+ OTools::ThrowException(x,m_aStatementHandle,SQL_HANDLE_STMT,*this)
+
+#ifdef DEBUG
+#define DEBUG_THROW \
+ try \
+ { \
+ THROW_SQL(nRetCode); \
+ } \
+ catch(...) \
+ { \
+ }
+#endif
+
+using namespace connectivity::odbc;
+//------------------------------------------------------------------------------
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::beans;
+using namespace com::sun::star::sdbc;
+using namespace com::sun::star::sdbcx;
+using namespace com::sun::star::container;
+using namespace com::sun::star::io;
+using namespace com::sun::star::util;
+//------------------------------------------------------------------------------
+OStatement_Base::OStatement_Base(OConnection* _pConnection ) : OStatement_BASE(m_aMutex),
+ OPropertySetHelper(OStatement_BASE::rBHelper),
+ rBHelper(OStatement_BASE::rBHelper),
+ m_pConnection(_pConnection),
+ m_pRowStatusArray(0)
+{
+ m_pConnection->acquire();
+ N3SQLAllocHandle(SQL_HANDLE_STMT,m_pConnection->getConnection(),&m_aStatementHandle);
+}
+//------------------------------------------------------------------------------
+void OStatement_Base::disposeResultSet()
+{
+ // free the cursor if alive
+ Reference< XComponent > xComp(m_xResultSet.get(), UNO_QUERY);
+ if (xComp.is())
+ xComp->dispose();
+ m_xResultSet = Reference< XResultSet>();
+}
+//------------------------------------------------------------------------------
+void OStatement_BASE2::disposing()
+{
+ ::osl::MutexGuard aGuard(m_aMutex);
+
+ disposeResultSet();
+
+ if (N3SQLFreeStmt(m_aStatementHandle,SQL_RESET_PARAMS) ||
+ N3SQLFreeStmt(m_aStatementHandle,SQL_UNBIND) ||
+ N3SQLFreeStmt(m_aStatementHandle,SQL_CLOSE))
+ OTools::ThrowException(N3SQLFreeStmt(m_aStatementHandle,SQL_DROP),m_aStatementHandle,SQL_HANDLE_STMT,*this);
+
+ if (m_pConnection)
+ m_pConnection->release();
+
+ dispose_ChildImpl();
+ OStatement_Base::disposing();
+}
+//-----------------------------------------------------------------------------
+void SAL_CALL OStatement_BASE2::release() throw(RuntimeException)
+{
+ relase_ChildImpl();
+}
+//-----------------------------------------------------------------------------
+Any SAL_CALL OStatement_Base::queryInterface( const Type & rType ) throw(RuntimeException)
+{
+ Any aRet = OStatement_BASE::queryInterface(rType);
+ if(!aRet.hasValue())
+ aRet = OPropertySetHelper::queryInterface(rType);
+ return aRet;
+}
+// -------------------------------------------------------------------------
+Sequence< Type > SAL_CALL OStatement_Base::getTypes( ) throw(RuntimeException)
+{
+ ::cppu::OTypeCollection aTypes( ::getCppuType( (const Reference< XMultiPropertySet > *)0 ),
+ ::getCppuType( (const Reference< XFastPropertySet > *)0 ),
+ ::getCppuType( (const Reference< XPropertySet > *)0 ));
+
+ return ::utl::concatSequences(aTypes.getTypes(),OStatement_BASE::getTypes());
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OStatement_Base::cancel( ) throw(RuntimeException)
+{
+ OTools::ThrowException(N3SQLCancel(m_aStatementHandle),m_aStatementHandle,SQL_HANDLE_STMT,*this);
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OStatement_Base::close( ) throw(SQLException, RuntimeException)
+{
+ {
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+ }
+ dispose();
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OStatement::clearBatch( ) throw(SQLException, RuntimeException)
+{
+
+}
+// -------------------------------------------------------------------------
+
+void OStatement_Base::reset() throw (SQLException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ clearWarnings ();
+
+ if (m_xResultSet.get().is())
+ {
+ clearMyResultSet();
+ THROW_SQL(N3SQLFreeStmt(m_aStatementHandle, SQL_CLOSE));
+ }
+}
+//--------------------------------------------------------------------
+// clearMyResultSet
+// If a ResultSet was created for this Statement, close it
+//--------------------------------------------------------------------
+
+void OStatement_Base::clearMyResultSet () throw (SQLException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ Reference<XCloseable> xCloseable;
+ if(::utl::query_interface(m_xResultSet.get(),xCloseable))
+ xCloseable->close();
+ m_xResultSet = Reference< XResultSet>();
+}
+//--------------------------------------------------------------------
+sal_Int32 OStatement_Base::getRowCount () throw( SQLException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ sal_Int32 numRows = 0;
+
+ try {
+ THROW_SQL(N3SQLRowCount(m_aStatementHandle,&numRows));
+ }
+ catch (...)
+ {
+ }
+ return numRows;
+}
+//--------------------------------------------------------------------
+// lockIfNecessary
+// If the given SQL statement contains a 'FOR UPDATE' clause, change
+// the concurrency to lock so that the row can then be updated. Returns
+// true if the concurrency has been changed
+//--------------------------------------------------------------------
+
+sal_Bool OStatement_Base::lockIfNecessary (const ::rtl::OUString& sql) throw( SQLException)
+{
+ sal_Bool rc = sal_False;
+
+ // First, convert the statement to upper case
+
+ ::rtl::OUString sqlStatement = sql.toUpperCase ();
+
+ // Now, look for the FOR UPDATE keywords. If there is any extra white
+ // space between the FOR and UPDATE, this will fail.
+
+ sal_Int32 index = sqlStatement.indexOf(::rtl::OUString::createFromAscii(" FOR UPDATE"));
+
+ // We found it. Change our concurrency level to ensure that the
+ // row can be updated.
+
+ if (index > 0)
+ {
+ try
+ {
+ SQLINTEGER nLock = SQL_CONCUR_LOCK;
+ THROW_SQL(N3SQLSetStmtAttr(m_aStatementHandle, SQL_CONCURRENCY,(SQLPOINTER)nLock,SQL_IS_UINTEGER));
+ }
+ catch (SQLWarning& warn)
+ {
+ // Catch any warnings and place on the warning stack
+ setWarning (warn);
+ }
+ rc = sal_True;
+ }
+
+ return rc;
+}
+//--------------------------------------------------------------------
+// setWarning
+// Sets the warning
+//--------------------------------------------------------------------
+
+void OStatement_Base::setWarning (const SQLWarning &ex) throw( SQLException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ m_aLastWarning = ex;
+}
+
+//--------------------------------------------------------------------
+// getColumnCount
+// Return the number of columns in the ResultSet
+//--------------------------------------------------------------------
+
+sal_Int32 OStatement_Base::getColumnCount () throw( SQLException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ sal_Int16 numCols = 0;
+
+ try {
+ THROW_SQL(N3SQLNumResultCols(m_aStatementHandle,&numCols));
+ }
+ catch (...)
+ {
+ }
+ return numCols;
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OStatement_Base::execute( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ ::rtl::OString aSql(::rtl::OUStringToOString(sql,
+ osl_getThreadTextEncoding()
+ ));
+
+ sal_Bool hasResultSet = sal_False;
+ SQLWarning aWarning;
+
+ // Reset the statement handle and warning
+
+ reset();
+
+ // Check for a 'FOR UPDATE' statement. If present, change
+ // the concurrency to lock
+
+ lockIfNecessary (sql);
+
+ // Call SQLExecDirect
+
+ try {
+ THROW_SQL(N3SQLExecDirect(m_aStatementHandle, (SDB_ODBC_CHAR*)aSql.getStr(),aSql.getLength()));
+ }
+ catch (SQLWarning& ex) {
+
+ // Save pointer to warning and save with ResultSet
+ // object once it is created.
+
+ aWarning = ex;
+ }
+
+ // Now determine if there is a result set associated with
+ // the SQL statement that was executed. Get the column
+ // count, and if it is not zero, there is a result set.
+
+ if (getColumnCount () > 0)
+ {
+ hasResultSet = sal_True;
+ }
+
+ return hasResultSet;
+}
+//--------------------------------------------------------------------
+// getResultSet
+// getResultSet returns the current result as a ResultSet. It
+// returns NULL if the current result is not a ResultSet.
+//--------------------------------------------------------------------
+Reference< XResultSet > OStatement_Base::getResultSet (sal_Bool checkCount) throw( SQLException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ if (m_xResultSet.get().is()) // if resultset already retrieved,
+ {
+ // throw exception to avoid sequence error
+ throw SQLException(::rtl::OUString::createFromAscii("Invalid state for getResultSet"),*this,
+ ::rtl::OUString(),0,Any());
+ }
+
+ OResultSet* pRs = NULL;
+ sal_Int32 numCols = 1;
+
+ // If we already know we have result columns, checkCount
+ // is false. This is an optimization to prevent unneeded
+ // calls to getColumnCount
+
+ if (checkCount)
+ numCols = getColumnCount ();
+
+ // Only return a result set if there are result columns
+
+ if (numCols > 0)
+ {
+ pRs = new OResultSet(m_aStatementHandle,this);
+
+ // Save a copy of our last result set
+ // Changed to save copy at getResultSet.
+ //m_xResultSet = rs;
+ }
+ else
+ clearMyResultSet ();
+
+ return pRs;
+}
+//--------------------------------------------------------------------
+// getStmtOption
+// Invoke SQLGetStmtOption with the given option.
+//--------------------------------------------------------------------
+
+sal_Int32 OStatement_Base::getStmtOption (short fOption) const throw( SQLException)
+{
+ sal_Int32 result = 0;
+
+ // Reset last warning message
+
+ // clearWarnings();
+
+ try {
+ N3SQLGetStmtAttr(m_aStatementHandle, fOption,&result,SQL_IS_INTEGER,NULL);
+ }
+ catch (...)
+ {
+ }
+ return result;
+}
+// -------------------------------------------------------------------------
+
+Reference< XResultSet > SAL_CALL OStatement_Base::executeQuery( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ Reference< XResultSet > xRS = NULL;
+
+ // Execute the statement. If execute returns true, a result
+ // set exists.
+
+ if (execute (sql))
+ {
+ xRS = getResultSet (sal_False);
+ }
+ else
+ {
+ // No ResultSet was produced. Raise an exception
+ throw SQLException(::rtl::OUString::createFromAscii("No ResultSet was produced"),*this,
+ ::rtl::OUString(),0,Any());
+ }
+ return xRS;
+}
+// -------------------------------------------------------------------------
+
+Reference< XConnection > SAL_CALL OStatement_Base::getConnection( ) throw(SQLException, RuntimeException)
+{
+ return (Reference< XConnection >)m_pConnection;
+}
+// -------------------------------------------------------------------------
+
+Any SAL_CALL OStatement::queryInterface( const Type & rType ) throw(RuntimeException)
+{
+ Any aRet = ::cppu::queryInterface(rType,static_cast< XBatchExecution*> (this));
+ if(!aRet.hasValue())
+ aRet = OStatement_Base::queryInterface(rType);
+ return aRet;
+}
+// -------------------------------------------------------------------------
+
+void SAL_CALL OStatement::addBatch( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ m_aBatchList.push_back(sql);
+}
+// -------------------------------------------------------------------------
+Sequence< sal_Int32 > SAL_CALL OStatement::executeBatch( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ ::rtl::OString aBatchSql;
+ sal_Int32 nLen = 0;
+ for(::std::list< ::rtl::OUString>::const_iterator i=m_aBatchList.begin();i != m_aBatchList.end();++i,++nLen)
+ {
+ aBatchSql += ::rtl::OUStringToOString(*i,
+ osl_getThreadTextEncoding()
+ );
+ aBatchSql += ";";
+ }
+
+ THROW_SQL(N3SQLExecDirect(m_aStatementHandle, (SDB_ODBC_CHAR*)aBatchSql.getStr(),aBatchSql.getLength()));
+
+ Sequence< sal_Int32 > aRet(nLen);
+ sal_Int32* pArray = aRet.getArray();
+ for(sal_Int32 j=0;j<nLen;++j)
+ {
+ SQLRETURN nError = N3SQLMoreResults(m_aStatementHandle);
+ if(nError == SQL_SUCCESS)
+ {
+ N3SQLRowCount(m_aStatementHandle,&pArray[j]);
+ }
+ }
+ return aRet;
+}
+// -------------------------------------------------------------------------
+
+
+sal_Int32 SAL_CALL OStatement_Base::executeUpdate( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ sal_Int32 numRows = -1;
+
+ // Execute the statement. If execute returns false, a
+ // row count exists.
+
+ if (!execute (sql)) {
+ numRows = getUpdateCount();
+ }
+ else {
+
+ // No update count was produced (a ResultSet was). Raise
+ // an exception
+
+ throw new SQLException (::rtl::OUString::createFromAscii("No row count was produced"),*this,
+ ::rtl::OUString(),0,Any());
+ }
+ return numRows;
+
+}
+// -------------------------------------------------------------------------
+
+Reference< XResultSet > SAL_CALL OStatement_Base::getResultSet( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ m_xResultSet = getResultSet(sal_True);
+ return m_xResultSet;
+}
+// -------------------------------------------------------------------------
+
+sal_Int32 SAL_CALL OStatement_Base::getUpdateCount( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ sal_Int32 rowCount = -1;
+
+ // Only return a row count for SQL statements that did not
+ // return a result set.
+
+ if (getColumnCount () == 0)
+ rowCount = getRowCount ();
+
+ return rowCount;
+}
+// -------------------------------------------------------------------------
+
+sal_Bool SAL_CALL OStatement_Base::getMoreResults( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ OResultSet* pRS = NULL;
+ SQLWarning warning;
+ sal_Bool hasResultSet = sal_False;
+
+ // clear previous warnings
+
+ clearWarnings ();
+
+ // Call SQLMoreResults
+
+ try {
+ hasResultSet = N3SQLMoreResults(m_aStatementHandle) == SQL_SUCCESS;
+ }
+ catch (SQLWarning &ex) {
+
+ // Save pointer to warning and save with ResultSet
+ // object once it is created.
+
+ warning = ex;
+ }
+
+ // There are more results (it may not be a result set, though)
+
+ if (hasResultSet)
+ {
+
+ // Now determine if there is a result set associated
+ // with the SQL statement that was executed. Get the
+ // column count, and if it is zero, there is not a
+ // result set.
+
+ if (getColumnCount () == 0)
+ hasResultSet = sal_False;
+ }
+
+ // Set the warning for the statement, if one was generated
+
+ setWarning (warning);
+
+ // Return the result set indicator
+
+ return hasResultSet;
+}
+// -------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------
+Any SAL_CALL OStatement_Base::getWarnings( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ return makeAny(m_aLastWarning);
+}
+// -------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------
+void SAL_CALL OStatement_Base::clearWarnings( ) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ m_aLastWarning = SQLWarning();
+}
+// -------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+sal_Int32 OStatement_Base::getQueryTimeOut() const throw(SQLException, RuntimeException)
+{
+ return getStmtOption(SQL_ATTR_QUERY_TIMEOUT);
+}
+//------------------------------------------------------------------------------
+sal_Int32 OStatement_Base::getMaxRows() const throw(SQLException, RuntimeException)
+{
+ return getStmtOption(SQL_ATTR_MAX_ROWS);
+}
+//------------------------------------------------------------------------------
+sal_Int32 OStatement_Base::getResultSetConcurrency() const throw(SQLException, RuntimeException)
+{
+ sal_uInt32 nValue;
+ SQLRETURN nRetCode = N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_CONCURRENCY,&nValue,SQL_IS_UINTEGER,0);
+ return nValue;
+}
+//------------------------------------------------------------------------------
+sal_Int32 OStatement_Base::getResultSetType() const throw(SQLException, RuntimeException)
+{
+ sal_uInt32 nValue=0;
+ SQLRETURN nRetCode = N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_CURSOR_SENSITIVITY,&nValue,SQL_IS_UINTEGER,0);
+ nRetCode = N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_CURSOR_TYPE,&nValue,SQL_IS_UINTEGER,0);
+ return nValue;
+}
+//------------------------------------------------------------------------------
+sal_Int32 OStatement_Base::getFetchDirection() const throw(SQLException, RuntimeException)
+{
+ sal_uInt32 nValue;
+ SQLRETURN nRetCode = N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_CURSOR_TYPE,&nValue,SQL_IS_UINTEGER,0);
+ return nValue;
+}
+//------------------------------------------------------------------------------
+sal_Int32 OStatement_Base::getFetchSize() const throw(SQLException, RuntimeException)
+{
+ sal_uInt32 nValue;
+ SQLRETURN nRetCode = N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_ARRAY_SIZE,&nValue,SQL_IS_UINTEGER,0);
+ return nValue;
+}
+//------------------------------------------------------------------------------
+sal_Int32 OStatement_Base::getMaxFieldSize() const throw(SQLException, RuntimeException)
+{
+ return getStmtOption(SQL_ATTR_MAX_LENGTH);
+}
+//------------------------------------------------------------------------------
+::rtl::OUString OStatement_Base::getCursorName() const throw(SQLException, RuntimeException)
+{
+ SQLCHAR pName[258];
+ SQLSMALLINT nRealLen = 0;
+ SQLRETURN nRetCode = N3SQLGetCursorName(m_aStatementHandle,(SQLCHAR*)pName,256,&nRealLen);
+ return ::rtl::OUString::createFromAscii((const char*)pName);
+}
+//------------------------------------------------------------------------------
+void OStatement_Base::setQueryTimeOut(sal_Int32 seconds) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ SQLRETURN nRetCode = N3SQLSetStmtAttr(m_aStatementHandle, SQL_ATTR_QUERY_TIMEOUT,(SQLPOINTER)seconds,SQL_IS_UINTEGER);
+#ifdef DEBUG
+ DEBUG_THROW
+#endif
+}
+//------------------------------------------------------------------------------
+void OStatement_Base::setMaxRows(sal_Int32 _par0) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ SQLRETURN nRetCode = N3SQLSetStmtAttr(m_aStatementHandle, SQL_ATTR_MAX_ROWS, (SQLPOINTER)_par0,SQL_IS_UINTEGER);
+#ifdef DEBUG
+ DEBUG_THROW
+#endif
+
+}
+//------------------------------------------------------------------------------
+void OStatement_Base::setResultSetConcurrency(sal_Int32 _par0) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ SQLINTEGER nSet;
+ if(_par0 == ResultSetConcurrency::READ_ONLY)
+ nSet = SQL_CONCUR_READ_ONLY;
+ else
+ nSet = SQL_CONCUR_VALUES;
+
+ THROW_SQL(N3SQLSetStmtAttr(m_aStatementHandle, SQL_ATTR_CONCURRENCY,(SQLPOINTER)nSet,SQL_IS_UINTEGER));
+
+}
+//------------------------------------------------------------------------------
+void OStatement_Base::setResultSetType(sal_Int32 _par0) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ SQLRETURN nRetCode = N3SQLSetStmtAttr(m_aStatementHandle, SQL_ATTR_ROW_BIND_TYPE,(SQLPOINTER)SQL_BIND_BY_COLUMN,SQL_IS_UINTEGER);
+
+ SQLUINTEGER nSet;
+ switch(_par0)
+ {
+ case ResultSetType::FORWARD_ONLY:
+ nSet = SQL_UNSPECIFIED;
+ break;
+ case ResultSetType::SCROLL_INSENSITIVE:
+ nSet = SQL_INSENSITIVE;
+ THROW_SQL(N3SQLSetStmtAttr(m_aStatementHandle, SQL_ATTR_CURSOR_TYPE,(SQLPOINTER)SQL_CURSOR_KEYSET_DRIVEN,SQL_IS_UINTEGER));
+ break;
+ case ResultSetType::SCROLL_SENSITIVE:
+ nSet = SQL_CURSOR_DYNAMIC;
+ if(N3SQLSetStmtAttr(m_aStatementHandle, SQL_ATTR_CURSOR_TYPE,(SQLPOINTER)nSet,SQL_IS_UINTEGER) != SQL_SUCCESS)
+ {
+ nSet = SQL_CURSOR_KEYSET_DRIVEN;
+ THROW_SQL(N3SQLSetStmtAttr(m_aStatementHandle, SQL_ATTR_CURSOR_TYPE,(SQLPOINTER)nSet,SQL_IS_UINTEGER));
+ }
+ nSet = SQL_SENSITIVE;
+ break;
+ }
+
+
+ if(nRetCode = N3SQLSetStmtAttr(m_aStatementHandle, SQL_ATTR_CURSOR_SENSITIVITY,(SQLPOINTER)nSet,SQL_IS_UINTEGER) != SQL_SUCCESS)
+ {
+ }
+}
+//------------------------------------------------------------------------------
+void OStatement_Base::setFetchDirection(sal_Int32 _par0) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ SQLRETURN nRetCode = N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_CURSOR_TYPE,(SQLPOINTER)_par0,SQL_IS_UINTEGER);
+}
+//------------------------------------------------------------------------------
+void OStatement_Base::setFetchSize(sal_Int32 _par0) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ SQLRETURN nRetCode = N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_ARRAY_SIZE,(SQLPOINTER)_par0,SQL_IS_UINTEGER);
+
+#ifdef DEBUG
+ DEBUG_THROW
+#endif
+
+ delete m_pRowStatusArray;
+ m_pRowStatusArray = new SQLUSMALLINT[_par0];
+ nRetCode = N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_ROW_STATUS_PTR,m_pRowStatusArray,SQL_IS_POINTER);
+#ifdef DEBUG
+ DEBUG_THROW
+#endif
+
+}
+//------------------------------------------------------------------------------
+void OStatement_Base::setMaxFieldSize(sal_Int32 _par0) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ THROW_SQL(N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_MAX_LENGTH,(SQLPOINTER)_par0,SQL_IS_UINTEGER));
+}
+//------------------------------------------------------------------------------
+void OStatement_Base::setCursorName(const ::rtl::OUString &_par0) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ ::rtl::OString aName(::rtl::OUStringToOString(_par0,
+ osl_getThreadTextEncoding()
+ ));
+ THROW_SQL(N3SQLSetCursorName(m_aStatementHandle,(SDB_ODBC_CHAR*)aName.getStr(),aName.getLength()));
+}
+// -------------------------------------------------------------------------
+sal_Bool OStatement_Base::isUsingBookmarks() const throw(SQLException, RuntimeException)
+{
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ sal_uInt32 nValue = SQL_UB_OFF;
+ SQLRETURN nRet = N3SQLGetStmtAttr(m_aStatementHandle,SQL_ATTR_USE_BOOKMARKS,&nValue,SQL_IS_UINTEGER,NULL);
+ // THROW_SQL(nRet);
+ return nValue != SQL_UB_OFF;
+}
+// -------------------------------------------------------------------------
+void OStatement_Base::setUsingBookmarks(sal_Bool _bUseBookmark) throw(SQLException, RuntimeException)
+{
+ ::osl::MutexGuard aGuard( m_aMutex );
+ if (OStatement_BASE::rBHelper.bDisposed)
+ throw DisposedException();
+
+ sal_uInt32 nValue = _bUseBookmark ? SQL_UB_VARIABLE : SQL_UB_OFF;
+ SQLRETURN nRet = N3SQLSetStmtAttr(m_aStatementHandle,SQL_ATTR_USE_BOOKMARKS,(SQLPOINTER)nValue,SQL_IS_UINTEGER);
+ THROW_SQL(nRet);
+}
+// -------------------------------------------------------------------------
+::cppu::IPropertyArrayHelper* OStatement_Base::createArrayHelper( ) const
+{
+ Sequence< Property > aProps(10);
+ Property* pProperties = aProps.getArray();
+ sal_Int32 nPos = 0;
+ DECL_PROP0(CURSORNAME, ::rtl::OUString);
+ DECL_BOOL_PROP0(ESCAPEPROCESSING);
+ DECL_PROP0(FETCHDIRECTION,sal_Int32);
+ DECL_PROP0(FETCHSIZE, sal_Int32);
+ DECL_PROP0(MAXFIELDSIZE,sal_Int32);
+ DECL_PROP0(MAXROWS, sal_Int32);
+ DECL_PROP0(QUERYTIMEOUT,sal_Int32);
+ DECL_PROP0(RESULTSETCONCURRENCY,sal_Int32);
+ DECL_PROP0(RESULTSETTYPE,sal_Int32);
+ DECL_BOOL_PROP0(USEBOOKMARKS);
+
+ return new ::cppu::OPropertyArrayHelper(aProps);
+}
+
+// -------------------------------------------------------------------------
+::cppu::IPropertyArrayHelper & OStatement_Base::getInfoHelper()
+{
+ return *const_cast<OStatement_Base*>(this)->getArrayHelper();
+}
+// -------------------------------------------------------------------------
+sal_Bool OStatement_Base::convertFastPropertyValue(
+ Any & rConvertedValue,
+ Any & rOldValue,
+ sal_Int32 nHandle,
+ const Any& rValue )
+ throw (::com::sun::star::lang::IllegalArgumentException)
+{
+ switch(nHandle)
+ {
+ case PROPERTY_ID_QUERYTIMEOUT:
+ return ::utl::tryPropertyValue(rConvertedValue, rOldValue, rValue, getQueryTimeOut());
+ case PROPERTY_ID_MAXFIELDSIZE:
+ return ::utl::tryPropertyValue(rConvertedValue, rOldValue, rValue, getMaxFieldSize());
+ case PROPERTY_ID_MAXROWS:
+ return ::utl::tryPropertyValue(rConvertedValue, rOldValue, rValue, getMaxRows());
+ case PROPERTY_ID_CURSORNAME:
+ return ::utl::tryPropertyValue(rConvertedValue, rOldValue, rValue, getCursorName());
+ case PROPERTY_ID_RESULTSETCONCURRENCY:
+ return ::utl::tryPropertyValue(rConvertedValue, rOldValue, rValue, getResultSetConcurrency());
+ case PROPERTY_ID_RESULTSETTYPE:
+ return ::utl::tryPropertyValue(rConvertedValue, rOldValue, rValue, getResultSetType());
+ case PROPERTY_ID_FETCHDIRECTION:
+ return ::utl::tryPropertyValue(rConvertedValue, rOldValue, rValue, getFetchDirection());
+ case PROPERTY_ID_FETCHSIZE:
+ return ::utl::tryPropertyValue(rConvertedValue, rOldValue, rValue, getFetchSize());
+ case PROPERTY_ID_ESCAPEPROCESSING:
+ // return ::utl::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bAsLink);
+ break;
+ case PROPERTY_ID_USEBOOKMARKS:
+ return ::utl::tryPropertyValue(rConvertedValue, rOldValue, rValue, isUsingBookmarks());
+
+ default:
+ ;
+ }
+ return sal_False;
+}
+// -------------------------------------------------------------------------
+void OStatement_Base::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue) throw (Exception)
+{
+ switch(nHandle)
+ {
+ case PROPERTY_ID_QUERYTIMEOUT:
+ setQueryTimeOut(connectivity::getINT32(rValue));
+ break;
+ case PROPERTY_ID_MAXFIELDSIZE:
+ setMaxFieldSize(connectivity::getINT32(rValue));
+ break;
+ case PROPERTY_ID_MAXROWS:
+ setMaxRows(connectivity::getINT32(rValue));
+ break;
+ case PROPERTY_ID_CURSORNAME:
+ setCursorName(connectivity::getString(rValue));
+ break;
+ case PROPERTY_ID_RESULTSETCONCURRENCY:
+ setResultSetConcurrency(connectivity::getINT32(rValue));
+ break;
+ case PROPERTY_ID_RESULTSETTYPE:
+ setResultSetType(connectivity::getINT32(rValue));
+ break;
+ case PROPERTY_ID_FETCHDIRECTION:
+ setFetchDirection(connectivity::getINT32(rValue));
+ break;
+ case PROPERTY_ID_FETCHSIZE:
+ setFetchSize(connectivity::getINT32(rValue));
+ break;
+ case PROPERTY_ID_ESCAPEPROCESSING:
+ // return ::utl::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bAsLink);
+ break;
+ case PROPERTY_ID_USEBOOKMARKS:
+ setUsingBookmarks(connectivity::getBOOL(rValue));
+ break;
+ default:
+ ;
+ }
+}
+// -------------------------------------------------------------------------
+void OStatement_Base::getFastPropertyValue(Any& rValue,sal_Int32 nHandle) const
+{
+ switch(nHandle)
+ {
+ case PROPERTY_ID_QUERYTIMEOUT:
+ rValue <<= getQueryTimeOut();
+ break;
+ case PROPERTY_ID_MAXFIELDSIZE:
+ rValue <<= getMaxFieldSize();
+ break;
+ case PROPERTY_ID_MAXROWS:
+ rValue <<= getMaxRows();
+ break;
+ case PROPERTY_ID_CURSORNAME:
+ rValue <<= getCursorName();
+ break;
+ case PROPERTY_ID_RESULTSETCONCURRENCY:
+ rValue <<= getResultSetConcurrency();
+ break;
+ case PROPERTY_ID_RESULTSETTYPE:
+ rValue <<= getResultSetType();
+ break;
+ case PROPERTY_ID_FETCHDIRECTION:
+ rValue <<= getFetchDirection();
+ break;
+ case PROPERTY_ID_FETCHSIZE:
+ rValue <<= getFetchSize();
+ break;
+ case PROPERTY_ID_ESCAPEPROCESSING:
+ break;
+ case PROPERTY_ID_USEBOOKMARKS:
+ rValue <<= cppu::bool2any(isUsingBookmarks());
+ break;
+ default:
+ ;
+ }
+}
+// -------------------------------------------------------------------------
+IMPLEMENT_SERVICE_INFO(OStatement,"com.sun.star.sdbcx.OStatement","com.sun.star.sdbc.Statement");
+
diff --git a/connectivity/source/drivers/odbc/OTools.cxx b/connectivity/source/drivers/odbc/OTools.cxx
new file mode 100644
index 000000000000..23d3589ac0f3
--- /dev/null
+++ b/connectivity/source/drivers/odbc/OTools.cxx
@@ -0,0 +1,545 @@
+/*************************************************************************
+ *
+ * $RCSfile: OTools.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:14:23 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_OTOOLS_HXX_
+#include "odbc/OTools.hxx"
+#endif
+
+#define __STL_IMPORT_VENDOR_CSTD
+#include <cstring>
+#ifndef _CONNECTIVITY_ODBC_OFUNCTIONS_HXX_
+#include "odbc/OFunctions.hxx"
+#endif
+#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
+#include <com/sun/star/sdbc/DataType.hpp>
+#endif
+#ifndef _OSL_DIAGNOSE_H_
+#include <osl/diagnose.h>
+#endif
+
+using namespace connectivity::odbc;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::sdbc;
+using namespace com::sun::star::util;
+#ifndef min
+#define min(x,y) (x) < ( y) ? (x) : (y)
+#endif
+// -------------------------------------------------------------------------
+void OTools::ThrowException(SQLRETURN _rRetCode,SQLHANDLE _pContext,SQLSMALLINT _nHandleType,const Reference< XInterface >& _xInterface,sal_Bool _bNoFound) throw(SQLException, RuntimeException)
+{
+ 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_ENSHURE(0,"SdbODBC3_SetStatus: SQL_INVALID_HANDLE");
+ throw RuntimeException();
+ break;
+ }
+
+
+ // Zusaetliche Informationen zum letzten ODBC-Funktionsaufruf vorhanden.
+ // SQLError liefert diese Informationen.
+
+ SDB_ODBC_CHAR szSqlState[5];
+ SDWORD pfNativeError;
+ SDB_ODBC_CHAR szErrorMessage[SQL_MAX_MESSAGE_LENGTH];
+ SWORD pcbErrorMsg;
+
+ // Informationen zur letzten Operation:
+ // wenn hstmt != SQL_NULL_HSTMT ist (Benutzung von SetStatus in SdbCursor, SdbTable, ...),
+ // dann wird der Status des letzten Statements erfragt, sonst der Status des letzten
+ // Statements zu dieser Verbindung [was in unserem Fall wahrscheinlich gleichbedeutend ist,
+ // aber das Reference Manual drueckt sich da nicht so klar aus ...].
+ // Entsprechend bei hdbc.
+ SQLRETURN n = N3SQLGetDiagRec(_nHandleType,_pContext,1,
+ szSqlState,
+ &pfNativeError,
+ szErrorMessage,sizeof szErrorMessage - 1,&pcbErrorMsg);
+ OSL_ENSHURE(n != SQL_INVALID_HANDLE,"SdbODBC3_SetStatus: SQLError returned SQL_INVALID_HANDLE");
+ OSL_ENSHURE(n == SQL_SUCCESS || n == SQL_SUCCESS_WITH_INFO || n == SQL_NO_DATA_FOUND || n == SQL_ERROR,"SdbODBC3_SetStatus: SQLError failed");
+
+ // Zum Return Code von SQLError siehe ODBC 2.0 Programmer's Reference Seite 287ff
+ throw SQLException( ::rtl::OUString((char *)szErrorMessage,pcbErrorMsg,RTL_TEXTENCODING_MS_1252),
+ _xInterface,
+ ::rtl::OUString((char *)szSqlState,5,RTL_TEXTENCODING_MS_1252),
+ pfNativeError,
+ Any()
+ );
+
+}
+// -------------------------------------------------------------------------
+Sequence<sal_Int8> OTools::getBytesValue(SQLHANDLE _aStatementHandle,sal_Int32 columnIndex,SWORD _fSqlType,sal_Bool &_bWasNull,
+ const Reference< XInterface >& _xInterface) throw(SQLException, RuntimeException)
+{
+ char aCharArray[2048];
+ // Erstmal versuchen, die Daten mit dem kleinen Puffer
+ // abzuholen:
+ SQLINTEGER nMaxLen = sizeof aCharArray - 1;
+ // GETDATA(SQL_C_CHAR,aCharArray,nMaxLen);
+ SQLINTEGER pcbValue = 0;
+ OTools::ThrowException(N3SQLGetData(_aStatementHandle,
+ (SQLUSMALLINT)columnIndex,
+ SQL_C_BINARY,
+ &aCharArray,
+ (SQLINTEGER)nMaxLen,
+ &pcbValue),
+ _aStatementHandle,SQL_HANDLE_STMT,_xInterface);
+
+ _bWasNull = pcbValue == SQL_NULL_DATA;
+ if(_bWasNull)
+ return Sequence<sal_Int8>();
+
+ SQLINTEGER nBytes = pcbValue != SQL_NO_TOTAL ? min(pcbValue, nMaxLen) : nMaxLen;
+ Sequence<sal_Int8> aData((sal_Int8*)aCharArray, nBytes);
+
+
+ // Es handelt sich um Binaerdaten, um einen String, der fuer
+ // StarView zu lang ist oder der Treiber kann die Laenge der
+ // Daten nicht im voraus bestimmen - also als MemoryStream
+ // speichern.
+ while ((pcbValue == SQL_NO_TOTAL) || pcbValue > nMaxLen)
+ {
+ // Bei Strings wird der Puffer nie ganz ausgenutzt
+ // (das letzte Byte ist immer ein NULL-Byte, das
+ // aber bei pcbValue nicht mitgezaehlt wird)
+ if (pcbValue != SQL_NO_TOTAL && (pcbValue - nMaxLen) < nMaxLen)
+ nBytes = pcbValue - nMaxLen;
+ else
+ nBytes = nMaxLen;
+
+ // Solange eine "truncation"-Warnung vorliegt, weiter Daten abholen
+ // GETDATA(SQL_C_CHAR,aCharArray, nLen + 1);
+ OTools::ThrowException(N3SQLGetData(_aStatementHandle,
+ (SQLUSMALLINT)columnIndex,
+ SQL_C_BINARY,
+ &aCharArray,
+ (SQLINTEGER)nBytes,
+ &pcbValue),
+ _aStatementHandle,SQL_HANDLE_STMT,_xInterface);
+ sal_Int32 nLen = aData.getLength();
+ aData.realloc(nLen + nBytes);
+ ::std::memcpy(aData.getArray() + nLen, aCharArray, nBytes);
+ }
+ return aData;
+}
+// -------------------------------------------------------------------------
+::rtl::OUString OTools::getStringValue(SQLHANDLE _aStatementHandle,sal_Int32 columnIndex,SWORD _fSqlType,sal_Bool &_bWasNull,
+ const Reference< XInterface >& _xInterface) throw(SQLException, RuntimeException)
+{
+ ::rtl::OUString aData;
+ switch(_fSqlType)
+ {
+ case SQL_WVARCHAR:
+ case SQL_WCHAR:
+ case SQL_WLONGVARCHAR:
+ {
+ sal_Unicode waCharArray[2048];
+ // read the unicode data
+ sal_Int32 nMaxLen = sizeof(waCharArray) - sizeof(sal_Unicode);
+ // GETDATA(SQL_C_WCHAR, waCharArray, nMaxLen + sizeof(sal_Unicode));
+
+ SQLINTEGER pcbValue=0;
+ OTools::ThrowException(N3SQLGetData(_aStatementHandle,
+ (SQLUSMALLINT)columnIndex,
+ SQL_C_WCHAR,
+ &waCharArray,
+ (SQLINTEGER)nMaxLen*sizeof(sal_Unicode),
+ &pcbValue),
+ _aStatementHandle,SQL_HANDLE_STMT,_xInterface);
+ _bWasNull = pcbValue == SQL_NULL_DATA;
+ if(_bWasNull)
+ return ::rtl::OUString();
+ // Bei Fehler bricht der GETDATA-Makro mit return ab,
+ // bei NULL mit break!
+ SQLINTEGER nLen = pcbValue != SQL_NO_TOTAL ? min(pcbValue, nMaxLen) : nMaxLen;
+ waCharArray[nLen] = 0;
+ aData = ::rtl::OUString(waCharArray);
+
+ // Es handelt sich um Binaerdaten, um einen String, der fuer
+ // StarView zu lang ist oder der Treiber kann die Laenge der
+ // Daten nicht im voraus bestimmen - also als MemoryStream
+ // speichern.
+ while ((pcbValue == SQL_NO_TOTAL ) || pcbValue > nMaxLen)
+ {
+ // Bei Strings wird der Puffer nie ganz ausgenutzt
+ // (das letzte Byte ist immer ein NULL-Byte, das
+ // aber bei pcbValue nicht mitgezaehlt wird)
+ if (pcbValue != SQL_NO_TOTAL && (pcbValue - nMaxLen) < nMaxLen)
+ nLen = pcbValue - nMaxLen;
+ else
+ nLen = nMaxLen;
+
+ // Solange eine "truncation"-Warnung vorliegt, weiter Daten abholen
+ // GETDATA(SQL_C_CHAR,waCharArray, nLen + 1);
+ OTools::ThrowException(N3SQLGetData(_aStatementHandle,
+ (SQLUSMALLINT)columnIndex,
+ SQL_C_WCHAR,
+ &waCharArray,
+ (SQLINTEGER)nLen+1,
+ &pcbValue),
+ _aStatementHandle,SQL_HANDLE_STMT,_xInterface);
+ waCharArray[nLen] = 0;
+
+ aData += ::rtl::OUString(waCharArray);
+ }
+ }
+ break;
+ default:
+ {
+ char aCharArray[2048];
+ // Erstmal versuchen, die Daten mit dem kleinen Puffer
+ // abzuholen:
+ SDWORD nMaxLen = sizeof aCharArray - 1;
+ // GETDATA(SQL_C_CHAR,aCharArray,nMaxLen);
+ SQLINTEGER pcbValue = 0;
+ OTools::ThrowException(N3SQLGetData(_aStatementHandle,
+ (SQLUSMALLINT)columnIndex,
+ SQL_C_CHAR,
+ &aCharArray,
+ (SQLINTEGER)nMaxLen,
+ &pcbValue),
+ _aStatementHandle,SQL_HANDLE_STMT,_xInterface);
+ _bWasNull = pcbValue == SQL_NULL_DATA;
+ if(_bWasNull)
+ return ::rtl::OUString();
+
+ SQLINTEGER nLen = pcbValue != SQL_NO_TOTAL ? min(pcbValue, nMaxLen) : nMaxLen;
+ aCharArray[nLen] = 0;
+ aData = ::rtl::OUString((const sal_Char*)aCharArray,nLen, osl_getThreadTextEncoding());
+
+ // Es handelt sich um Binaerdaten, um einen String, der fuer
+ // StarView zu lang ist oder der Treiber kann die Laenge der
+ // Daten nicht im voraus bestimmen - also als MemoryStream
+ // speichern.
+ while ((pcbValue == SQL_NO_TOTAL) || pcbValue > nMaxLen)
+ {
+ // Bei Strings wird der Puffer nie ganz ausgenutzt
+ // (das letzte Byte ist immer ein NULL-Byte, das
+ // aber bei pcbValue nicht mitgezaehlt wird)
+ if (pcbValue != SQL_NO_TOTAL && (pcbValue - nMaxLen) < nMaxLen)
+ nLen = pcbValue - nMaxLen;
+ else
+ nLen = nMaxLen;
+
+ // Solange eine "truncation"-Warnung vorliegt, weiter Daten abholen
+ // GETDATA(SQL_C_CHAR,aCharArray, nLen + 1);
+ OTools::ThrowException(N3SQLGetData(_aStatementHandle,
+ (SQLUSMALLINT)columnIndex,
+ SQL_C_CHAR,
+ &aCharArray,
+ (SQLINTEGER)nLen +1,
+ &pcbValue),
+ _aStatementHandle,SQL_HANDLE_STMT,_xInterface);
+ aCharArray[nLen] = 0;
+
+ aData += ::rtl::OUString((const sal_Char*)aCharArray,nLen,osl_getThreadTextEncoding());
+ }
+
+ // delete all blanks
+ // aData.EraseTrailingChars();
+ }
+ }
+
+ return aData;
+}
+// -------------------------------------------------------------------------
+void OTools::GetInfo(SQLHANDLE _aConnectionHandle,SQLUSMALLINT _nInfo,::rtl::OUString &_rValue,const Reference< XInterface >& _xInterface) throw(SQLException, RuntimeException)
+{
+ char aValue[512];
+ SQLSMALLINT nValueLen;
+ OTools::ThrowException(
+ N3SQLGetInfo(_aConnectionHandle,_nInfo,aValue,sizeof aValue,&nValueLen),
+ _aConnectionHandle,SQL_HANDLE_DBC,_xInterface);
+
+ _rValue = ::rtl::OUString(aValue,nValueLen,RTL_TEXTENCODING_MS_1252);
+}
+// -------------------------------------------------------------------------
+void OTools::GetInfo(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(
+ N3SQLGetInfo(_aConnectionHandle,_nInfo,&_rValue,sizeof _rValue,&nValueLen),
+ _aConnectionHandle,SQL_HANDLE_DBC,_xInterface);
+}
+// -------------------------------------------------------------------------
+void OTools::GetInfo(SQLHANDLE _aConnectionHandle,SQLUSMALLINT _nInfo,sal_Bool &_rValue,const Reference< XInterface >& _xInterface) throw(SQLException, RuntimeException)
+{
+ SQLSMALLINT nValueLen;
+ OTools::ThrowException(
+ N3SQLGetInfo(_aConnectionHandle,_nInfo,&_rValue,sizeof _rValue,&nValueLen),
+ _aConnectionHandle,SQL_HANDLE_DBC,_xInterface);
+}
+// -------------------------------------------------------------------------
+sal_Int32 OTools::MapOdbcType2Jdbc(sal_Int32 _nType)
+{
+ sal_Int32 nValue;
+ 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:
+ nValue = DataType::VARBINARY;
+ break;
+ case SQL_LONGVARBINARY:
+ nValue = DataType::LONGVARBINARY;
+ break;
+ }
+ return nValue;
+}
+//--------------------------------------------------------------------
+// jdbcTypeToOdbc
+// Convert the JDBC SQL type to the correct ODBC type
+//--------------------------------------------------------------------
+sal_Int32 OTools::jdbcTypeToOdbc(sal_Int32 jdbcType)
+{
+ // 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,
+ sal_Int32 jdbcType,SQLSMALLINT& fCType,SQLSMALLINT& fSqlType,
+ SQLUINTEGER& nColumnSize,SQLSMALLINT& nDecimalDigits)
+{
+ switch(jdbcTypeToOdbc(jdbcType))
+ {
+ 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_SHORT;
+ 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 = _bUseWChar ? SQL_C_WCHAR : SQL_C_CHAR;
+ fSqlType = SQL_BIGINT; break;
+ case SQL_REAL: fCType = SQL_C_FLOAT;
+ 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;
+ }
+}
+
+
diff --git a/connectivity/source/drivers/odbc/makefile.mk b/connectivity/source/drivers/odbc/makefile.mk
new file mode 100644
index 000000000000..dd1cef6b9938
--- /dev/null
+++ b/connectivity/source/drivers/odbc/makefile.mk
@@ -0,0 +1,177 @@
+#*************************************************************************
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.1.1.1 $
+#
+# last change: $Author: hr $ $Date: 2000-09-18 16:14:23 $
+#
+# The Contents of this file are made available subject to the terms of
+# either of the following licenses
+#
+# - GNU Lesser General Public License Version 2.1
+# - Sun Industry Standards Source License Version 1.1
+#
+# Sun Microsystems Inc., October, 2000
+#
+# GNU Lesser General Public License Version 2.1
+# =============================================
+# Copyright 2000 by Sun Microsystems, Inc.
+# 901 San Antonio Road, Palo Alto, CA 94303, USA
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License version 2.1, as published by the Free Software Foundation.
+#
+# This library 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 for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+#
+# Sun Industry Standards Source License Version 1.1
+# =================================================
+# The contents of this file are subject to the Sun Industry Standards
+# Source License Version 1.1 (the "License"); You may not use this file
+# except in compliance with the License. You may obtain a copy of the
+# License at http://www.openoffice.org/license.html.
+#
+# Software provided under this License is provided on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+# See the License for the specific provisions governing your rights and
+# obligations concerning the Software.
+#
+# The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+#
+# Copyright: 2000 by Sun Microsystems, Inc.
+#
+# All Rights Reserved.
+#
+# Contributor(s): _______________________________________
+#
+#
+#
+#*************************************************************************
+
+PRJ=..$/..$/..
+PRJINC=..$/..
+PRJNAME=connectivity
+TARGET=odbc
+
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings ----------------------------------
+.IF "$(DBGUTIL_OJ)"!=""
+ENVCFLAGS+=/FR$(SLO)$/
+.ENDIF
+
+.INCLUDE : settings.mk
+.INCLUDE : $(PRJ)$/version.mk
+
+# --- Types -------------------------------------
+
+
+UNOUCRDEP=$(SOLARBINDIR)$/applicat.rdb
+UNOUCRRDB=$(SOLARBINDIR)$/applicat.rdb
+
+UNOUCROUT=$(OUT)$/inc
+INCPRE+=$(UNOUCROUT)
+
+# --- Types -------------------------------------
+
+UNOTYPES+= \
+ com.sun.star.util.XCancellable \
+ com.sun.star.util.XNumberFormatter \
+ com.sun.star.uno.TypeClass \
+ com.sun.star.uno.XWeak \
+ com.sun.star.uno.XAggregation \
+ com.sun.star.beans.XPropertyState \
+ com.sun.star.beans.XPropertySet \
+ com.sun.star.beans.PropertyValue \
+ com.sun.star.beans.XMultiPropertySet \
+ com.sun.star.beans.XFastPropertySet \
+ com.sun.star.lang.XTypeProvider \
+ com.sun.star.lang.EventObject \
+ com.sun.star.lang.XComponent \
+ com.sun.star.lang.IllegalArgumentException \
+ com.sun.star.lang.DisposedException \
+ com.sun.star.lang.XMultiServiceFactory \
+ com.sun.star.lang.XSingleServiceFactory \
+ com.sun.star.registry.XRegistryKey \
+ com.sun.star.java.XJavaThreadRegister_11 \
+ com.sun.star.java.XJavaVM \
+ com.sun.star.sdbc.XConnection \
+ com.sun.star.sdbc.XStatement \
+ com.sun.star.sdbc.XResultSet \
+ com.sun.star.sdbc.XResultSetMetaDataSupplier \
+ com.sun.star.sdbc.XColumnLocate \
+ com.sun.star.sdbc.XResultSetUpdate \
+ com.sun.star.sdbc.XWarningsSupplier \
+ com.sun.star.sdbc.XRowUpdate \
+ com.sun.star.sdbc.XMultipleResults \
+ com.sun.star.sdbc.XBatchExecution \
+ com.sun.star.sdbc.XPreparedBatchExecution \
+ com.sun.star.sdbc.XParameters \
+ com.sun.star.sdbc.XOutParameters \
+ com.sun.star.sdbc.DriverPropertyInfo \
+ com.sun.star.sdbc.XDriver \
+ com.sun.star.sdbc.XRow \
+ com.sun.star.sdbc.SQLWarning \
+ com.sun.star.sdbc.ColumnSearch \
+ com.sun.star.sdbc.DataType \
+ com.sun.star.sdbc.ResultSetConcurrency \
+ com.sun.star.sdbc.ResultSetType \
+ com.sun.star.sdbc.ColumnValue \
+ com.sun.star.sdb.XColumnUpdate \
+ com.sun.star.sdb.XColumn \
+ com.sun.star.lang.XServiceInfo \
+
+
+# --- Files -------------------------------------
+
+SLOFILES=\
+ $(SLO)$/OPreparedStatement.obj \
+ $(SLO)$/OStatement.obj \
+ $(SLO)$/OResultSetMetaData.obj \
+ $(SLO)$/OResultSet.obj \
+ $(SLO)$/OTools.obj \
+ $(SLO)$/ODatabaseMetaData.obj \
+ $(SLO)$/ODriver.obj \
+ $(SLO)$/OFunctions.obj \
+ $(SLO)$/oservices.obj \
+ $(SLO)$/OConnection.obj
+
+# --- Library -----------------------------------
+
+SHL1TARGET= $(ODBC_TARGET)$(ODBC_MAJOR)
+SHL1OBJS=$(SLOFILES)
+SHL1STDLIBS=\
+ $(CPPULIB) \
+ $(CPPUHELPERLIB) \
+ $(VOSLIB) \
+ $(OSLLIB) \
+ $(SALLIB)
+
+SHL1DEPN=
+SHL1IMPLIB= i$(ODBC_TARGET)
+SHL1LIBS= $(SLB)$/commontools.lib \
+ $(SLB)$/resource.lib
+
+SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME= $(SHL1TARGET)
+DEF1EXPORTFILE= exports.dxp
+
+
+# --- Targets ----------------------------------
+
+.INCLUDE : target.mk
+
+
diff --git a/connectivity/source/drivers/odbc/odbc.map b/connectivity/source/drivers/odbc/odbc.map
new file mode 100644
index 000000000000..becb2594a6a3
--- /dev/null
+++ b/connectivity/source/drivers/odbc/odbc.map
@@ -0,0 +1,8 @@
+ODBC_2_0 {
+ global:
+ component_getImplementationEnvironment
+ component_writeInfo
+ component_getFactory
+ local:
+ *;
+};
diff --git a/connectivity/source/drivers/odbc/odbc.xml b/connectivity/source/drivers/odbc/odbc.xml
new file mode 100644
index 000000000000..253bccb84c4c
--- /dev/null
+++ b/connectivity/source/drivers/odbc/odbc.xml
@@ -0,0 +1,70 @@
+<?xml version='1.0' encoding="UTF-8"?>
+<!DOCTYPE COMPONENTDESCRIPTION PUBLIC "-//W3C//DTD HTML 3.2//EN" "componentdependencies.dtd">
+<COMPONENTDESCRIPTION>
+
+<Name> com.sun.star.sdbc.ODBCDriver </Name>
+
+<Description>
+ This is the implementation of the sdbc-odbc bridge.
+</Description>
+
+<ModuleName> odbc </ModuleName>
+
+<LoaderName> com.sun.star.loader.SharedLibrary </LoaderName>
+
+<SupportedService> com.sun.star.sdbc.Driver </SupportedService>
+
+<ServiceDependency> ... </ServiceDependency>
+
+<ProjectBuildDependency> cppuhelper </ProjectBuildDependency>
+<ProjectBuildDependency> cppu </ProjectBuildDependency>
+<ProjectBuildDependency> sal </ProjectBuildDependency>
+<ProjectBuildDependency> vos </ProjectBuildDependency>
+
+<RuntimeModuleDependency> cppuhelper </RuntimeModuleDependency>
+<RuntimeModuleDependency> cppu1 </RuntimeModuleDependency>
+<RuntimeModuleDependency> sal1 </RuntimeModuleDependency>
+<RuntimeModuleDependency> vos </RuntimeModuleDependency>
+
+<Language> c++ </Language>
+
+<Status StatusValue="final"/>
+
+<Type> com.sun.star.util.XCancellable </Type>
+<Type> com.sun.star.util.XNumberFormatter </Type>
+<Type> com.sun.star.uno.TypeClass </Type>
+<Type> com.sun.star.uno.XWeak </Type>
+<Type> com.sun.star.uno.XAggregation </Type>
+<Type> com.sun.star.beans.XPropertyState </Type>
+<Type> com.sun.star.beans.XPropertySet </Type>
+<Type> com.sun.star.beans.PropertyValue </Type>
+<Type> com.sun.star.beans.XMultiPropertySet </Type>
+<Type> com.sun.star.beans.XFastPropertySet </Type>
+<Type> com.sun.star.lang.XTypeProvider </Type>
+<Type> com.sun.star.lang.EventObject </Type>
+<Type> com.sun.star.lang.XComponent </Type>
+<Type> com.sun.star.lang.IllegalArgumentException </Type>
+<Type> com.sun.star.lang.XMultiServiceFactory </Type>
+<Type> com.sun.star.java.XJavaThreadRegister_11 </Type>
+<Type> com.sun.star.java.XJavaVM </Type>
+<Type> com.sun.star.sdbc.XConnection </Type>
+<Type> com.sun.star.sdbc.XStatement </Type>
+<Type> com.sun.star.sdbc.XResultSet </Type>
+<Type> com.sun.star.sdbc.XResultSetMetaDataSupplier</Type>
+<Type> com.sun.star.sdbc.XColumnLocate </Type>
+<Type> com.sun.star.sdbc.XResultSetUpdate </Type>
+<Type> com.sun.star.sdbc.XWarningsSupplier </Type>
+<Type> com.sun.star.sdbc.XRowUpdate </Type>
+<Type> com.sun.star.sdbc.XMultipleResults </Type>
+<Type> com.sun.star.sdbc.XBatchExecution </Type>
+<Type> com.sun.star.sdbc.XPreparedBatchExecution </Type>
+<Type> com.sun.star.sdbc.XParameters </Type>
+<Type> com.sun.star.sdbc.XOutParameters </Type>
+<Type> com.sun.star.sdbc.DriverPropertyInfo </Type>
+<Type> com.sun.star.sdbc.XRow </Type>
+<Type> com.sun.star.sdb.XColumnUpdate </Type>
+<Type> com.sun.star.sdb.XColumn </Type>
+
+</COMPONENTDESCRIPTION>
+
+
diff --git a/connectivity/source/drivers/odbc/oservices.cxx b/connectivity/source/drivers/odbc/oservices.cxx
new file mode 100644
index 000000000000..7e6bf4bc118a
--- /dev/null
+++ b/connectivity/source/drivers/odbc/oservices.cxx
@@ -0,0 +1,212 @@
+/*************************************************************************
+ *
+ * $RCSfile: oservices.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:14:23 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library 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 for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifndef _CONNECTIVITY_ODBC_ODRIVER_HXX_
+#include "odbc/ODriver.hxx"
+#endif
+#ifndef _CPPUHELPER_FACTORY_HXX_
+#include <cppuhelper/factory.hxx>
+#endif
+#ifndef _OSL_DIAGNOSE_H_
+#include <osl/diagnose.h>
+#endif
+
+using namespace connectivity::odbc;
+using ::rtl::OUString;
+using ::com::sun::star::uno::Reference;
+using ::com::sun::star::uno::Sequence;
+using ::com::sun::star::registry::XRegistryKey;
+using ::com::sun::star::lang::XSingleServiceFactory;
+using ::com::sun::star::lang::XMultiServiceFactory;
+
+typedef Reference< XSingleServiceFactory > (SAL_CALL *createFactoryFunc)
+ (
+ const Reference< XMultiServiceFactory > & rServiceManager,
+ const OUString & rComponentName,
+ ::cppu::ComponentInstantiation pCreateFunction,
+ const Sequence< OUString > & rServiceNames
+ );
+
+//***************************************************************************************
+//
+// Die vorgeschriebene C-Api muss erfuellt werden!
+// Sie besteht aus drei Funktionen, die von dem Modul exportiert werden muessen.
+//
+
+//---------------------------------------------------------------------------------------
+void REGISTER_PROVIDER(
+ const OUString& aServiceImplName,
+ const Sequence< OUString>& Services,
+ const Reference< ::com::sun::star::registry::XRegistryKey > & xKey)
+{
+ OUString aMainKeyName;
+ aMainKeyName = OUString::createFromAscii("/");
+ aMainKeyName += aServiceImplName;
+ aMainKeyName += OUString::createFromAscii("/UNO/SERVICES");
+
+ Reference< ::com::sun::star::registry::XRegistryKey > xNewKey( xKey->createKey(aMainKeyName) );
+ OSL_ENSHURE(xNewKey.is(), "ODBC::component_writeInfo : could not create a registry key !");
+
+ for (sal_uInt32 i=0; i<Services.getLength(); ++i)
+ xNewKey->createKey(Services[i]);
+}
+
+
+//---------------------------------------------------------------------------------------
+struct ProviderRequest
+{
+ Reference< XSingleServiceFactory > xRet;
+ Reference< XMultiServiceFactory > const xServiceManager;
+ OUString const sImplementationName;
+
+ ProviderRequest(
+ void* pServiceManager,
+ sal_Char const* pImplementationName
+ )
+ : xServiceManager(reinterpret_cast<XMultiServiceFactory*>(pServiceManager))
+ , sImplementationName(OUString::createFromAscii(pImplementationName))
+ {
+ }
+
+ inline
+ sal_Bool CREATE_PROVIDER(
+ const OUString& Implname,
+ const Sequence< OUString > & Services,
+ ::cppu::ComponentInstantiation Factory,
+ createFactoryFunc creator
+ )
+ {
+ if (!xRet.is() && (Implname == sImplementationName))
+ try
+ {
+ xRet = creator( xServiceManager, sImplementationName,Factory, Services);
+ }
+ catch(...)
+ {
+ }
+ return xRet.is();
+ }
+
+ void* getProvider() const { return xRet.get(); }
+};
+
+//---------------------------------------------------------------------------------------
+
+extern "C" void SAL_CALL component_getImplementationEnvironment(
+ const sal_Char **ppEnvTypeName,
+ uno_Environment **ppEnv
+ )
+{
+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+}
+
+//---------------------------------------------------------------------------------------
+extern "C" sal_Bool SAL_CALL component_writeInfo(
+ void* pServiceManager,
+ void* pRegistryKey
+ )
+{
+ if (pRegistryKey)
+ try
+ {
+ Reference< ::com::sun::star::registry::XRegistryKey > xKey(reinterpret_cast< ::com::sun::star::registry::XRegistryKey*>(pRegistryKey));
+
+ REGISTER_PROVIDER(
+ ODBCDriver::getImplementationName_Static(),
+ ODBCDriver::getSupportedServiceNames_Static(), xKey);
+
+ return sal_True;
+ }
+ catch (::com::sun::star::registry::InvalidRegistryException& )
+ {
+ OSL_ENSHURE(sal_False, "ODBC::component_writeInfo : could not create a registry key ! ## InvalidRegistryException !");
+ }
+
+ return sal_False;
+}
+
+//---------------------------------------------------------------------------------------
+extern "C" void* SAL_CALL component_getFactory(
+ const sal_Char* pImplementationName,
+ void* pServiceManager,
+ void* pRegistryKey)
+{
+ void* pRet = 0;
+ if (pServiceManager)
+ {
+ ProviderRequest aReq(pServiceManager,pImplementationName);
+
+ aReq.CREATE_PROVIDER(
+ ODBCDriver::getImplementationName_Static(),
+ ODBCDriver::getSupportedServiceNames_Static(),
+ ODBCDriver_CreateInstance, ::cppu::createSingleFactory)
+ ;
+
+ if(aReq.xRet.is())
+ aReq.xRet->acquire();
+
+ pRet = aReq.getProvider();
+ }
+
+ return pRet;
+};
+
+