xref: /AOO41X/main/dbaccess/source/core/api/TableDeco.cxx (revision 96de54900b79e13b861fbc62cbf36018b54e21b7)
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_dbaccess.hxx"
26 
27 #ifndef _DBA_CORE_TABLEDECORATOR_HXX_
28 #include "TableDeco.hxx"
29 #endif
30 #ifndef _DBACORE_DEFINITIONCOLUMN_HXX_
31 #include <definitioncolumn.hxx>
32 #endif
33 #ifndef DBACCESS_SHARED_DBASTRINGS_HRC
34 #include "dbastrings.hrc"
35 #endif
36 #ifndef _DBA_CORE_RESOURCE_HXX_
37 #include "core_resource.hxx"
38 #endif
39 #ifndef _DBA_CORE_RESOURCE_HRC_
40 #include "core_resource.hrc"
41 #endif
42 #ifndef _TOOLS_DEBUG_HXX
43 #include <tools/debug.hxx>
44 #endif
45 
46 #ifndef _CPPUHELPER_TYPEPROVIDER_HXX_
47 #include <cppuhelper/typeprovider.hxx>
48 #endif
49 #ifndef _COMPHELPER_ENUMHELPER_HXX_
50 #include <comphelper/enumhelper.hxx>
51 #endif
52 #ifndef _COMPHELPER_CONTAINER_HXX_
53 #include <comphelper/container.hxx>
54 #endif
55 #ifndef _COMPHELPER_SEQUENCE_HXX_
56 #include <comphelper/sequence.hxx>
57 #endif
58 #ifndef _COMPHELPER_PROPERTY_HXX_
59 #include <comphelper/property.hxx>
60 #endif
61 #ifndef _COMPHELPER_TYPES_HXX_
62 #include <comphelper/types.hxx>
63 #endif
64 #ifndef _COM_SUN_STAR_UTIL_XREFRESHLISTENER_HPP_
65 #include <com/sun/star/util/XRefreshListener.hpp>
66 #endif
67 #ifndef _COM_SUN_STAR_SDBC_XCONNECTION_HPP_
68 #include <com/sun/star/sdbc/XConnection.hpp>
69 #endif
70 #ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
71 #include <com/sun/star/sdbc/XRow.hpp>
72 #endif
73 #ifndef _COM_SUN_STAR_SDBCX_PRIVILEGE_HPP_
74 #include <com/sun/star/sdbcx/Privilege.hpp>
75 #endif
76 #ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_
77 #include <com/sun/star/beans/PropertyAttribute.hpp>
78 #endif
79 #ifndef _CONNECTIVITY_DBTOOLS_HXX_
80 #include <connectivity/dbtools.hxx>
81 #endif
82 #ifndef _DBHELPER_DBEXCEPTION_HXX_
83 #include <connectivity/dbexception.hxx>
84 #endif
85 #ifndef _CONNECTIVITY_DBTOOLS_HXX_
86 #include <connectivity/dbtools.hxx>
87 #endif
88 #ifndef _COMPHELPER_EXTRACT_HXX_
89 #include <comphelper/extract.hxx>
90 #endif
91 #ifndef DBA_CONTAINERMEDIATOR_HXX
92 #include "ContainerMediator.hxx"
93 #endif
94 #include <rtl/logfile.hxx>
95 
96 using namespace dbaccess;
97 using namespace ::com::sun::star::uno;
98 using namespace ::com::sun::star::util;
99 using namespace ::com::sun::star::lang;
100 using namespace ::com::sun::star::beans;
101 using namespace ::com::sun::star::sdbc;
102 using namespace ::com::sun::star::sdbcx;
103 using namespace ::com::sun::star::container;
104 using namespace ::osl;
105 using namespace ::comphelper;
106 using namespace ::dbtools;
107 using namespace ::cppu;
108 
109 //==========================================================================
110 //= ODBTableDecorator
111 //==========================================================================
DBG_NAME(ODBTableDecorator)112 DBG_NAME(ODBTableDecorator)
113 // -----------------------------------------------------------------------------
114 ODBTableDecorator::ODBTableDecorator( const Reference< XConnection >& _rxConnection, const Reference< XColumnsSupplier >& _rxNewTable,
115         const Reference< XNumberFormatsSupplier >& _rxNumberFormats, const Reference< XNameAccess >& _xColumnDefinitions ) throw(SQLException)
116     :OTableDescriptor_BASE(m_aMutex)
117     ,ODataSettings(OTableDescriptor_BASE::rBHelper)
118     ,m_xTable(_rxNewTable)
119     ,m_xColumnDefinitions(_xColumnDefinitions)
120     ,m_xConnection( _rxConnection )
121     ,m_xMetaData( _rxConnection.is() ? _rxConnection->getMetaData() : Reference< XDatabaseMetaData >() )
122     ,m_xNumberFormats( _rxNumberFormats )
123     ,m_nPrivileges(-1)
124     ,m_pColumns(NULL)
125 {
126     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::ODBTableDecorator" );
127     DBG_CTOR(ODBTableDecorator, NULL);
128     ODataSettings::registerPropertiesFor(this);
129 }
130 // -------------------------------------------------------------------------
~ODBTableDecorator()131 ODBTableDecorator::~ODBTableDecorator()
132 {
133     DBG_DTOR(ODBTableDecorator, NULL);
134     if ( m_pColumns )
135         delete m_pColumns;
136 }
137 
138 //--------------------------------------------------------------------------
getImplementationId()139 Sequence< sal_Int8 > ODBTableDecorator::getImplementationId() throw (RuntimeException)
140 {
141     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::getImplementationId" );
142     static OImplementationId * pId = 0;
143     if (! pId)
144     {
145         MutexGuard aGuard( Mutex::getGlobalMutex() );
146         if (! pId)
147         {
148             static OImplementationId aId;
149             pId = &aId;
150         }
151     }
152     return pId->getImplementationId();
153 }
154 
155 // OComponentHelper
156 //------------------------------------------------------------------------------
disposing()157 void SAL_CALL ODBTableDecorator::disposing()
158 {
159     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::disposing" );
160     OPropertySetHelper::disposing();
161     OTableDescriptor_BASE::disposing();
162 
163     MutexGuard aGuard(m_aMutex);
164     m_xTable        = NULL;
165     m_xMetaData     = NULL;
166     m_pTables       = NULL;
167     m_xColumnDefinitions = NULL;
168     m_xNumberFormats = NULL;
169     if ( m_pColumns )
170         m_pColumns->disposing();
171     m_xColumnMediator = NULL;
172 }
173 // -----------------------------------------------------------------------------
convertFastPropertyValue(Any & rConvertedValue,Any & rOldValue,sal_Int32 nHandle,const Any & rValue)174 sal_Bool SAL_CALL ODBTableDecorator::convertFastPropertyValue(
175                             Any & rConvertedValue,
176                             Any & rOldValue,
177                             sal_Int32 nHandle,
178                             const Any& rValue )
179                                 throw (::com::sun::star::lang::IllegalArgumentException)
180 {
181     //RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::convertFastPropertyValue" );
182     sal_Bool bRet = sal_True;
183     switch(nHandle)
184     {
185         case PROPERTY_ID_PRIVILEGES:
186         case PROPERTY_ID_FILTER:
187         case PROPERTY_ID_ORDER:
188         case PROPERTY_ID_APPLYFILTER:
189         case PROPERTY_ID_FONT:
190         case PROPERTY_ID_ROW_HEIGHT:
191         case PROPERTY_ID_TEXTCOLOR:
192         case PROPERTY_ID_TEXTLINECOLOR:
193         case PROPERTY_ID_TEXTEMPHASIS:
194         case PROPERTY_ID_TEXTRELIEF:
195         case PROPERTY_ID_FONTCHARWIDTH:
196         case PROPERTY_ID_FONTCHARSET:
197         case PROPERTY_ID_FONTFAMILY:
198         case PROPERTY_ID_FONTHEIGHT:
199         case PROPERTY_ID_FONTKERNING:
200         case PROPERTY_ID_FONTNAME:
201         case PROPERTY_ID_FONTORIENTATION:
202         case PROPERTY_ID_FONTPITCH:
203         case PROPERTY_ID_FONTSLANT:
204         case PROPERTY_ID_FONTSTRIKEOUT:
205         case PROPERTY_ID_FONTSTYLENAME:
206         case PROPERTY_ID_FONTUNDERLINE:
207         case PROPERTY_ID_FONTWEIGHT:
208         case PROPERTY_ID_FONTWIDTH:
209         case PROPERTY_ID_FONTWORDLINEMODE:
210         case PROPERTY_ID_FONTTYPE:
211             bRet = ODataSettings::convertFastPropertyValue(rConvertedValue, rOldValue,nHandle,rValue);
212             break;
213 
214         default:
215             {
216                 Any aValue;
217                 getFastPropertyValue(aValue,nHandle);
218                 bRet = ::comphelper::tryPropertyValue(rConvertedValue,rOldValue,rValue,aValue,::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL)));
219             }
220             break; // we assume that it works
221     }
222     return bRet;
223 }
224 // -----------------------------------------------------------------------------
setFastPropertyValue_NoBroadcast(sal_Int32 _nHandle,const Any & _rValue)225 void ODBTableDecorator::setFastPropertyValue_NoBroadcast(sal_Int32 _nHandle, const Any& _rValue) throw (Exception)
226 {
227     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::setFastPropertyValue_NoBroadcast" );
228     switch(_nHandle)
229     {
230         case PROPERTY_ID_PRIVILEGES:
231             OSL_ENSURE(0,"Property is readonly!");
232         case PROPERTY_ID_FILTER:
233         case PROPERTY_ID_ORDER:
234         case PROPERTY_ID_APPLYFILTER:
235         case PROPERTY_ID_FONT:
236         case PROPERTY_ID_ROW_HEIGHT:
237         case PROPERTY_ID_TEXTCOLOR:
238         case PROPERTY_ID_TEXTLINECOLOR:
239         case PROPERTY_ID_TEXTEMPHASIS:
240         case PROPERTY_ID_TEXTRELIEF:
241         case PROPERTY_ID_FONTCHARWIDTH:
242         case PROPERTY_ID_FONTCHARSET:
243         case PROPERTY_ID_FONTFAMILY:
244         case PROPERTY_ID_FONTHEIGHT:
245         case PROPERTY_ID_FONTKERNING:
246         case PROPERTY_ID_FONTNAME:
247         case PROPERTY_ID_FONTORIENTATION:
248         case PROPERTY_ID_FONTPITCH:
249         case PROPERTY_ID_FONTSLANT:
250         case PROPERTY_ID_FONTSTRIKEOUT:
251         case PROPERTY_ID_FONTSTYLENAME:
252         case PROPERTY_ID_FONTUNDERLINE:
253         case PROPERTY_ID_FONTWEIGHT:
254         case PROPERTY_ID_FONTWIDTH:
255         case PROPERTY_ID_FONTWORDLINEMODE:
256         case PROPERTY_ID_FONTTYPE:
257 
258             ODataSettings::setFastPropertyValue_NoBroadcast(_nHandle, _rValue);
259             break;
260         case PROPERTY_ID_CATALOGNAME:
261             {
262                 Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
263                 xProp->setPropertyValue(PROPERTY_CATALOGNAME,_rValue);
264             }
265             break;
266         case PROPERTY_ID_SCHEMANAME:
267             {
268                 Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
269                 xProp->setPropertyValue(PROPERTY_SCHEMANAME,_rValue);
270             }
271             break;
272         case PROPERTY_ID_NAME:
273             {
274                 Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
275                 xProp->setPropertyValue(PROPERTY_NAME,_rValue);
276             }
277             break;
278         case PROPERTY_ID_DESCRIPTION:
279             {
280                 Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
281                 xProp->setPropertyValue(PROPERTY_DESCRIPTION,_rValue);
282             }
283             break;
284         case PROPERTY_ID_TYPE:
285             {
286                 Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
287                 xProp->setPropertyValue(PROPERTY_TYPE,_rValue);
288             }
289             break;
290     }
291 }
292 //------------------------------------------------------------------------------
getFastPropertyValue(Any & _rValue,sal_Int32 _nHandle) const293 void ODBTableDecorator::getFastPropertyValue(Any& _rValue, sal_Int32 _nHandle) const
294 {
295     //RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::getFastPropertyValue" );
296     switch(_nHandle)
297     {
298         case PROPERTY_ID_PRIVILEGES:
299             {
300                 if ( -1 == m_nPrivileges )
301                     fillPrivileges();
302                 Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
303                 Reference<XPropertySetInfo> xInfo = xProp->getPropertySetInfo();
304                 if ( xInfo->hasPropertyByName(PROPERTY_PRIVILEGES) )
305                 {
306                     _rValue <<= m_nPrivileges;
307                     break;
308                 }
309             }
310             // run through
311 
312         case PROPERTY_ID_FILTER:
313         case PROPERTY_ID_ORDER:
314         case PROPERTY_ID_APPLYFILTER:
315         case PROPERTY_ID_FONT:
316         case PROPERTY_ID_ROW_HEIGHT:
317         case PROPERTY_ID_TEXTCOLOR:
318         case PROPERTY_ID_TEXTLINECOLOR:
319         case PROPERTY_ID_TEXTEMPHASIS:
320         case PROPERTY_ID_TEXTRELIEF:
321         case PROPERTY_ID_FONTCHARWIDTH:
322         case PROPERTY_ID_FONTCHARSET:
323         case PROPERTY_ID_FONTFAMILY:
324         case PROPERTY_ID_FONTHEIGHT:
325         case PROPERTY_ID_FONTKERNING:
326         case PROPERTY_ID_FONTNAME:
327         case PROPERTY_ID_FONTORIENTATION:
328         case PROPERTY_ID_FONTPITCH:
329         case PROPERTY_ID_FONTSLANT:
330         case PROPERTY_ID_FONTSTRIKEOUT:
331         case PROPERTY_ID_FONTSTYLENAME:
332         case PROPERTY_ID_FONTUNDERLINE:
333         case PROPERTY_ID_FONTWEIGHT:
334         case PROPERTY_ID_FONTWIDTH:
335         case PROPERTY_ID_FONTWORDLINEMODE:
336         case PROPERTY_ID_FONTTYPE:
337             ODataSettings::getFastPropertyValue(_rValue, _nHandle);
338             break;
339         case PROPERTY_ID_CATALOGNAME:
340             {
341                 Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
342                 _rValue = xProp->getPropertyValue(PROPERTY_CATALOGNAME);
343             }
344             break;
345         case PROPERTY_ID_SCHEMANAME:
346             {
347                 Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
348                 _rValue = xProp->getPropertyValue(PROPERTY_SCHEMANAME);
349             }
350             break;
351         case PROPERTY_ID_NAME:
352             {
353                 Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
354                 _rValue = xProp->getPropertyValue(PROPERTY_NAME);
355             }
356             break;
357         case PROPERTY_ID_DESCRIPTION:
358             {
359                 Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
360                 _rValue = xProp->getPropertyValue(PROPERTY_DESCRIPTION);
361             }
362             break;
363         case PROPERTY_ID_TYPE:
364             {
365                 Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
366                 _rValue = xProp->getPropertyValue(PROPERTY_TYPE);
367             }
368             break;
369         default:
370             OSL_ENSURE(0,"Invalid Handle for table");
371     }
372 }
373 // -------------------------------------------------------------------------
construct()374 void ODBTableDecorator::construct()
375 {
376     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::construct" );
377     sal_Bool bNotFound = sal_True;
378     Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
379     if ( xProp.is() )
380     {
381         Reference<XPropertySetInfo> xInfo = xProp->getPropertySetInfo();
382         bNotFound = !xInfo->hasPropertyByName(PROPERTY_PRIVILEGES);
383     }
384     if ( bNotFound )
385         registerProperty(PROPERTY_PRIVILEGES, PROPERTY_ID_PRIVILEGES, PropertyAttribute::BOUND  | PropertyAttribute::READONLY,
386                         &m_nPrivileges, ::getCppuType(static_cast<sal_Int32*>(NULL)));
387 }
388 // -----------------------------------------------------------------------------
createArrayHelper(sal_Int32) const389 ::cppu::IPropertyArrayHelper* ODBTableDecorator::createArrayHelper(sal_Int32 /*_nId*/) const
390 {
391     //RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::createArrayHelper" );
392     Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
393     Reference<XPropertySetInfo> xInfo = xProp->getPropertySetInfo();
394 
395     Sequence< Property > aTableProps = xInfo->getProperties();
396     Property* pIter = aTableProps.getArray();
397     Property* pEnd = pIter + aTableProps.getLength();
398     for (;pIter != pEnd ; ++pIter)
399     {
400         if (0 == pIter->Name.compareToAscii(PROPERTY_CATALOGNAME))
401             pIter->Handle = PROPERTY_ID_CATALOGNAME;
402         else if (0 ==pIter->Name.compareToAscii(PROPERTY_SCHEMANAME))
403             pIter->Handle = PROPERTY_ID_SCHEMANAME;
404         else if (0 ==pIter->Name.compareToAscii(PROPERTY_NAME))
405             pIter->Handle = PROPERTY_ID_NAME;
406         else if (0 ==pIter->Name.compareToAscii(PROPERTY_DESCRIPTION))
407             pIter->Handle = PROPERTY_ID_DESCRIPTION;
408         else if (0 ==pIter->Name.compareToAscii(PROPERTY_TYPE))
409             pIter->Handle = PROPERTY_ID_TYPE;
410         else if (0 ==pIter->Name.compareToAscii(PROPERTY_PRIVILEGES))
411             pIter->Handle = PROPERTY_ID_PRIVILEGES;
412     }
413 
414     describeProperties(aTableProps);
415 
416     return new ::cppu::OPropertyArrayHelper(aTableProps);
417 }
418 // -----------------------------------------------------------------------------
getInfoHelper()419 ::cppu::IPropertyArrayHelper & SAL_CALL ODBTableDecorator::getInfoHelper()
420 {
421     //RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::getInfoHelper" );
422     Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
423 
424     Reference<XPropertySetInfo> xInfo = xProp->getPropertySetInfo();
425     bool bIsDescriptor = (xInfo->getPropertyByName(PROPERTY_NAME).Attributes & PropertyAttribute::READONLY) == 0;
426 
427     return *ODBTableDecorator_PROP::getArrayHelper( bIsDescriptor ? 0 : 1 );
428 
429     // TODO: this is a HACK, and prone to errors
430     // The OIdPropertyArrayUsageHelper is intended for classes where there exists a known, limited
431     // number of different property set infos (distinguished by the ID), all implemented by this very
432     // same class.
433     // However, in this case here we have an unknown, potentially unlimited number of different
434     // property set infos: Depending on the table for which we act as decorator, different property
435     // sets might exist.
436 }
437 // -------------------------------------------------------------------------
438 // XServiceInfo
439 IMPLEMENT_SERVICE_INFO1(ODBTableDecorator, "com.sun.star.sdb.dbaccess.ODBTableDecorator", SERVICE_SDBCX_TABLE)
440 // -------------------------------------------------------------------------
queryInterface(const Type & rType)441 Any SAL_CALL ODBTableDecorator::queryInterface( const Type & rType ) throw(RuntimeException)
442 {
443     //RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::queryInterface" );
444     Any aRet;
445     if(m_xTable.is())
446     {
447         aRet = m_xTable->queryInterface(rType);
448         if(aRet.hasValue())
449         {   // now we know that our table supports this type so we return ourself
450             aRet = OTableDescriptor_BASE::queryInterface(rType);
451             if(!aRet.hasValue())
452                 aRet = ODataSettings::queryInterface(rType);
453         }
454     }
455 
456     return aRet;
457 }
458 // -------------------------------------------------------------------------
getTypes()459 Sequence< Type > SAL_CALL ODBTableDecorator::getTypes(  ) throw(RuntimeException)
460 {
461     //RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::getTypes" );
462     Reference<XTypeProvider> xTypes(m_xTable,UNO_QUERY);
463     OSL_ENSURE(xTypes.is(),"Table must be a TypePropvider!");
464     return xTypes->getTypes();
465 }
466 
467 // -----------------------------------------------------------------------------
468 // XRename,
469 //------------------------------------------------------------------------------
rename(const::rtl::OUString & _rNewName)470 void SAL_CALL ODBTableDecorator::rename( const ::rtl::OUString& _rNewName ) throw(SQLException, ElementExistException, RuntimeException)
471 {
472     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::rename" );
473     ::osl::MutexGuard aGuard(m_aMutex);
474     ::connectivity::checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
475     Reference<XRename> xRename(m_xTable,UNO_QUERY);
476     if(xRename.is())
477     {
478 //      ::rtl::OUString sOldName;
479 //      Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
480 //      xProp->getPropertyValue(PROPERTY_NAME) >>= sOldName;
481         xRename->rename(_rNewName);
482     }
483     else // not supported
484         throw SQLException(DBACORE_RESSTRING(RID_STR_NO_TABLE_RENAME),*this,SQLSTATE_GENERAL,1000,Any() );
485 }
486 
487 // XAlterTable,
488 //------------------------------------------------------------------------------
alterColumnByName(const::rtl::OUString & _rName,const Reference<XPropertySet> & _rxDescriptor)489 void SAL_CALL ODBTableDecorator::alterColumnByName( const ::rtl::OUString& _rName, const Reference< XPropertySet >& _rxDescriptor ) throw(SQLException, NoSuchElementException, RuntimeException)
490 {
491     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::alterColumnByName" );
492     ::osl::MutexGuard aGuard(m_aMutex);
493     ::connectivity::checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
494     Reference<XAlterTable> xAlter(m_xTable,UNO_QUERY);
495     if(xAlter.is())
496     {
497         xAlter->alterColumnByName(_rName,_rxDescriptor);
498     }
499     else
500         throw SQLException(DBACORE_RESSTRING(RID_STR_COLUMN_ALTER_BY_NAME),*this,SQLSTATE_GENERAL,1000,Any() );
501     if(m_pColumns)
502         m_pColumns->refresh();
503 }
504 
505 //------------------------------------------------------------------------------
alterColumnByIndex(sal_Int32 _nIndex,const Reference<XPropertySet> & _rxDescriptor)506 void SAL_CALL ODBTableDecorator::alterColumnByIndex( sal_Int32 _nIndex, const Reference< XPropertySet >& _rxDescriptor ) throw(SQLException, IndexOutOfBoundsException, RuntimeException)
507 {
508     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::alterColumnByIndex" );
509     ::osl::MutexGuard aGuard(m_aMutex);
510     ::connectivity::checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
511     Reference<XAlterTable> xAlter(m_xTable,UNO_QUERY);
512     if(xAlter.is())
513     {
514         xAlter->alterColumnByIndex(_nIndex,_rxDescriptor);
515         if(m_pColumns)
516             m_pColumns->refresh();
517     }
518     else // not supported
519         throw SQLException(DBACORE_RESSTRING(RID_STR_COLUMN_ALTER_BY_INDEX),*this,SQLSTATE_GENERAL,1000,Any() );
520 }
521 // -----------------------------------------------------------------------------
getIndexes()522 Reference< XNameAccess> ODBTableDecorator::getIndexes() throw (RuntimeException)
523 {
524     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::getIndexes" );
525     ::osl::MutexGuard aGuard(m_aMutex);
526     ::connectivity::checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
527     return Reference< XIndexesSupplier>(m_xTable,UNO_QUERY)->getIndexes();
528 }
529 // -------------------------------------------------------------------------
getKeys()530 Reference< XIndexAccess> ODBTableDecorator::getKeys() throw (RuntimeException)
531 {
532     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::getKeys" );
533     ::osl::MutexGuard aGuard(m_aMutex);
534     ::connectivity::checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
535     return Reference< XKeysSupplier>(m_xTable,UNO_QUERY)->getKeys();
536 }
537 // -------------------------------------------------------------------------
getColumns()538 Reference< XNameAccess> ODBTableDecorator::getColumns() throw (RuntimeException)
539 {
540     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::getColumns" );
541     ::osl::MutexGuard aGuard(m_aMutex);
542     ::connectivity::checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
543 
544     if(!m_pColumns)
545         refreshColumns();
546 
547     return m_pColumns;
548 }
549 // -----------------------------------------------------------------------------
getName()550 ::rtl::OUString SAL_CALL ODBTableDecorator::getName() throw(RuntimeException)
551 {
552     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::getName" );
553     ::osl::MutexGuard aGuard(m_aMutex);
554     ::connectivity::checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
555     Reference<XNamed> xName(m_xTable,UNO_QUERY);
556     OSL_ENSURE(xName.is(),"Table should support the XNamed interface");
557     return xName->getName();
558 }
559 // -----------------------------------------------------------------------------
getSomething(const Sequence<sal_Int8> & rId)560 sal_Int64 SAL_CALL ODBTableDecorator::getSomething( const Sequence< sal_Int8 >& rId ) throw(RuntimeException)
561 {
562     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::getSomething" );
563     if (rId.getLength() == 16 && 0 == rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(),  rId.getConstArray(), 16 ) )
564         return reinterpret_cast<sal_Int64>(this);
565 
566     sal_Int64 nRet = 0;
567     Reference<XUnoTunnel> xTunnel(m_xTable,UNO_QUERY);
568     if(xTunnel.is())
569         nRet = xTunnel->getSomething(rId);
570     return nRet;
571 }
572 // -----------------------------------------------------------------------------
getUnoTunnelImplementationId()573 Sequence< sal_Int8 > ODBTableDecorator::getUnoTunnelImplementationId()
574 {
575     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::getUnoTunnelImplementationId" );
576     static ::cppu::OImplementationId * pId = 0;
577     if (! pId)
578     {
579         ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
580         if (! pId)
581         {
582             static ::cppu::OImplementationId aId;
583             pId = &aId;
584         }
585     }
586     return pId->getImplementationId();
587 }
588 // -----------------------------------------------------------------------------
fillPrivileges() const589 void ODBTableDecorator::fillPrivileges() const
590 {
591     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::fillPrivileges" );
592     // somebody is asking for the privileges an we do not know them, yet
593     m_nPrivileges = 0;
594     try
595     {
596         Reference<XPropertySet> xProp(m_xTable,UNO_QUERY);
597         if ( xProp.is() )
598         {
599             if ( xProp->getPropertySetInfo()->hasPropertyByName(PROPERTY_PRIVILEGES) )
600             {
601                 xProp->getPropertyValue(PROPERTY_PRIVILEGES) >>= m_nPrivileges;
602             }
603             if ( m_nPrivileges == 0 ) // second chance
604             {
605                 ::rtl::OUString sCatalog,sSchema,sName;
606                 xProp->getPropertyValue(PROPERTY_CATALOGNAME)   >>= sCatalog;
607                 xProp->getPropertyValue(PROPERTY_SCHEMANAME)    >>= sSchema;
608                 xProp->getPropertyValue(PROPERTY_NAME)          >>= sName;
609                 m_nPrivileges = ::dbtools::getTablePrivileges(getMetaData(),sCatalog,sSchema, sName);
610             }
611         }
612     }
613     catch(const SQLException& e)
614     {
615         (void)e;
616         DBG_ERROR("ODBTableDecorator::ODBTableDecorator : could not collect the privileges !");
617     }
618 }
619 // -----------------------------------------------------------------------------
createDataDescriptor()620 Reference< XPropertySet > SAL_CALL ODBTableDecorator::createDataDescriptor(  ) throw (RuntimeException)
621 {
622     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::createDataDescriptor" );
623     ::osl::MutexGuard aGuard(m_aMutex);
624     ::connectivity::checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
625 
626     Reference< XDataDescriptorFactory > xFactory( m_xTable, UNO_QUERY );
627     DBG_ASSERT( xFactory.is(), "ODBTableDecorator::createDataDescriptor: invalid table!" );
628     Reference< XColumnsSupplier > xColsSupp;
629     if ( xFactory.is() )
630         xColsSupp = xColsSupp.query( xFactory->createDataDescriptor() );
631 
632     return new ODBTableDecorator(
633         m_xConnection,
634         xColsSupp,
635         m_xNumberFormats,
636         NULL
637     );
638 }
639 // -----------------------------------------------------------------------------
getPropertySetInfo()640 Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL ODBTableDecorator::getPropertySetInfo(  ) throw(RuntimeException)
641 {
642     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::getPropertySetInfo" );
643     return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
644 }
645 // -----------------------------------------------------------------------------
refreshColumns()646 void ODBTableDecorator::refreshColumns()
647 {
648     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::refreshColumns" );
649     ::osl::MutexGuard aGuard(m_aMutex);
650     ::connectivity::checkDisposed(OTableDescriptor_BASE::rBHelper.bDisposed);
651 
652     ::std::vector< ::rtl::OUString> aVector;
653 
654     Reference<XNameAccess> xNames;
655     if(m_xTable.is())
656     {
657         xNames = m_xTable->getColumns();
658         if(xNames.is())
659         {
660             Sequence< ::rtl::OUString> aNames = xNames->getElementNames();
661             const ::rtl::OUString* pIter    = aNames.getConstArray();
662             const ::rtl::OUString* pEnd     = pIter + aNames.getLength();
663             for(;pIter != pEnd;++pIter)
664                 aVector.push_back(*pIter);
665         }
666     }
667     if(!m_pColumns)
668     {
669         OColumns* pCol = new OColumns(*this,m_aMutex,xNames,m_xMetaData.is() && m_xMetaData->supportsMixedCaseQuotedIdentifiers(),aVector,
670                                     this,this,
671                                     m_xMetaData.is() && m_xMetaData->supportsAlterTableWithAddColumn(),
672                                     m_xMetaData.is() && m_xMetaData->supportsAlterTableWithDropColumn());
673 
674         pCol->setParent(*this);
675         OContainerMediator* pMediator = new OContainerMediator( pCol, m_xColumnDefinitions, m_xConnection, OContainerMediator::eColumns );
676         m_xColumnMediator = pMediator;
677         pCol->setMediator( pMediator );
678         m_pColumns  = pCol;
679     }
680     else
681         m_pColumns->reFill(aVector);
682 }
683 // -----------------------------------------------------------------------------
createColumn(const::rtl::OUString & _rName) const684 OColumn* ODBTableDecorator::createColumn(const ::rtl::OUString& _rName) const
685 {
686     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::createColumn" );
687     OColumn* pReturn = NULL;
688 
689     Reference<XNameAccess> xNames;
690     if ( m_xTable.is() )
691     {
692         xNames = m_xTable->getColumns();
693 
694         if ( xNames.is() && xNames->hasByName(_rName) )
695         {
696             Reference<XPropertySet> xProp(xNames->getByName(_rName),UNO_QUERY);
697 
698             Reference<XPropertySet> xColumnDefintion;
699             if ( m_xColumnDefinitions.is() && m_xColumnDefinitions->hasByName(_rName))
700                 xColumnDefintion.set(m_xColumnDefinitions->getByName(_rName),UNO_QUERY);
701 
702             pReturn = new OTableColumnWrapper( xProp, xColumnDefintion, false );
703         }
704     }
705     return pReturn;
706 }
707 // -----------------------------------------------------------------------------
columnAppended(const Reference<XPropertySet> &)708 void ODBTableDecorator::columnAppended( const Reference< XPropertySet >& /*_rxSourceDescriptor*/ )
709 {
710     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::columnAppended" );
711     // not interested in
712 }
713 // -----------------------------------------------------------------------------
columnDropped(const::rtl::OUString & _sName)714 void ODBTableDecorator::columnDropped(const ::rtl::OUString& _sName)
715 {
716     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::columnDropped" );
717     Reference<XDrop> xDrop(m_xColumnDefinitions,UNO_QUERY);
718     if ( xDrop.is() && m_xColumnDefinitions->hasByName(_sName) )
719         xDrop->dropByName(_sName);
720 }
721 
722 // -----------------------------------------------------------------------------
createColumnDescriptor()723 Reference< XPropertySet > ODBTableDecorator::createColumnDescriptor()
724 {
725     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::createColumnDescriptor" );
726     Reference<XDataDescriptorFactory> xNames;
727     if(m_xTable.is())
728         xNames.set(m_xTable->getColumns(),UNO_QUERY);
729     Reference< XPropertySet > xRet;
730     if ( xNames.is() )
731         xRet = new OTableColumnDescriptorWrapper( xNames->createDataDescriptor(), false, true );
732     return xRet;
733 }
734 // -----------------------------------------------------------------------------
acquire()735 void SAL_CALL ODBTableDecorator::acquire() throw()
736 {
737     OTableDescriptor_BASE::acquire();
738 }
739 // -----------------------------------------------------------------------------
release()740 void SAL_CALL ODBTableDecorator::release() throw()
741 {
742     OTableDescriptor_BASE::release();
743 }
744 
745 // -----------------------------------------------------------------------------
setName(const::rtl::OUString &)746 void SAL_CALL ODBTableDecorator::setName( const ::rtl::OUString& /*aName*/ ) throw (::com::sun::star::uno::RuntimeException)
747 {
748     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTableDecorator::setName" );
749     throwFunctionNotSupportedException( "XNamed::setName", *this );
750 }
751 
752 // -----------------------------------------------------------------------------
753 
754 
755