diff options
author | Andrzej J.R. Hunt <andrzej@ahunt.org> | 2013-07-23 16:06:54 +0200 |
---|---|---|
committer | Andrzej J.R. Hunt <andrzej@ahunt.org> | 2013-07-23 19:29:05 +0200 |
commit | 2b541c928ca6eaca9cb5dcbe7f4f43f9f0b20101 (patch) | |
tree | 7117d02d28b5d537b9a839a2909ecf3a0b24a3bc /connectivity/source | |
parent | a061f0a845323017aec07f6521f6c254740c128d (diff) |
Move Statement_Base into it's own file (firebird-sdbc).
This is in preparation of cleanly separating the code shared
by PreparedStatment and Statement from the code unique to either
of those classes.
Change-Id: I419668044e67b25d492a381acab9ee9b1acce7ce
Diffstat (limited to 'connectivity/source')
4 files changed, 629 insertions, 527 deletions
diff --git a/connectivity/source/drivers/firebird/FStatement.cxx b/connectivity/source/drivers/firebird/FStatement.cxx index c58db4438267..9c435809e114 100644 --- a/connectivity/source/drivers/firebird/FStatement.cxx +++ b/connectivity/source/drivers/firebird/FStatement.cxx @@ -38,15 +38,9 @@ #include "FResultSet.hxx" #include "Util.hxx" -#include <ibase.h> - -#include <comphelper/sequence.hxx> -#include <cppuhelper/typeprovider.hxx> #include <osl/diagnose.h> #include <osl/thread.h> -#include <propertyids.hxx> #include <rtl/ustrbuf.hxx> -#include <TConnection.hxx> #include <com/sun/star/sdbc/ResultSetConcurrency.hpp> #include <com/sun/star/sdbc/ResultSetType.hpp> @@ -70,316 +64,6 @@ using namespace ::osl; using namespace ::rtl; using namespace ::std; -OStatement_Base::OStatement_Base(OConnection* _pConnection) - : OStatement_BASE(_pConnection->getMutex()), - OPropertySetHelper(OStatement_BASE::rBHelper), - m_pConnection(_pConnection), - rBHelper(OStatement_BASE::rBHelper) -{ - m_pConnection->acquire(); -// // enabling the XSQLDA to accommodate up to 10 parameter items (DEFAULT) -// m_INsqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(10)); -// m_INsqlda->version = SQLDA_VERSION1; -// m_INsqlda->sqln = 10; -// m_INsqlda->sqld = 0; - -} - -OStatement_Base::~OStatement_Base() -{ -} - -void OStatement_Base::disposeResultSet() -{ - //free the cursor if alive -// uno::Reference< XComponent > xComp(m_xResultSet.get(), UNO_QUERY); -// if (xComp.is()) -// xComp->dispose(); -// m_xResultSet = uno::Reference< XResultSet>(); -} - -//----------------------------------------------------------------------------- -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( - ::cppu::UnoType< uno::Reference< XMultiPropertySet > >::get(), - ::cppu::UnoType< uno::Reference< XFastPropertySet > >::get(), - ::cppu::UnoType< uno::Reference< XPropertySet > >::get()); - - return concatSequences(aTypes.getTypes(),OStatement_BASE::getTypes()); -} -// ------------------------------------------------------------------------- - -void SAL_CALL OStatement_Base::cancel( ) throw(RuntimeException) -{ - MutexGuard aGuard(m_pConnection->getMutex()); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); - // cancel the current sql statement -} -// ------------------------------------------------------------------------- - -void SAL_CALL OStatement_Base::close( ) throw(SQLException, RuntimeException) -{ - SAL_INFO("connectivity.firebird", "close()."); - - { - MutexGuard aGuard(m_pConnection->getMutex()); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); - - } - dispose(); -} - -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; -} - -// ---- XStatement ----------------------------------------------------------- -sal_Int32 SAL_CALL OStatement_Base::executeUpdate(const OUString& sqlIn) - throw(SQLException, RuntimeException) -{ - // TODO: close ResultSet if existing -- so so in all 3 execute methods. - MutexGuard aGuard(m_pConnection->getMutex()); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); - - const OUString sql = sanitizeSqlString(sqlIn); - - int aErr = isc_dsql_execute_immediate(m_statusVector, - &m_pConnection->getDBHandle(), - &m_pConnection->getTransaction(), - 0, - OUStringToOString(sql, RTL_TEXTENCODING_UTF8).getStr(), - 1, - NULL); - - if (aErr) - SAL_WARN("connectivity.firebird", "isc_dsql_execute_immediate failed" ); - - m_pConnection->evaluateStatusVector(m_statusVector, sql, *this); - // TODO: get number of changed rows with SELECT ROW_COUNT (use executeQuery) - // return getUpdateCount(); - return 0; -} - -OUString OStatement_Base::sanitizeSqlString(const OUString& sqlIn) -{ - // TODO: verify this is all we need. - static const sal_Unicode pattern('"'); - static const sal_Unicode empty(' '); - return sqlIn.replace(pattern, empty); -} - -int OStatement_Base::prepareAndDescribeStatement(const OUString& sqlIn, - isc_stmt_handle& aStatementHandle, - XSQLDA*& pOutSqlda, - XSQLDA* pInSqlda) -{ - MutexGuard aGuard(m_pConnection->getMutex()); - - const OUString sql = sanitizeSqlString(sqlIn); - - if (!pOutSqlda) - { - pOutSqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(10)); - pOutSqlda->version = SQLDA_VERSION1; - pOutSqlda->sqln = 10; - } - - int aErr = 0; - - aErr = isc_dsql_allocate_statement(m_statusVector, - &m_pConnection->getDBHandle(), - &aStatementHandle); - - if (aErr) - { - SAL_WARN("connectivity.firebird", "isc_dsql_allocate_statement failed"); - return aErr; - } - else - { - aErr = isc_dsql_prepare(m_statusVector, - &m_pConnection->getTransaction(), - &aStatementHandle, - 0, - OUStringToOString(sql, RTL_TEXTENCODING_UTF8).getStr(), - 1, - pInSqlda); - } - - if (aErr) - { - SAL_WARN("connectivity.firebird", "isc_dsql_prepare failed"); - return aErr; - } - else - { - aErr = isc_dsql_describe(m_statusVector, - &aStatementHandle, - 1, - pOutSqlda); - } - - // Ensure we have enough space in pOutSqlda - if (aErr) - { - SAL_WARN("connectivity.firebird", "isc_dsql_describe failed"); - return aErr; - } - else if (!aErr && (pOutSqlda->sqld > pOutSqlda->sqln)) - { - int n = pOutSqlda->sqld; - free(pOutSqlda); - pOutSqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(n)); - pOutSqlda->version = SQLDA_VERSION1; - aErr = isc_dsql_describe(m_statusVector, - &aStatementHandle, - 1, - pOutSqlda); - } - - // Process each XSQLVAR parameter structure in the output XSQLDA - if (aErr) - { - SAL_WARN("connectivity.firebird","isc_dsql_describe failed when resizing pOutSqlda"); - return aErr; - } - else - { - mallocSQLVAR(pOutSqlda); - } - - return aErr; -} - -uno::Reference< XResultSet > SAL_CALL OStatement_Base::executeQuery(const OUString& sqlIn) throw(SQLException, RuntimeException) -{ - MutexGuard aGuard(m_pConnection->getMutex()); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); - - const OUString sql = sanitizeSqlString(sqlIn); - - XSQLDA* pOutSqlda = 0; - isc_stmt_handle aStatementHandle = 0; - int aErr = 0; - - - aErr = prepareAndDescribeStatement(sql, - aStatementHandle, - pOutSqlda); - if (aErr) - { - SAL_WARN("connectivity.firebird", "prepareAndDescribeStatement failed"); - } - else - { - aErr = isc_dsql_execute(m_statusVector, - &m_pConnection->getTransaction(), - &aStatementHandle, - 1, - NULL); - if (aErr) - SAL_WARN("connectivity.firebird", "isc_dsql_execute failed" ); - } - - uno::Reference< OResultSet > pResult(new OResultSet(m_pConnection, - uno::Reference< XStatement >(this), - aStatementHandle, - pOutSqlda)); - //initializeResultSet( pResult.get() ); - m_xResultSet = pResult.get(); - - // TODO: deal with cleanup -// close(); - m_pConnection->evaluateStatusVector(m_statusVector, sql, *this); - return m_xResultSet; -} - -sal_Bool SAL_CALL OStatement_Base::execute(const OUString& sqlIn) throw(SQLException, RuntimeException) -{ - SAL_INFO("connectivity.firebird", "executeQuery(). " - "Got called with sql: " << sqlIn); - - MutexGuard aGuard(m_pConnection->getMutex()); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); - - XSQLDA* pOutSqlda = 0; - isc_stmt_handle aStatementHandle = 0; - int aErr = 0; - - const OUString sql = sanitizeSqlString(sqlIn); - - aErr = prepareAndDescribeStatement(sql, - aStatementHandle, - pOutSqlda); - - if (aErr) - { - SAL_WARN("connectivity.firebird", "prepareAndDescribeStatement failed" ); - } - else - { - aErr = isc_dsql_execute(m_statusVector, - &m_pConnection->getTransaction(), - &aStatementHandle, - 1, - NULL); - if (aErr) - SAL_WARN("connectivity.firebird", "isc_dsql_execute failed" ); - } - - m_pConnection->evaluateStatusVector(m_statusVector, sql, *this); - - // returns true when a resultset is available - return sal_False; -} - -uno::Reference< XConnection > SAL_CALL OStatement_Base::getConnection() - throw(SQLException, RuntimeException) -{ - MutexGuard aGuard(m_pConnection->getMutex()); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); - - return (uno::Reference< XConnection >)m_pConnection; -} - -// ---- XMultipleResults - UNSUPPORTED ---------------------------------------- -uno::Reference< XResultSet > SAL_CALL OStatement_Base::getResultSet() throw(SQLException, RuntimeException) -{ - // TODO: verify we really can't support this - return uno::Reference< XResultSet >(); -// MutexGuard aGuard( m_aMutex ); -// checkDisposed(OStatement_BASE::rBHelper.bDisposed); - -// return m_xResultSet; -} - -sal_Bool SAL_CALL OStatement_Base::getMoreResults() throw(SQLException, RuntimeException) -{ - // TODO: verify we really can't support this - return sal_False; -// MutexGuard aGuard( m_aMutex ); -// checkDisposed(OStatement_BASE::rBHelper.bDisposed); -} - -sal_Int32 SAL_CALL OStatement_Base::getUpdateCount() throw(SQLException, RuntimeException) -{ - // TODO: verify we really can't support this - return 0; -} - // ---- XBatchExecution - UNSUPPORTED ---------------------------------------- void SAL_CALL OStatement::addBatch(const OUString& sql) throw(SQLException, RuntimeException) @@ -396,112 +80,8 @@ Sequence< sal_Int32 > SAL_CALL OStatement::executeBatch() throw(SQLException, Ru return Sequence< sal_Int32 >(); } -// ---- XWarningsSupplier - UNSUPPORTED ---------------------------------------- -Any SAL_CALL OStatement_Base::getWarnings() throw(SQLException, RuntimeException) -{ - return Any(); -} - -void SAL_CALL OStatement_Base::clearWarnings() throw(SQLException, RuntimeException) -{ -} - -::cppu::IPropertyArrayHelper* OStatement_Base::createArrayHelper( ) const -{ - // this properties are define by the service statement - // they must in alphabetic order - Sequence< Property > aProps(10); - Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - DECL_PROP0(CURSORNAME, 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 (IllegalArgumentException) -{ - (void) rConvertedValue; - (void) rOldValue; - (void) nHandle; - (void) rValue; - sal_Bool bConverted = sal_False; - // here we have to try to convert - return bConverted; -} -// ------------------------------------------------------------------------- -void OStatement_Base::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue) throw (Exception) -{ - (void) rValue; - // set the value to what ever is necessary - switch(nHandle) - { - case PROPERTY_ID_QUERYTIMEOUT: - case PROPERTY_ID_MAXFIELDSIZE: - case PROPERTY_ID_MAXROWS: - case PROPERTY_ID_CURSORNAME: - case PROPERTY_ID_RESULTSETCONCURRENCY: - case PROPERTY_ID_RESULTSETTYPE: - case PROPERTY_ID_FETCHDIRECTION: - case PROPERTY_ID_FETCHSIZE: - case PROPERTY_ID_ESCAPEPROCESSING: - case PROPERTY_ID_USEBOOKMARKS: - default: - ; - } -} -// ------------------------------------------------------------------------- -void OStatement_Base::getFastPropertyValue(Any& rValue,sal_Int32 nHandle) const -{ - (void) rValue; - switch(nHandle) - { - case PROPERTY_ID_QUERYTIMEOUT: - case PROPERTY_ID_MAXFIELDSIZE: - case PROPERTY_ID_MAXROWS: - case PROPERTY_ID_CURSORNAME: - case PROPERTY_ID_RESULTSETCONCURRENCY: - case PROPERTY_ID_RESULTSETTYPE: - case PROPERTY_ID_FETCHDIRECTION: - case PROPERTY_ID_FETCHSIZE: - case PROPERTY_ID_ESCAPEPROCESSING: - case PROPERTY_ID_USEBOOKMARKS: - default: - ; - } -} - IMPLEMENT_SERVICE_INFO(OStatement,"com.sun.star.sdbcx.OStatement","com.sun.star.sdbc.Statement"); -void SAL_CALL OStatement_Base::acquire() throw() -{ - OStatement_BASE::acquire(); -} - -void SAL_CALL OStatement_Base::release() throw() -{ - OStatement_BASE::release(); -} - void SAL_CALL OStatement::acquire() throw() { OStatement_Base::acquire(); @@ -512,8 +92,12 @@ void SAL_CALL OStatement::release() throw() OStatement_Base::release(); } -uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL OStatement_Base::getPropertySetInfo( ) throw(RuntimeException) +Any SAL_CALL OStatement::queryInterface( const Type & rType ) throw(RuntimeException) { - return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper()); + Any aRet = ::cppu::queryInterface(rType,static_cast< XBatchExecution*> (this)); + if(!aRet.hasValue()) + aRet = OStatement_Base::queryInterface(rType); + return aRet; } + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/firebird/FStatement.hxx b/connectivity/source/drivers/firebird/FStatement.hxx index 584afa9b45c8..07c5afb8bc4d 100644 --- a/connectivity/source/drivers/firebird/FStatement.hxx +++ b/connectivity/source/drivers/firebird/FStatement.hxx @@ -36,117 +36,13 @@ #ifndef CONNECTIVITY_FIREBIRD_STATEMENT_HXX #define CONNECTIVITY_FIREBIRD_STATEMENT_HXX -#include <com/sun/star/sdbc/XStatement.hpp> -#include <com/sun/star/sdbc/XWarningsSupplier.hpp> -#include <com/sun/star/sdbc/XMultipleResults.hpp> -#include <com/sun/star/sdbc/XBatchExecution.hpp> -#include <com/sun/star/sdbc/XCloseable.hpp> -#include <com/sun/star/sdbc/SQLWarning.hpp> -#include <com/sun/star/util/XCancellable.hpp> -#include <cppuhelper/compbase5.hxx> -#include "FConnection.hxx" -#include <list> -#include "connectivity/OSubComponent.hxx" -#include <com/sun/star/lang/XServiceInfo.hpp> +#include "StatementCommonBase.hxx" namespace connectivity { namespace firebird { - typedef ::cppu::WeakComponentImplHelper5< ::com::sun::star::sdbc::XStatement, - ::com::sun::star::sdbc::XWarningsSupplier, - ::com::sun::star::util::XCancellable, - ::com::sun::star::sdbc::XCloseable, - ::com::sun::star::sdbc::XMultipleResults> OStatement_BASE; - - //************************************************************** - //************ Class: OStatement_Base - // is a base class for the normal statement and for the prepared statement - //************************************************************** - class OStatement_Base : public OStatement_BASE, - public ::cppu::OPropertySetHelper, - public OPropertyArrayUsageHelper<OStatement_Base> - - { - protected: - ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XResultSet> m_xResultSet; // The last ResultSet created - // for this Statement - - ::std::list< ::rtl::OUString> m_aBatchList; - - OConnection* m_pConnection; - - ISC_STATUS_ARRAY m_statusVector; - protected: - - void disposeResultSet(); - - // OPropertyArrayUsageHelper - virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; - // OPropertySetHelper - using OPropertySetHelper::getFastPropertyValue; - virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); - virtual sal_Bool SAL_CALL convertFastPropertyValue( - ::com::sun::star::uno::Any & rConvertedValue, - ::com::sun::star::uno::Any & rOldValue, - sal_Int32 nHandle, - const ::com::sun::star::uno::Any& rValue ) - throw (::com::sun::star::lang::IllegalArgumentException); - virtual void SAL_CALL setFastPropertyValue_NoBroadcast( - sal_Int32 nHandle, - const ::com::sun::star::uno::Any& rValue) throw (::com::sun::star::uno::Exception); - virtual void SAL_CALL getFastPropertyValue( - ::com::sun::star::uno::Any& rValue, - sal_Int32 nHandle) const; - virtual ~OStatement_Base(); - int prepareAndDescribeStatement(const OUString& sqlIn, - isc_stmt_handle& aStatementHandle, - XSQLDA*& pOutSqlda, - XSQLDA* pInSqlda=0); - ::rtl::OUString sanitizeSqlString(const OUString& sqlIn); - public: - - ::cppu::OBroadcastHelper& rBHelper; - OStatement_Base(OConnection* _pConnection); - using OStatement_BASE::operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >; - - // OComponentHelper - virtual void SAL_CALL disposing(void){OStatement_BASE::disposing();} - // XInterface - virtual void SAL_CALL release() throw(); - virtual void SAL_CALL acquire() throw(); - // XInterface - virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); - //XTypeProvider - virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); - - // XPropertySet - virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); - // XStatement - virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL executeQuery( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ; - virtual sal_Int32 SAL_CALL executeUpdate( const ::rtl::OUString& sqlIn ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ; - virtual sal_Bool SAL_CALL execute( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ; - virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnection( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ; - - // XWarningsSupplier - UNSUPPORTED - virtual ::com::sun::star::uno::Any SAL_CALL getWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL clearWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); - // XMultipleResults - UNSUPPORTED - virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getResultSet( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); - virtual sal_Int32 SAL_CALL getUpdateCount( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); - virtual sal_Bool SAL_CALL getMoreResults( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); - - // XCancellable - virtual void SAL_CALL cancel( ) throw(::com::sun::star::uno::RuntimeException); - // XCloseable - virtual void SAL_CALL close( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); - - // other methods - OConnection* getOwnConnection() const { return m_pConnection;} - - }; - class OStatement : public OStatement_Base, public ::com::sun::star::sdbc::XBatchExecution, public ::com::sun::star::lang::XServiceInfo diff --git a/connectivity/source/drivers/firebird/StatementCommonBase.cxx b/connectivity/source/drivers/firebird/StatementCommonBase.cxx new file mode 100644 index 000000000000..4816f0f25b44 --- /dev/null +++ b/connectivity/source/drivers/firebird/StatementCommonBase.cxx @@ -0,0 +1,468 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * The Contents of this file are made available subject to the terms of + * the BSD license. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *************************************************************************/ + +#include "FResultSet.hxx" +#include "StatementCommonBase.hxx" +#include "Util.hxx" + +#include <comphelper/sequence.hxx> +#include <cppuhelper/typeprovider.hxx> +#include <propertyids.hxx> +#include <TConnection.hxx> + +using namespace ::connectivity::firebird; + +using namespace ::com::sun::star; +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; + +using namespace ::comphelper; +using namespace ::osl; +using namespace ::rtl; +using namespace ::std; + +OStatement_Base::OStatement_Base(OConnection* _pConnection) + : OStatement_BASE(_pConnection->getMutex()), + OPropertySetHelper(OStatement_BASE::rBHelper), + m_pConnection(_pConnection), + rBHelper(OStatement_BASE::rBHelper) +{ + m_pConnection->acquire(); +} + +OStatement_Base::~OStatement_Base() +{ +} + +void OStatement_Base::disposeResultSet() +{ + //free the cursor if alive +// uno::Reference< XComponent > xComp(m_xResultSet.get(), UNO_QUERY); +// if (xComp.is()) +// xComp->dispose(); +// m_xResultSet = uno::Reference< XResultSet>(); +} + +//----------------------------------------------------------------------------- +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( + ::cppu::UnoType< uno::Reference< XMultiPropertySet > >::get(), + ::cppu::UnoType< uno::Reference< XFastPropertySet > >::get(), + ::cppu::UnoType< uno::Reference< XPropertySet > >::get()); + + return concatSequences(aTypes.getTypes(),OStatement_BASE::getTypes()); +} +// ------------------------------------------------------------------------- + +void SAL_CALL OStatement_Base::cancel( ) throw(RuntimeException) +{ + MutexGuard aGuard(m_pConnection->getMutex()); + checkDisposed(OStatement_BASE::rBHelper.bDisposed); + // cancel the current sql statement +} +// ------------------------------------------------------------------------- + +void SAL_CALL OStatement_Base::close( ) throw(SQLException, RuntimeException) +{ + SAL_INFO("connectivity.firebird", "close()."); + + { + MutexGuard aGuard(m_pConnection->getMutex()); + checkDisposed(OStatement_BASE::rBHelper.bDisposed); + + } + dispose(); +} + +// ---- XStatement ----------------------------------------------------------- +sal_Int32 SAL_CALL OStatement_Base::executeUpdate(const OUString& sqlIn) + throw(SQLException, RuntimeException) +{ + // TODO: close ResultSet if existing -- so so in all 3 execute methods. + MutexGuard aGuard(m_pConnection->getMutex()); + checkDisposed(OStatement_BASE::rBHelper.bDisposed); + + const OUString sql = sanitizeSqlString(sqlIn); + + int aErr = isc_dsql_execute_immediate(m_statusVector, + &m_pConnection->getDBHandle(), + &m_pConnection->getTransaction(), + 0, + OUStringToOString(sql, RTL_TEXTENCODING_UTF8).getStr(), + 1, + NULL); + + if (aErr) + SAL_WARN("connectivity.firebird", "isc_dsql_execute_immediate failed" ); + + m_pConnection->evaluateStatusVector(m_statusVector, sql, *this); + // TODO: get number of changed rows with SELECT ROW_COUNT (use executeQuery) + // return getUpdateCount(); + return 0; +} + +OUString OStatement_Base::sanitizeSqlString(const OUString& sqlIn) +{ + // TODO: verify this is all we need. + static const sal_Unicode pattern('"'); + static const sal_Unicode empty(' '); + return sqlIn.replace(pattern, empty); +} + +int OStatement_Base::prepareAndDescribeStatement(const OUString& sqlIn, + isc_stmt_handle& aStatementHandle, + XSQLDA*& pOutSqlda, + XSQLDA* pInSqlda) +{ + MutexGuard aGuard(m_pConnection->getMutex()); + + const OUString sql = sanitizeSqlString(sqlIn); + + if (!pOutSqlda) + { + pOutSqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(10)); + pOutSqlda->version = SQLDA_VERSION1; + pOutSqlda->sqln = 10; + } + + int aErr = 0; + + aErr = isc_dsql_allocate_statement(m_statusVector, + &m_pConnection->getDBHandle(), + &aStatementHandle); + + if (aErr) + { + SAL_WARN("connectivity.firebird", "isc_dsql_allocate_statement failed"); + return aErr; + } + else + { + aErr = isc_dsql_prepare(m_statusVector, + &m_pConnection->getTransaction(), + &aStatementHandle, + 0, + OUStringToOString(sql, RTL_TEXTENCODING_UTF8).getStr(), + 1, + pInSqlda); + } + + if (aErr) + { + SAL_WARN("connectivity.firebird", "isc_dsql_prepare failed"); + return aErr; + } + else + { + aErr = isc_dsql_describe(m_statusVector, + &aStatementHandle, + 1, + pOutSqlda); + } + + // Ensure we have enough space in pOutSqlda + if (aErr) + { + SAL_WARN("connectivity.firebird", "isc_dsql_describe failed"); + return aErr; + } + else if (!aErr && (pOutSqlda->sqld > pOutSqlda->sqln)) + { + int n = pOutSqlda->sqld; + free(pOutSqlda); + pOutSqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(n)); + pOutSqlda->version = SQLDA_VERSION1; + aErr = isc_dsql_describe(m_statusVector, + &aStatementHandle, + 1, + pOutSqlda); + } + + // Process each XSQLVAR parameter structure in the output XSQLDA + if (aErr) + { + SAL_WARN("connectivity.firebird","isc_dsql_describe failed when resizing pOutSqlda"); + return aErr; + } + else + { + mallocSQLVAR(pOutSqlda); + } + + return aErr; +} + +uno::Reference< XResultSet > SAL_CALL OStatement_Base::executeQuery(const OUString& sqlIn) throw(SQLException, RuntimeException) +{ + MutexGuard aGuard(m_pConnection->getMutex()); + checkDisposed(OStatement_BASE::rBHelper.bDisposed); + + const OUString sql = sanitizeSqlString(sqlIn); + + XSQLDA* pOutSqlda = 0; + isc_stmt_handle aStatementHandle = 0; + int aErr = 0; + + + aErr = prepareAndDescribeStatement(sql, + aStatementHandle, + pOutSqlda); + if (aErr) + { + SAL_WARN("connectivity.firebird", "prepareAndDescribeStatement failed"); + } + else + { + aErr = isc_dsql_execute(m_statusVector, + &m_pConnection->getTransaction(), + &aStatementHandle, + 1, + NULL); + if (aErr) + SAL_WARN("connectivity.firebird", "isc_dsql_execute failed" ); + } + + uno::Reference< OResultSet > pResult(new OResultSet(m_pConnection, + uno::Reference< XStatement >(this), + aStatementHandle, + pOutSqlda)); + //initializeResultSet( pResult.get() ); + m_xResultSet = pResult.get(); + + // TODO: deal with cleanup +// close(); + m_pConnection->evaluateStatusVector(m_statusVector, sql, *this); + return m_xResultSet; +} + +sal_Bool SAL_CALL OStatement_Base::execute(const OUString& sqlIn) throw(SQLException, RuntimeException) +{ + SAL_INFO("connectivity.firebird", "executeQuery(). " + "Got called with sql: " << sqlIn); + + MutexGuard aGuard(m_pConnection->getMutex()); + checkDisposed(OStatement_BASE::rBHelper.bDisposed); + + XSQLDA* pOutSqlda = 0; + isc_stmt_handle aStatementHandle = 0; + int aErr = 0; + + const OUString sql = sanitizeSqlString(sqlIn); + + aErr = prepareAndDescribeStatement(sql, + aStatementHandle, + pOutSqlda); + + if (aErr) + { + SAL_WARN("connectivity.firebird", "prepareAndDescribeStatement failed" ); + } + else + { + aErr = isc_dsql_execute(m_statusVector, + &m_pConnection->getTransaction(), + &aStatementHandle, + 1, + NULL); + if (aErr) + SAL_WARN("connectivity.firebird", "isc_dsql_execute failed" ); + } + + m_pConnection->evaluateStatusVector(m_statusVector, sql, *this); + + // returns true when a resultset is available + return sal_False; +} + +uno::Reference< XConnection > SAL_CALL OStatement_Base::getConnection() + throw(SQLException, RuntimeException) +{ + MutexGuard aGuard(m_pConnection->getMutex()); + checkDisposed(OStatement_BASE::rBHelper.bDisposed); + + return (uno::Reference< XConnection >)m_pConnection; +} + +// ---- XMultipleResults - UNSUPPORTED ---------------------------------------- +uno::Reference< XResultSet > SAL_CALL OStatement_Base::getResultSet() throw(SQLException, RuntimeException) +{ + // TODO: verify we really can't support this + return uno::Reference< XResultSet >(); +// MutexGuard aGuard( m_aMutex ); +// checkDisposed(OStatement_BASE::rBHelper.bDisposed); + +// return m_xResultSet; +} + +sal_Bool SAL_CALL OStatement_Base::getMoreResults() throw(SQLException, RuntimeException) +{ + // TODO: verify we really can't support this + return sal_False; +// MutexGuard aGuard( m_aMutex ); +// checkDisposed(OStatement_BASE::rBHelper.bDisposed); +} + +sal_Int32 SAL_CALL OStatement_Base::getUpdateCount() throw(SQLException, RuntimeException) +{ + // TODO: verify we really can't support this + return 0; +} + + +// ---- XWarningsSupplier - UNSUPPORTED ---------------------------------------- +Any SAL_CALL OStatement_Base::getWarnings() throw(SQLException, RuntimeException) +{ + return Any(); +} + +void SAL_CALL OStatement_Base::clearWarnings() throw(SQLException, RuntimeException) +{ +} + +::cppu::IPropertyArrayHelper* OStatement_Base::createArrayHelper( ) const +{ + // this properties are define by the service statement + // they must in alphabetic order + Sequence< Property > aProps(10); + Property* pProperties = aProps.getArray(); + sal_Int32 nPos = 0; + DECL_PROP0(CURSORNAME, 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 (IllegalArgumentException) +{ + (void) rConvertedValue; + (void) rOldValue; + (void) nHandle; + (void) rValue; + sal_Bool bConverted = sal_False; + // here we have to try to convert + return bConverted; +} +// ------------------------------------------------------------------------- +void OStatement_Base::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue) throw (Exception) +{ + (void) rValue; + // set the value to what ever is necessary + switch(nHandle) + { + case PROPERTY_ID_QUERYTIMEOUT: + case PROPERTY_ID_MAXFIELDSIZE: + case PROPERTY_ID_MAXROWS: + case PROPERTY_ID_CURSORNAME: + case PROPERTY_ID_RESULTSETCONCURRENCY: + case PROPERTY_ID_RESULTSETTYPE: + case PROPERTY_ID_FETCHDIRECTION: + case PROPERTY_ID_FETCHSIZE: + case PROPERTY_ID_ESCAPEPROCESSING: + case PROPERTY_ID_USEBOOKMARKS: + default: + ; + } +} +// ------------------------------------------------------------------------- +void OStatement_Base::getFastPropertyValue(Any& rValue,sal_Int32 nHandle) const +{ + (void) rValue; + switch(nHandle) + { + case PROPERTY_ID_QUERYTIMEOUT: + case PROPERTY_ID_MAXFIELDSIZE: + case PROPERTY_ID_MAXROWS: + case PROPERTY_ID_CURSORNAME: + case PROPERTY_ID_RESULTSETCONCURRENCY: + case PROPERTY_ID_RESULTSETTYPE: + case PROPERTY_ID_FETCHDIRECTION: + case PROPERTY_ID_FETCHSIZE: + case PROPERTY_ID_ESCAPEPROCESSING: + case PROPERTY_ID_USEBOOKMARKS: + default: + ; + } +} + +void SAL_CALL OStatement_Base::acquire() throw() +{ + OStatement_BASE::acquire(); +} + +void SAL_CALL OStatement_Base::release() throw() +{ + OStatement_BASE::release(); +} + +uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL OStatement_Base::getPropertySetInfo( ) throw(RuntimeException) +{ + return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper()); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/connectivity/source/drivers/firebird/StatementCommonBase.hxx b/connectivity/source/drivers/firebird/StatementCommonBase.hxx new file mode 100644 index 000000000000..7ee121c4846d --- /dev/null +++ b/connectivity/source/drivers/firebird/StatementCommonBase.hxx @@ -0,0 +1,154 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * The Contents of this file are made available subject to the terms of + * the BSD license. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *************************************************************************/ + +#ifndef CONNECTIVITY_FIREBIRD_STATEMENT_BASE_HXX +#define CONNECTIVITY_FIREBIRD_STATEMENT_BASE_HXX + +#include "FConnection.hxx" + +#include <ibase.h> + +#include <connectivity/OSubComponent.hxx> +#include <cppuhelper/compbase5.hxx> +#include <list> + +#include <com/sun/star/lang/XServiceInfo.hpp> +#include <com/sun/star/sdbc/SQLWarning.hpp> +#include <com/sun/star/sdbc/XBatchExecution.hpp> +#include <com/sun/star/sdbc/XCloseable.hpp> +#include <com/sun/star/sdbc/XMultipleResults.hpp> +#include <com/sun/star/sdbc/XStatement.hpp> +#include <com/sun/star/sdbc/XWarningsSupplier.hpp> +#include <com/sun/star/util/XCancellable.hpp> + +namespace connectivity +{ + namespace firebird + { + + typedef ::cppu::WeakComponentImplHelper5< ::com::sun::star::sdbc::XStatement, + ::com::sun::star::sdbc::XWarningsSupplier, + ::com::sun::star::util::XCancellable, + ::com::sun::star::sdbc::XCloseable, + ::com::sun::star::sdbc::XMultipleResults> OStatement_BASE; + + class OStatement_Base : public OStatement_BASE, + public ::cppu::OPropertySetHelper, + public OPropertyArrayUsageHelper<OStatement_Base> + + { + protected: + ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XResultSet> m_xResultSet; // The last ResultSet created + // for this Statement + + ::std::list< ::rtl::OUString> m_aBatchList; + + OConnection* m_pConnection; + + ISC_STATUS_ARRAY m_statusVector; + protected: + + void disposeResultSet(); + + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; + // OPropertySetHelper + using OPropertySetHelper::getFastPropertyValue; + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + virtual sal_Bool SAL_CALL convertFastPropertyValue( + ::com::sun::star::uno::Any & rConvertedValue, + ::com::sun::star::uno::Any & rOldValue, + sal_Int32 nHandle, + const ::com::sun::star::uno::Any& rValue ) + throw (::com::sun::star::lang::IllegalArgumentException); + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( + sal_Int32 nHandle, + const ::com::sun::star::uno::Any& rValue) throw (::com::sun::star::uno::Exception); + virtual void SAL_CALL getFastPropertyValue( + ::com::sun::star::uno::Any& rValue, + sal_Int32 nHandle) const; + virtual ~OStatement_Base(); + int prepareAndDescribeStatement(const OUString& sqlIn, + isc_stmt_handle& aStatementHandle, + XSQLDA*& pOutSqlda, + XSQLDA* pInSqlda=0); + ::rtl::OUString sanitizeSqlString(const OUString& sqlIn); + public: + + ::cppu::OBroadcastHelper& rBHelper; + OStatement_Base(OConnection* _pConnection); + using OStatement_BASE::operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >; + + // OComponentHelper + virtual void SAL_CALL disposing(void){OStatement_BASE::disposing();} + // XInterface + virtual void SAL_CALL release() throw(); + virtual void SAL_CALL acquire() throw(); + // XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + //XTypeProvider + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); + + // XPropertySet + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); + // XStatement + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL executeQuery( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ; + virtual sal_Int32 SAL_CALL executeUpdate( const ::rtl::OUString& sqlIn ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ; + virtual sal_Bool SAL_CALL execute( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ; + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnection( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ; + + // XWarningsSupplier - UNSUPPORTED + virtual ::com::sun::star::uno::Any SAL_CALL getWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL clearWarnings( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + // XMultipleResults - UNSUPPORTED + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getResultSet( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL getUpdateCount( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL getMoreResults( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // XCancellable + virtual void SAL_CALL cancel( ) throw(::com::sun::star::uno::RuntimeException); + // XCloseable + virtual void SAL_CALL close( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + // other methods + OConnection* getOwnConnection() const { return m_pConnection;} + + }; + } +} + +#endif //CONNECTIVITY_FIREBIRD_STATEMENT_BASE_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |