LibreOffice Module connectivity (master) 1
VCollection.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20
21#include <algorithm>
22#include <com/sun/star/container/ElementExistException.hpp>
23#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
26#include <com/sun/star/sdbc/SQLException.hpp>
29#include <comphelper/types.hxx>
33#include <o3tl/unreachable.hxx>
34#include <TConnection.hxx>
35#include <strings.hrc>
37
38using namespace connectivity::sdbcx;
39using namespace connectivity;
40using namespace comphelper;
41using namespace ::cppu;
42using namespace ::com::sun::star::beans;
43using namespace ::com::sun::star::uno;
44using namespace ::com::sun::star::lang;
45using namespace ::com::sun::star::sdbc;
46using namespace ::com::sun::star::container;
47using namespace ::com::sun::star::util;
48
49namespace
50{
51 template < typename T> class OHardRefMap : public connectivity::sdbcx::IObjectCollection
52 {
53 typedef std::multimap< OUString, T , ::comphelper::UStringMixLess> ObjectMap;
54 typedef typename ObjectMap::iterator ObjectIter;
55 typedef typename ObjectMap::value_type ObjectEntry;
56
57 // private:
58 // this combination of map and vector is used to have a fast name and index access
59 std::vector< ObjectIter > m_aElements; // hold the iterators which point to map
60 ObjectMap m_aNameMap; // hold the elements and a name
61 public:
62 OHardRefMap(bool _bCase)
63 : m_aNameMap(_bCase)
64 {
65 }
66
67 virtual bool exists(const OUString& _sName ) override
68 {
69 return m_aNameMap.find(_sName) != m_aNameMap.end();
70 }
71
72 virtual bool empty() override
73 {
74 return m_aNameMap.empty();
75 }
76
77 virtual void swapAll() override
78 {
79 std::vector< ObjectIter >(m_aElements).swap(m_aElements);
80 ObjectMap(m_aNameMap).swap(m_aNameMap);
81 }
82
83 virtual void swap() override
84 {
85 std::vector< ObjectIter >().swap(m_aElements);
86
87 OSL_ENSURE( m_aNameMap.empty(), "swap: what did disposeElements do?" );
88 ObjectMap( m_aNameMap ).swap( m_aNameMap );
89 // Note that it's /important/ to construct the new ObjectMap from m_aNameMap before
90 // swapping. This way, it's ensured that the compare object held by these maps is preserved
91 // during the swap. If we would not do this, the UStringMixLess instance which is used would be
92 // default constructed (instead of being constructed from the same instance in m_aNameMap), and
93 // it's case-sensitive flag would have an unpredictable value.
94 }
95
96 virtual void clear() override
97 {
98 m_aElements.clear();
99 m_aNameMap.clear();
100 }
101
102 virtual void insert(const OUString& _sName,const ObjectType& _xObject) override
103 {
104 m_aElements.push_back(m_aNameMap.insert(m_aNameMap.begin(), ObjectEntry(_sName,_xObject)));
105 }
106
107 virtual void reFill(const ::std::vector< OUString> &_rVector) override
108 {
109 OSL_ENSURE(m_aNameMap.empty(),"OCollection::reFill: collection isn't empty");
110 m_aElements.reserve(_rVector.size());
111
112 for (auto const& elem : _rVector)
113 m_aElements.push_back(m_aNameMap.insert(m_aNameMap.begin(), ObjectEntry(elem,ObjectType())));
114 }
115
116 virtual bool rename(const OUString& _sOldName, const OUString& _sNewName) override
117 {
118 bool bRet = false;
119 ObjectIter aIter = m_aNameMap.find(_sOldName);
120 if ( aIter != m_aNameMap.end() )
121 {
122 typename std::vector< ObjectIter >::iterator aFind = std::find(m_aElements.begin(),m_aElements.end(),aIter);
123 if(m_aElements.end() != aFind)
124 {
125 (*aFind) = m_aNameMap.insert(m_aNameMap.begin(), ObjectEntry(_sNewName,(*aFind)->second));
126 m_aNameMap.erase(aIter);
127
128 bRet = true;
129 }
130 }
131 return bRet;
132 }
133
134 virtual sal_Int32 size() override
135 {
136 return static_cast<sal_Int32>(m_aNameMap.size());
137 }
138
139 virtual Sequence< OUString > getElementNames() override
140 {
141 Sequence< OUString > aNameList(m_aElements.size());
142
143 OUString* pStringArray = aNameList.getArray();
144 for(const auto& rIter : m_aElements)
145 {
146 *pStringArray = rIter->first;
147 ++pStringArray;
148 }
149
150 return aNameList;
151 }
152
153 virtual OUString getName(sal_Int32 _nIndex) override
154 {
155 return m_aElements[_nIndex]->first;
156 }
157
158 virtual void disposeAndErase(sal_Int32 _nIndex) override
159 {
160 OSL_ENSURE(_nIndex >= 0 && _nIndex < static_cast<sal_Int32>(m_aElements.size()),"Illegal argument!");
161 Reference<XComponent> xComp(m_aElements[_nIndex]->second.get(),UNO_QUERY);
162 ::comphelper::disposeComponent(xComp);
163 m_aElements[_nIndex]->second = T();
164
165 OUString sName = m_aElements[_nIndex]->first;
166 m_aElements.erase(m_aElements.begin()+_nIndex);
167 m_aNameMap.erase(sName);
168 }
169
170 virtual void disposeElements() override
171 {
172 for (auto & name : m_aNameMap)
173 {
174 Reference<XComponent> xComp(name.second.get(),UNO_QUERY);
175 if ( xComp.is() )
176 {
177 ::comphelper::disposeComponent(xComp);
178 name.second = T();
179 }
180 }
181 m_aElements.clear();
182 m_aNameMap.clear();
183 }
184
185 virtual sal_Int32 findColumn( const OUString& columnName ) override
186 {
187 ObjectIter aIter = m_aNameMap.find(columnName);
188 OSL_ENSURE(aIter != m_aNameMap.end(),"findColumn:: Illegal name!");
189 return m_aElements.size() - (m_aElements.end() - std::find(m_aElements.begin(),m_aElements.end(),aIter));
190 }
191
192 virtual ObjectType getObject(sal_Int32 _nIndex) override
193 {
194 OSL_ENSURE(_nIndex >= 0 && _nIndex < static_cast<sal_Int32>(m_aElements.size()),"Illegal argument!");
195 return m_aElements[_nIndex]->second;
196 }
197
198 virtual ObjectType getObject(const OUString& columnName) override
199 {
200 return m_aNameMap.find(columnName)->second;
201 }
202
203 virtual void setObject(sal_Int32 _nIndex,const ObjectType& _xObject) override
204 {
205 OSL_ENSURE(_nIndex >= 0 && _nIndex < static_cast<sal_Int32>(m_aElements.size()),"Illegal argument!");
206 m_aElements[_nIndex]->second = _xObject;
207 }
208
209 bool isCaseSensitive() const override
210 {
211 return m_aNameMap.key_comp().isCaseSensitive();
212 }
213
214 };
215}
216
217IObjectCollection::~IObjectCollection() {}
218
219IMPLEMENT_SERVICE_INFO(OCollection,"com.sun.star.sdbcx.VContainer" , "com.sun.star.sdbcx.Container")
220
221OCollection::OCollection(::cppu::OWeakObject& _rParent
222 , bool _bCase
223 , ::osl::Mutex& _rMutex
224 , const ::std::vector< OUString> &_rVector
225 , bool _bUseIndexOnly
226 , bool _bUseHardRef)
227 :m_aContainerListeners(_rMutex)
228 ,m_aRefreshListeners(_rMutex)
229 ,m_rParent(_rParent)
230 ,m_rMutex(_rMutex)
231 ,m_bUseIndexOnly(_bUseIndexOnly)
232{
233 if ( _bUseHardRef )
234 {
235 m_pElements.reset(new OHardRefMap< ObjectType >(_bCase));
236 }
237 else
238 {
239 m_pElements.reset(new OHardRefMap< WeakReference< XPropertySet> >(_bCase));
240 }
241 m_pElements->reFill(_rVector);
242}
243
245{
246}
247
248Any SAL_CALL OCollection::queryInterface( const Type & rType )
249{
251 {
252 return Any();
253 }
254 return OCollectionBase::queryInterface( rType );
255}
256
257Sequence< Type > SAL_CALL OCollection::getTypes()
258{
259 if ( m_bUseIndexOnly )
260 {
261 Sequence< Type > aTypes(OCollectionBase::getTypes());
262 Type* pBegin = aTypes.getArray();
263 Type* pEnd = pBegin + aTypes.getLength();
264
265 std::vector<Type> aOwnTypes;
266 aOwnTypes.reserve(aTypes.getLength());
268 for(;pBegin != pEnd; ++pBegin)
269 {
270 if ( *pBegin != aType )
271 aOwnTypes.push_back(*pBegin);
272 }
273 return Sequence< Type >(aOwnTypes.data(), aOwnTypes.size());
274 }
276}
277
279{
280 ::osl::MutexGuard aGuard(m_rMutex);
281
282 m_pElements->clear();
283 m_pElements->swapAll();
284}
285
286
288{
289 m_aContainerListeners.disposeAndClear(EventObject(static_cast<XTypeProvider*>(this)));
290 m_aRefreshListeners.disposeAndClear(EventObject(static_cast<XTypeProvider*>(this)));
291
292 ::osl::MutexGuard aGuard(m_rMutex);
293
295
296 m_pElements->swap();
297}
298
299Any SAL_CALL OCollection::getByIndex( sal_Int32 Index )
300{
301 ::osl::MutexGuard aGuard(m_rMutex);
302 if (Index < 0 || Index >= m_pElements->size() )
303 throw IndexOutOfBoundsException(OUString::number(Index),static_cast<XTypeProvider*>(this));
304
305 return Any(getObject(Index));
306}
307
308Any SAL_CALL OCollection::getByName( const OUString& aName )
309{
310 ::osl::MutexGuard aGuard(m_rMutex);
311
312 if ( !m_pElements->exists(aName) )
313 {
315 const OUString sError( aResources.getResourceStringWithSubstitution(
316 STR_NO_ELEMENT_NAME,
317 "$name$", aName
318 ) );
319 throw NoSuchElementException( sError, static_cast< XTypeProvider* >( this ) );
320 }
321
322 return Any(getObject(m_pElements->findColumn(aName)));
323}
324
325Sequence< OUString > SAL_CALL OCollection::getElementNames( )
326{
327 ::osl::MutexGuard aGuard(m_rMutex);
328 return m_pElements->getElementNames();
329}
330
331void SAL_CALL OCollection::refresh( )
332{
333 ::osl::MutexGuard aGuard(m_rMutex);
334
336
337 impl_refresh();
338 EventObject aEvt(static_cast<XTypeProvider*>(this));
339 m_aRefreshListeners.notifyEach( &XRefreshListener::refreshed, aEvt );
340}
341
342void OCollection::reFill(const ::std::vector< OUString> &_rVector)
343{
344 m_pElements->reFill(_rVector);
345}
346
347// XDataDescriptorFactory
348Reference< XPropertySet > SAL_CALL OCollection::createDataDescriptor( )
349{
350 ::osl::MutexGuard aGuard(m_rMutex);
351
352 return createDescriptor();
353}
354
356{
357 OSL_ENSURE(_xObject.is(),"OCollection::getNameForObject: Object is NULL!");
358 OUString sName;
359 _xObject->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= sName;
360 return sName;
361}
362
363// XAppend
364void SAL_CALL OCollection::appendByDescriptor( const Reference< XPropertySet >& descriptor )
365{
366 ::osl::ClearableMutexGuard aGuard(m_rMutex);
367
368 OUString sName = getNameForObject( descriptor );
369
370 if ( m_pElements->exists(sName) )
371 throw ElementExistException(sName,static_cast<XTypeProvider*>(this));
372
373 ObjectType xNewlyCreated = appendObject( sName, descriptor );
374 if ( !xNewlyCreated.is() )
375 throw RuntimeException();
376
377 ODescriptor* pDescriptor = dynamic_cast<ODescriptor*>( xNewlyCreated.get() );
378 if ( pDescriptor )
379 pDescriptor->setNew( false );
380
381 sName = getNameForObject( xNewlyCreated );
382 if ( !m_pElements->exists( sName ) ) // this may happen when the derived class included it itself
383 m_pElements->insert( sName, xNewlyCreated );
384
385 // notify our container listeners
386 ContainerEvent aEvent(static_cast<XContainer*>(this), Any(sName), Any(xNewlyCreated), Any());
387 aGuard.clear();
388 m_aContainerListeners.notifyEach( &XContainerListener::elementInserted, aEvent );
389}
390
391// XDrop
392void SAL_CALL OCollection::dropByName( const OUString& elementName )
393{
394 ::osl::MutexGuard aGuard(m_rMutex);
395
396 if ( !m_pElements->exists(elementName) )
397 throw NoSuchElementException(elementName,static_cast<XTypeProvider*>(this));
398
399 dropImpl(m_pElements->findColumn(elementName));
400}
401
402void SAL_CALL OCollection::dropByIndex( sal_Int32 index )
403{
404 ::osl::MutexGuard aGuard(m_rMutex);
405 if(index <0 || index >= getCount())
406 throw IndexOutOfBoundsException(OUString::number(index),static_cast<XTypeProvider*>(this));
407
409}
410
411void OCollection::dropImpl(sal_Int32 _nIndex, bool _bReallyDrop)
412{
413 OUString elementName = m_pElements->getName(_nIndex);
414
415 if ( _bReallyDrop )
416 dropObject(_nIndex,elementName);
417
418 m_pElements->disposeAndErase(_nIndex);
419
420 // notify our container listeners
421 notifyElementRemoved(elementName);
422}
423
424void OCollection::notifyElementRemoved(const OUString& _sName)
425{
426 ContainerEvent aEvent(static_cast<XContainer*>(this), Any(_sName), Any(), Any());
427 // note that xExistent may be empty, in case somebody removed the data source while it is not alive at this moment
429 while (aListenerLoop.hasMoreElements())
430 aListenerLoop.next()->elementRemoved(aEvent);
431}
432
433sal_Int32 SAL_CALL OCollection::findColumn( const OUString& columnName )
434{
435 if ( !m_pElements->exists(columnName) )
436 {
437 ::dbtools::throwInvalidColumnException( columnName, static_cast< XIndexAccess*>(this) );
439 }
440
441 return m_pElements->findColumn(columnName) + 1; // because columns start at one
442}
443
444Reference< XEnumeration > SAL_CALL OCollection::createEnumeration( )
445{
446 ::osl::MutexGuard aGuard(m_rMutex);
447 return new OEnumerationByIndex( static_cast< XIndexAccess*>(this));
448}
449
450void SAL_CALL OCollection::addContainerListener( const Reference< XContainerListener >& _rxListener )
451{
453}
454
455
456void SAL_CALL OCollection::removeContainerListener( const Reference< XContainerListener >& _rxListener )
457{
459}
460
461void SAL_CALL OCollection::acquire() noexcept
462{
464}
465
466void SAL_CALL OCollection::release() noexcept
467{
469}
470
472{
474}
475
477{
478 ::osl::MutexGuard aGuard(m_rMutex);
479 return !m_pElements->empty();
480}
481
482sal_Int32 SAL_CALL OCollection::getCount( )
483{
484 ::osl::MutexGuard aGuard(m_rMutex);
485 return m_pElements->size();
486}
487
488sal_Bool SAL_CALL OCollection::hasByName( const OUString& aName )
489{
490 ::osl::MutexGuard aGuard(m_rMutex);
491 return m_pElements->exists(aName);
492}
493
494void SAL_CALL OCollection::addRefreshListener( const Reference< XRefreshListener >& l )
495{
497}
498
499void SAL_CALL OCollection::removeRefreshListener( const Reference< XRefreshListener >& l )
500{
502}
503
504void OCollection::insertElement(const OUString& _sElementName,const ObjectType& _xElement)
505{
506 OSL_ENSURE(!m_pElements->exists(_sElementName),"Element already exists");
507 if ( !m_pElements->exists(_sElementName) )
508 m_pElements->insert(_sElementName,_xElement);
509}
510
511void OCollection::renameObject(const OUString& _sOldName, const OUString& _sNewName)
512{
513 OSL_ENSURE(m_pElements->exists(_sOldName),"Element doesn't exist");
514 OSL_ENSURE(!m_pElements->exists(_sNewName),"Element already exists");
515 OSL_ENSURE(!_sNewName.isEmpty(),"New name must not be empty!");
516 OSL_ENSURE(!_sOldName.isEmpty(),"Old name must not be empty!");
517
518 if ( m_pElements->rename(_sOldName,_sNewName) )
519 {
520 ContainerEvent aEvent(static_cast<XContainer*>(this), Any(_sNewName), Any(m_pElements->getObject(_sNewName)),Any(_sOldName));
521 // note that xExistent may be empty, in case somebody removed the data source while it is not alive at this moment
523 while (aListenerLoop.hasMoreElements())
524 aListenerLoop.next()->elementReplaced(aEvent);
525 }
526}
527
529{
530 ObjectType xName = m_pElements->getObject(_nIndex);
531 if ( !xName.is() )
532 {
533 try
534 {
535 xName = createObject(m_pElements->getName(_nIndex));
536 }
537 catch(const SQLException& e)
538 {
539 css::uno::Any anyEx = cppu::getCaughtException();
540 try
541 {
542 dropImpl(_nIndex,false);
543 }
544 catch(const Exception& )
545 {
546 }
547 throw WrappedTargetException(e.Message,static_cast<XTypeProvider*>(this),anyEx);
548 }
549 m_pElements->setObject(_nIndex,xName);
550 }
551 return xName;
552}
553
555{
556 m_pElements->disposeElements();
557}
558
559Reference< XPropertySet > OCollection::createDescriptor()
560{
561 OSL_FAIL("createDescriptor() needs to be overridden when used!");
562 throw SQLException();
563}
564
566{
567 ObjectType xNewDescriptor( createDescriptor() );
568 ::comphelper::copyProperties( _descriptor, xNewDescriptor );
569 return xNewDescriptor;
570}
571
572ObjectType OCollection::appendObject( const OUString& /*_rForName*/, const Reference< XPropertySet >& descriptor )
573{
574 return cloneDescriptor( descriptor );
575}
576
577void OCollection::dropObject(sal_Int32 /*_nPos*/, const OUString& /*_sElementName*/)
578{
579}
580
581
582/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
struct _ADOIndex Index
Definition: Awrapadox.hxx:45
#define IMPLEMENT_SERVICE_INFO(classname, implasciiname, serviceasciiname)
TStyleElements m_aElements
AnyEventRef aEvent
sal_Int32 addInterface(const css::uno::Reference< ListenerT > &rxIFace)
void disposeAndClear(const css::lang::EventObject &rEvt)
sal_Int32 removeInterface(const css::uno::Reference< ListenerT > &rxIFace)
void notifyEach(void(SAL_CALL ListenerT::*NotificationMethod)(const EventT &), const EventT &Event)
css::uno::Reference< ListenerT > const & next()
::dbtools::OPropertyMap & getPropMap()
Definition: TConnection.cxx:68
helper class for accessing resources shared by different libraries in the connectivity module
OUString getResourceStringWithSubstitution(TranslateId pResId, const char *_pAsciiPatternToReplace, const OUString &_rStringToSubstitute) const
loads a string from the shared resource file, and replaces a given ASCII pattern with a given string
virtual bool rename(const OUString &_sOldName, const OUString &_sNewName)=0
virtual void setObject(sal_Int32 _nIndex, const ObjectType &_xObject)=0
virtual ObjectType getObject(sal_Int32 _nIndex)=0
virtual OUString getName(sal_Int32 _nIndex)=0
virtual bool isCaseSensitive() const =0
virtual bool exists(const OUString &_sName)=0
virtual void insert(const OUString &_sName, const ObjectType &_xObject)=0
virtual void disposeAndErase(sal_Int32 _nIndex)=0
virtual sal_Int32 findColumn(const OUString &columnName)=0
virtual css::uno::Sequence< OUString > getElementNames()=0
virtual void reFill(const ::std::vector< OUString > &_rVector)=0
virtual void SAL_CALL acquire() noexcept override
virtual css::uno::Sequence< OUString > SAL_CALL getElementNames() override
virtual css::uno::Reference< css::beans::XPropertySet > createDescriptor()
void insertElement(const OUString &_sElementName, const ObjectType &_xElement)
insert a new element into the collection
virtual void SAL_CALL dropByName(const OUString &elementName) override
virtual void SAL_CALL refresh() override
virtual ObjectType createObject(const OUString &_rName)=0
virtual void dropObject(sal_Int32 _nPos, const OUString &_sElementName)
virtual OUString getNameForObject(const ObjectType &_xObject)
returns the name for the object.
virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override
virtual css::uno::Any SAL_CALL getByIndex(sal_Int32 Index) override
void notifyElementRemoved(const OUString &_sName)
virtual void SAL_CALL release() noexcept override
void dropImpl(sal_Int32 _nIndex, bool _bReallyDrop=true)
ObjectType getObject(sal_Int32 _nIndex)
return the object, if not existent it creates it.
void clear_NoDispose()
clear the name map
virtual css::uno::Type SAL_CALL getElementType() override
virtual void SAL_CALL dropByIndex(sal_Int32 index) override
virtual void SAL_CALL removeContainerListener(const css::uno::Reference< css::container::XContainerListener > &xListener) override
virtual sal_Int32 SAL_CALL findColumn(const OUString &columnName) override
void reFill(const ::std::vector< OUString > &_rVector)
virtual void SAL_CALL addRefreshListener(const css::uno::Reference< css::util::XRefreshListener > &l) override
virtual ObjectType appendObject(const OUString &_rForName, const css::uno::Reference< css::beans::XPropertySet > &descriptor)
appends an object described by a descriptor, under a given name
::cppu::OWeakObject & m_rParent
Definition: VCollection.hxx:97
virtual sal_Int32 SAL_CALL getCount() override
::std::unique_ptr< IObjectCollection > m_pElements
Definition: VCollection.hxx:91
virtual css::uno::Any SAL_CALL queryInterface(const css::uno::Type &rType) override
virtual void SAL_CALL addContainerListener(const css::uno::Reference< css::container::XContainerListener > &xListener) override
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() override
virtual css::uno::Any SAL_CALL getByName(const OUString &aName) override
void renameObject(const OUString &_sOldName, const OUString &_sNewName)
virtual void SAL_CALL removeRefreshListener(const css::uno::Reference< css::util::XRefreshListener > &l) override
virtual sal_Bool SAL_CALL hasByName(const OUString &aName) override
virtual css::uno::Reference< css::beans::XPropertySet > SAL_CALL createDataDescriptor() override
ObjectType cloneDescriptor(const ObjectType &_descriptor)
clones the given descriptor
::comphelper::OInterfaceContainerHelper3< css::util::XRefreshListener > m_aRefreshListeners
Definition: VCollection.hxx:94
virtual sal_Bool SAL_CALL hasElements() override
::comphelper::OInterfaceContainerHelper3< css::container::XContainerListener > m_aContainerListeners
Definition: VCollection.hxx:93
virtual void SAL_CALL appendByDescriptor(const css::uno::Reference< css::beans::XPropertySet > &descriptor) override
virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() SAL_OVERRIDE
virtual css::uno::Any SAL_CALL queryInterface(css::uno::Type const &rType) SAL_OVERRIDE
virtual void SAL_CALL acquire() SAL_NOEXCEPT SAL_OVERRIDE
virtual void SAL_CALL release() SAL_NOEXCEPT SAL_OVERRIDE
css::uno::Type const & get()
OUString sName
OUString aName
@ Exception
Type
css::uno::Reference< css::beans::XPropertySet > ObjectType
Definition: VCollection.hxx:59
Any SAL_CALL getCaughtException()
void throwInvalidColumnException(const OUString &_rColumnName, const Reference< XInterface > &_rxContext)
index
ObjectType
const char * columnName
Definition: pq_statics.cxx:56
OUString name
Definition: pq_statics.cxx:74
#define PROPERTY_ID_NAME
Definition: propertyids.hxx:50
unsigned char sal_Bool
#define O3TL_UNREACHABLE
const SvXMLTokenMapEntry aTypes[]