| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| #ifndef _CONNECTIVITY_ZCONNECTIONPOOL_HXX_ |
| #define _CONNECTIVITY_ZCONNECTIONPOOL_HXX_ |
| |
| #include <com/sun/star/lang/XEventListener.hpp> |
| #include <com/sun/star/sdbc/XPooledConnection.hpp> |
| #include <com/sun/star/sdbc/XDriver.hpp> |
| #include <com/sun/star/beans/PropertyValue.hpp> |
| #include <com/sun/star/beans/XPropertyChangeListener.hpp> |
| #include <com/sun/star/reflection/XProxyFactory.hpp> |
| #include <cppuhelper/weakref.hxx> |
| #include <cppuhelper/implbase1.hxx> |
| #include <comphelper/stl_types.hxx> |
| #include <osl/mutex.hxx> |
| #include <vos/timer.hxx> |
| #include <vos/ref.hxx> |
| #include <rtl/digest.h> |
| |
| namespace connectivity |
| { |
| class OConnectionPool; |
| //========================================================================== |
| /// OPoolTimer - Invalidates the connection pool |
| //========================================================================== |
| class OPoolTimer : public ::vos::OTimer |
| { |
| OConnectionPool* m_pPool; |
| public: |
| OPoolTimer(OConnectionPool* _pPool,const ::vos::TTimeValue& _Time) |
| : ::vos::OTimer(_Time) |
| ,m_pPool(_pPool) |
| {} |
| protected: |
| virtual void SAL_CALL onShot(); |
| }; |
| |
| //========================================================================== |
| //= OConnectionPool - the one-instance service for PooledConnections |
| //= manages the active connections and the connections in the pool |
| //========================================================================== |
| typedef ::cppu::WeakImplHelper1< ::com::sun::star::beans::XPropertyChangeListener> OConnectionPool_Base; |
| |
| // typedef for the interanl structure |
| typedef ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPooledConnection> > TPooledConnections; |
| |
| // contains the currently pooled connections |
| typedef struct |
| { |
| TPooledConnections aConnections; |
| sal_Int32 nALiveCount; // will be decremented everytime a time says to, when will reach zero the pool will be deleted |
| } TConnectionPool; |
| |
| struct TDigestHolder |
| { |
| sal_uInt8 m_pBuffer[RTL_DIGEST_LENGTH_SHA1]; |
| TDigestHolder() |
| { |
| m_pBuffer[0] = 0; |
| } |
| |
| }; |
| |
| // typedef TDigestHolder |
| |
| struct TDigestLess : public ::std::binary_function< TDigestHolder, TDigestHolder, bool> |
| { |
| bool operator() (const TDigestHolder& x, const TDigestHolder& y) const |
| { |
| sal_uInt32 i; |
| for(i=0;i < RTL_DIGEST_LENGTH_SHA1 && (x.m_pBuffer[i] >= y.m_pBuffer[i]); ++i) |
| ; |
| return i < RTL_DIGEST_LENGTH_SHA1; |
| } |
| }; |
| |
| typedef ::std::map< TDigestHolder,TConnectionPool,TDigestLess> TConnectionMap; |
| |
| // contains additional information about a activeconnection which is needed to put it back to the pool |
| typedef struct |
| { |
| TConnectionMap::iterator aPos; |
| ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPooledConnection> xPooledConnection; |
| } TActiveConnectionInfo; |
| |
| typedef ::std::map< ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>, |
| TActiveConnectionInfo> TActiveConnectionMap; |
| |
| class OConnectionPool : public OConnectionPool_Base |
| { |
| TConnectionMap m_aPool; // the pooled connections |
| TActiveConnectionMap m_aActiveConnections; // the currently active connections |
| |
| ::osl::Mutex m_aMutex; |
| ::vos::ORef<OPoolTimer> m_xInvalidator; // invalidates the conntection pool when shot |
| |
| ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDriver > m_xDriver; // the one and only driver for this connectionpool |
| ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xDriverNode; // config node entry |
| ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XProxyFactory > m_xProxyFactory; |
| sal_Int32 m_nTimeOut; |
| sal_Int32 m_nALiveCount; |
| |
| private: |
| ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> createNewConnection(const ::rtl::OUString& _rURL, |
| const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _rInfo); |
| ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> getPooledConnection(TConnectionMap::iterator& _rIter); |
| // calculate the timeout and the corresponding ALiveCount |
| void calculateTimeOuts(); |
| |
| protected: |
| // the dtor will be called from the last instance (last release call) |
| virtual ~OConnectionPool(); |
| public: |
| OConnectionPool(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDriver >& _xDriver, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _xDriverNode, |
| const ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XProxyFactory >& _rxProxyFactory); |
| |
| // delete all refs |
| void clear(sal_Bool _bDispose); |
| ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnectionWithInfo( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); |
| // XEventListener |
| virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); |
| // XPropertyChangeListener |
| virtual void SAL_CALL propertyChange( const ::com::sun::star::beans::PropertyChangeEvent& evt ) throw (::com::sun::star::uno::RuntimeException); |
| |
| void invalidatePooledConnections(); |
| }; |
| } |
| #endif // _CONNECTIVITY_ZCONNECTIONPOOL_HXX_ |
| |
| |