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