xref: /aoo41x/main/dbaccess/source/core/api/column.cxx (revision 96de5490)
1*96de5490SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*96de5490SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*96de5490SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*96de5490SAndrew Rist  * distributed with this work for additional information
6*96de5490SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*96de5490SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*96de5490SAndrew Rist  * "License"); you may not use this file except in compliance
9*96de5490SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*96de5490SAndrew Rist  *
11*96de5490SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*96de5490SAndrew Rist  *
13*96de5490SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*96de5490SAndrew Rist  * software distributed under the License is distributed on an
15*96de5490SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*96de5490SAndrew Rist  * KIND, either express or implied.  See the License for the
17*96de5490SAndrew Rist  * specific language governing permissions and limitations
18*96de5490SAndrew Rist  * under the License.
19*96de5490SAndrew Rist  *
20*96de5490SAndrew Rist  *************************************************************/
21*96de5490SAndrew Rist 
22*96de5490SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_dbaccess.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "ContainerMediator.hxx"
28cdf0e10cSrcweir #include "apitools.hxx"
29cdf0e10cSrcweir #include "column.hxx"
30cdf0e10cSrcweir #include "core_resource.hrc"
31cdf0e10cSrcweir #include "core_resource.hxx"
32cdf0e10cSrcweir #include "dbastrings.hrc"
33cdf0e10cSrcweir #include "sdbcoretools.hxx"
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp>
36cdf0e10cSrcweir #include <com/sun/star/sdbc/ColumnValue.hpp>
37cdf0e10cSrcweir #include <com/sun/star/sdbc/DataType.hpp>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir #include <comphelper/basicio.hxx>
40cdf0e10cSrcweir #include <comphelper/enumhelper.hxx>
41cdf0e10cSrcweir #include <comphelper/extract.hxx>
42cdf0e10cSrcweir #include <comphelper/property.hxx>
43cdf0e10cSrcweir #include <comphelper/seqstream.hxx>
44cdf0e10cSrcweir #include <comphelper/sequence.hxx>
45cdf0e10cSrcweir #include <comphelper/types.hxx>
46cdf0e10cSrcweir #include <connectivity/TTableHelper.hxx>
47cdf0e10cSrcweir #include <connectivity/dbexception.hxx>
48cdf0e10cSrcweir #include <connectivity/dbtools.hxx>
49cdf0e10cSrcweir #include <cppuhelper/typeprovider.hxx>
50cdf0e10cSrcweir #include <osl/diagnose.h>
51cdf0e10cSrcweir #include <tools/debug.hxx>
52cdf0e10cSrcweir 
53cdf0e10cSrcweir #include <algorithm>
54cdf0e10cSrcweir 
55cdf0e10cSrcweir using namespace dbaccess;
56cdf0e10cSrcweir using namespace connectivity;
57cdf0e10cSrcweir using namespace connectivity;
58cdf0e10cSrcweir using namespace ::com::sun::star::sdbc;
59cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx;
60cdf0e10cSrcweir using namespace ::com::sun::star::beans;
61cdf0e10cSrcweir using namespace ::com::sun::star::uno;
62cdf0e10cSrcweir using namespace ::com::sun::star::lang;
63cdf0e10cSrcweir using namespace ::com::sun::star::awt;
64cdf0e10cSrcweir using namespace ::com::sun::star::io;
65cdf0e10cSrcweir using namespace ::com::sun::star::container;
66cdf0e10cSrcweir using namespace ::com::sun::star::util;
67cdf0e10cSrcweir using namespace ::osl;
68cdf0e10cSrcweir using namespace ::comphelper;
69cdf0e10cSrcweir using namespace ::cppu;
70cdf0e10cSrcweir 
DBG_NAME(OColumn)71cdf0e10cSrcweir DBG_NAME(OColumn)
72cdf0e10cSrcweir 
73cdf0e10cSrcweir //============================================================
74cdf0e10cSrcweir //= OColumn
75cdf0e10cSrcweir //============================================================
76cdf0e10cSrcweir //--------------------------------------------------------------------------
77cdf0e10cSrcweir OColumn::OColumn( const bool _bNameIsReadOnly )
78cdf0e10cSrcweir 	    :OColumnBase( m_aMutex )
79cdf0e10cSrcweir         ,::comphelper::OPropertyContainer( OColumnBase::rBHelper )
80cdf0e10cSrcweir {
81cdf0e10cSrcweir 	DBG_CTOR(OColumn, NULL);
82cdf0e10cSrcweir 
83cdf0e10cSrcweir     registerProperty( PROPERTY_NAME, PROPERTY_ID_NAME, _bNameIsReadOnly ? PropertyAttribute::READONLY : 0,
84cdf0e10cSrcweir         &m_sName, ::getCppuType( &m_sName ) );
85cdf0e10cSrcweir }
86cdf0e10cSrcweir 
87cdf0e10cSrcweir //--------------------------------------------------------------------------
~OColumn()88cdf0e10cSrcweir OColumn::~OColumn()
89cdf0e10cSrcweir {
90cdf0e10cSrcweir 	DBG_DTOR(OColumn, NULL);
91cdf0e10cSrcweir }
92cdf0e10cSrcweir 
93cdf0e10cSrcweir // com::sun::star::lang::XTypeProvider
94cdf0e10cSrcweir //--------------------------------------------------------------------------
getTypes()95cdf0e10cSrcweir Sequence< Type > OColumn::getTypes() throw (RuntimeException)
96cdf0e10cSrcweir {
97cdf0e10cSrcweir 	return ::comphelper::concatSequences(
98cdf0e10cSrcweir 		OColumnBase::getTypes(),
99cdf0e10cSrcweir 		::comphelper::OPropertyContainer::getTypes()
100cdf0e10cSrcweir 	);
101cdf0e10cSrcweir }
102cdf0e10cSrcweir 
103cdf0e10cSrcweir // com::sun::star::uno::XInterface
IMPLEMENT_FORWARD_XINTERFACE2(OColumn,OColumnBase,::comphelper::OPropertyContainer)104cdf0e10cSrcweir IMPLEMENT_FORWARD_XINTERFACE2( OColumn, OColumnBase, ::comphelper::OPropertyContainer )
105cdf0e10cSrcweir 
106cdf0e10cSrcweir // ::com::sun::star::lang::XServiceInfo
107cdf0e10cSrcweir //------------------------------------------------------------------------------
108cdf0e10cSrcweir rtl::OUString OColumn::getImplementationName(  ) throw(RuntimeException)
109cdf0e10cSrcweir {
110cdf0e10cSrcweir 	return rtl::OUString::createFromAscii("com.sun.star.sdb.OColumn");
111cdf0e10cSrcweir }
112cdf0e10cSrcweir 
113cdf0e10cSrcweir //------------------------------------------------------------------------------
supportsService(const::rtl::OUString & _rServiceName)114cdf0e10cSrcweir sal_Bool OColumn::supportsService( const ::rtl::OUString& _rServiceName ) throw (RuntimeException)
115cdf0e10cSrcweir {
116cdf0e10cSrcweir 	return ::comphelper::findValue(getSupportedServiceNames(), _rServiceName, sal_True).getLength() != 0;
117cdf0e10cSrcweir }
118cdf0e10cSrcweir 
119cdf0e10cSrcweir //------------------------------------------------------------------------------
getSupportedServiceNames()120cdf0e10cSrcweir Sequence< ::rtl::OUString > OColumn::getSupportedServiceNames(  ) throw (RuntimeException)
121cdf0e10cSrcweir {
122cdf0e10cSrcweir 	Sequence< ::rtl::OUString > aSNS( 1 );
123cdf0e10cSrcweir 	aSNS[0] = SERVICE_SDBCX_COLUMN;
124cdf0e10cSrcweir 	return aSNS;
125cdf0e10cSrcweir }
126cdf0e10cSrcweir 
127cdf0e10cSrcweir // OComponentHelper
128cdf0e10cSrcweir //------------------------------------------------------------------------------
disposing()129cdf0e10cSrcweir void OColumn::disposing()
130cdf0e10cSrcweir {
131cdf0e10cSrcweir 	OPropertyContainer::disposing();
132cdf0e10cSrcweir }
133cdf0e10cSrcweir 
134cdf0e10cSrcweir // com::sun::star::beans::XPropertySet
135cdf0e10cSrcweir //------------------------------------------------------------------------------
getPropertySetInfo()136cdf0e10cSrcweir Reference< XPropertySetInfo > OColumn::getPropertySetInfo() throw (RuntimeException)
137cdf0e10cSrcweir {
138cdf0e10cSrcweir 	return createPropertySetInfo( getInfoHelper() ) ;
139cdf0e10cSrcweir }
140cdf0e10cSrcweir 
141cdf0e10cSrcweir // -----------------------------------------------------------------------------
getName()142cdf0e10cSrcweir ::rtl::OUString SAL_CALL OColumn::getName(  ) throw(::com::sun::star::uno::RuntimeException)
143cdf0e10cSrcweir {
144cdf0e10cSrcweir 	return m_sName;
145cdf0e10cSrcweir }
146cdf0e10cSrcweir // -----------------------------------------------------------------------------
setName(const::rtl::OUString & _rName)147cdf0e10cSrcweir void SAL_CALL OColumn::setName( const ::rtl::OUString& _rName ) throw(::com::sun::star::uno::RuntimeException)
148cdf0e10cSrcweir {
149cdf0e10cSrcweir 	m_sName = _rName;
150cdf0e10cSrcweir }
151cdf0e10cSrcweir 
152cdf0e10cSrcweir // -----------------------------------------------------------------------------
fireValueChange(const::connectivity::ORowSetValue &)153cdf0e10cSrcweir void OColumn::fireValueChange(const ::connectivity::ORowSetValue& /*_rOldValue*/)
154cdf0e10cSrcweir {
155cdf0e10cSrcweir     DBG_ERROR( "OColumn::fireValueChange: not implemented!" );
156cdf0e10cSrcweir }
157cdf0e10cSrcweir 
158cdf0e10cSrcweir //------------------------------------------------------------------------------
registerProperty(const::rtl::OUString & _rName,sal_Int32 _nHandle,sal_Int32 _nAttributes,void * _pPointerToMember,const Type & _rMemberType)159cdf0e10cSrcweir void OColumn::registerProperty( const ::rtl::OUString& _rName, sal_Int32 _nHandle, sal_Int32 _nAttributes, void* _pPointerToMember, const Type& _rMemberType )
160cdf0e10cSrcweir {
161cdf0e10cSrcweir     ::comphelper::OPropertyContainer::registerProperty( _rName, _nHandle, _nAttributes, _pPointerToMember, _rMemberType );
162cdf0e10cSrcweir }
163cdf0e10cSrcweir 
164cdf0e10cSrcweir //------------------------------------------------------------------------------
registerMayBeVoidProperty(const::rtl::OUString & _rName,sal_Int32 _nHandle,sal_Int32 _nAttributes,Any * _pPointerToMember,const Type & _rExpectedType)165cdf0e10cSrcweir void OColumn::registerMayBeVoidProperty( const ::rtl::OUString& _rName, sal_Int32 _nHandle, sal_Int32 _nAttributes, Any* _pPointerToMember, const Type& _rExpectedType )
166cdf0e10cSrcweir {
167cdf0e10cSrcweir     ::comphelper::OPropertyContainer::registerMayBeVoidProperty( _rName, _nHandle, _nAttributes, _pPointerToMember, _rExpectedType );
168cdf0e10cSrcweir }
169cdf0e10cSrcweir 
170cdf0e10cSrcweir //------------------------------------------------------------------------------
registerPropertyNoMember(const::rtl::OUString & _rName,sal_Int32 _nHandle,sal_Int32 _nAttributes,const Type & _rType,const void * _pInitialValue)171cdf0e10cSrcweir void OColumn::registerPropertyNoMember( const ::rtl::OUString& _rName, sal_Int32 _nHandle, sal_Int32 _nAttributes, const Type& _rType, const void* _pInitialValue )
172cdf0e10cSrcweir {
173cdf0e10cSrcweir     ::comphelper::OPropertyContainer::registerPropertyNoMember( _rName, _nHandle, _nAttributes, _rType, _pInitialValue );
174cdf0e10cSrcweir }
175cdf0e10cSrcweir 
176cdf0e10cSrcweir //============================================================
177cdf0e10cSrcweir //= OColumns
178cdf0e10cSrcweir //============================================================
179cdf0e10cSrcweir DBG_NAME(OColumns);
180cdf0e10cSrcweir 
181cdf0e10cSrcweir //--------------------------------------------------------------------------
OColumns(::cppu::OWeakObject & _rParent,::osl::Mutex & _rMutex,sal_Bool _bCaseSensitive,const::std::vector<::rtl::OUString> & _rVector,IColumnFactory * _pColFactory,::connectivity::sdbcx::IRefreshableColumns * _pRefresh,sal_Bool _bAddColumn,sal_Bool _bDropColumn,sal_Bool _bUseHardRef)182cdf0e10cSrcweir OColumns::OColumns(::cppu::OWeakObject& _rParent,
183cdf0e10cSrcweir 				   ::osl::Mutex& _rMutex,
184cdf0e10cSrcweir 				   sal_Bool _bCaseSensitive,const ::std::vector< ::rtl::OUString> &_rVector,
185cdf0e10cSrcweir 				   IColumnFactory* _pColFactory,
186cdf0e10cSrcweir 				   ::connectivity::sdbcx::IRefreshableColumns* _pRefresh,
187cdf0e10cSrcweir 				   sal_Bool _bAddColumn,
188cdf0e10cSrcweir 				   sal_Bool _bDropColumn,
189cdf0e10cSrcweir 				   sal_Bool _bUseHardRef)
190cdf0e10cSrcweir 				   : OColumns_BASE(_rParent,_bCaseSensitive,_rMutex,_rVector,_bUseHardRef)
191cdf0e10cSrcweir 	,m_pMediator(NULL)
192cdf0e10cSrcweir 	,m_xDrvColumns(NULL)
193cdf0e10cSrcweir 	,m_pColFactoryImpl(_pColFactory)
194cdf0e10cSrcweir 	,m_pRefreshColumns(_pRefresh)
195cdf0e10cSrcweir 	,m_bInitialized(sal_False)
196cdf0e10cSrcweir 	,m_bAddColumn(_bAddColumn)
197cdf0e10cSrcweir 	,m_bDropColumn(_bDropColumn)
198cdf0e10cSrcweir {
199cdf0e10cSrcweir 	DBG_CTOR(OColumns, NULL);
200cdf0e10cSrcweir }
201cdf0e10cSrcweir 
202cdf0e10cSrcweir // -------------------------------------------------------------------------
OColumns(::cppu::OWeakObject & _rParent,::osl::Mutex & _rMutex,const::com::sun::star::uno::Reference<::com::sun::star::container::XNameAccess> & _rxDrvColumns,sal_Bool _bCaseSensitive,const::std::vector<::rtl::OUString> & _rVector,IColumnFactory * _pColFactory,::connectivity::sdbcx::IRefreshableColumns * _pRefresh,sal_Bool _bAddColumn,sal_Bool _bDropColumn,sal_Bool _bUseHardRef)203cdf0e10cSrcweir OColumns::OColumns(::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex,
204cdf0e10cSrcweir 		const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& _rxDrvColumns,
205cdf0e10cSrcweir 		sal_Bool _bCaseSensitive,const ::std::vector< ::rtl::OUString> &_rVector,
206cdf0e10cSrcweir 		IColumnFactory* _pColFactory,
207cdf0e10cSrcweir 		::connectivity::sdbcx::IRefreshableColumns* _pRefresh,
208cdf0e10cSrcweir 		sal_Bool _bAddColumn,
209cdf0e10cSrcweir 		sal_Bool _bDropColumn,
210cdf0e10cSrcweir 		sal_Bool _bUseHardRef)
211cdf0e10cSrcweir 	   : OColumns_BASE(_rParent,_bCaseSensitive,_rMutex,_rVector,_bUseHardRef)
212cdf0e10cSrcweir 	,m_pMediator(NULL)
213cdf0e10cSrcweir 	,m_xDrvColumns(_rxDrvColumns)
214cdf0e10cSrcweir 	,m_pColFactoryImpl(_pColFactory)
215cdf0e10cSrcweir 	,m_pRefreshColumns(_pRefresh)
216cdf0e10cSrcweir 	,m_bInitialized(sal_False)
217cdf0e10cSrcweir 	,m_bAddColumn(_bAddColumn)
218cdf0e10cSrcweir 	,m_bDropColumn(_bDropColumn)
219cdf0e10cSrcweir {
220cdf0e10cSrcweir 	DBG_CTOR(OColumns, NULL);
221cdf0e10cSrcweir }
222cdf0e10cSrcweir //--------------------------------------------------------------------------
~OColumns()223cdf0e10cSrcweir OColumns::~OColumns()
224cdf0e10cSrcweir {
225cdf0e10cSrcweir 	DBG_DTOR(OColumns, NULL);
226cdf0e10cSrcweir }
227cdf0e10cSrcweir 
228cdf0e10cSrcweir // XServiceInfo
229cdf0e10cSrcweir //------------------------------------------------------------------------------
getImplementationName()230cdf0e10cSrcweir rtl::OUString OColumns::getImplementationName(  ) throw(RuntimeException)
231cdf0e10cSrcweir {
232cdf0e10cSrcweir 	return rtl::OUString::createFromAscii("com.sun.star.sdb.OColumns");
233cdf0e10cSrcweir }
234cdf0e10cSrcweir 
235cdf0e10cSrcweir //------------------------------------------------------------------------------
supportsService(const::rtl::OUString & _rServiceName)236cdf0e10cSrcweir sal_Bool OColumns::supportsService( const ::rtl::OUString& _rServiceName ) throw (RuntimeException)
237cdf0e10cSrcweir {
238cdf0e10cSrcweir 	return ::comphelper::findValue(getSupportedServiceNames(), _rServiceName, sal_True).getLength() != 0;
239cdf0e10cSrcweir }
240cdf0e10cSrcweir 
241cdf0e10cSrcweir //------------------------------------------------------------------------------
getSupportedServiceNames()242cdf0e10cSrcweir Sequence< ::rtl::OUString > OColumns::getSupportedServiceNames(  ) throw (RuntimeException)
243cdf0e10cSrcweir {
244cdf0e10cSrcweir 	Sequence< ::rtl::OUString > aSNS( 1 );
245cdf0e10cSrcweir 	aSNS[0] = SERVICE_SDBCX_CONTAINER;
246cdf0e10cSrcweir 	return aSNS;
247cdf0e10cSrcweir }
248cdf0e10cSrcweir 
249cdf0e10cSrcweir //------------------------------------------------------------------
append(const::rtl::OUString & _rName,OColumn * _pColumn)250cdf0e10cSrcweir void OColumns::append( const ::rtl::OUString& _rName, OColumn* _pColumn )
251cdf0e10cSrcweir {
252cdf0e10cSrcweir 	MutexGuard aGuard(m_rMutex);
253cdf0e10cSrcweir 
254cdf0e10cSrcweir 	OSL_ENSURE( _pColumn, "OColumns::append: invalid column!" );
255cdf0e10cSrcweir 	OSL_ENSURE( !m_pElements->exists( _rName ),"OColumns::append: Column already exists");
256cdf0e10cSrcweir 
257cdf0e10cSrcweir 	_pColumn->m_sName = _rName;
258cdf0e10cSrcweir 
259cdf0e10cSrcweir 	// now really insert the column
260cdf0e10cSrcweir 	insertElement( _rName, _pColumn );
261cdf0e10cSrcweir }
262cdf0e10cSrcweir 
263cdf0e10cSrcweir //------------------------------------------------------------------
clearColumns()264cdf0e10cSrcweir void OColumns::clearColumns()
265cdf0e10cSrcweir {
266cdf0e10cSrcweir 	MutexGuard aGuard(m_rMutex);
267cdf0e10cSrcweir 	disposing();
268cdf0e10cSrcweir }
269cdf0e10cSrcweir 
270cdf0e10cSrcweir // -----------------------------------------------------------------------------
disposing(void)271cdf0e10cSrcweir void SAL_CALL OColumns::disposing(void)
272cdf0e10cSrcweir {
273cdf0e10cSrcweir 	MutexGuard aGuard(m_rMutex);
274cdf0e10cSrcweir 	m_xDrvColumns = NULL;
275cdf0e10cSrcweir 	m_pMediator = NULL;
276cdf0e10cSrcweir 	m_pColFactoryImpl = NULL;
277cdf0e10cSrcweir 	OColumns_BASE::disposing();
278cdf0e10cSrcweir }
279cdf0e10cSrcweir 
280cdf0e10cSrcweir // -------------------------------------------------------------------------
impl_refresh()281cdf0e10cSrcweir void OColumns::impl_refresh() throw(::com::sun::star::uno::RuntimeException)
282cdf0e10cSrcweir {
283cdf0e10cSrcweir 	if (m_pRefreshColumns)
284cdf0e10cSrcweir 		m_pRefreshColumns->refreshColumns();
285cdf0e10cSrcweir }
286cdf0e10cSrcweir 
287cdf0e10cSrcweir // -------------------------------------------------------------------------
createObject(const::rtl::OUString & _rName)288cdf0e10cSrcweir connectivity::sdbcx::ObjectType OColumns::createObject(const ::rtl::OUString& _rName)
289cdf0e10cSrcweir {
290cdf0e10cSrcweir 	OSL_ENSURE(m_pColFactoryImpl, "OColumns::createObject: no column factory!");
291cdf0e10cSrcweir 
292cdf0e10cSrcweir 	connectivity::sdbcx::ObjectType xRet;
293cdf0e10cSrcweir 	if ( m_pColFactoryImpl )
294cdf0e10cSrcweir 	{
295cdf0e10cSrcweir 		xRet = m_pColFactoryImpl->createColumn(_rName);
296cdf0e10cSrcweir 		Reference<XChild> xChild(xRet,UNO_QUERY);
297cdf0e10cSrcweir 		if ( xChild.is() )
298cdf0e10cSrcweir 			xChild->setParent(static_cast<XChild*>(static_cast<TXChild*>(this)));
299cdf0e10cSrcweir 	}
300cdf0e10cSrcweir 
301cdf0e10cSrcweir 	Reference<XPropertySet> xDest(xRet,UNO_QUERY);
302cdf0e10cSrcweir 	if ( m_pMediator && xDest.is() )
303cdf0e10cSrcweir 		m_pMediator->notifyElementCreated(_rName,xDest);
304cdf0e10cSrcweir 
305cdf0e10cSrcweir 	return xRet;
306cdf0e10cSrcweir }
307cdf0e10cSrcweir // -------------------------------------------------------------------------
createDescriptor()308cdf0e10cSrcweir Reference< XPropertySet > OColumns::createDescriptor()
309cdf0e10cSrcweir {
310cdf0e10cSrcweir 	if ( m_pColFactoryImpl )
311cdf0e10cSrcweir 	{
312cdf0e10cSrcweir 		Reference<XPropertySet> xRet = m_pColFactoryImpl->createColumnDescriptor();
313cdf0e10cSrcweir 		Reference<XChild> xChild(xRet,UNO_QUERY);
314cdf0e10cSrcweir 		if ( xChild.is() )
315cdf0e10cSrcweir 			xChild->setParent(static_cast<XChild*>(static_cast<TXChild*>(this)));
316cdf0e10cSrcweir 		return xRet;
317cdf0e10cSrcweir 	}
318cdf0e10cSrcweir 	else
319cdf0e10cSrcweir 		return Reference< XPropertySet >();
320cdf0e10cSrcweir }
321cdf0e10cSrcweir // -------------------------------------------------------------------------
queryInterface(const Type & rType)322cdf0e10cSrcweir Any SAL_CALL OColumns::queryInterface( const Type & rType ) throw(RuntimeException)
323cdf0e10cSrcweir {
324cdf0e10cSrcweir 	Any aRet;
325cdf0e10cSrcweir 	if(m_xDrvColumns.is())
326cdf0e10cSrcweir 	{
327cdf0e10cSrcweir 		aRet = m_xDrvColumns->queryInterface(rType);
328cdf0e10cSrcweir 		if ( aRet.hasValue() )
329cdf0e10cSrcweir 			aRet = OColumns_BASE::queryInterface( rType);
330cdf0e10cSrcweir 		if ( !aRet.hasValue() )
331cdf0e10cSrcweir 			aRet = TXChild::queryInterface( rType);
332cdf0e10cSrcweir 		return aRet;
333cdf0e10cSrcweir 	}
334cdf0e10cSrcweir 	else if(!m_pTable || (m_pTable && !m_pTable->isNew()))
335cdf0e10cSrcweir 	{
336cdf0e10cSrcweir 		if(!m_bAddColumn	&& rType == getCppuType( (Reference<XAppend>*)0))
337cdf0e10cSrcweir 			return Any();
338cdf0e10cSrcweir 		if(!m_bDropColumn	&& rType == getCppuType( (Reference<XDrop>*)0))
339cdf0e10cSrcweir 			return Any();
340cdf0e10cSrcweir 	}
341cdf0e10cSrcweir 
342cdf0e10cSrcweir 	aRet = OColumns_BASE::queryInterface( rType);
343cdf0e10cSrcweir 	if ( !aRet.hasValue() )
344cdf0e10cSrcweir 		aRet = TXChild::queryInterface( rType);
345cdf0e10cSrcweir 	return aRet;
346cdf0e10cSrcweir }
347cdf0e10cSrcweir // -------------------------------------------------------------------------
getTypes()348cdf0e10cSrcweir Sequence< Type > SAL_CALL OColumns::getTypes(  ) throw(RuntimeException)
349cdf0e10cSrcweir {
350cdf0e10cSrcweir 	sal_Bool bAppendFound = sal_False,bDropFound = sal_False;
351cdf0e10cSrcweir 
352cdf0e10cSrcweir 	sal_Int32 nSize = 0;
353cdf0e10cSrcweir 	Type aAppendType = getCppuType( (Reference<XAppend>*)0);
354cdf0e10cSrcweir 	Type aDropType	 = getCppuType( (Reference<XDrop>*)0);
355cdf0e10cSrcweir 	if(m_xDrvColumns.is())
356cdf0e10cSrcweir 	{
357cdf0e10cSrcweir 		Reference<XTypeProvider> xTypes(m_xDrvColumns,UNO_QUERY);
358cdf0e10cSrcweir 		Sequence< Type > aTypes(xTypes->getTypes());
359cdf0e10cSrcweir 
360cdf0e10cSrcweir 		Sequence< Type > aSecTypes(OColumns_BASE::getTypes());
361cdf0e10cSrcweir 
362cdf0e10cSrcweir 
363cdf0e10cSrcweir 		const Type* pBegin = aTypes.getConstArray();
364cdf0e10cSrcweir 		const Type* pEnd = pBegin + aTypes.getLength();
365cdf0e10cSrcweir 		for (;pBegin != pEnd ; ++pBegin)
366cdf0e10cSrcweir 		{
367cdf0e10cSrcweir 			if(aAppendType == *pBegin)
368cdf0e10cSrcweir 				bAppendFound = sal_True;
369cdf0e10cSrcweir 			else if(aDropType == *pBegin)
370cdf0e10cSrcweir 				bDropFound = sal_True;
371cdf0e10cSrcweir 		}
372cdf0e10cSrcweir 		nSize = (bDropFound ? (bAppendFound ? 0 : 1) : (bAppendFound ? 1 : 2));
373cdf0e10cSrcweir 	}
374cdf0e10cSrcweir 	else
375cdf0e10cSrcweir 	{
376cdf0e10cSrcweir 		nSize = ((m_pTable && m_pTable->isNew()) ? 0 :
377cdf0e10cSrcweir 					((m_bDropColumn ?
378cdf0e10cSrcweir 						(m_bAddColumn ? 0 : 1) : (m_bAddColumn ? 1 : 2))));
379cdf0e10cSrcweir 		bDropFound		= (m_pTable && m_pTable->isNew()) || m_bDropColumn;
380cdf0e10cSrcweir 		bAppendFound	= (m_pTable && m_pTable->isNew()) || m_bAddColumn;
381cdf0e10cSrcweir 	}
382cdf0e10cSrcweir 	Sequence< Type > aTypes(::comphelper::concatSequences(OColumns_BASE::getTypes(),TXChild::getTypes()));
383cdf0e10cSrcweir 	Sequence< Type > aRet(aTypes.getLength() - nSize);
384cdf0e10cSrcweir 
385cdf0e10cSrcweir 	const Type* pBegin = aTypes.getConstArray();
386cdf0e10cSrcweir 	const Type* pEnd = pBegin + aTypes.getLength();
387cdf0e10cSrcweir 	for(sal_Int32 i=0;pBegin != pEnd ;++pBegin)
388cdf0e10cSrcweir 	{
389cdf0e10cSrcweir 		if(*pBegin != aAppendType && *pBegin != aDropType)
390cdf0e10cSrcweir 			aRet.getArray()[i++] = *pBegin;
391cdf0e10cSrcweir 		else if(bDropFound && *pBegin == aDropType)
392cdf0e10cSrcweir 			aRet.getArray()[i++] = *pBegin;
393cdf0e10cSrcweir 		else if(bAppendFound && *pBegin == aAppendType)
394cdf0e10cSrcweir 			aRet.getArray()[i++] = *pBegin;
395cdf0e10cSrcweir 	}
396cdf0e10cSrcweir 	return aRet;
397cdf0e10cSrcweir }
398cdf0e10cSrcweir // -------------------------------------------------------------------------
399cdf0e10cSrcweir // XAppend
appendObject(const::rtl::OUString & _rForName,const Reference<XPropertySet> & descriptor)400cdf0e10cSrcweir sdbcx::ObjectType OColumns::appendObject( const ::rtl::OUString& _rForName, const Reference< XPropertySet >& descriptor )
401cdf0e10cSrcweir {
402cdf0e10cSrcweir     sdbcx::ObjectType xReturn;
403cdf0e10cSrcweir 
404cdf0e10cSrcweir     Reference< XAppend > xAppend( m_xDrvColumns, UNO_QUERY );
405cdf0e10cSrcweir 	if ( xAppend.is() )
406cdf0e10cSrcweir 	{
407cdf0e10cSrcweir 		xAppend->appendByDescriptor(descriptor);
408cdf0e10cSrcweir         xReturn = createObject( _rForName );
409cdf0e10cSrcweir 	}
410cdf0e10cSrcweir     else if ( m_pTable && !m_pTable->isNew() )
411cdf0e10cSrcweir     {
412cdf0e10cSrcweir         if ( m_bAddColumn )
413cdf0e10cSrcweir         {
414cdf0e10cSrcweir             Reference< ::com::sun::star::sdb::tools::XTableAlteration> xAlterService = m_pTable->getAlterService();
415cdf0e10cSrcweir             if ( xAlterService.is() )
416cdf0e10cSrcweir             {
417cdf0e10cSrcweir                 xAlterService->addColumn(m_pTable,descriptor);
418cdf0e10cSrcweir                 xReturn = createObject( _rForName );
419cdf0e10cSrcweir             }
420cdf0e10cSrcweir             else
421cdf0e10cSrcweir                 xReturn = OColumns_BASE::appendObject( _rForName, descriptor );
422cdf0e10cSrcweir         }
423cdf0e10cSrcweir         else
424cdf0e10cSrcweir             ::dbtools::throwGenericSQLException( DBA_RES( RID_STR_NO_COLUMN_ADD ), static_cast<XChild*>(static_cast<TXChild*>(this)) );
425cdf0e10cSrcweir     }
426cdf0e10cSrcweir     else
427cdf0e10cSrcweir         xReturn = cloneDescriptor( descriptor );
428cdf0e10cSrcweir 
429cdf0e10cSrcweir     if ( m_pColFactoryImpl )
430cdf0e10cSrcweir 		m_pColFactoryImpl->columnAppended( descriptor );
431cdf0e10cSrcweir 
432cdf0e10cSrcweir     ::dbaccess::notifyDataSourceModified(m_xParent,sal_True);
433cdf0e10cSrcweir 
434cdf0e10cSrcweir     return xReturn;
435cdf0e10cSrcweir }
436cdf0e10cSrcweir // -------------------------------------------------------------------------
437cdf0e10cSrcweir // XDrop
dropObject(sal_Int32 _nPos,const::rtl::OUString _sElementName)438cdf0e10cSrcweir void OColumns::dropObject(sal_Int32 _nPos,const ::rtl::OUString _sElementName)
439cdf0e10cSrcweir {
440cdf0e10cSrcweir 	Reference< XDrop > xDrop( m_xDrvColumns, UNO_QUERY );
441cdf0e10cSrcweir 	if ( xDrop.is() )
442cdf0e10cSrcweir 	{
443cdf0e10cSrcweir 		xDrop->dropByName( _sElementName );
444cdf0e10cSrcweir 	}
445cdf0e10cSrcweir 	else if ( m_pTable && !m_pTable->isNew() )
446cdf0e10cSrcweir     {
447cdf0e10cSrcweir         if ( m_bDropColumn )
448cdf0e10cSrcweir         {
449cdf0e10cSrcweir             Reference< ::com::sun::star::sdb::tools::XTableAlteration> xAlterService = m_pTable->getAlterService();
450cdf0e10cSrcweir             if ( xAlterService.is() )
451cdf0e10cSrcweir                 xAlterService->dropColumn(m_pTable,_sElementName);
452cdf0e10cSrcweir             else
453cdf0e10cSrcweir 		        OColumns_BASE::dropObject(_nPos,_sElementName);
454cdf0e10cSrcweir         }
455cdf0e10cSrcweir         else
456cdf0e10cSrcweir             ::dbtools::throwGenericSQLException( DBA_RES( RID_STR_NO_COLUMN_DROP ), static_cast<XChild*>(static_cast<TXChild*>(this)) );
457cdf0e10cSrcweir     }
458cdf0e10cSrcweir 
459cdf0e10cSrcweir     if ( m_pColFactoryImpl )
460cdf0e10cSrcweir 		m_pColFactoryImpl->columnDropped(_sElementName);
461cdf0e10cSrcweir 
462cdf0e10cSrcweir     ::dbaccess::notifyDataSourceModified(m_xParent,sal_True);
463cdf0e10cSrcweir }
464cdf0e10cSrcweir // -----------------------------------------------------------------------------
465cdf0e10cSrcweir 
getParent()466cdf0e10cSrcweir Reference< XInterface > SAL_CALL OColumns::getParent(  ) throw (RuntimeException)
467cdf0e10cSrcweir {
468cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_rMutex);
469cdf0e10cSrcweir 	return m_xParent;
470cdf0e10cSrcweir }
471cdf0e10cSrcweir // -----------------------------------------------------------------------------
setParent(const Reference<XInterface> & _xParent)472cdf0e10cSrcweir void SAL_CALL OColumns::setParent( const Reference< XInterface >& _xParent ) throw (NoSupportException, RuntimeException)
473cdf0e10cSrcweir {
474cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_rMutex);
475cdf0e10cSrcweir 	m_xParent = _xParent;
476cdf0e10cSrcweir }
477cdf0e10cSrcweir // -----------------------------------------------------------------------------
478