1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski #ifndef _CONNECTIVITY_ZCONNECTIONPOOL_HXX_
24*b1cdbd2cSJim Jagielski #define _CONNECTIVITY_ZCONNECTIONPOOL_HXX_
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XEventListener.hpp>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XPooledConnection.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XDriver.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertyChangeListener.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/reflection/XProxyFactory.hpp>
32*b1cdbd2cSJim Jagielski #include <cppuhelper/weakref.hxx>
33*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
34*b1cdbd2cSJim Jagielski #include <comphelper/stl_types.hxx>
35*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx>
36*b1cdbd2cSJim Jagielski #include <vos/timer.hxx>
37*b1cdbd2cSJim Jagielski #include <vos/ref.hxx>
38*b1cdbd2cSJim Jagielski #include <rtl/digest.h>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski namespace connectivity
41*b1cdbd2cSJim Jagielski {
42*b1cdbd2cSJim Jagielski 	class OConnectionPool;
43*b1cdbd2cSJim Jagielski 	//==========================================================================
44*b1cdbd2cSJim Jagielski 	/// OPoolTimer - Invalidates the connection pool
45*b1cdbd2cSJim Jagielski 	//==========================================================================
46*b1cdbd2cSJim Jagielski 	class OPoolTimer : public ::vos::OTimer
47*b1cdbd2cSJim Jagielski 	{
48*b1cdbd2cSJim Jagielski 		OConnectionPool* m_pPool;
49*b1cdbd2cSJim Jagielski 	public:
OPoolTimer(OConnectionPool * _pPool,const::vos::TTimeValue & _Time)50*b1cdbd2cSJim Jagielski 		OPoolTimer(OConnectionPool* _pPool,const ::vos::TTimeValue& _Time)
51*b1cdbd2cSJim Jagielski 			: ::vos::OTimer(_Time)
52*b1cdbd2cSJim Jagielski 			,m_pPool(_pPool)
53*b1cdbd2cSJim Jagielski 		{}
54*b1cdbd2cSJim Jagielski 	protected:
55*b1cdbd2cSJim Jagielski 		virtual void SAL_CALL onShot();
56*b1cdbd2cSJim Jagielski 	};
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski 	//==========================================================================
59*b1cdbd2cSJim Jagielski 	//= OConnectionPool - the one-instance service for PooledConnections
60*b1cdbd2cSJim Jagielski 	//= manages the active connections and the connections in the pool
61*b1cdbd2cSJim Jagielski 	//==========================================================================
62*b1cdbd2cSJim Jagielski 	typedef	::cppu::WeakImplHelper1< ::com::sun::star::beans::XPropertyChangeListener>	OConnectionPool_Base;
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski 	// typedef for the interanl structure
65*b1cdbd2cSJim Jagielski 	typedef ::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPooledConnection> > TPooledConnections;
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski 	 // contains the currently pooled connections
68*b1cdbd2cSJim Jagielski 	typedef struct
69*b1cdbd2cSJim Jagielski 	{
70*b1cdbd2cSJim Jagielski 		TPooledConnections	aConnections;
71*b1cdbd2cSJim Jagielski 		sal_Int32			nALiveCount; // will be decremented everytime a time says to, when will reach zero the pool will be deleted
72*b1cdbd2cSJim Jagielski 	} TConnectionPool;
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski 	struct TDigestHolder
75*b1cdbd2cSJim Jagielski 	{
76*b1cdbd2cSJim Jagielski 		sal_uInt8 m_pBuffer[RTL_DIGEST_LENGTH_SHA1];
TDigestHolderconnectivity::TDigestHolder77*b1cdbd2cSJim Jagielski 		TDigestHolder()
78*b1cdbd2cSJim Jagielski 		{
79*b1cdbd2cSJim Jagielski 			m_pBuffer[0] = 0;
80*b1cdbd2cSJim Jagielski 		}
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski 	};
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski 	//	typedef TDigestHolder
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski 	struct TDigestLess : public ::std::binary_function< TDigestHolder, TDigestHolder, bool>
87*b1cdbd2cSJim Jagielski 	{
operator ()connectivity::TDigestLess88*b1cdbd2cSJim Jagielski 		bool operator() (const TDigestHolder& x, const TDigestHolder& y) const
89*b1cdbd2cSJim Jagielski 		{
90*b1cdbd2cSJim Jagielski 			sal_uInt32 i;
91*b1cdbd2cSJim Jagielski 			for(i=0;i < RTL_DIGEST_LENGTH_SHA1 && (x.m_pBuffer[i] >= y.m_pBuffer[i]); ++i)
92*b1cdbd2cSJim Jagielski 				;
93*b1cdbd2cSJim Jagielski 			return i < RTL_DIGEST_LENGTH_SHA1;
94*b1cdbd2cSJim Jagielski 		}
95*b1cdbd2cSJim Jagielski 	};
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski 	typedef ::std::map< TDigestHolder,TConnectionPool,TDigestLess> TConnectionMap;
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski 	// contains additional information about a activeconnection which is needed to put it back to the pool
100*b1cdbd2cSJim Jagielski 	typedef struct
101*b1cdbd2cSJim Jagielski 	{
102*b1cdbd2cSJim Jagielski 		TConnectionMap::iterator aPos;
103*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPooledConnection> xPooledConnection;
104*b1cdbd2cSJim Jagielski 	} TActiveConnectionInfo;
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 	typedef ::std::map< ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>,
107*b1cdbd2cSJim Jagielski 						TActiveConnectionInfo> TActiveConnectionMap;
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski 	class OConnectionPool : public OConnectionPool_Base
110*b1cdbd2cSJim Jagielski 	{
111*b1cdbd2cSJim Jagielski 		TConnectionMap			m_aPool;				// the pooled connections
112*b1cdbd2cSJim Jagielski 		TActiveConnectionMap	m_aActiveConnections;	// the currently active connections
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski 		::osl::Mutex			m_aMutex;
115*b1cdbd2cSJim Jagielski 		::vos::ORef<OPoolTimer>	m_xInvalidator;			// invalidates the conntection pool when shot
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDriver >				m_xDriver;		// the one and only driver for this connectionpool
118*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >			m_xDriverNode;	// config node entry
119*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Reference< ::com::sun::star::reflection::XProxyFactory >	m_xProxyFactory;
120*b1cdbd2cSJim Jagielski 		sal_Int32				m_nTimeOut;
121*b1cdbd2cSJim Jagielski 		sal_Int32				m_nALiveCount;
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski 	private:
124*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> createNewConnection(const ::rtl::OUString& _rURL,
125*b1cdbd2cSJim Jagielski 								const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _rInfo);
126*b1cdbd2cSJim Jagielski 		::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> getPooledConnection(TConnectionMap::iterator& _rIter);
127*b1cdbd2cSJim Jagielski 		// calculate the timeout and the corresponding ALiveCount
128*b1cdbd2cSJim Jagielski 		void calculateTimeOuts();
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski 	protected:
131*b1cdbd2cSJim Jagielski 		// the dtor will be called from the last instance  (last release call)
132*b1cdbd2cSJim Jagielski 		virtual ~OConnectionPool();
133*b1cdbd2cSJim Jagielski 	public:
134*b1cdbd2cSJim Jagielski 		OConnectionPool(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDriver >& _xDriver,
135*b1cdbd2cSJim Jagielski 						const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _xDriverNode,
136*b1cdbd2cSJim Jagielski 						const ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XProxyFactory >& _rxProxyFactory);
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski 		// delete all refs
139*b1cdbd2cSJim Jagielski 		void clear(sal_Bool _bDispose);
140*b1cdbd2cSJim Jagielski 		::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);
141*b1cdbd2cSJim Jagielski 		// XEventListener
142*b1cdbd2cSJim Jagielski 		virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException);
143*b1cdbd2cSJim Jagielski 		// XPropertyChangeListener
144*b1cdbd2cSJim Jagielski 		virtual void SAL_CALL propertyChange( const ::com::sun::star::beans::PropertyChangeEvent& evt ) throw (::com::sun::star::uno::RuntimeException);
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski 		void invalidatePooledConnections();
147*b1cdbd2cSJim Jagielski 	};
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski #endif // _CONNECTIVITY_ZCONNECTIONPOOL_HXX_
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski 
152