1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_cui.hxx"
26 
27 #include "connpoolconfig.hxx"
28 #include "connpoolsettings.hxx"
29 
30 #include "connpooloptions.hxx"
31 #include <svl/itemset.hxx>
32 #include <unotools/confignode.hxx>
33 #include <comphelper/extract.hxx>
34 #include <svl/eitem.hxx>
35 #include <comphelper/processfactory.hxx>
36 #include "sdbcdriverenum.hxx"
37 
38 //........................................................................
39 namespace offapp
40 {
41 //........................................................................
42 
43 	using namespace ::utl;
44 	using namespace ::com::sun::star::uno;
45 
46 	//--------------------------------------------------------------------
getConnectionPoolNodeName()47 	static const ::rtl::OUString& getConnectionPoolNodeName()
48 	{
49 		static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("org.openoffice.Office.DataAccess/ConnectionPool");
50 		return s_sNodeName;
51 	}
52 
53 	//--------------------------------------------------------------------
getEnablePoolingNodeName()54 	static const ::rtl::OUString& getEnablePoolingNodeName()
55 	{
56 		static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("EnablePooling");
57 		return s_sNodeName;
58 	}
59 
60 	//--------------------------------------------------------------------
getDriverSettingsNodeName()61 	static const ::rtl::OUString& getDriverSettingsNodeName()
62 	{
63 		static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("DriverSettings");
64 		return s_sNodeName;
65 	}
66 
67 	//--------------------------------------------------------------------
getDriverNameNodeName()68 	static const ::rtl::OUString& getDriverNameNodeName()
69 	{
70 		static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("DriverName");
71 		return s_sNodeName;
72 	}
73 
74 	//--------------------------------------------------------------------
getEnableNodeName()75 	static const ::rtl::OUString& getEnableNodeName()
76 	{
77 		static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("Enable");
78 		return s_sNodeName;
79 	}
80 
81 	//--------------------------------------------------------------------
getTimeoutNodeName()82 	static const ::rtl::OUString& getTimeoutNodeName()
83 	{
84 		static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("Timeout");
85 		return s_sNodeName;
86 	}
87 
88 	//====================================================================
89 	//= ConnectionPoolConfig
90 	//====================================================================
91 	//--------------------------------------------------------------------
GetOptions(SfxItemSet & _rFillItems)92 	void ConnectionPoolConfig::GetOptions(SfxItemSet& _rFillItems)
93 	{
94 		// the config node where all pooling relevant info are stored under
95 		OConfigurationTreeRoot aConnectionPoolRoot = OConfigurationTreeRoot::createWithServiceFactory(
96 			::comphelper::getProcessServiceFactory(), getConnectionPoolNodeName(), -1, OConfigurationTreeRoot::CM_READONLY);
97 
98 		// the global "enabled" flag
99 		Any aEnabled = aConnectionPoolRoot.getNodeValue(getEnablePoolingNodeName());
100 		sal_Bool bEnabled = sal_True;
101 		aEnabled >>= bEnabled;
102 		_rFillItems.Put(SfxBoolItem(SID_SB_POOLING_ENABLED, bEnabled));
103 
104 		// the settings for the single drivers
105 		DriverPoolingSettings aSettings;
106 		// first get all the drivers register at the driver manager
107 		ODriverEnumeration aEnumDrivers;
108 		for	(	ODriverEnumeration::const_iterator aLoopDrivers = aEnumDrivers.begin();
109 				aLoopDrivers != aEnumDrivers.end();
110 				++aLoopDrivers
111 			)
112 		{
113 			aSettings.push_back(DriverPooling(*aLoopDrivers, sal_False, 120));
114 		}
115 
116 		// then look for which of them settings are stored in the configuration
117 		OConfigurationNode aDriverSettings = aConnectionPoolRoot.openNode(getDriverSettingsNodeName());
118 
119 		Sequence< ::rtl::OUString > aDriverKeys = aDriverSettings.getNodeNames();
120 		const ::rtl::OUString* pDriverKeys = aDriverKeys.getConstArray();
121 		const ::rtl::OUString* pDriverKeysEnd = pDriverKeys + aDriverKeys.getLength();
122 		for (;pDriverKeys != pDriverKeysEnd; ++pDriverKeys)
123 		{
124 			// the name of the driver in this round
125 			OConfigurationNode aThisDriverSettings = aDriverSettings.openNode(*pDriverKeys);
126 			::rtl::OUString sThisDriverName;
127 			aThisDriverSettings.getNodeValue(getDriverNameNodeName()) >>= sThisDriverName;
128 
129 			// look if we (resp. the driver manager) know this driver
130 			// doing O(n) search here, which is expensive, but this doesn't matter in this small case ...
131  			DriverPoolingSettings::iterator aLookup;
132  			for	(	aLookup = aSettings.begin();
133 					aLookup != aSettings.end();
134 					++aLookup
135 				)
136 				if (sThisDriverName.equals(aLookup->sName))
137 					break;
138 
139 			if (aLookup == aSettings.end())
140 			{	// do not know the driver - add it
141 				aSettings.push_back(DriverPooling(sThisDriverName, sal_False, 120));
142 
143 				// and the position of the new entry
144 				aLookup = aSettings.end();
145 				--aLookup;
146 			}
147 
148 			// now fill this entry with the settings from the configuration
149 			aThisDriverSettings.getNodeValue(getEnableNodeName()) >>= aLookup->bEnabled;
150 			aThisDriverSettings.getNodeValue(getTimeoutNodeName()) >>= aLookup->nTimeoutSeconds;
151 		}
152 
153 		_rFillItems.Put(DriverPoolingSettingsItem(SID_SB_DRIVER_TIMEOUTS, aSettings));
154 	}
155 
156 	//--------------------------------------------------------------------
SetOptions(const SfxItemSet & _rSourceItems)157 	void ConnectionPoolConfig::SetOptions(const SfxItemSet& _rSourceItems)
158 	{
159 		// the config node where all pooling relevant info are stored under
160 		OConfigurationTreeRoot aConnectionPoolRoot = OConfigurationTreeRoot::createWithServiceFactory(
161 			::comphelper::getProcessServiceFactory(), getConnectionPoolNodeName(), -1, OConfigurationTreeRoot::CM_UPDATABLE);
162 
163 		if (!aConnectionPoolRoot.isValid())
164 			// already asserted by the OConfigurationTreeRoot
165 			return;
166 
167 		sal_Bool bNeedCommit = sal_False;
168 
169 		// the global "enabled" flag
170 		SFX_ITEMSET_GET( _rSourceItems, pEnabled, SfxBoolItem, SID_SB_POOLING_ENABLED, sal_True );
171 		if (pEnabled)
172 		{
173 			sal_Bool bEnabled = pEnabled->GetValue();
174 			aConnectionPoolRoot.setNodeValue(getEnablePoolingNodeName(), Any(&bEnabled, ::getBooleanCppuType()));
175 			bNeedCommit = sal_True;
176 		}
177 
178 		// the settings for the single drivers
179 		SFX_ITEMSET_GET( _rSourceItems, pDriverSettings, DriverPoolingSettingsItem, SID_SB_DRIVER_TIMEOUTS, sal_True );
180 		if (pDriverSettings)
181 		{
182 			OConfigurationNode aDriverSettings = aConnectionPoolRoot.openNode(getDriverSettingsNodeName());
183 			if (!aDriverSettings.isValid())
184 				return;
185 
186 			::rtl::OUString sThisDriverName;
187 			OConfigurationNode aThisDriverSettings;
188 
189 			const DriverPoolingSettings& rNewSettings = pDriverSettings->getSettings();
190 			for (	DriverPoolingSettings::const_iterator aLoop = rNewSettings.begin();
191 					aLoop != rNewSettings.end();
192 					++aLoop
193 				)
194 			{
195 				// need the name as ::rtl::OUString
196 				sThisDriverName = aLoop->sName;
197 
198 				// the sub-node for this driver
199 				if (aDriverSettings.hasByName(aLoop->sName))
200 					aThisDriverSettings = aDriverSettings.openNode(aLoop->sName);
201 				else
202 					aThisDriverSettings = aDriverSettings.createNode(aLoop->sName);
203 
204 				// set the values
205 				aThisDriverSettings.setNodeValue(getDriverNameNodeName(), makeAny(sThisDriverName));
206 				aThisDriverSettings.setNodeValue(getEnableNodeName(), Any(&aLoop->bEnabled, ::getBooleanCppuType()));
207 				aThisDriverSettings.setNodeValue(getTimeoutNodeName(), makeAny(aLoop->nTimeoutSeconds));
208 			}
209 			bNeedCommit = sal_True;
210 		}
211 		if (bNeedCommit)
212 			aConnectionPoolRoot.commit();
213 	}
214 
215 //........................................................................
216 }	// namespace offapp
217 //........................................................................
218 
219 
220