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_sw.hxx"
26  #include <com/sun/star/sdbc/XConnection.hpp>
27  #include <com/sun/star/util/XNumberFormatsSupplier.hpp>
28  #include <com/sun/star/sdbc/XDataSource.hpp>
29  #include <com/sun/star/sdb/SQLContext.hpp>
30  #include <swdbtoolsclient.hxx>
31  #include <osl/diagnose.h>
32  #include <tools/solar.h>
33  
34  //........................................................................
35  
36  using namespace ::connectivity::simple;
37  using namespace ::com::sun::star;
38  using namespace ::com::sun::star::sdbc;
39  using namespace ::com::sun::star::lang;
40  using namespace ::com::sun::star::util;
41  using namespace ::com::sun::star::uno;
42  using namespace ::com::sun::star::beans;
43  using namespace ::com::sun::star::sdb;
44  
45  //====================================================================
46  //= SwDbtoolsClient
47  //====================================================================
48  namespace
49  {
50  	// -----------------------------------------------------------------------------
51  	// this namespace contains access to all static members of the class SwDbtoolsClient
52  	// to make the initialize of the dll a little bit faster
53  	// -----------------------------------------------------------------------------
getDbtoolsClientMutex()54  	::osl::Mutex& getDbtoolsClientMutex()
55  	{
56  		static  ::osl::Mutex aMutex;
57  		return aMutex;
58  	}
59  	// -----------------------------------------------------------------------------
getDbToolsClientClients()60  	sal_Int32& getDbToolsClientClients()
61  	{
62  		static  sal_Int32 nClients = 0;
63  		return nClients;
64  	}
65  	// -----------------------------------------------------------------------------
getDbToolsClientModule()66  	oslModule& getDbToolsClientModule()
67  	{
68  		static oslModule hDbtoolsModule = NULL;
69  		return hDbtoolsModule;
70  	}
71  	// -----------------------------------------------------------------------------
getDbToolsClientFactoryFunction()72  	createDataAccessToolsFactoryFunction& getDbToolsClientFactoryFunction()
73  	{
74  		static createDataAccessToolsFactoryFunction pFactoryCreationFunc = NULL;
75  		return pFactoryCreationFunc;
76  	}
77  	// -----------------------------------------------------------------------------
78  }
79  // -----------------------------------------------------------------------------
SwDbtoolsClient()80  SwDbtoolsClient::SwDbtoolsClient()
81  {
82  }
83  
84  //--------------------------------------------------------------------
~SwDbtoolsClient()85  SwDbtoolsClient::~SwDbtoolsClient()
86  {
87      if(m_xDataAccessFactory.is())
88      {
89          // clear the factory _before_ revoking the client
90          // (the revocation may unload the DBT lib)
91          m_xDataAccessFactory = NULL;
92          // revoke the client
93          revokeClient();
94      }
95  }
96  
97  //--------------------------------------------------------------------
thisModule()98  extern "C" { static void SAL_CALL thisModule() {} }
99  
registerClient()100  void SwDbtoolsClient::registerClient()
101  {
102      ::osl::MutexGuard aGuard(getDbtoolsClientMutex());
103      if (1 == ++getDbToolsClientClients())
104      {
105          OSL_ENSURE(NULL == getDbToolsClientModule(), "SwDbtoolsClient::registerClient: inconsistence: already have a module!");
106          OSL_ENSURE(NULL == getDbToolsClientFactoryFunction(), "SwDbtoolsClient::registerClient: inconsistence: already have a factory function!");
107  
108          const ::rtl::OUString sModuleName = ::rtl::OUString::createFromAscii(
109              SVLIBRARY( "dbtools" )
110          );
111  
112          // load the dbtools library
113          getDbToolsClientModule() = osl_loadModuleRelative(
114              &thisModule, sModuleName.pData, 0);
115          OSL_ENSURE(NULL != getDbToolsClientModule(), "SwDbtoolsClient::registerClient: could not load the dbtools library!");
116          if (NULL != getDbToolsClientModule())
117          {
118              // get the symbol for the method creating the factory
119              const ::rtl::OUString sFactoryCreationFunc = ::rtl::OUString::createFromAscii("createDataAccessToolsFactory");
120              //  reinterpret_cast<createDataAccessToolsFactoryFunction> removed for gcc permissive
121              getDbToolsClientFactoryFunction() = reinterpret_cast< createDataAccessToolsFactoryFunction >(
122                  osl_getFunctionSymbol(getDbToolsClientModule(), sFactoryCreationFunc.pData));
123  
124              if (NULL == getDbToolsClientFactoryFunction())
125              {   // did not find the symbol
126                  OSL_ENSURE(sal_False, "SwDbtoolsClient::registerClient: could not find the symbol for creating the factory!");
127                  osl_unloadModule(getDbToolsClientModule());
128                  getDbToolsClientModule() = NULL;
129              }
130          }
131      }
132  }
133  
134  //--------------------------------------------------------------------
revokeClient()135  void SwDbtoolsClient::revokeClient()
136  {
137      ::osl::MutexGuard aGuard(getDbtoolsClientMutex());
138      if (0 == --getDbToolsClientClients())
139      {
140          getDbToolsClientFactoryFunction() = NULL;
141          if (getDbToolsClientModule())
142              osl_unloadModule(getDbToolsClientModule());
143          getDbToolsClientModule() = NULL;
144      }
145  }
146  /* -----------------------------30.08.2001 14:58------------------------------
147  
148   ---------------------------------------------------------------------------*/
getFactory()149  void SwDbtoolsClient::getFactory()
150  {
151      if(!m_xDataAccessFactory.is())
152      {
153          registerClient();
154          if(getDbToolsClientFactoryFunction())
155  		{	// loading the lib succeeded
156              void* pUntypedFactory = (*getDbToolsClientFactoryFunction())();
157  			IDataAccessToolsFactory* pDBTFactory = static_cast<IDataAccessToolsFactory*>(pUntypedFactory);
158              OSL_ENSURE(pDBTFactory, "SwDbtoolsClient::SwDbtoolsClient: no factory returned!");
159  			if (pDBTFactory)
160  			{
161  				m_xDataAccessFactory = pDBTFactory;
162  				// by definition, the factory was aquired once
163  				m_xDataAccessFactory->release();
164  			}
165  		}
166      }
167  }
168  /* -----------------------------30.08.2001 11:32------------------------------
169  
170   ---------------------------------------------------------------------------*/
171  ::rtl::Reference< ::connectivity::simple::IDataAccessTools >
getDataAccessTools()172      SwDbtoolsClient::getDataAccessTools()
173  {
174      if(!m_xDataAccessTools.is())
175      {
176          getFactory();
177          if(m_xDataAccessFactory.is())
178              m_xDataAccessTools = m_xDataAccessFactory->getDataAccessTools();
179      }
180      return m_xDataAccessTools;
181  }
182  /* -----------------------------30.08.2001 12:40------------------------------
183  
184   ---------------------------------------------------------------------------*/
185  ::rtl::Reference< ::connectivity::simple::IDataAccessTypeConversion >
getAccessTypeConversion()186      SwDbtoolsClient::getAccessTypeConversion()
187  {
188      if(!m_xAccessTypeConversion.is())
189      {
190          getFactory();
191          if(m_xDataAccessFactory.is())
192              m_xAccessTypeConversion = m_xDataAccessFactory->getTypeConversionHelper();
193      }
194      return m_xAccessTypeConversion;
195  }
196  
197  /* -----------------------------30.08.2001 11:37------------------------------
198  
199   ---------------------------------------------------------------------------*/
getDataSource(const::rtl::OUString & rRegisteredName,const Reference<XMultiServiceFactory> & xFactory)200  Reference< XDataSource > SwDbtoolsClient::getDataSource(
201          const ::rtl::OUString& rRegisteredName,
202          const Reference< XMultiServiceFactory>& xFactory
203              )
204  {
205      Reference< XDataSource > xRet;
206      ::rtl::Reference< ::connectivity::simple::IDataAccessTools >    xAccess = getDataAccessTools();
207      if(xAccess.is())
208          xRet = xAccess->getDataSource(rRegisteredName, xFactory);
209      return xRet;
210  }
211  /* -----------------------------30.08.2001 12:06------------------------------
212  
213   ---------------------------------------------------------------------------*/
getDefaultNumberFormat(const Reference<XPropertySet> & rxColumn,const Reference<XNumberFormatTypes> & rxTypes,const Locale & rLocale)214  sal_Int32 SwDbtoolsClient::getDefaultNumberFormat(
215          const Reference< XPropertySet >& rxColumn,
216          const Reference< XNumberFormatTypes >& rxTypes,
217          const Locale& rLocale
218              )
219  {
220      sal_Int32 nRet = -1;
221      ::rtl::Reference< ::connectivity::simple::IDataAccessTools >    xAccess = getDataAccessTools();
222      if(xAccess.is())
223          nRet = xAccess->getDefaultNumberFormat( rxColumn, rxTypes, rLocale);
224      return nRet;
225  }
226  /* -----------------------------30.08.2001 12:38------------------------------
227  
228   ---------------------------------------------------------------------------*/
getFormattedValue(const uno::Reference<beans::XPropertySet> & _rxColumn,const uno::Reference<util::XNumberFormatter> & _rxFormatter,const lang::Locale & _rLocale,const util::Date & _rNullDate)229  ::rtl::OUString SwDbtoolsClient::getFormattedValue(
230          const uno::Reference< beans::XPropertySet>& _rxColumn,
231          const uno::Reference< util::XNumberFormatter>& _rxFormatter,
232          const lang::Locale& _rLocale,
233          const util::Date& _rNullDate
234              )
235  
236  {
237      ::rtl::Reference< ::connectivity::simple::IDataAccessTypeConversion > xConversion =
238                      getAccessTypeConversion();
239      rtl::OUString sRet;
240      if(xConversion.is())
241          sRet = xConversion->getFormattedValue(_rxColumn, _rxFormatter, _rLocale, _rNullDate);
242      return sRet;
243  }
244  
245