/************************************************************** * * 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. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_cui.hxx" #include "connpoolconfig.hxx" #include "connpoolsettings.hxx" #include "connpooloptions.hxx" #include #include #include #include #include #include "sdbcdriverenum.hxx" //........................................................................ namespace offapp { //........................................................................ using namespace ::utl; using namespace ::com::sun::star::uno; //-------------------------------------------------------------------- static const ::rtl::OUString& getConnectionPoolNodeName() { static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("org.openoffice.Office.DataAccess/ConnectionPool"); return s_sNodeName; } //-------------------------------------------------------------------- static const ::rtl::OUString& getEnablePoolingNodeName() { static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("EnablePooling"); return s_sNodeName; } //-------------------------------------------------------------------- static const ::rtl::OUString& getDriverSettingsNodeName() { static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("DriverSettings"); return s_sNodeName; } //-------------------------------------------------------------------- static const ::rtl::OUString& getDriverNameNodeName() { static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("DriverName"); return s_sNodeName; } //-------------------------------------------------------------------- static const ::rtl::OUString& getEnableNodeName() { static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("Enable"); return s_sNodeName; } //-------------------------------------------------------------------- static const ::rtl::OUString& getTimeoutNodeName() { static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("Timeout"); return s_sNodeName; } //==================================================================== //= ConnectionPoolConfig //==================================================================== //-------------------------------------------------------------------- void ConnectionPoolConfig::GetOptions(SfxItemSet& _rFillItems) { // the config node where all pooling relevant info are stored under OConfigurationTreeRoot aConnectionPoolRoot = OConfigurationTreeRoot::createWithServiceFactory( ::comphelper::getProcessServiceFactory(), getConnectionPoolNodeName(), -1, OConfigurationTreeRoot::CM_READONLY); // the global "enabled" flag Any aEnabled = aConnectionPoolRoot.getNodeValue(getEnablePoolingNodeName()); sal_Bool bEnabled = sal_True; aEnabled >>= bEnabled; _rFillItems.Put(SfxBoolItem(SID_SB_POOLING_ENABLED, bEnabled)); // the settings for the single drivers DriverPoolingSettings aSettings; // first get all the drivers register at the driver manager ODriverEnumeration aEnumDrivers; for ( ODriverEnumeration::const_iterator aLoopDrivers = aEnumDrivers.begin(); aLoopDrivers != aEnumDrivers.end(); ++aLoopDrivers ) { aSettings.push_back(DriverPooling(*aLoopDrivers, sal_False, 120)); } // then look for which of them settings are stored in the configuration OConfigurationNode aDriverSettings = aConnectionPoolRoot.openNode(getDriverSettingsNodeName()); Sequence< ::rtl::OUString > aDriverKeys = aDriverSettings.getNodeNames(); const ::rtl::OUString* pDriverKeys = aDriverKeys.getConstArray(); const ::rtl::OUString* pDriverKeysEnd = pDriverKeys + aDriverKeys.getLength(); for (;pDriverKeys != pDriverKeysEnd; ++pDriverKeys) { // the name of the driver in this round OConfigurationNode aThisDriverSettings = aDriverSettings.openNode(*pDriverKeys); ::rtl::OUString sThisDriverName; aThisDriverSettings.getNodeValue(getDriverNameNodeName()) >>= sThisDriverName; // look if we (resp. the driver manager) know this driver // doing O(n) search here, which is expensive, but this doesn't matter in this small case ... DriverPoolingSettings::iterator aLookup; for ( aLookup = aSettings.begin(); aLookup != aSettings.end(); ++aLookup ) if (sThisDriverName.equals(aLookup->sName)) break; if (aLookup == aSettings.end()) { // do not know the driver - add it aSettings.push_back(DriverPooling(sThisDriverName, sal_False, 120)); // and the position of the new entry aLookup = aSettings.end(); --aLookup; } // now fill this entry with the settings from the configuration aThisDriverSettings.getNodeValue(getEnableNodeName()) >>= aLookup->bEnabled; aThisDriverSettings.getNodeValue(getTimeoutNodeName()) >>= aLookup->nTimeoutSeconds; } _rFillItems.Put(DriverPoolingSettingsItem(SID_SB_DRIVER_TIMEOUTS, aSettings)); } //-------------------------------------------------------------------- void ConnectionPoolConfig::SetOptions(const SfxItemSet& _rSourceItems) { // the config node where all pooling relevant info are stored under OConfigurationTreeRoot aConnectionPoolRoot = OConfigurationTreeRoot::createWithServiceFactory( ::comphelper::getProcessServiceFactory(), getConnectionPoolNodeName(), -1, OConfigurationTreeRoot::CM_UPDATABLE); if (!aConnectionPoolRoot.isValid()) // already asserted by the OConfigurationTreeRoot return; sal_Bool bNeedCommit = sal_False; // the global "enabled" flag SFX_ITEMSET_GET( _rSourceItems, pEnabled, SfxBoolItem, SID_SB_POOLING_ENABLED, sal_True ); if (pEnabled) { sal_Bool bEnabled = pEnabled->GetValue(); aConnectionPoolRoot.setNodeValue(getEnablePoolingNodeName(), Any(&bEnabled, ::getBooleanCppuType())); bNeedCommit = sal_True; } // the settings for the single drivers SFX_ITEMSET_GET( _rSourceItems, pDriverSettings, DriverPoolingSettingsItem, SID_SB_DRIVER_TIMEOUTS, sal_True ); if (pDriverSettings) { OConfigurationNode aDriverSettings = aConnectionPoolRoot.openNode(getDriverSettingsNodeName()); if (!aDriverSettings.isValid()) return; ::rtl::OUString sThisDriverName; OConfigurationNode aThisDriverSettings; const DriverPoolingSettings& rNewSettings = pDriverSettings->getSettings(); for ( DriverPoolingSettings::const_iterator aLoop = rNewSettings.begin(); aLoop != rNewSettings.end(); ++aLoop ) { // need the name as ::rtl::OUString sThisDriverName = aLoop->sName; // the sub-node for this driver if (aDriverSettings.hasByName(aLoop->sName)) aThisDriverSettings = aDriverSettings.openNode(aLoop->sName); else aThisDriverSettings = aDriverSettings.createNode(aLoop->sName); // set the values aThisDriverSettings.setNodeValue(getDriverNameNodeName(), makeAny(sThisDriverName)); aThisDriverSettings.setNodeValue(getEnableNodeName(), Any(&aLoop->bEnabled, ::getBooleanCppuType())); aThisDriverSettings.setNodeValue(getTimeoutNodeName(), makeAny(aLoop->nTimeoutSeconds)); } bNeedCommit = sal_True; } if (bNeedCommit) aConnectionPoolRoot.commit(); } //........................................................................ } // namespace offapp //........................................................................