blob: 13044b114b52f08df63c37ceecfb8a68505a699c [file] [log] [blame]
/**************************************************************
*
* 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_sw.hxx"
#include <com/sun/star/sdbc/XConnection.hpp>
#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
#include <com/sun/star/sdbc/XDataSource.hpp>
#include <com/sun/star/sdb/SQLContext.hpp>
#include <swdbtoolsclient.hxx>
#include <osl/diagnose.h>
#include <tools/solar.h>
//........................................................................
using namespace ::connectivity::simple;
using namespace ::com::sun::star;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::sdb;
//====================================================================
//= SwDbtoolsClient
//====================================================================
namespace
{
// -----------------------------------------------------------------------------
// this namespace contains access to all static members of the class SwDbtoolsClient
// to make the initialize of the dll a little bit faster
// -----------------------------------------------------------------------------
::osl::Mutex& getDbtoolsClientMutex()
{
static ::osl::Mutex aMutex;
return aMutex;
}
// -----------------------------------------------------------------------------
sal_Int32& getDbToolsClientClients()
{
static sal_Int32 nClients = 0;
return nClients;
}
// -----------------------------------------------------------------------------
oslModule& getDbToolsClientModule()
{
static oslModule hDbtoolsModule = NULL;
return hDbtoolsModule;
}
// -----------------------------------------------------------------------------
createDataAccessToolsFactoryFunction& getDbToolsClientFactoryFunction()
{
static createDataAccessToolsFactoryFunction pFactoryCreationFunc = NULL;
return pFactoryCreationFunc;
}
// -----------------------------------------------------------------------------
}
// -----------------------------------------------------------------------------
SwDbtoolsClient::SwDbtoolsClient()
{
}
//--------------------------------------------------------------------
SwDbtoolsClient::~SwDbtoolsClient()
{
if(m_xDataAccessFactory.is())
{
// clear the factory _before_ revoking the client
// (the revocation may unload the DBT lib)
m_xDataAccessFactory = NULL;
// revoke the client
revokeClient();
}
}
//--------------------------------------------------------------------
extern "C" { static void SAL_CALL thisModule() {} }
void SwDbtoolsClient::registerClient()
{
::osl::MutexGuard aGuard(getDbtoolsClientMutex());
if (1 == ++getDbToolsClientClients())
{
OSL_ENSURE(NULL == getDbToolsClientModule(), "SwDbtoolsClient::registerClient: inconsistence: already have a module!");
OSL_ENSURE(NULL == getDbToolsClientFactoryFunction(), "SwDbtoolsClient::registerClient: inconsistence: already have a factory function!");
const ::rtl::OUString sModuleName = ::rtl::OUString::createFromAscii(
SVLIBRARY( "dbtools" )
);
// load the dbtools library
getDbToolsClientModule() = osl_loadModuleRelative(
&thisModule, sModuleName.pData, 0);
OSL_ENSURE(NULL != getDbToolsClientModule(), "SwDbtoolsClient::registerClient: could not load the dbtools library!");
if (NULL != getDbToolsClientModule())
{
// get the symbol for the method creating the factory
const ::rtl::OUString sFactoryCreationFunc = ::rtl::OUString::createFromAscii("createDataAccessToolsFactory");
// reinterpret_cast<createDataAccessToolsFactoryFunction> removed for gcc permissive
getDbToolsClientFactoryFunction() = reinterpret_cast< createDataAccessToolsFactoryFunction >(
osl_getFunctionSymbol(getDbToolsClientModule(), sFactoryCreationFunc.pData));
if (NULL == getDbToolsClientFactoryFunction())
{ // did not find the symbol
OSL_ENSURE(sal_False, "SwDbtoolsClient::registerClient: could not find the symbol for creating the factory!");
osl_unloadModule(getDbToolsClientModule());
getDbToolsClientModule() = NULL;
}
}
}
}
//--------------------------------------------------------------------
void SwDbtoolsClient::revokeClient()
{
::osl::MutexGuard aGuard(getDbtoolsClientMutex());
if (0 == --getDbToolsClientClients())
{
getDbToolsClientFactoryFunction() = NULL;
if (getDbToolsClientModule())
osl_unloadModule(getDbToolsClientModule());
getDbToolsClientModule() = NULL;
}
}
/* -----------------------------30.08.2001 14:58------------------------------
---------------------------------------------------------------------------*/
void SwDbtoolsClient::getFactory()
{
if(!m_xDataAccessFactory.is())
{
registerClient();
if(getDbToolsClientFactoryFunction())
{ // loading the lib succeeded
void* pUntypedFactory = (*getDbToolsClientFactoryFunction())();
IDataAccessToolsFactory* pDBTFactory = static_cast<IDataAccessToolsFactory*>(pUntypedFactory);
OSL_ENSURE(pDBTFactory, "SwDbtoolsClient::SwDbtoolsClient: no factory returned!");
if (pDBTFactory)
{
m_xDataAccessFactory = pDBTFactory;
// by definition, the factory was aquired once
m_xDataAccessFactory->release();
}
}
}
}
/* -----------------------------30.08.2001 11:32------------------------------
---------------------------------------------------------------------------*/
::rtl::Reference< ::connectivity::simple::IDataAccessTools >
SwDbtoolsClient::getDataAccessTools()
{
if(!m_xDataAccessTools.is())
{
getFactory();
if(m_xDataAccessFactory.is())
m_xDataAccessTools = m_xDataAccessFactory->getDataAccessTools();
}
return m_xDataAccessTools;
}
/* -----------------------------30.08.2001 12:40------------------------------
---------------------------------------------------------------------------*/
::rtl::Reference< ::connectivity::simple::IDataAccessTypeConversion >
SwDbtoolsClient::getAccessTypeConversion()
{
if(!m_xAccessTypeConversion.is())
{
getFactory();
if(m_xDataAccessFactory.is())
m_xAccessTypeConversion = m_xDataAccessFactory->getTypeConversionHelper();
}
return m_xAccessTypeConversion;
}
/* -----------------------------30.08.2001 11:37------------------------------
---------------------------------------------------------------------------*/
Reference< XDataSource > SwDbtoolsClient::getDataSource(
const ::rtl::OUString& rRegisteredName,
const Reference< XMultiServiceFactory>& xFactory
)
{
Reference< XDataSource > xRet;
::rtl::Reference< ::connectivity::simple::IDataAccessTools > xAccess = getDataAccessTools();
if(xAccess.is())
xRet = xAccess->getDataSource(rRegisteredName, xFactory);
return xRet;
}
/* -----------------------------30.08.2001 12:06------------------------------
---------------------------------------------------------------------------*/
sal_Int32 SwDbtoolsClient::getDefaultNumberFormat(
const Reference< XPropertySet >& rxColumn,
const Reference< XNumberFormatTypes >& rxTypes,
const Locale& rLocale
)
{
sal_Int32 nRet = -1;
::rtl::Reference< ::connectivity::simple::IDataAccessTools > xAccess = getDataAccessTools();
if(xAccess.is())
nRet = xAccess->getDefaultNumberFormat( rxColumn, rxTypes, rLocale);
return nRet;
}
/* -----------------------------30.08.2001 12:38------------------------------
---------------------------------------------------------------------------*/
::rtl::OUString SwDbtoolsClient::getFormattedValue(
const uno::Reference< beans::XPropertySet>& _rxColumn,
const uno::Reference< util::XNumberFormatter>& _rxFormatter,
const lang::Locale& _rLocale,
const util::Date& _rNullDate
)
{
::rtl::Reference< ::connectivity::simple::IDataAccessTypeConversion > xConversion =
getAccessTypeConversion();
rtl::OUString sRet;
if(xConversion.is())
sRet = xConversion->getFormattedValue(_rxColumn, _rxFormatter, _rLocale, _rNullDate);
return sRet;
}