summaryrefslogtreecommitdiff
path: root/cui/source/options/connpoolconfig.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cui/source/options/connpoolconfig.cxx')
-rw-r--r--cui/source/options/connpoolconfig.cxx226
1 files changed, 226 insertions, 0 deletions
diff --git a/cui/source/options/connpoolconfig.cxx b/cui/source/options/connpoolconfig.cxx
new file mode 100644
index 000000000000..1a681beb263e
--- /dev/null
+++ b/cui/source/options/connpoolconfig.cxx
@@ -0,0 +1,226 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: connpoolconfig.cxx,v $
+ * $Revision: 1.7 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 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 <svl/itemset.hxx>
+#include <unotools/confignode.hxx>
+#include <comphelper/extract.hxx>
+#include <svl/eitem.hxx>
+#include <comphelper/processfactory.hxx>
+#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
+//........................................................................
+
+