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