diff options
Diffstat (limited to 'dbaccess/source/core/api')
26 files changed, 1001 insertions, 1741 deletions
diff --git a/dbaccess/source/core/api/BookmarkSet.cxx b/dbaccess/source/core/api/BookmarkSet.cxx index 63d287df08bd..127ee83aaf2c 100644 --- a/dbaccess/source/core/api/BookmarkSet.cxx +++ b/dbaccess/source/core/api/BookmarkSet.cxx @@ -270,7 +270,10 @@ void OBookmarkSet::updateColumn(sal_Int32 nPos,Reference< XRowUpdate > _xParamet case DataType::LONGVARBINARY: _xParameter->updateBytes(nPos,_rValue); break; - + case DataType::BLOB: + case DataType::CLOB: + _xParameter->updateObject(nPos,_rValue.getAny()); + break; } } } diff --git a/dbaccess/source/core/api/CRowSetColumn.cxx b/dbaccess/source/core/api/CRowSetColumn.cxx index bc48a56ed3f0..0974963dfd72 100644 --- a/dbaccess/source/core/api/CRowSetColumn.cxx +++ b/dbaccess/source/core/api/CRowSetColumn.cxx @@ -31,186 +31,84 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_dbaccess.hxx" -#ifndef DBACCESS_SHARED_DBASTRINGS_HRC #include "dbastrings.hrc" -#endif -#ifndef _DBASHARED_APITOOLS_HXX_ #include "apitools.hxx" -#endif -#ifndef _COMPHELPER_TYPES_HXX_ -#include <comphelper/types.hxx> -#endif -#ifndef _CPPUHELPER_TYPEPROVIDER_HXX_ -#include <cppuhelper/typeprovider.hxx> -#endif -#ifndef DBACCESS_CORE_API_CROWSETCOLUMN_HXX #include "CRowSetColumn.hxx" -#endif -#ifndef _COM_SUN_STAR_SDB_XCOLUMN_HPP_ + #include <com/sun/star/sdb/XColumn.hpp> -#endif -#ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_ #include <com/sun/star/beans/PropertyAttribute.hpp> -#endif +#include <comphelper/types.hxx> +#include <cppuhelper/typeprovider.hxx> -using namespace dbaccess; -// using namespace connectivity; using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::beans; -// using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::sdb; -using namespace ::com::sun::star::container; -using namespace ::com::sun::star::lang; -// using namespace ::com::sun::star::util; -using namespace cppu; -using namespace osl; +using namespace ::com::sun::star::beans; +//.............................................................................. +namespace dbaccess +{ +//.............................................................................. -// ------------------------------------------------------------------------- -//ORowSetColumn::ORowSetColumn( const Reference < XResultSetMetaData >& _xMetaData, -// const ::com::sun::star::uno::Reference < ::com::sun::star::sdbc::XRow >& _xRow, -// sal_Int32 _nPos, -// ORowSetMatrix::iterator& _rColumnValue, -// ORowSetMatrix::iterator& _rEnd) -// : ORowSetDataColumn(_xMetaData,_xRow,NULL,_nPos,_rColumnValue,_rEnd) -//{ -// -//} //------------------------------------------------------------------------------ -Any SAL_CALL ORowSetColumn::queryInterface( const Type & _rType ) throw (RuntimeException) +ORowSetColumn::ORowSetColumn( const Reference < XResultSetMetaData >& _xMetaData, const Reference < XRow >& _xRow, sal_Int32 _nPos, + const Reference< XDatabaseMetaData >& _rxDBMeta, const ::rtl::OUString& _rDescription, ORowSetCacheIterator& _rColumnValue ) + :ORowSetDataColumn( _xMetaData, _xRow, NULL, _nPos, _rxDBMeta, _rDescription, _rColumnValue ) { - Any aReturn = OResultColumn::queryInterface(_rType); - if (!aReturn.hasValue()) - aReturn = ::cppu::queryInterface(_rType,static_cast< XColumn* >(this)); - return aReturn; } -// ------------------------------------------------------------------------- -// comphelper::OPropertyArrayUsageHelper + //------------------------------------------------------------------------------ ::cppu::IPropertyArrayHelper* ORowSetColumn::createArrayHelper( ) const { - BEGIN_PROPERTY_HELPER(30) - DECL_PROP2(ALIGN, sal_Int32, BOUND,MAYBEVOID); - DECL_PROP1(CATALOGNAME, ::rtl::OUString, READONLY); - DECL_PROP2(CONTROLDEFAULT, ::rtl::OUString, BOUND,MAYBEVOID); - DECL_PROP1_IFACE(CONTROLMODEL, XPropertySet, BOUND ); - DECL_PROP1(DISPLAYSIZE, sal_Int32, READONLY); - DECL_PROP2(NUMBERFORMAT, sal_Int32, BOUND,MAYBEVOID); - DECL_PROP2(HELPTEXT, ::rtl::OUString, BOUND,MAYBEVOID); - DECL_PROP1_BOOL(HIDDEN, BOUND); - DECL_PROP1_BOOL(ISAUTOINCREMENT, READONLY); - DECL_PROP1_BOOL(ISCASESENSITIVE, READONLY); - DECL_PROP1_BOOL(ISCURRENCY, READONLY); - DECL_PROP1_BOOL(ISDEFINITELYWRITABLE, READONLY); - DECL_PROP1(ISNULLABLE, sal_Int32, READONLY); - DECL_PROP1_BOOL(ISREADONLY, READONLY); - DECL_PROP1_BOOL(ISROWVERSION, READONLY); - DECL_PROP1_BOOL(ISSEARCHABLE, READONLY); - DECL_PROP1_BOOL(ISSIGNED, READONLY); - DECL_PROP1_BOOL(ISWRITABLE, READONLY); - DECL_PROP1(LABEL, ::rtl::OUString, READONLY); - DECL_PROP1(NAME, ::rtl::OUString, READONLY); - DECL_PROP1(PRECISION, sal_Int32, READONLY); - DECL_PROP2(RELATIVEPOSITION, sal_Int32, BOUND, MAYBEVOID); - DECL_PROP1(SCALE, sal_Int32, READONLY); - DECL_PROP1(SCHEMANAME, ::rtl::OUString, READONLY); - DECL_PROP1(SERVICENAME, ::rtl::OUString, READONLY); - DECL_PROP1(TABLENAME, ::rtl::OUString, READONLY); - DECL_PROP1(TYPE, sal_Int32, READONLY); - DECL_PROP1(TYPENAME, ::rtl::OUString, READONLY); - DECL_PROP2(VALUE, Any, READONLY,BOUND); - DECL_PROP1(WIDTH, sal_Int32, MAYBEVOID); - END_PROPERTY_HELPER(); + const sal_Int32 nDerivedProperties = 21; + Sequence< Property> aDerivedProperties( nDerivedProperties ); + Property* pDesc = aDerivedProperties.getArray(); + sal_Int32 nPos = 0; + + DECL_PROP1( CATALOGNAME, ::rtl::OUString, READONLY ); + DECL_PROP1( DISPLAYSIZE, sal_Int32, READONLY ); + DECL_PROP1_BOOL( ISAUTOINCREMENT, READONLY ); + DECL_PROP1_BOOL( ISCASESENSITIVE, READONLY ); + DECL_PROP1_BOOL( ISCURRENCY, READONLY ); + DECL_PROP1_BOOL( ISDEFINITELYWRITABLE, READONLY ); + DECL_PROP1( ISNULLABLE, sal_Int32, READONLY ); + DECL_PROP1_BOOL( ISREADONLY, READONLY ); + DECL_PROP1_BOOL( ISROWVERSION, READONLY ); + DECL_PROP1_BOOL( ISSEARCHABLE, READONLY ); + DECL_PROP1_BOOL( ISSIGNED, READONLY ); + DECL_PROP1_BOOL( ISWRITABLE, READONLY ); + DECL_PROP1( LABEL, ::rtl::OUString, READONLY ); + DECL_PROP1( PRECISION, sal_Int32, READONLY ); + DECL_PROP1( SCALE, sal_Int32, READONLY ); + DECL_PROP1( SCHEMANAME, ::rtl::OUString, READONLY ); + DECL_PROP1( SERVICENAME, ::rtl::OUString, READONLY ); + DECL_PROP1( TABLENAME, ::rtl::OUString, READONLY ); + DECL_PROP1( TYPE, sal_Int32, READONLY ); + DECL_PROP1( TYPENAME, ::rtl::OUString, READONLY ); + DECL_PROP2( VALUE, Any, READONLY, BOUND ); + OSL_ENSURE( nPos == nDerivedProperties, "ORowSetColumn::createArrayHelper: inconsistency!" ); + + Sequence< Property > aRegisteredProperties; + describeProperties( aRegisteredProperties ); + + return new ::cppu::OPropertyArrayHelper( ::comphelper::concatSequences( aDerivedProperties, aRegisteredProperties ), sal_False ); } -// cppu::OPropertySetHelper //------------------------------------------------------------------------------ ::cppu::IPropertyArrayHelper& ORowSetColumn::getInfoHelper() { return *static_cast< ::comphelper::OPropertyArrayUsageHelper< ORowSetColumn >* >(this)->getArrayHelper(); } -// ------------------------------------------------------------------------- -void SAL_CALL ORowSetColumn::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const -{ - switch(nHandle) - { - case PROPERTY_ID_ALIGN: - case PROPERTY_ID_NUMBERFORMAT: - case PROPERTY_ID_RELATIVEPOSITION: - case PROPERTY_ID_WIDTH: - case PROPERTY_ID_HIDDEN: - case PROPERTY_ID_CONTROLMODEL: - case PROPERTY_ID_HELPTEXT: - case PROPERTY_ID_CONTROLDEFAULT: - OColumnSettings::getFastPropertyValue( rValue, nHandle ); - break; - case PROPERTY_ID_VALUE: - if ( !m_aColumnValue.isNull() && (*m_aColumnValue).isValid() ) - rValue = ((*m_aColumnValue)->get())[m_nPos].makeAny(); - break; - default: - ORowSetDataColumn::getFastPropertyValue(rValue,nHandle); - } -} -// ------------------------------------------------------------------------- + +//------------------------------------------------------------------------------ void SAL_CALL ORowSetColumn::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue )throw (Exception) { - switch(nHandle) - { - case PROPERTY_ID_ALIGN: - case PROPERTY_ID_NUMBERFORMAT: - case PROPERTY_ID_RELATIVEPOSITION: - case PROPERTY_ID_WIDTH: - case PROPERTY_ID_HIDDEN: - case PROPERTY_ID_CONTROLMODEL: - case PROPERTY_ID_HELPTEXT: - case PROPERTY_ID_CONTROLDEFAULT: - OColumnSettings::setFastPropertyValue_NoBroadcast( nHandle, rValue ); - break; - case PROPERTY_ID_VALUE: - break; - default: - ORowSetDataColumn::setFastPropertyValue_NoBroadcast(nHandle,rValue ); - } + OSL_ENSURE( nHandle != PROPERTY_ID_VALUE, "ORowSetColumn::setFastPropertyValue_NoBroadcast: hmm? This property is marked as READONLY!" ); + if ( nHandle != PROPERTY_ID_VALUE ) + ORowSetDataColumn::setFastPropertyValue_NoBroadcast( nHandle, rValue ); } -// ------------------------------------------------------------------------- -sal_Bool SAL_CALL ORowSetColumn::convertFastPropertyValue( Any & rConvertedValue, - Any & rOldValue, - sal_Int32 nHandle, - const Any& rValue ) throw (IllegalArgumentException) -{ - sal_Bool bModified = sal_False; - switch(nHandle) - { - case PROPERTY_ID_ALIGN: - case PROPERTY_ID_NUMBERFORMAT: - case PROPERTY_ID_RELATIVEPOSITION: - case PROPERTY_ID_WIDTH: - case PROPERTY_ID_HIDDEN: - case PROPERTY_ID_CONTROLMODEL: - case PROPERTY_ID_HELPTEXT: - case PROPERTY_ID_CONTROLDEFAULT: - bModified = OColumnSettings::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, rValue ); - break; - case PROPERTY_ID_VALUE: - rConvertedValue = rValue; - getFastPropertyValue(rOldValue, PROPERTY_ID_VALUE); - bModified = !::comphelper::compare(rConvertedValue, rOldValue); - break; - default: - bModified = ORowSetDataColumn::convertFastPropertyValue(rConvertedValue, rOldValue, nHandle, rValue); - - } - return bModified; -} -// com::sun::star::lang::XTypeProvider -//-------------------------------------------------------------------------- -Sequence< Type > ORowSetColumn::getTypes() throw (RuntimeException) -{ - OTypeCollection aTypes(::getCppuType( (const Reference< XColumn > *)0 ),OColumn::getTypes()); - return aTypes.getTypes(); -} -//-------------------------------------------------------------------------- +//.............................................................................. +} // namespace dbaccess +//.............................................................................. diff --git a/dbaccess/source/core/api/CRowSetColumn.hxx b/dbaccess/source/core/api/CRowSetColumn.hxx index 06b701f42601..45d71d8e513a 100644 --- a/dbaccess/source/core/api/CRowSetColumn.hxx +++ b/dbaccess/source/core/api/CRowSetColumn.hxx @@ -46,11 +46,9 @@ namespace dbaccess { class ORowSetColumn; - typedef ::comphelper::OPropertyArrayUsageHelper<ORowSetColumn> ORowSetColumn_PROP; + class ORowSetColumn :public ORowSetDataColumn + ,public ::comphelper::OPropertyArrayUsageHelper< ORowSetColumn > - // ------------------------------------------------------------------------- - class ORowSetColumn : public ORowSetColumn_PROP, - public ORowSetDataColumn { public: ORowSetColumn( const ::com::sun::star::uno::Reference < ::com::sun::star::sdbc::XResultSetMetaData >& _xMetaData, @@ -58,34 +56,13 @@ namespace dbaccess sal_Int32 _nPos, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _rxDBMeta, const ::rtl::OUString& _rDescription, - ORowSetCacheIterator& _rColumnValue) - : ORowSetDataColumn(_xMetaData,_xRow,NULL,_nPos,_rxDBMeta,_rDescription,_rColumnValue) - { - } + ORowSetCacheIterator& _rColumnValue); - // com::sun::star::lang::XTypeProvider - virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes() throw (::com::sun::star::uno::RuntimeException); - - // com::sun::star::uno::XInterface - virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw (::com::sun::star::uno::RuntimeException); - - // comphelper::OPropertyArrayUsageHelper virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; - - // cppu::OPropertySetHelper virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); - - virtual sal_Bool SAL_CALL convertFastPropertyValue( ::com::sun::star::uno::Any & rConvertedValue, - ::com::sun::star::uno::Any & rOldValue, - sal_Int32 nHandle, - const ::com::sun::star::uno::Any& rValue ) throw (::com::sun::star::lang::IllegalArgumentException); - virtual void SAL_CALL getFastPropertyValue( ::com::sun::star::uno::Any& rValue, sal_Int32 nHandle ) const; - virtual void SAL_CALL setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const ::com::sun::star::uno::Any& rValue )throw (::com::sun::star::uno::Exception); - - protected: - using ORowSetDataColumn::getFastPropertyValue; + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle,const ::com::sun::star::uno::Any& rValue )throw (::com::sun::star::uno::Exception ); }; } -#endif // DBACCESS_CORE_API_CROWSETCOLUMN_HXX +#endif // DBACCESS_CORE_API_CROWSETCOLUMN_HXX diff --git a/dbaccess/source/core/api/CRowSetDataColumn.cxx b/dbaccess/source/core/api/CRowSetDataColumn.cxx index 3205d343f83b..ae78b8af7817 100644 --- a/dbaccess/source/core/api/CRowSetDataColumn.cxx +++ b/dbaccess/source/core/api/CRowSetDataColumn.cxx @@ -75,11 +75,13 @@ ORowSetDataColumn::ORowSetDataColumn( const Reference < XResultSetMetaData >& const Reference< XDatabaseMetaData >& _rxDBMeta, const ::rtl::OUString& _rDescription, const ORowSetCacheIterator& _rColumnValue) - : ODataColumn(_xMetaData,_xRow,_xRowUpdate,_nPos,_rxDBMeta) + :ODataColumn(_xMetaData,_xRow,_xRowUpdate,_nPos,_rxDBMeta) ,m_aColumnValue(_rColumnValue) ,m_aDescription(_rDescription) { DBG_CTOR(ORowSetDataColumn,NULL); + OColumnSettings::registerProperties( *this ); + registerProperty( PROPERTY_DESCRIPTION, PROPERTY_ID_DESCRIPTION, PropertyAttribute::READONLY, &m_aDescription, ::getCppuType( &m_aDescription ) ); } // ------------------------------------------------------------------------- ORowSetDataColumn::~ORowSetDataColumn() @@ -91,39 +93,38 @@ ORowSetDataColumn::~ORowSetDataColumn() //------------------------------------------------------------------------------ ::cppu::IPropertyArrayHelper* ORowSetDataColumn::createArrayHelper( ) const { - BEGIN_PROPERTY_HELPER(31) - DECL_PROP2(ALIGN, sal_Int32, BOUND,MAYBEVOID); - DECL_PROP1(CATALOGNAME, ::rtl::OUString, READONLY); - DECL_PROP2(CONTROLDEFAULT, ::rtl::OUString, BOUND,MAYBEVOID); - DECL_PROP1_IFACE(CONTROLMODEL, XPropertySet, BOUND ); - DECL_PROP1(DESCRIPTION, ::rtl::OUString, READONLY); - DECL_PROP1(DISPLAYSIZE, sal_Int32, READONLY); - DECL_PROP2(NUMBERFORMAT, sal_Int32, BOUND,MAYBEVOID); - DECL_PROP2(HELPTEXT, ::rtl::OUString, BOUND,MAYBEVOID); - DECL_PROP1_BOOL(HIDDEN, BOUND); - DECL_PROP1_BOOL(ISAUTOINCREMENT, READONLY); - DECL_PROP1_BOOL(ISCASESENSITIVE, READONLY); - DECL_PROP1_BOOL(ISCURRENCY, READONLY); - DECL_PROP1_BOOL(ISDEFINITELYWRITABLE, READONLY); - DECL_PROP1(ISNULLABLE, sal_Int32, READONLY); - DECL_PROP1_BOOL(ISREADONLY, READONLY); - DECL_PROP1_BOOL(ISROWVERSION, READONLY); - DECL_PROP1_BOOL(ISSEARCHABLE, READONLY); - DECL_PROP1_BOOL(ISSIGNED, READONLY); - DECL_PROP1_BOOL(ISWRITABLE, READONLY); - DECL_PROP1(LABEL, ::rtl::OUString, READONLY); - DECL_PROP1(NAME, ::rtl::OUString, READONLY); - DECL_PROP1(PRECISION, sal_Int32, READONLY); - DECL_PROP2(RELATIVEPOSITION, sal_Int32, BOUND, MAYBEVOID); - DECL_PROP1(SCALE, sal_Int32, READONLY); - DECL_PROP1(SCHEMANAME, ::rtl::OUString, READONLY); - DECL_PROP1(SERVICENAME, ::rtl::OUString, READONLY); - DECL_PROP1(TABLENAME, ::rtl::OUString, READONLY); - DECL_PROP1(TYPE, sal_Int32, READONLY); - DECL_PROP1(TYPENAME, ::rtl::OUString, READONLY); - DECL_PROP1(VALUE, Any, BOUND); - DECL_PROP1(WIDTH, sal_Int32, MAYBEVOID); - END_PROPERTY_HELPER(); + const sal_Int32 nDerivedProperties = 21; + Sequence< Property> aDerivedProperties( nDerivedProperties ); + Property* pDesc = aDerivedProperties.getArray(); + sal_Int32 nPos = 0; + + DECL_PROP1( CATALOGNAME, ::rtl::OUString, READONLY ); + DECL_PROP1( DISPLAYSIZE, sal_Int32, READONLY ); + DECL_PROP1_BOOL( ISAUTOINCREMENT, READONLY ); + DECL_PROP1_BOOL( ISCASESENSITIVE, READONLY ); + DECL_PROP1_BOOL( ISCURRENCY, READONLY ); + DECL_PROP1_BOOL( ISDEFINITELYWRITABLE, READONLY ); + DECL_PROP1( ISNULLABLE, sal_Int32, READONLY ); + DECL_PROP1_BOOL( ISREADONLY, READONLY ); + DECL_PROP1_BOOL( ISROWVERSION, READONLY ); + DECL_PROP1_BOOL( ISSEARCHABLE, READONLY ); + DECL_PROP1_BOOL( ISSIGNED, READONLY ); + DECL_PROP1_BOOL( ISWRITABLE, READONLY ); + DECL_PROP1( LABEL, ::rtl::OUString, READONLY ); + DECL_PROP1( PRECISION, sal_Int32, READONLY ); + DECL_PROP1( SCALE, sal_Int32, READONLY ); + DECL_PROP1( SCHEMANAME, ::rtl::OUString, READONLY ); + DECL_PROP1( SERVICENAME, ::rtl::OUString, READONLY ); + DECL_PROP1( TABLENAME, ::rtl::OUString, READONLY ); + DECL_PROP1( TYPE, sal_Int32, READONLY ); + DECL_PROP1( TYPENAME, ::rtl::OUString, READONLY ); + DECL_PROP1( VALUE, Any, BOUND ); + OSL_ENSURE( nPos == nDerivedProperties, "ORowSetDataColumn::createArrayHelper: inconsistency!" ); + + Sequence< Property > aRegisteredProperties; + describeProperties( aRegisteredProperties ); + + return new ::cppu::OPropertyArrayHelper( ::comphelper::concatSequences( aDerivedProperties, aRegisteredProperties ), sal_False ); } // cppu::OPropertySetHelper @@ -135,57 +136,33 @@ ORowSetDataColumn::~ORowSetDataColumn() // ------------------------------------------------------------------------- void SAL_CALL ORowSetDataColumn::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const { - switch(nHandle) + if ( PROPERTY_ID_VALUE == nHandle ) { - case PROPERTY_ID_DESCRIPTION: - rValue <<= m_aDescription; - break; - case PROPERTY_ID_ALIGN: - case PROPERTY_ID_NUMBERFORMAT: - case PROPERTY_ID_RELATIVEPOSITION: - case PROPERTY_ID_WIDTH: - case PROPERTY_ID_HIDDEN: - case PROPERTY_ID_CONTROLMODEL: - case PROPERTY_ID_HELPTEXT: - case PROPERTY_ID_CONTROLDEFAULT: - OColumnSettings::getFastPropertyValue( rValue, nHandle ); - break; - case PROPERTY_ID_VALUE: - if ( !m_aColumnValue.isNull() && m_aColumnValue->isValid() ) - { - ::osl::Mutex* pMutex = m_aColumnValue.getMutex(); - ::osl::MutexGuard aGuard( *pMutex ); + if ( !m_aColumnValue.isNull() && m_aColumnValue->isValid() ) + { + ::osl::Mutex* pMutex = m_aColumnValue.getMutex(); + ::osl::MutexGuard aGuard( *pMutex ); #if OSL_DEBUG_LEVEL > 0 - ORowSetRow aRow = *m_aColumnValue; + ORowSetRow aRow = *m_aColumnValue; #endif - OSL_ENSURE((sal_Int32)aRow->get().size() > m_nPos,"Pos is greater than size of vector"); - rValue = ((*m_aColumnValue)->get())[m_nPos].makeAny(); - } - break; - default: - ODataColumn::getFastPropertyValue(rValue,nHandle); + OSL_ENSURE((sal_Int32)aRow->get().size() > m_nPos,"Pos is greater than size of vector"); + rValue = ((*m_aColumnValue)->get())[m_nPos].makeAny(); + } } + else + ODataColumn::getFastPropertyValue( rValue, nHandle ); } + // ------------------------------------------------------------------------- void SAL_CALL ORowSetDataColumn::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue )throw (Exception) { - switch(nHandle) + if ( PROPERTY_ID_VALUE == nHandle ) + { + updateObject(rValue); + } + else { - case PROPERTY_ID_ALIGN: - case PROPERTY_ID_NUMBERFORMAT: - case PROPERTY_ID_RELATIVEPOSITION: - case PROPERTY_ID_WIDTH: - case PROPERTY_ID_HIDDEN: - case PROPERTY_ID_CONTROLMODEL: - case PROPERTY_ID_HELPTEXT: - case PROPERTY_ID_CONTROLDEFAULT: - OColumnSettings::setFastPropertyValue_NoBroadcast( nHandle, rValue ); - break; - case PROPERTY_ID_VALUE: - updateObject(rValue); - break; - default: - ODataColumn::setFastPropertyValue_NoBroadcast(nHandle,rValue ); + ODataColumn::setFastPropertyValue_NoBroadcast( nHandle,rValue ); } } // ------------------------------------------------------------------------- @@ -195,27 +172,14 @@ sal_Bool SAL_CALL ORowSetDataColumn::convertFastPropertyValue( Any & rConvertedV const Any& rValue ) throw (IllegalArgumentException) { sal_Bool bModified = sal_False; - switch(nHandle) + if ( PROPERTY_ID_VALUE == nHandle ) { - case PROPERTY_ID_ALIGN: - case PROPERTY_ID_NUMBERFORMAT: - case PROPERTY_ID_RELATIVEPOSITION: - case PROPERTY_ID_WIDTH: - case PROPERTY_ID_HIDDEN: - case PROPERTY_ID_CONTROLMODEL: - case PROPERTY_ID_HELPTEXT: - case PROPERTY_ID_CONTROLDEFAULT: - bModified = OColumnSettings::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, rValue ); - break; - case PROPERTY_ID_VALUE: - rConvertedValue = rValue; - getFastPropertyValue(rOldValue, PROPERTY_ID_VALUE); - bModified = !::comphelper::compare(rConvertedValue, rOldValue); - break; - default: - bModified = ODataColumn::convertFastPropertyValue(rConvertedValue, rOldValue, nHandle, rValue); - + rConvertedValue = rValue; + getFastPropertyValue(rOldValue, PROPERTY_ID_VALUE); + bModified = rConvertedValue != rOldValue; } + else + bModified = ODataColumn::convertFastPropertyValue(rConvertedValue, rOldValue, nHandle, rValue); return bModified; } diff --git a/dbaccess/source/core/api/CRowSetDataColumn.hxx b/dbaccess/source/core/api/CRowSetDataColumn.hxx index 93b812815676..ceec7344737c 100644 --- a/dbaccess/source/core/api/CRowSetDataColumn.hxx +++ b/dbaccess/source/core/api/CRowSetDataColumn.hxx @@ -30,21 +30,13 @@ #ifndef DBACCESS_CORE_API_CROWSETDATACOLUMN_HXX #define DBACCESS_CORE_API_CROWSETDATACOLUMN_HXX -#ifndef _DBACORE_DATACOLUMN_HXX_ #include "datacolumn.hxx" -#endif -#ifndef DBACCESS_CORE_API_ROWSETROW_HXX #include "RowSetRow.hxx" -#endif -#ifndef _CONNECTIVITY_COMMONTOOLS_HXX_ +#include "RowSetCacheIterator.hxx" +#include "columnsettings.hxx" + #include <connectivity/CommonTools.hxx> -#endif -#ifndef _COMPHELPER_PROPERTY_ARRAY_HELPER_HXX_ #include <comphelper/proparrhlp.hxx> -#endif -#ifndef DBACCESS_ROWSETCACHEITERATOR_HXX -#include "RowSetCacheIterator.hxx" -#endif namespace dbaccess { diff --git a/dbaccess/source/core/api/CacheSet.cxx b/dbaccess/source/core/api/CacheSet.cxx index bbb080a52238..f7be322caa1a 100644 --- a/dbaccess/source/core/api/CacheSet.cxx +++ b/dbaccess/source/core/api/CacheSet.cxx @@ -515,88 +515,7 @@ void OCacheSet::setParameter(sal_Int32 nPos { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "OCacheSet::setParameter" ); sal_Int32 nType = ( _nType != DataType::OTHER ) ? _nType : _rValue.getTypeKind(); - if(!_rValue.isNull()) - { - - switch(nType) - { - case DataType::DECIMAL: - case DataType::NUMERIC: - _xParameter->setObjectWithInfo(nPos,_rValue.makeAny(),nType,_nScale); - break; - case DataType::CHAR: - case DataType::VARCHAR: - case DataType::LONGVARCHAR: - _xParameter->setString(nPos,_rValue); - break; - case DataType::BIGINT: - if ( _rValue.isSigned() ) - _xParameter->setLong(nPos,_rValue); - else - _xParameter->setString(nPos,_rValue); - break; - case DataType::BIT: - case DataType::BOOLEAN: - _xParameter->setBoolean(nPos,_rValue); - break; - case DataType::TINYINT: - if ( _rValue.isSigned() ) - _xParameter->setByte(nPos,_rValue); - else - _xParameter->setShort(nPos,_rValue); - break; - case DataType::SMALLINT: - if ( _rValue.isSigned() ) - _xParameter->setShort(nPos,_rValue); - else - _xParameter->setInt(nPos,_rValue); - break; - case DataType::INTEGER: - if ( _rValue.isSigned() ) - _xParameter->setInt(nPos,_rValue); - else - _xParameter->setLong(nPos,_rValue); - break; - case DataType::FLOAT: - _xParameter->setFloat(nPos,_rValue); - break; - case DataType::DOUBLE: - case DataType::REAL: - _xParameter->setDouble(nPos,_rValue); - break; - case DataType::DATE: - _xParameter->setDate(nPos,_rValue); - break; - case DataType::TIME: - _xParameter->setTime(nPos,_rValue); - break; - case DataType::TIMESTAMP: - _xParameter->setTimestamp(nPos,_rValue); - break; - case DataType::BINARY: - case DataType::VARBINARY: - case DataType::LONGVARBINARY: - _xParameter->setBytes(nPos,_rValue); - break; - case DataType::CLOB: - { - Reference<XInputStream> xStream(_rValue.getAny(),UNO_QUERY); - _xParameter->setCharacterStream(nPos,xStream,xStream.is() ? xStream->available() : sal_Int32(0)); - } - break; - case DataType::BLOB: - { - Reference<XInputStream> xStream(_rValue.getAny(),UNO_QUERY); - _xParameter->setBinaryStream(nPos,xStream,xStream.is() ? xStream->available() : sal_Int32(0)); - } - break; - case DataType::SQLNULL: - _xParameter->setNull(nPos,nType); - break; - } - } - else - _xParameter->setNull(nPos,nType); + ::dbtools::setObjectWithInfo(_xParameter,nPos,_rValue,nType,_nScale); } // ------------------------------------------------------------------------- void OCacheSet::fillValueRow(ORowSetRow& _rRow,sal_Int32 _nPosition) diff --git a/dbaccess/source/core/api/KeySet.cxx b/dbaccess/source/core/api/KeySet.cxx index b3e815928bff..1be6dffa6a75 100644 --- a/dbaccess/source/core/api/KeySet.cxx +++ b/dbaccess/source/core/api/KeySet.cxx @@ -211,8 +211,33 @@ void OKeySet::construct(const Reference< XResultSet>& _xDriverSet) Reference<XColumnsSupplier> xSup(m_xComposer,UNO_QUERY); Reference<XNameAccess> xSourceColumns = m_xTable->getColumns(); - ::dbaccess::getColumnPositions(xSup->getColumns(),xKeyColumns,m_sUpdateTableName,(*m_pKeyColumnNames)); - ::dbaccess::getColumnPositions(xSup->getColumns(),xSourceColumns,m_sUpdateTableName,(*m_pColumnNames)); + ::rtl::OUString sCatalog,sSchema,sTable; + + Reference<XPropertySet> xTableProp(m_xTable,UNO_QUERY); + Any aCatalog = xTableProp->getPropertyValue(PROPERTY_CATALOGNAME); + aCatalog >>= sCatalog; + xTableProp->getPropertyValue(PROPERTY_SCHEMANAME) >>= sSchema; + xTableProp->getPropertyValue(PROPERTY_NAME) >>= sTable; + + ::std::vector< ::rtl::OUString> aBestRowColumnNames; + Reference<XResultSet> xBestRes(xMeta->getBestRowIdentifier(aCatalog,sSchema,sTable,0,sal_False)); + Reference<XRow> xBestRow(xBestRes,uno::UNO_QUERY); + while ( xBestRes->next() ) + { + aBestRowColumnNames.push_back(xBestRow->getString(2)); + } + + Sequence< ::rtl::OUString> aBestColumnNames; + if ( aBestRowColumnNames.empty() ) + { + if ( xKeyColumns.is() ) + aBestColumnNames = xKeyColumns->getElementNames(); + } + else + aBestColumnNames = Sequence< ::rtl::OUString>(&aBestRowColumnNames[0],aBestRowColumnNames.size()); + + ::dbaccess::getColumnPositions(xSup->getColumns(),aBestColumnNames,m_sUpdateTableName,(*m_pKeyColumnNames)); + ::dbaccess::getColumnPositions(xSup->getColumns(),xSourceColumns->getElementNames(),m_sUpdateTableName,(*m_pColumnNames)); SelectColumnsMetaData::const_iterator aPosIter = (*m_pKeyColumnNames).begin(); SelectColumnsMetaData::const_iterator aPosEnd = (*m_pKeyColumnNames).end(); @@ -235,16 +260,7 @@ void OKeySet::construct(const Reference< XResultSet>& _xDriverSet) static ::rtl::OUString aAnd = ::rtl::OUString::createFromAscii(" AND "); Reference<XDatabaseMetaData> xMetaData = m_xConnection->getMetaData(); - ::rtl::OUString aQuote = getIdentifierQuoteString(); - - ::rtl::OUStringBuffer aFilter; - ::rtl::OUString sCatalog,sSchema,sTable; - - Reference<XPropertySet> xTableProp(m_xTable,UNO_QUERY); - xTableProp->getPropertyValue(PROPERTY_CATALOGNAME) >>= sCatalog; - xTableProp->getPropertyValue(PROPERTY_SCHEMANAME) >>= sSchema; - xTableProp->getPropertyValue(PROPERTY_NAME) >>= sTable; - + const ::rtl::OUString aQuote = getIdentifierQuoteString(); m_aSelectComposedTableName = getComposedTableName(sCatalog,sSchema,sTable); ::rtl::OUString sComposedName; @@ -252,6 +268,7 @@ void OKeySet::construct(const Reference< XResultSet>& _xDriverSet) ::dbtools::qualifiedNameComponents(xMetaData,m_sUpdateTableName,sCatalog,sSchema,sTable,::dbtools::eInDataManipulation); sComposedName = ::dbtools::composeTableName( xMetaData, sCatalog, sSchema, sTable, sal_True, ::dbtools::eInDataManipulation ); + ::rtl::OUStringBuffer aFilter; static ::rtl::OUString s_sDot(RTL_CONSTASCII_USTRINGPARAM(".")); static ::rtl::OUString s_sParam(RTL_CONSTASCII_USTRINGPARAM(" = ?")); // create the where clause @@ -286,21 +303,20 @@ void OKeySet::construct(const Reference< XResultSet>& _xDriverSet) ::rtl::OUString sSelectTableName = ::dbtools::composeTableName( xMetaData, xProp, ::dbtools::eInDataManipulation, false, false, false ); Reference<XNameAccess > xSelectColumns = xSup->getColumns(); - ::dbaccess::getColumnPositions(xSelectColumns,xSelColSup->getColumns(),sSelectTableName,(*m_pForeignColumnNames)); + ::dbaccess::getColumnPositions(xSelectColumns,xSelColSup->getColumns()->getElementNames(),sSelectTableName,(*m_pForeignColumnNames)); - uno::Sequence< ::rtl::OUString> aSelectColumnNames = xSelectColumns->getElementNames(); - const ::rtl::OUString* pSelectColumnName = aSelectColumnNames.getConstArray(); - const ::rtl::OUString* pSelectColumnEnd = pSelectColumnName + aSelectColumnNames.getLength(); - for( ; pSelectColumnName != pSelectColumnEnd ; ++pSelectColumnName) + aPosEnd = (*m_pForeignColumnNames).end(); + for(aPosIter = (*m_pForeignColumnNames).begin();aPosIter != aPosEnd;++aPosIter) { // look for columns not in the source columns to use them as filter as well - if ( !xSourceColumns->hasByName(*pSelectColumnName) ) + // if ( !xSourceColumns->hasByName(aPosIter->first) ) { + if ( aFilter.getLength() ) + aFilter.append(aAnd); + aFilter.append(::dbtools::quoteName( aQuote,sSelectTableName)); aFilter.append(s_sDot); - aFilter.append(::dbtools::quoteName( aQuote,*pSelectColumnName)); + aFilter.append(::dbtools::quoteName( aQuote,aPosIter->first)); aFilter.append(s_sParam); - if ( (pSelectColumnName+1) != pSelectColumnEnd ) - aFilter.append(aAnd); } } break; @@ -502,7 +518,8 @@ void SAL_CALL OKeySet::updateRow(const ORowSetRow& _rInsertRow ,const ORowSetRow SelectColumnsMetaData::const_iterator aEnd = m_pColumnNames->end(); for(;aIter != aEnd;++aIter,++i) { - if(xKeyColumns.is() && xKeyColumns->hasByName(aIter->first)) + //if(xKeyColumns.is() && xKeyColumns->hasByName(aIter->first)) + if ( m_pKeyColumnNames->find(aIter->first) != m_pKeyColumnNames->end() ) { sKeyCondition.append(::dbtools::quoteName( aQuote,aIter->first)); if((_rOrginalRow->get())[aIter->second.nPosition].isNull()) @@ -597,7 +614,8 @@ void SAL_CALL OKeySet::updateRow(const ORowSetRow& _rInsertRow ,const ORowSetRow ::std::vector<sal_Int32>::iterator aIdxColIter = aIndexColumnPositions.begin(); ::std::vector<sal_Int32>::iterator aIdxColEnd = aIndexColumnPositions.end(); j = 0; - for(;aIdxColIter != aIdxColEnd;++aIdxColIter,++i,++j) + aIter = m_pColumnNames->begin(); + for(;aIdxColIter != aIdxColEnd;++aIdxColIter,++i,++j,++aIter) { setParameter(i,xParameter,(_rOrginalRow->get())[*aIdxColIter],(_rOrginalRow->get())[*aIdxColIter].getTypeKind(),aIter->second.nScale); } @@ -829,7 +847,7 @@ void SAL_CALL OKeySet::deleteRow(const ORowSetRow& _rDeleteRow,const connectivit sal_Int32 i = 1; for(i = 1;aIter != aEnd;++aIter,++i) { - if(xKeyColumns.is() && xKeyColumns->hasByName(aIter->first)) + if ( m_pKeyColumnNames->find(aIter->first) != m_pKeyColumnNames->end() ) { aSql.append(::dbtools::quoteName( aQuote,aIter->first)); if((_rDeleteRow->get())[aIter->second.nPosition].isNull()) @@ -882,7 +900,8 @@ void SAL_CALL OKeySet::deleteRow(const ORowSetRow& _rDeleteRow,const connectivit // now we have to set the index values ::std::vector<sal_Int32>::iterator aIdxColIter = aIndexColumnPositions.begin(); ::std::vector<sal_Int32>::iterator aIdxColEnd = aIndexColumnPositions.end(); - for(;aIdxColIter != aIdxColEnd;++aIdxColIter,++i) + aIter = m_pColumnNames->begin(); + for(;aIdxColIter != aIdxColEnd;++aIdxColIter,++i,++aIter) { setParameter(i,xParameter,(_rDeleteRow->get())[*aIdxColIter],(_rDeleteRow->get())[*aIdxColIter].getTypeKind(),aIter->second.nScale); } @@ -1397,7 +1416,7 @@ sal_Bool SAL_CALL OKeySet::rowDeleted( ) throw(SQLException, RuntimeException) namespace dbaccess { void getColumnPositions(const Reference<XNameAccess>& _rxQueryColumns, - const Reference<XNameAccess>& _rxColumns, + const Sequence< ::rtl::OUString>& _aColumnNames, const ::rtl::OUString& _rsUpdateTableName, SelectColumnsMetaData& _rColumnNames) { @@ -1406,9 +1425,8 @@ namespace dbaccess const ::rtl::OUString* pSelBegin = aSelNames.getConstArray(); const ::rtl::OUString* pSelEnd = pSelBegin + aSelNames.getLength(); - Sequence< ::rtl::OUString> aColumnNames(_rxColumns->getElementNames()); - const ::rtl::OUString* pColumnIter = aColumnNames.getConstArray(); - const ::rtl::OUString* pColumnEnd = pColumnIter + aColumnNames.getLength(); + const ::rtl::OUString* pColumnIter = _aColumnNames.getConstArray(); + const ::rtl::OUString* pColumnEnd = pColumnIter + _aColumnNames.getLength(); ::comphelper::UStringMixLess aTmp(_rColumnNames.key_comp()); ::comphelper::UStringMixEqual bCase(static_cast< ::comphelper::UStringMixLess*>(&aTmp)->isCaseSensitive()); @@ -1442,7 +1460,7 @@ namespace dbaccess break; } } - pColumnIter = aColumnNames.getConstArray(); + pColumnIter = _aColumnNames.getConstArray(); } } } diff --git a/dbaccess/source/core/api/KeySet.hxx b/dbaccess/source/core/api/KeySet.hxx index 4193f60506d1..7a213d05b466 100644 --- a/dbaccess/source/core/api/KeySet.hxx +++ b/dbaccess/source/core/api/KeySet.hxx @@ -83,7 +83,7 @@ namespace dbaccess // the elements of _rxQueryColumns must have the properties PROPERTY_REALNAME and PROPERTY_TABLENAME void getColumnPositions(const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& _rxQueryColumns, - const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& _rxColumns, + const ::com::sun::star::uno::Sequence< ::rtl::OUString>& _aColumnNames, const ::rtl::OUString& _rsUpdateTableName, SelectColumnsMetaData& _rColumnNames /* out */); diff --git a/dbaccess/source/core/api/RowSet.cxx b/dbaccess/source/core/api/RowSet.cxx index d3df4552126c..60624a02297d 100644 --- a/dbaccess/source/core/api/RowSet.cxx +++ b/dbaccess/source/core/api/RowSet.cxx @@ -68,6 +68,7 @@ #include <comphelper/componentcontext.hxx> #include <comphelper/extract.hxx> +#include <connectivity/BlobHelper.hxx> #include <comphelper/interaction.hxx> #include <comphelper/property.hxx> #include <comphelper/seqstream.hxx> @@ -713,7 +714,18 @@ void ORowSet::updateValue(sal_Int32 columnIndex,const ORowSetValue& x) // XRowUpdate void SAL_CALL ORowSet::updateNull( sal_Int32 columnIndex ) throw(SQLException, RuntimeException) { - updateValue(columnIndex,ORowSetValue()); + ::connectivity::checkDisposed(ORowSet_BASE1::rBHelper.bDisposed); + + ::osl::MutexGuard aGuard( *m_pMutex ); + checkUpdateConditions(columnIndex); + checkUpdateIterator(); + + ::connectivity::ORowSetValue aOldValue(((*m_aCurrentRow)->get())[columnIndex]); + m_pCache->updateNull(columnIndex); + // we have to notify all listeners + ((*m_aCurrentRow)->get())[columnIndex].setNull(); + firePropertyChange(columnIndex-1 ,aOldValue); + fireProperty(PROPERTY_ID_ISMODIFIED,sal_True,sal_False); } // ------------------------------------------------------------------------- void SAL_CALL ORowSet::updateBoolean( sal_Int32 columnIndex, sal_Bool x ) throw(SQLException, RuntimeException) @@ -785,25 +797,23 @@ void SAL_CALL ORowSet::updateBinaryStream( sal_Int32 columnIndex, const Referenc checkUpdateConditions(columnIndex); checkUpdateIterator(); - ::connectivity::ORowSetValue aOldValue; - if(((*m_aCurrentRow)->get())[columnIndex].getTypeKind() == DataType::BLOB) - { - m_pCache->updateBinaryStream(columnIndex,x,length); - aOldValue = ((*m_aCurrentRow)->get())[columnIndex]; - ((*m_aCurrentRow)->get())[columnIndex] = makeAny(x); - } - else + + //if(((*m_aCurrentRow)->get())[columnIndex].getTypeKind() == DataType::BLOB) + //{ + // ::connectivity::ORowSetValue aOldValue = ((*m_aCurrentRow)->get())[columnIndex]; + // m_pCache->updateBinaryStream(columnIndex,x,length); + // ((*m_aCurrentRow)->get())[columnIndex] = makeAny(x); + // ((*m_aCurrentRow)->get())[columnIndex].setTypeKind(DataType::BLOB); + // firePropertyChange(columnIndex-1 ,aOldValue); + // fireProperty(PROPERTY_ID_ISMODIFIED,sal_True,sal_False); + //} + //else { Sequence<sal_Int8> aSeq; if(x.is()) x->readBytes(aSeq,length); updateValue(columnIndex,aSeq); - aOldValue = ((*m_aCurrentRow)->get())[columnIndex]; - ((*m_aCurrentRow)->get())[columnIndex] = aSeq; } - - firePropertyChange(columnIndex-1 ,aOldValue); - fireProperty(PROPERTY_ID_ISMODIFIED,sal_True,sal_False); } // ------------------------------------------------------------------------- void SAL_CALL ORowSet::updateCharacterStream( sal_Int32 columnIndex, const Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ) throw(SQLException, RuntimeException) @@ -1380,14 +1390,19 @@ Reference< XRef > SAL_CALL ORowSet::getRef( sal_Int32 /*columnIndex*/ ) throw(SQ return Reference< XRef >(); } // ------------------------------------------------------------------------- -Reference< XBlob > SAL_CALL ORowSet::getBlob( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException) +Reference< XBlob > SAL_CALL ORowSet::getBlob( sal_Int32 columnIndex ) throw(SQLException, RuntimeException) { - return Reference< XBlob >(); + if ( m_pCache && isInsertRow() ) + { + checkCache(); + return new ::connectivity::BlobHelper(((*m_pCache->m_aInsertRow)->get())[m_nLastColumnIndex = columnIndex].getSequence()); + } + return ORowSetBase::getBlob(columnIndex); } // ------------------------------------------------------------------------- -Reference< XClob > SAL_CALL ORowSet::getClob( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException) +Reference< XClob > SAL_CALL ORowSet::getClob( sal_Int32 columnIndex ) throw(SQLException, RuntimeException) { - return Reference< XClob >(); + return Reference< XClob >(getInsertValue(columnIndex).makeAny(),UNO_QUERY); } // ------------------------------------------------------------------------- Reference< XArray > SAL_CALL ORowSet::getArray( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException) @@ -2737,7 +2752,8 @@ ORowSetClone::ORowSetClone( const ::comphelper::ComponentContext& _rContext, ORo m_aDataColumns.push_back(pColumn); pColumn->setFastPropertyValue_NoBroadcast(PROPERTY_ID_ALIGN,xColumn->getPropertyValue(PROPERTY_ALIGN)); - sal_Int32 nFormatKey = comphelper::getINT32(xColumn->getPropertyValue(PROPERTY_NUMBERFORMAT)); + sal_Int32 nFormatKey = 0; + xColumn->getPropertyValue(PROPERTY_NUMBERFORMAT) >>= nFormatKey; if(!nFormatKey && xColumn.is() && m_xNumberFormatTypes.is()) nFormatKey = ::dbtools::getDefaultNumberFormat(xColumn,m_xNumberFormatTypes,aLocale); pColumn->setFastPropertyValue_NoBroadcast(PROPERTY_ID_NUMBERFORMAT,makeAny(nFormatKey)); diff --git a/dbaccess/source/core/api/RowSetBase.cxx b/dbaccess/source/core/api/RowSetBase.cxx index a8894bcf5f1b..d8449094fa85 100644 --- a/dbaccess/source/core/api/RowSetBase.cxx +++ b/dbaccess/source/core/api/RowSetBase.cxx @@ -469,18 +469,16 @@ Reference< XRef > SAL_CALL ORowSetBase::getRef( sal_Int32 /*columnIndex*/ ) thro return NULL; } // ------------------------------------------------------------------------- -Reference< XBlob > SAL_CALL ORowSetBase::getBlob( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException) +Reference< XBlob > SAL_CALL ORowSetBase::getBlob( sal_Int32 columnIndex ) throw(SQLException, RuntimeException) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ORowSetBase::getBlob" ); - ::dbtools::throwFeatureNotImplementedException( "XRow::getBlob", *m_pMySelf ); - return NULL; + return Reference< XBlob >(getValue(columnIndex).makeAny(),UNO_QUERY); } // ------------------------------------------------------------------------- -Reference< XClob > SAL_CALL ORowSetBase::getClob( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException) +Reference< XClob > SAL_CALL ORowSetBase::getClob( sal_Int32 columnIndex ) throw(SQLException, RuntimeException) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ORowSetBase::getClob" ); - ::dbtools::throwFeatureNotImplementedException( "XRow::getClob", *m_pMySelf ); - return NULL; + return Reference< XClob >(getValue(columnIndex).makeAny(),UNO_QUERY); } // ------------------------------------------------------------------------- Reference< XArray > SAL_CALL ORowSetBase::getArray( sal_Int32 /*columnIndex*/ ) throw(SQLException, RuntimeException) diff --git a/dbaccess/source/core/api/RowSetCache.cxx b/dbaccess/source/core/api/RowSetCache.cxx index a96de4b9fbe1..4156c32635a2 100644 --- a/dbaccess/source/core/api/RowSetCache.cxx +++ b/dbaccess/source/core/api/RowSetCache.cxx @@ -168,6 +168,16 @@ ORowSetCache::ORowSetCache(const Reference< XResultSet >& _xRs, Reference< XIndexAccess> xUpdateTableKeys; ::rtl::OUString aUpdateTableName = _rUpdateTableName; Reference< XConnection> xConnection; + // first we need a connection + Reference< XStatement> xStmt(_xRs->getStatement(),UNO_QUERY); + if(xStmt.is()) + xConnection = xStmt->getConnection(); + else + { + Reference< XPreparedStatement> xPrepStmt(_xRs->getStatement(),UNO_QUERY); + xConnection = xPrepStmt->getConnection(); + } + OSL_ENSURE(xConnection.is(),"No connection!"); if(_xAnalyzer.is()) { try @@ -215,16 +225,7 @@ ORowSetCache::ORowSetCache(const Reference< XResultSet >& _xRs, if(xColumnsSupplier.is()) { - // first we need a connection - Reference< XStatement> xStmt(_xRs->getStatement(),UNO_QUERY); - if(xStmt.is()) - xConnection = xStmt->getConnection(); - else - { - Reference< XPreparedStatement> xPrepStmt(_xRs->getStatement(),UNO_QUERY); - xConnection = xPrepStmt->getConnection(); - } - OSL_ENSURE(xConnection.is(),"No connection!"); + Reference<XNameAccess> xColumns = xColumnsSupplier->getColumns(); Reference<XColumnsSupplier> xColSup(_xAnalyzer,UNO_QUERY); @@ -233,7 +234,7 @@ ORowSetCache::ORowSetCache(const Reference< XResultSet >& _xRs, Reference<XNameAccess> xSelColumns = xColSup->getColumns(); Reference<XDatabaseMetaData> xMeta = xConnection->getMetaData(); SelectColumnsMetaData aColumnNames(xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers() ? true : false); - ::dbaccess::getColumnPositions(xSelColumns,xColumns,aUpdateTableName,aColumnNames); + ::dbaccess::getColumnPositions(xSelColumns,xColumns->getElementNames(),aUpdateTableName,aColumnNames); bAllKeysFound = !aColumnNames.empty() && sal_Int32(aColumnNames.size()) == xColumns->getElementNames().getLength(); } } @@ -303,7 +304,7 @@ ORowSetCache::ORowSetCache(const Reference< XResultSet >& _xRs, Reference<XColumnsSupplier> xColSup(_xAnalyzer,UNO_QUERY); Reference<XNameAccess> xSelColumns = xColSup->getColumns(); Reference<XNameAccess> xColumns = m_aUpdateTable->getColumns(); - ::dbaccess::getColumnPositions(xSelColumns,xColumns,aUpdateTableName,aColumnNames); + ::dbaccess::getColumnPositions(xSelColumns,xColumns->getElementNames(),aUpdateTableName,aColumnNames); // check privileges m_nPrivileges = Privilege::SELECT; @@ -560,10 +561,18 @@ sal_Int32 ORowSetCache::hashBookmark( const Any& bookmark ) // ------------------------------------------------------------------------- // XRowUpdate // ----------------------------------------------------------------------------- -void ORowSetCache::updateValue(sal_Int32 columnIndex,const ORowSetValue& x) +void ORowSetCache::updateNull(sal_Int32 columnIndex) { checkUpdateConditions(columnIndex); + ((*m_aInsertRow)->get())[columnIndex].setBound(sal_True); + ((*m_aInsertRow)->get())[columnIndex].setNull(); + ((*m_aInsertRow)->get())[columnIndex].setModified(); +} +// ----------------------------------------------------------------------------- +void ORowSetCache::updateValue(sal_Int32 columnIndex,const ORowSetValue& x) +{ + checkUpdateConditions(columnIndex); ((*m_aInsertRow)->get())[columnIndex].setBound(sal_True); ((*m_aInsertRow)->get())[columnIndex] = x; @@ -1342,11 +1351,12 @@ void ORowSetCache::moveToInsertRow( ) // we don't unbound the bookmark column ORowSetValueVector::Vector::iterator aIter = (*m_aInsertRow)->get().begin()+1; ORowSetValueVector::Vector::iterator aEnd = (*m_aInsertRow)->get().end(); - for(;aIter != aEnd;++aIter) + for(sal_Int32 i = 1;aIter != aEnd;++aIter,++i) { aIter->setBound(sal_False); aIter->setModified(sal_False); aIter->setNull(); + aIter->setTypeKind(m_xMetaData->getColumnType(i)); } } // ------------------------------------------------------------------------- diff --git a/dbaccess/source/core/api/RowSetCache.hxx b/dbaccess/source/core/api/RowSetCache.hxx index 0576aa68ac02..1f5be3113f8b 100644 --- a/dbaccess/source/core/api/RowSetCache.hxx +++ b/dbaccess/source/core/api/RowSetCache.hxx @@ -225,6 +225,7 @@ namespace dbaccess void updateCharacterStream( sal_Int32 columnIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& x, sal_Int32 length ); void updateObject( sal_Int32 columnIndex, const ::com::sun::star::uno::Any& x ); void updateNumericObject( sal_Int32 columnIndex, const ::com::sun::star::uno::Any& x, sal_Int32 scale ); + void updateNull(sal_Int32 columnIndex); // ::com::sun::star::sdbc::XResultSet sal_Bool next( ); diff --git a/dbaccess/source/core/api/SingleSelectQueryComposer.cxx b/dbaccess/source/core/api/SingleSelectQueryComposer.cxx index 10878f599c4f..9b8bae551cf1 100644 --- a/dbaccess/source/core/api/SingleSelectQueryComposer.cxx +++ b/dbaccess/source/core/api/SingleSelectQueryComposer.cxx @@ -1530,6 +1530,27 @@ void OSingleSelectQueryComposer::setConditionByColumn( const Reference< XPropert aSQL.append( STR_LIKE ); aSQL.append( DBTypeConversion::toSQLString( nType, aValue, sal_True, m_xTypeConverter ) ); break; + case DataType::CLOB: + { + Reference< XClob > xClob(aValue,UNO_QUERY); + if ( xClob.is() ) + { + const ::sal_Int64 nLength = xClob->length(); + if ( sal_Int64(nLength + aSQL.getLength() + STR_LIKE.getLength() ) < sal_Int64(SAL_MAX_INT32) ) + { + aSQL.append( STR_LIKE ); + aSQL.appendAscii("'"); + aSQL.append( xClob->getSubString(1,(sal_Int32)nLength) ); + aSQL.appendAscii("'"); + } + } + else + { + aSQL.append( STR_LIKE ); + aSQL.append( DBTypeConversion::toSQLString( nType, aValue, sal_True, m_xTypeConverter ) ); + } + } + break; case DataType::VARBINARY: case DataType::BINARY: case DataType::LONGVARBINARY: diff --git a/dbaccess/source/core/api/TableDeco.cxx b/dbaccess/source/core/api/TableDeco.cxx index b0fa5b7492c6..c8225f1d7a28 100644 --- a/dbaccess/source/core/api/TableDeco.cxx +++ b/dbaccess/source/core/api/TableDeco.cxx @@ -706,7 +706,7 @@ OColumn* ODBTableDecorator::createColumn(const ::rtl::OUString& _rName) const if ( m_xColumnDefinitions.is() && m_xColumnDefinitions->hasByName(_rName)) xColumnDefintion.set(m_xColumnDefinitions->getByName(_rName),UNO_QUERY); - pReturn = new OTableColumnWrapper(xProp,xColumnDefintion); + pReturn = new OTableColumnWrapper( xProp, xColumnDefintion, false ); } } return pReturn; @@ -734,8 +734,8 @@ Reference< XPropertySet > ODBTableDecorator::createColumnDescriptor() if(m_xTable.is()) xNames.set(m_xTable->getColumns(),UNO_QUERY); Reference< XPropertySet > xRet; - if(xNames.is()) - xRet = new OTableColumnDescriptorWrapper(xNames->createDataDescriptor()); + if ( xNames.is() ) + xRet = new OTableColumnDescriptorWrapper( xNames->createDataDescriptor(), false, true ); return xRet; } // ----------------------------------------------------------------------------- diff --git a/dbaccess/source/core/api/column.cxx b/dbaccess/source/core/api/column.cxx index 0dde122faa1a..f789394d23f9 100644 --- a/dbaccess/source/core/api/column.cxx +++ b/dbaccess/source/core/api/column.cxx @@ -31,78 +31,31 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_dbaccess.hxx" -#ifndef _DBA_COREAPI_COLUMN_HXX_ +#include "ContainerMediator.hxx" +#include "apitools.hxx" #include "column.hxx" -#endif -#ifndef DBACCESS_SHARED_DBASTRINGS_HRC -#include "dbastrings.hrc" -#endif -#ifndef _DBA_CORE_RESOURCE_HXX_ -#include "core_resource.hxx" -#endif -#ifndef _DBA_CORE_RESOURCE_HRC_ #include "core_resource.hrc" -#endif -#ifndef _DBASHARED_APITOOLS_HXX_ -#include "apitools.hxx" -#endif -#ifndef _COM_SUN_STAR_SDBC_COLUMNVALUE_HPP_ +#include "core_resource.hxx" +#include "dbastrings.hrc" +#include "sdbcoretools.hxx" + +#include <com/sun/star/lang/DisposedException.hpp> #include <com/sun/star/sdbc/ColumnValue.hpp> -#endif -#ifndef _CPPUHELPER_TYPEPROVIDER_HXX_ -#include <cppuhelper/typeprovider.hxx> -#endif -#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_ #include <com/sun/star/sdbc/DataType.hpp> -#endif -#ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_ -#include <com/sun/star/lang/DisposedException.hpp> -#endif -#ifndef _COMPHELPER_SEQUENCE_HXX_ -#include <comphelper/sequence.hxx> -#endif -#ifndef _COMPHELPER_PROPERTY_HXX_ -#include <comphelper/property.hxx> -#endif -#ifndef _COMPHELPER_ENUMHELPER_HXX_ + +#include <comphelper/basicio.hxx> #include <comphelper/enumhelper.hxx> -#endif -#ifndef _COMPHELPER_TYPES_HXX_ -#include <comphelper/types.hxx> -#endif -#ifndef _COMPHELPER_EXTRACT_HXX_ #include <comphelper/extract.hxx> -#endif -#ifndef _OSL_DIAGNOSE_H_ -#include <osl/diagnose.h> -#endif -#ifndef _COMPHELPER_SEQSTREAM_HXX +#include <comphelper/property.hxx> #include <comphelper/seqstream.hxx> -#endif -#ifndef _COMPHELPER_BASIC_IO_HXX_ -#include <comphelper/basicio.hxx> -#endif -#ifndef _TOOLS_DEBUG_HXX -#include <tools/debug.hxx> -#endif -#ifndef CONNECTIVITY_TABLEHELPER_HXX +#include <comphelper/sequence.hxx> +#include <comphelper/types.hxx> #include <connectivity/TTableHelper.hxx> -#endif -#ifndef _DBACORE_DEFINITIONCOLUMN_HXX_ -#include "definitioncolumn.hxx" -#endif -#ifndef _CONNECTIVITY_DBTOOLS_HXX_ -#include <connectivity/dbtools.hxx> -#endif -#ifndef _DBHELPER_DBEXCEPTION_HXX_ #include <connectivity/dbexception.hxx> -#endif -#ifndef DBA_CONTAINERMEDIATOR_HXX -#include "ContainerMediator.hxx" -#endif -#ifndef DBACORE_SDBCORETOOLS_HXX -#include "sdbcoretools.hxx" -#endif +#include <connectivity/dbtools.hxx> +#include <cppuhelper/typeprovider.hxx> +#include <osl/diagnose.h> +#include <tools/debug.hxx> #include <algorithm> @@ -128,11 +81,14 @@ DBG_NAME(OColumn) //= OColumn //============================================================ //-------------------------------------------------------------------------- -OColumn::OColumn() - :OColumnBase(m_aMutex) - , OPropertySetHelper(OColumnBase::rBHelper) +OColumn::OColumn( const bool _bNameIsReadOnly ) + :OColumnBase( m_aMutex ) + ,::comphelper::OPropertyContainer( OColumnBase::rBHelper ) { DBG_CTOR(OColumn, NULL); + + registerProperty( PROPERTY_NAME, PROPERTY_ID_NAME, _bNameIsReadOnly ? PropertyAttribute::READONLY : 0, + &m_sName, ::getCppuType( &m_sName ) ); } //-------------------------------------------------------------------------- @@ -145,37 +101,14 @@ OColumn::~OColumn() //-------------------------------------------------------------------------- Sequence< Type > OColumn::getTypes() throw (RuntimeException) { - OTypeCollection aTypes(::getCppuType( (const Reference< XPropertySet > *)0 ), - ::getCppuType( (const Reference< XMultiPropertySet > *)0 ), - OColumnBase::getTypes()); - return aTypes.getTypes(); + return ::comphelper::concatSequences( + OColumnBase::getTypes(), + ::comphelper::OPropertyContainer::getTypes() + ); } // com::sun::star::uno::XInterface -//-------------------------------------------------------------------------- -Any OColumn::queryInterface( const Type & rType ) throw (RuntimeException) -{ - Any aIface = OColumnBase::queryInterface( rType ); - if (!aIface.hasValue()) - aIface = ::cppu::queryInterface( - rType, - static_cast< XPropertySet * >( this ), - static_cast< XMultiPropertySet * >( this )); - - return aIface; -} - -//-------------------------------------------------------------------------- -void OColumn::acquire() throw() -{ - OColumnBase::acquire(); -} - -//-------------------------------------------------------------------------- -void OColumn::release() throw() -{ - OColumnBase::release(); -} +IMPLEMENT_FORWARD_XINTERFACE2( OColumn, OColumnBase, ::comphelper::OPropertyContainer ) // ::com::sun::star::lang::XServiceInfo //------------------------------------------------------------------------------ @@ -202,7 +135,7 @@ Sequence< ::rtl::OUString > OColumn::getSupportedServiceNames( ) throw (Runtime //------------------------------------------------------------------------------ void OColumn::disposing() { - OPropertySetHelper::disposing(); + OPropertyContainer::disposing(); } // com::sun::star::beans::XPropertySet @@ -212,77 +145,6 @@ Reference< XPropertySetInfo > OColumn::getPropertySetInfo() throw (RuntimeExcept return createPropertySetInfo( getInfoHelper() ) ; } -//------------------------------------------------------------------------------ -void OColumn::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const -{ - switch (nHandle) - { - case PROPERTY_ID_NAME: - rValue <<= m_sName; - break; - } -} - -//------------------------------------------------------------------------------ -sal_Bool OColumn::convertFastPropertyValue( - Any & rConvertedValue, - Any & rOldValue, - sal_Int32 nHandle, - const Any& rValue ) - throw (IllegalArgumentException) -{ - sal_Bool bModified = sal_False; - switch (nHandle) - { - case PROPERTY_ID_NAME: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_sName); - break; - } - return bModified; -} - -//------------------------------------------------------------------------------ -void OColumn::setFastPropertyValue_NoBroadcast( - sal_Int32 nHandle, - const Any& rValue - ) - throw (Exception) -{ - switch (nHandle) - { - case PROPERTY_ID_NAME: - OSL_ENSURE(rValue.getValueType().equals(::getCppuType(static_cast< ::rtl::OUString* >(NULL))), - "OColumn::setFastPropertyValue_NoBroadcast(NAME) : invalid value !"); - rValue >>= m_sName; - break; - } -} - -//-------------------------------------------------------------------------- -Sequence< sal_Int8 > OColumn::getUnoTunnelImplementationId() -{ - static ::cppu::OImplementationId * pId = 0; - if (! pId) - { - ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); - if (! pId) - { - static ::cppu::OImplementationId aId; - pId = &aId; - } - } - return pId->getImplementationId(); -} - -// com::sun::star::lang::XUnoTunnel -//------------------------------------------------------------------ -sal_Int64 OColumn::getSomething( const Sequence< sal_Int8 > & rId ) throw (RuntimeException) -{ - if (rId.getLength() == 16 && 0 == rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(), rId.getConstArray(), 16 ) ) - return reinterpret_cast<sal_Int64>(this); - - return 0; -} // ----------------------------------------------------------------------------- ::rtl::OUString SAL_CALL OColumn::getName( ) throw(::com::sun::star::uno::RuntimeException) { @@ -293,235 +155,31 @@ void SAL_CALL OColumn::setName( const ::rtl::OUString& _rName ) throw(::com::sun { m_sName = _rName; } + // ----------------------------------------------------------------------------- void OColumn::fireValueChange(const ::connectivity::ORowSetValue& /*_rOldValue*/) { DBG_ERROR( "OColumn::fireValueChange: not implemented!" ); } -// ----------------------------------------------------------------------------- -//============================================================ -//= OColumnSettings -//============================================================ -DBG_NAME( OColumnSettings ) -//------------------------------------------------------------------------------ -OColumnSettings::OColumnSettings() - :m_bHidden(sal_False) -{ - DBG_CTOR( OColumnSettings, NULL ); -} //------------------------------------------------------------------------------ -OColumnSettings::~OColumnSettings() +void OColumn::registerProperty( const ::rtl::OUString& _rName, sal_Int32 _nHandle, sal_Int32 _nAttributes, void* _pPointerToMember, const Type& _rMemberType ) { - DBG_DTOR( OColumnSettings, NULL ); -} - -// com::sun::star::lang::XUnoTunnel -//------------------------------------------------------------------ -sal_Int64 OColumnSettings::getSomething( const Sequence< sal_Int8 > & rId ) throw (RuntimeException) -{ - if ( ( rId.getLength() == 16 ) - && ( 0 == rtl_compareMemory( getUnoTunnelImplementationId().getConstArray(), rId.getConstArray(), 16 ) ) - ) - return reinterpret_cast< sal_Int64 >( this ); - - return 0; -} - -//-------------------------------------------------------------------------- -Sequence< sal_Int8 > OColumnSettings::getUnoTunnelImplementationId() -{ - static ::cppu::OImplementationId * pId = 0; - if (! pId) - { - ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); - if (! pId) - { - static ::cppu::OImplementationId aId; - pId = &aId; - } - } - return pId->getImplementationId(); + ::comphelper::OPropertyContainer::registerProperty( _rName, _nHandle, _nAttributes, _pPointerToMember, _rMemberType ); } //------------------------------------------------------------------------------ -void OColumnSettings::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const +void OColumn::registerMayBeVoidProperty( const ::rtl::OUString& _rName, sal_Int32 _nHandle, sal_Int32 _nAttributes, Any* _pPointerToMember, const Type& _rExpectedType ) { - switch (nHandle) - { - case PROPERTY_ID_ALIGN: - rValue = m_aAlignment; - break; - case PROPERTY_ID_NUMBERFORMAT: - rValue = m_aFormatKey; - break; - case PROPERTY_ID_RELATIVEPOSITION: - rValue = m_aRelativePosition; - break; - case PROPERTY_ID_WIDTH: - rValue = m_aWidth; - break; - case PROPERTY_ID_HIDDEN: - rValue.setValue(&m_bHidden, getBooleanCppuType()); - break; - case PROPERTY_ID_CONTROLMODEL: - rValue <<= m_xControlModel; - break; - case PROPERTY_ID_HELPTEXT: - rValue = m_aHelpText; - break; - case PROPERTY_ID_CONTROLDEFAULT: - rValue = m_aControlDefault; - break; - } + ::comphelper::OPropertyContainer::registerMayBeVoidProperty( _rName, _nHandle, _nAttributes, _pPointerToMember, _rExpectedType ); } //------------------------------------------------------------------------------ -sal_Bool OColumnSettings::convertFastPropertyValue( - Any & rConvertedValue, - Any & rOldValue, - sal_Int32 nHandle, - const Any& rValue ) - throw (IllegalArgumentException) -{ - sal_Bool bModified = sal_False; - switch (nHandle) - { - case PROPERTY_ID_ALIGN: - bModified = !uno_type_equalData( - const_cast< void* >( m_aAlignment.getValue() ), m_aAlignment.getValueType().getTypeLibType(), - const_cast< void* >( rValue.getValue() ), rValue.getValueType().getTypeLibType(), - reinterpret_cast< uno_QueryInterfaceFunc >( cpp_queryInterface ), - reinterpret_cast< uno_ReleaseFunc >( cpp_release ) - ); - if ( bModified ) - { - rConvertedValue = rValue; - rOldValue = m_aAlignment; - } - break; - case PROPERTY_ID_WIDTH: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_aWidth, - ::getCppuType(static_cast< sal_Int32* >(NULL))); - break; - case PROPERTY_ID_HIDDEN: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bHidden); - break; - case PROPERTY_ID_RELATIVEPOSITION: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_aRelativePosition, - ::getCppuType(static_cast< sal_Int32* >(NULL))); - break; - case PROPERTY_ID_NUMBERFORMAT: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_aFormatKey, - ::getCppuType(static_cast< sal_Int32* >(NULL))); - break; - case PROPERTY_ID_CONTROLMODEL: - { - Reference< XPropertySet > xTest; - if (!::cppu::extractInterface(xTest, rValue)) - throw IllegalArgumentException(); - if (xTest.get() != m_xControlModel.get()) - { - bModified = sal_True; - rOldValue <<= m_xControlModel; - rConvertedValue <<= rValue; - } - } - break; - case PROPERTY_ID_HELPTEXT: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_aHelpText, - ::getCppuType(static_cast< ::rtl::OUString* >(NULL))); - break; - case PROPERTY_ID_CONTROLDEFAULT: - bModified = rValue != m_aControlDefault; - if ( bModified ) - { - rConvertedValue = rValue; - rOldValue = m_aControlDefault; - } - break; - } - return bModified; -} - -//------------------------------------------------------------------------------ -void OColumnSettings::setFastPropertyValue_NoBroadcast( - sal_Int32 nHandle, - const Any& rValue - ) - throw (Exception) +void OColumn::registerPropertyNoMember( const ::rtl::OUString& _rName, sal_Int32 _nHandle, sal_Int32 _nAttributes, const Type& _rType, const void* _pInitialValue ) { - switch (nHandle) - { - case PROPERTY_ID_ALIGN: - { - if ( rValue.hasValue() ) - { - sal_Int32 nAlign = 0; - sal_Bool bSuccess = - // copy the data from the to-be-set value - uno_type_assignData( - static_cast< void* >( &nAlign ), ::getCppuType(static_cast< sal_Int32* >(NULL)).getTypeLibType(), - const_cast< void* >( rValue.getValue() ), rValue.getValueType().getTypeLibType(), - reinterpret_cast< uno_QueryInterfaceFunc >( cpp_queryInterface ), - reinterpret_cast< uno_AcquireFunc >( cpp_acquire ), - reinterpret_cast< uno_ReleaseFunc >( cpp_release ) ); - - OSL_ENSURE( bSuccess, - "OPropertyStateContainer::setFastPropertyValue_NoBroadcast : ooops .... the value could not be assigned!"); - if ( bSuccess ) - m_aAlignment <<= nAlign; - } - else - m_aAlignment = rValue; - } - - break; - case PROPERTY_ID_WIDTH: - OSL_ENSURE(!rValue.hasValue() || rValue.getValueType().equals(::getCppuType(static_cast< sal_Int32* >(NULL))), - "OColumnSettings::setFastPropertyValue_NoBroadcast(WIDTH) : invalid value !"); - m_aWidth = rValue; - break; - case PROPERTY_ID_NUMBERFORMAT: - OSL_ENSURE(!rValue.hasValue() || rValue.getValueType().equals(::getCppuType(static_cast< sal_Int32* >(NULL))), - "OColumnSettings::setFastPropertyValue_NoBroadcast(NUMBERFORMAT) : invalid value !"); - m_aFormatKey = rValue; - break; - case PROPERTY_ID_RELATIVEPOSITION: - OSL_ENSURE(!rValue.hasValue() || rValue.getValueType().equals(::getCppuType(static_cast< sal_Int32* >(NULL))), - "OColumnSettings::setFastPropertyValue_NoBroadcast(ID_RELATIVEPOSITION) : invalid value !"); - m_aRelativePosition = rValue; - break; - case PROPERTY_ID_HIDDEN: - OSL_ENSURE(rValue.getValueType().equals(::getBooleanCppuType()), - "OColumnSettings::setFastPropertyValue_NoBroadcast(HIDDEN) : invalid value !"); - m_bHidden = ::comphelper::getBOOL(rValue); - break; - case PROPERTY_ID_HELPTEXT: - OSL_ENSURE(!rValue.hasValue() || rValue.getValueType().equals(::getCppuType(static_cast< ::rtl::OUString* >(NULL))), - "OColumnSettings::setFastPropertyValue_NoBroadcast(ID_RELATIVEPOSITION) : invalid value !"); - m_aHelpText = rValue; - break; - case PROPERTY_ID_CONTROLDEFAULT: - m_aControlDefault = rValue; - break; - } + ::comphelper::OPropertyContainer::registerPropertyNoMember( _rName, _nHandle, _nAttributes, _rType, _pInitialValue ); } - -//------------------------------------------------------------------------------ -sal_Bool OColumnSettings::isDefaulted() const -{ - return !m_aAlignment.hasValue() - && !m_aWidth.hasValue() - && !m_aFormatKey.hasValue() - && !m_aRelativePosition.hasValue() - && !m_aHelpText.hasValue() - && !m_aControlDefault.hasValue() - && !m_bHidden; -} - - //============================================================ //= OColumns //============================================================ @@ -547,6 +205,7 @@ OColumns::OColumns(::cppu::OWeakObject& _rParent, { DBG_CTOR(OColumns, NULL); } + // ------------------------------------------------------------------------- OColumns::OColumns(::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex, const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >& _rxDrvColumns, diff --git a/dbaccess/source/core/api/columnsettings.cxx b/dbaccess/source/core/api/columnsettings.cxx new file mode 100644 index 000000000000..3aba07d88749 --- /dev/null +++ b/dbaccess/source/core/api/columnsettings.cxx @@ -0,0 +1,181 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* <http://www.openoffice.org/license.html> +* for a copy of the LGPLv3 License. +************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_dbaccess.hxx" + +#include "columnsettings.hxx" +#include "dbastrings.hrc" + +/** === begin UNO includes === **/ +#include <com/sun/star/beans/PropertyAttribute.hpp> +/** === end UNO includes === **/ + +#include <cppuhelper/typeprovider.hxx> +#include <comphelper/property.hxx> +#include <tools/debug.hxx> +#include <tools/diagnose_ex.h> + +//........................................................................ +namespace dbaccess +{ +//........................................................................ + + /** === begin UNO using === **/ + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::XInterface; + using ::com::sun::star::uno::UNO_QUERY; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::UNO_SET_THROW; + using ::com::sun::star::uno::Exception; + using ::com::sun::star::uno::RuntimeException; + using ::com::sun::star::uno::Any; + using ::com::sun::star::uno::makeAny; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::uno::Type; + using ::com::sun::star::lang::IllegalArgumentException; + using ::com::sun::star::beans::XPropertySet; + using ::com::sun::star::beans::XPropertySetInfo; + /** === end UNO using === **/ + namespace PropertyAttribute = ::com::sun::star::beans::PropertyAttribute; + + //============================================================================== + //= OColumnSettings + //============================================================================== + DBG_NAME( OColumnSettings ) + //------------------------------------------------------------------------------ + OColumnSettings::OColumnSettings() + :m_bHidden(sal_False) + { + DBG_CTOR( OColumnSettings, NULL ); + } + + //------------------------------------------------------------------------------ + OColumnSettings::~OColumnSettings() + { + DBG_DTOR( OColumnSettings, NULL ); + } + + //------------------------------------------------------------------------------ + void OColumnSettings::registerProperties( IPropertyContainer& _rPropertyContainer ) + { + const sal_Int32 nBoundAttr = PropertyAttribute::BOUND; + const sal_Int32 nMayBeVoidAttr = PropertyAttribute::MAYBEVOID | nBoundAttr; + + const Type& rSalInt32Type = ::getCppuType( static_cast< sal_Int32* >( NULL ) ); + const Type& rStringType = ::getCppuType( static_cast< ::rtl::OUString* >( NULL ) ); + + _rPropertyContainer.registerMayBeVoidProperty( PROPERTY_ALIGN, PROPERTY_ID_ALIGN, nMayBeVoidAttr, &m_aAlignment, rSalInt32Type ); + _rPropertyContainer.registerMayBeVoidProperty( PROPERTY_NUMBERFORMAT, PROPERTY_ID_NUMBERFORMAT, nMayBeVoidAttr, &m_aFormatKey, rSalInt32Type ); + _rPropertyContainer.registerMayBeVoidProperty( PROPERTY_RELATIVEPOSITION, PROPERTY_ID_RELATIVEPOSITION, nMayBeVoidAttr, &m_aRelativePosition, rSalInt32Type ); + _rPropertyContainer.registerMayBeVoidProperty( PROPERTY_WIDTH, PROPERTY_ID_WIDTH, nMayBeVoidAttr, &m_aWidth, rSalInt32Type ); + _rPropertyContainer.registerMayBeVoidProperty( PROPERTY_HELPTEXT, PROPERTY_ID_HELPTEXT, nMayBeVoidAttr, &m_aHelpText, rStringType ); + _rPropertyContainer.registerMayBeVoidProperty( PROPERTY_CONTROLDEFAULT, PROPERTY_ID_CONTROLDEFAULT, nMayBeVoidAttr, &m_aControlDefault, rStringType ); + _rPropertyContainer.registerProperty( PROPERTY_CONTROLMODEL, PROPERTY_ID_CONTROLMODEL, nBoundAttr, &m_xControlModel, ::getCppuType( &m_xControlModel ) ); + _rPropertyContainer.registerProperty( PROPERTY_HIDDEN, PROPERTY_ID_HIDDEN, nBoundAttr, &m_bHidden, ::getCppuType( &m_bHidden ) ); + } + + //------------------------------------------------------------------------------ + bool OColumnSettings::isColumnSettingProperty( const sal_Int32 _nPropertyHandle ) + { + return ( _nPropertyHandle == PROPERTY_ID_ALIGN ) + || ( _nPropertyHandle == PROPERTY_ID_NUMBERFORMAT ) + || ( _nPropertyHandle == PROPERTY_ID_RELATIVEPOSITION ) + || ( _nPropertyHandle == PROPERTY_ID_WIDTH ) + || ( _nPropertyHandle == PROPERTY_ID_HELPTEXT ) + || ( _nPropertyHandle == PROPERTY_ID_CONTROLDEFAULT ) + || ( _nPropertyHandle == PROPERTY_ID_CONTROLMODEL ) + || ( _nPropertyHandle == PROPERTY_ID_HIDDEN ); + } + + //------------------------------------------------------------------------------ + bool OColumnSettings::isDefaulted( const sal_Int32 _nPropertyHandle, const Any& _rPropertyValue ) + { + switch ( _nPropertyHandle ) + { + case PROPERTY_ID_ALIGN: + case PROPERTY_ID_NUMBERFORMAT: + case PROPERTY_ID_RELATIVEPOSITION: + case PROPERTY_ID_WIDTH: + case PROPERTY_ID_HELPTEXT: + case PROPERTY_ID_CONTROLDEFAULT: + return !_rPropertyValue.hasValue(); + + case PROPERTY_ID_CONTROLMODEL: + return !Reference< XPropertySet >( _rPropertyValue, UNO_QUERY ).is(); + + case PROPERTY_ID_HIDDEN: + { + sal_Bool bHidden = sal_False; + OSL_VERIFY( _rPropertyValue >>= bHidden ); + return !bHidden; + } + } + OSL_ENSURE( false, "OColumnSettings::isDefaulted: illegal property handle!" ); + return sal_False; + } + + //------------------------------------------------------------------------------ + bool OColumnSettings::hasDefaultSettings( const Reference< XPropertySet >& _rxColumn ) + { + ENSURE_OR_THROW( _rxColumn.is(), "illegal column" ); + try + { + Reference< XPropertySetInfo > xPSI( _rxColumn->getPropertySetInfo(), UNO_SET_THROW ); + + struct PropertyDescriptor + { + ::rtl::OUString sName; + sal_Int32 nHandle; + }; + PropertyDescriptor aProps[] = + { + { PROPERTY_ALIGN, PROPERTY_ID_ALIGN }, + { PROPERTY_NUMBERFORMAT, PROPERTY_ID_NUMBERFORMAT }, + { PROPERTY_RELATIVEPOSITION, PROPERTY_ID_RELATIVEPOSITION }, + { PROPERTY_WIDTH, PROPERTY_ID_WIDTH }, + { PROPERTY_HELPTEXT, PROPERTY_ID_HELPTEXT }, + { PROPERTY_CONTROLDEFAULT, PROPERTY_ID_CONTROLDEFAULT }, + { PROPERTY_CONTROLMODEL, PROPERTY_ID_CONTROLMODEL }, + { PROPERTY_HIDDEN, PROPERTY_ID_HIDDEN } + }; + + for ( size_t i=0; i < sizeof( aProps ) / sizeof( aProps[0] ); ++i ) + { + if ( xPSI->hasPropertyByName( aProps[i].sName ) ) + if ( !isDefaulted( aProps[i].nHandle, _rxColumn->getPropertyValue( aProps[i].sName ) ) ) + return false; + } + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return true; + } + +//........................................................................ +} // namespace dbaccess +//........................................................................ diff --git a/dbaccess/source/core/api/datasettings.cxx b/dbaccess/source/core/api/datasettings.cxx index dcca2c34d694..8a5be80c92a2 100644 --- a/dbaccess/source/core/api/datasettings.cxx +++ b/dbaccess/source/core/api/datasettings.cxx @@ -69,6 +69,8 @@ #include <com/sun/star/awt/FontWidth.hpp> #endif +#include <typeinfo.h> + using namespace ::com::sun::star::uno; using namespace ::com::sun::star::awt; using namespace ::com::sun::star::lang; @@ -157,19 +159,25 @@ ODataSettings_Base::ODataSettings_Base() //-------------------------------------------------------------------------- ODataSettings_Base::ODataSettings_Base(const ODataSettings_Base& _rSource) + :m_sFilter( _rSource.m_sFilter ) + ,m_sHavingClause( _rSource.m_sHavingClause ) + ,m_sGroupBy( _rSource.m_sGroupBy ) + ,m_sOrder( _rSource.m_sOrder ) + ,m_bApplyFilter( _rSource.m_bApplyFilter ) + ,m_aFont( _rSource.m_aFont ) + ,m_aRowHeight( _rSource.m_aRowHeight ) + ,m_aTextColor( _rSource.m_aTextColor ) + ,m_aTextLineColor( _rSource.m_aTextLineColor ) + ,m_nFontEmphasis( _rSource.m_nFontEmphasis ) + ,m_nFontRelief( _rSource.m_nFontRelief ) +{ +} + +// ----------------------------------------------------------------------------- +ODataSettings_Base::~ODataSettings_Base() { - m_sFilter = _rSource.m_sFilter; - m_sHavingClause = _rSource.m_sHavingClause; - m_sGroupBy = _rSource.m_sGroupBy; - m_sOrder = _rSource.m_sOrder; - m_bApplyFilter = _rSource.m_bApplyFilter; - m_aFont = _rSource.m_aFont; - m_aRowHeight = _rSource.m_aRowHeight; - m_aTextColor = _rSource.m_aTextColor; - m_aTextLineColor= _rSource.m_aTextLineColor; - m_nFontEmphasis = _rSource.m_nFontEmphasis; - m_nFontRelief = _rSource.m_nFontRelief; } + // ----------------------------------------------------------------------------- void ODataSettings::getPropertyDefaultByHandle( sal_Int32 _nHandle, Any& _rDefault ) const { diff --git a/dbaccess/source/core/api/definitioncolumn.cxx b/dbaccess/source/core/api/definitioncolumn.cxx index 8d0eb5e6b265..6662b470fcae 100644 --- a/dbaccess/source/core/api/definitioncolumn.cxx +++ b/dbaccess/source/core/api/definitioncolumn.cxx @@ -31,39 +31,29 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_dbaccess.hxx" -#ifndef _DBA_COREAPI_DEFINITIONSETTINGS_HXX_ +#include "apitools.hxx" +#include "dbastrings.hrc" #include "definitioncolumn.hxx" -#endif -#ifndef _CPPUHELPER_TYPEPROVIDER_HXX_ -#include <cppuhelper/typeprovider.hxx> -#endif -#ifndef _COMPHELPER_PROPERTY_HXX_ +#include "sdbcoretools.hxx" + +/** === begin UNO includes === **/ +#include <com/sun/star/beans/PropertyAttribute.hpp> +#include <com/sun/star/sdbcx/XTablesSupplier.hpp> +/** === end UNO includes === **/ + #include <comphelper/property.hxx> -#endif -#ifndef _COMPHELPER_TYPES_HXX_ #include <comphelper/types.hxx> -#endif -#ifndef DBACCESS_SHARED_DBASTRINGS_HRC -#include "dbastrings.hrc" -#endif -#ifndef _DBASHARED_APITOOLS_HXX_ -#include "apitools.hxx" -#endif -#ifndef _TOOLS_DEBUG_HXX +#include <connectivity/dbtools.hxx> +#include <cppuhelper/typeprovider.hxx> #include <tools/debug.hxx> -#endif -#ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_ -#include <com/sun/star/beans/PropertyAttribute.hpp> -#endif -#ifndef DBACORE_SDBCORETOOLS_HXX -#include "sdbcoretools.hxx" -#endif - +#include <tools/diagnose_ex.h> using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::sdbcx; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::container; using namespace ::cppu; using namespace ::comphelper; using namespace ::osl; @@ -79,23 +69,32 @@ using namespace dbaccess; //============================================================ IMPLEMENT_FORWARD_XINTERFACE2(OTableColumnDescriptor,OColumn,TXChild) -// com::sun::star::lang::XTypeProvider -//-------------------------------------------------------------------------- -Sequence< sal_Int8 > OTableColumnDescriptor::getImplementationId() throw (RuntimeException) +//------------------------------------------------------------------------------ +void OTableColumnDescriptor::impl_registerProperties() { - static OImplementationId * pId = 0; - if (! pId) - { - MutexGuard aGuard( Mutex::getGlobalMutex() ); - if (! pId) - { - static OImplementationId aId; - pId = &aId; - } - } - return pId->getImplementationId(); + sal_Int32 nDefaultAttr = m_bActAsDescriptor ? 0 : PropertyAttribute::READONLY; + + registerProperty( PROPERTY_TYPENAME, PROPERTY_ID_TYPENAME, nDefaultAttr, &m_aTypeName, ::getCppuType( &m_aTypeName ) ); + registerProperty( PROPERTY_DESCRIPTION, PROPERTY_ID_DESCRIPTION, nDefaultAttr, &m_aDescription, ::getCppuType( &m_aDescription ) ); + registerProperty( PROPERTY_DEFAULTVALUE, PROPERTY_ID_DEFAULTVALUE, nDefaultAttr, &m_aDefaultValue, ::getCppuType( &m_aDefaultValue ) ); + + if ( m_bActAsDescriptor ) + registerProperty( PROPERTY_AUTOINCREMENTCREATION, PROPERTY_ID_AUTOINCREMENTCREATION, nDefaultAttr, &m_aAutoIncrementValue, ::getCppuType( &m_aAutoIncrementValue ) ); + + registerProperty( PROPERTY_TYPE, PROPERTY_ID_TYPE, nDefaultAttr, &m_nType, ::getCppuType( &m_nType ) ); + registerProperty( PROPERTY_PRECISION, PROPERTY_ID_PRECISION, nDefaultAttr, &m_nPrecision, ::getCppuType( &m_nPrecision ) ); + registerProperty( PROPERTY_SCALE, PROPERTY_ID_SCALE, nDefaultAttr, &m_nScale, ::getCppuType( &m_nScale ) ); + registerProperty( PROPERTY_ISNULLABLE, PROPERTY_ID_ISNULLABLE, nDefaultAttr, &m_nIsNullable, ::getCppuType( &m_nIsNullable ) ); + registerProperty( PROPERTY_ISAUTOINCREMENT, PROPERTY_ID_ISAUTOINCREMENT, nDefaultAttr, &m_bAutoIncrement, ::getCppuType( &m_bAutoIncrement ) ); + registerProperty( PROPERTY_ISROWVERSION, PROPERTY_ID_ISROWVERSION, nDefaultAttr, &m_bRowVersion, ::getCppuType( &m_bRowVersion ) ); + registerProperty( PROPERTY_ISCURRENCY, PROPERTY_ID_ISCURRENCY, nDefaultAttr, &m_bCurrency, ::getCppuType( &m_bCurrency ) ); + + OColumnSettings::registerProperties( *this ); } +//-------------------------------------------------------------------------- +IMPLEMENT_GET_IMPLEMENTATION_ID( OTableColumnDescriptor ) + // ::com::sun::star::lang::XServiceInfo //------------------------------------------------------------------------------ rtl::OUString OTableColumnDescriptor::getImplementationName( ) throw (RuntimeException) @@ -107,7 +106,7 @@ rtl::OUString OTableColumnDescriptor::getImplementationName( ) throw (RuntimeEx Sequence< ::rtl::OUString > OTableColumnDescriptor::getSupportedServiceNames( ) throw (RuntimeException) { Sequence< ::rtl::OUString > aSNS( 2 ); - aSNS[0] = SERVICE_SDBCX_COLUMNDESCRIPTOR; + aSNS[0] = m_bActAsDescriptor ? SERVICE_SDBCX_COLUMNDESCRIPTOR : SERVICE_SDBCX_COLUMN; aSNS[1] = SERVICE_SDB_COLUMNSETTINGS; return aSNS; } @@ -116,28 +115,9 @@ Sequence< ::rtl::OUString > OTableColumnDescriptor::getSupportedServiceNames( ) //------------------------------------------------------------------------------ ::cppu::IPropertyArrayHelper* OTableColumnDescriptor::createArrayHelper( ) const { - BEGIN_PROPERTY_HELPER(20) - DECL_PROP2(ALIGN, sal_Int32, BOUND,MAYBEVOID); - DECL_PROP1(AUTOINCREMENTCREATION,::rtl::OUString, MAYBEVOID); - DECL_PROP2(CONTROLDEFAULT, ::rtl::OUString, BOUND,MAYBEVOID); - DECL_PROP1_IFACE(CONTROLMODEL, XPropertySet, BOUND ); - DECL_PROP0(DEFAULTVALUE, ::rtl::OUString ); - DECL_PROP0(DESCRIPTION, ::rtl::OUString ); - DECL_PROP2(NUMBERFORMAT, sal_Int32, BOUND,MAYBEVOID); - DECL_PROP2(HELPTEXT, ::rtl::OUString, BOUND,MAYBEVOID); - DECL_PROP1_BOOL(HIDDEN, BOUND); - DECL_PROP0_BOOL(ISAUTOINCREMENT ); - DECL_PROP0_BOOL(ISCURRENCY ); - DECL_PROP0(ISNULLABLE, sal_Int32 ); - DECL_PROP0_BOOL(ISROWVERSION ); - DECL_PROP0(NAME, ::rtl::OUString ); - DECL_PROP0(PRECISION, sal_Int32 ); - DECL_PROP2(RELATIVEPOSITION, sal_Int32, BOUND, MAYBEVOID); - DECL_PROP0(SCALE, sal_Int32 ); - DECL_PROP0(TYPE, sal_Int32 ); - DECL_PROP0(TYPENAME, ::rtl::OUString ); - DECL_PROP2(WIDTH, sal_Int32, BOUND, MAYBEVOID); - END_PROPERTY_HELPER(); + Sequence< Property > aProps; + describeProperties( aProps ); + return new ::cppu::OPropertyArrayHelper( aProps ); } // cppu::OPropertySetHelper @@ -148,190 +128,10 @@ Sequence< ::rtl::OUString > OTableColumnDescriptor::getSupportedServiceNames( ) } //------------------------------------------------------------------------------ -void OTableColumnDescriptor::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const +void OTableColumnDescriptor::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const Any& rValue ) throw (Exception) { - switch (nHandle) - { - case PROPERTY_ID_TYPE: - rValue <<= m_nType; - break; - case PROPERTY_ID_PRECISION: - rValue <<= m_nPrecision; - break; - case PROPERTY_ID_SCALE: - rValue <<= m_nScale; - break; - case PROPERTY_ID_ISNULLABLE: - rValue <<= m_nIsNullable; - break; - case PROPERTY_ID_TYPENAME: - rValue <<= m_aTypeName; - break; - case PROPERTY_ID_DESCRIPTION: - rValue <<= m_aDescription; - break; - case PROPERTY_ID_DEFAULTVALUE: - rValue <<= m_aDefaultValue; - break; - case PROPERTY_ID_AUTOINCREMENTCREATION: - rValue <<= m_aAutoIncrementValue; - break; - case PROPERTY_ID_ISAUTOINCREMENT: - { - sal_Bool bVal = m_bAutoIncrement; - rValue.setValue(&bVal, getBooleanCppuType()); - } break; - case PROPERTY_ID_ISCURRENCY: - { - sal_Bool bVal = m_bCurrency; - rValue.setValue(&bVal, getBooleanCppuType()); - } break; - case PROPERTY_ID_ISROWVERSION: - { - sal_Bool bVal = m_bRowVersion; - rValue.setValue(&bVal, getBooleanCppuType()); - } break; - case PROPERTY_ID_NAME: - OColumn::getFastPropertyValue( rValue, nHandle ); - break; - default: - OColumnSettings::getFastPropertyValue( rValue, nHandle ); - } -} - -//------------------------------------------------------------------------------ -sal_Bool OTableColumnDescriptor::convertFastPropertyValue( - Any & rConvertedValue, - Any & rOldValue, - sal_Int32 nHandle, - const Any& rValue ) - throw (IllegalArgumentException) -{ - sal_Bool bModified = sal_False; - switch (nHandle) - { - case PROPERTY_ID_TYPE: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_nType); - break; - case PROPERTY_ID_PRECISION: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_nPrecision); - break; - case PROPERTY_ID_SCALE: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_nScale); - break; - case PROPERTY_ID_ISNULLABLE: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_nIsNullable); - break; - case PROPERTY_ID_TYPENAME: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_aTypeName); - break; - case PROPERTY_ID_DESCRIPTION: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_aDescription); - break; - case PROPERTY_ID_DEFAULTVALUE: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_aDefaultValue); - break; - case PROPERTY_ID_AUTOINCREMENTCREATION: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_aAutoIncrementValue); - break; - case PROPERTY_ID_ISAUTOINCREMENT: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bAutoIncrement); - break; - case PROPERTY_ID_ISCURRENCY: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bCurrency); - break; - case PROPERTY_ID_ISROWVERSION: - bModified = ::comphelper::tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bRowVersion); - break; - case PROPERTY_ID_NAME: - bModified = OColumn::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, rValue ); - break; - default: - bModified = OColumnSettings::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, rValue ); - } - return bModified; -} - -//------------------------------------------------------------------------------ -void OTableColumnDescriptor::setFastPropertyValue_NoBroadcast( - sal_Int32 nHandle, - const Any& rValue - ) - throw (Exception) -{ - switch (nHandle) - { - case PROPERTY_ID_TYPE: - OSL_ENSURE(rValue.getValueType().equals(::getCppuType(static_cast< sal_Int32* >(NULL))), - "OTableColumnDescriptor::setFastPropertyValue_NoBroadcast(TYPE) : invalid value !"); - rValue >>= m_nType; - break; - case PROPERTY_ID_PRECISION: - OSL_ENSURE(rValue.getValueType().equals(::getCppuType(static_cast< sal_Int32* >(NULL))), - "OTableColumnDescriptor::setFastPropertyValue_NoBroadcast(PRECISION) : invalid value !"); - rValue >>= m_nPrecision; - break; - case PROPERTY_ID_SCALE: - OSL_ENSURE(rValue.getValueType().equals(::getCppuType(static_cast< sal_Int32* >(NULL))), - "OTableColumnDescriptor::setFastPropertyValue_NoBroadcast(SCALE) : invalid value !"); - rValue >>= m_nScale; - break; - case PROPERTY_ID_ISNULLABLE: - OSL_ENSURE(rValue.getValueType().equals(::getCppuType(static_cast< sal_Int32* >(NULL))), - "OTableColumnDescriptor::setFastPropertyValue_NoBroadcast(ISNULLABLE) : invalid value !"); - rValue >>= m_nIsNullable; - break; - case PROPERTY_ID_TYPENAME: - OSL_ENSURE(rValue.getValueType().equals(::getCppuType(static_cast< rtl::OUString* >(NULL))), - "OTableColumnDescriptor::setFastPropertyValue_NoBroadcast(TYPENAME) : invalid value !"); - rValue >>= m_aTypeName; - break; - case PROPERTY_ID_DESCRIPTION: - OSL_ENSURE(rValue.getValueType().equals(::getCppuType(static_cast< rtl::OUString* >(NULL))), - "OTableColumnDescriptor::setFastPropertyValue_NoBroadcast(DESCRIPTION) : invalid value !"); - rValue >>= m_aDescription; - break; - case PROPERTY_ID_DEFAULTVALUE: - OSL_ENSURE(rValue.getValueType().equals(::getCppuType(static_cast< rtl::OUString* >(NULL))), - "OTableColumnDescriptor::setFastPropertyValue_NoBroadcast(DEFAULTVALUE) : invalid value !"); - rValue >>= m_aDefaultValue; - break; - case PROPERTY_ID_AUTOINCREMENTCREATION: - OSL_ENSURE(rValue.getValueType().equals(::getCppuType(static_cast< rtl::OUString* >(NULL))), - "OTableColumnDescriptor::setFastPropertyValue_NoBroadcast(AUTOINCREMENTVALUE) : invalid value !"); - rValue >>= m_aAutoIncrementValue; - break; - case PROPERTY_ID_ISAUTOINCREMENT: - OSL_ENSURE(rValue.getValueType().equals(::getCppuType(static_cast< sal_Bool* >(NULL))), - "OTableColumnDescriptor::setFastPropertyValue_NoBroadcast(ISAUTOINCREMENT) : invalid value !"); - m_bAutoIncrement = ::comphelper::getBOOL(rValue); - break; - case PROPERTY_ID_ISCURRENCY: - OSL_ENSURE(rValue.getValueType().equals(::getCppuType(static_cast< sal_Bool* >(NULL))), - "OTableColumnDescriptor::setFastPropertyValue_NoBroadcast(ISCURRENCY) : invalid value !"); - m_bCurrency = ::comphelper::getBOOL(rValue); - break; - case PROPERTY_ID_ISROWVERSION: - OSL_ENSURE(rValue.getValueType().equals(::getCppuType(static_cast< sal_Bool* >(NULL))), - "OTableColumnDescriptor::setFastPropertyValue_NoBroadcast(ISROWVERSION) : invalid value !"); - m_bRowVersion = ::comphelper::getBOOL(rValue); - break; - case PROPERTY_ID_NAME: - OColumn::setFastPropertyValue_NoBroadcast( nHandle, rValue ); - break; - default: - OColumnSettings::setFastPropertyValue_NoBroadcast( nHandle, rValue ); - } - ::dbaccess::notifyDataSourceModified(m_xParent,sal_True); -} - -// ----------------------------------------------------------------------------- -sal_Int64 SAL_CALL OTableColumnDescriptor::getSomething( const Sequence< sal_Int8 >& aIdentifier ) throw(RuntimeException) -{ - sal_Int64 nReturn = OColumn::getSomething( aIdentifier ); - if ( !nReturn ) - nReturn = OColumnSettings::getSomething( aIdentifier ); - return nReturn; + OColumn::setFastPropertyValue_NoBroadcast( nHandle, rValue ); + ::dbaccess::notifyDataSourceModified( m_xParent, sal_True ); } // ----------------------------------------------------------------------------- @@ -350,51 +150,24 @@ void SAL_CALL OTableColumnDescriptor::setParent( const Reference< XInterface >& //= OTableColumn //============================================================ DBG_NAME(OTableColumn); -OTableColumn::OTableColumn(const ::rtl::OUString& _rName) + +// ------------------------------------------------------------------------- +OTableColumn::OTableColumn( const ::rtl::OUString& _rName ) + :OTableColumnDescriptor( false /* do not act as descriptor */ ) { DBG_CTOR(OTableColumn,NULL); m_sName = _rName; } -// ------------------------------------------------------------------------- -OTableColumn::OTableColumn(const Reference<XPropertySet>& _xColumn) -{ - DBG_CTOR(OTableColumn,NULL); - m_aTypeName = (::comphelper::getString(_xColumn->getPropertyValue(PROPERTY_TYPENAME))); - if(_xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_DEFAULTVALUE)) - m_aDefaultValue = (::comphelper::getString(_xColumn->getPropertyValue(PROPERTY_DEFAULTVALUE))); - m_nIsNullable = (::comphelper::getINT32(_xColumn->getPropertyValue(PROPERTY_ISNULLABLE))); - m_nPrecision = (::comphelper::getINT32(_xColumn->getPropertyValue(PROPERTY_PRECISION))); - m_nScale = (::comphelper::getINT32(_xColumn->getPropertyValue(PROPERTY_SCALE))); - m_nType = (::comphelper::getINT32(_xColumn->getPropertyValue(PROPERTY_TYPE))); - m_bAutoIncrement = (::comphelper::getBOOL(_xColumn->getPropertyValue(PROPERTY_ISAUTOINCREMENT))); - m_bRowVersion = (sal_False); - m_bCurrency = (::comphelper::getBOOL(_xColumn->getPropertyValue(PROPERTY_ISCURRENCY))); - _xColumn->getPropertyValue(PROPERTY_NAME) >>= m_sName; -} // ----------------------------------------------------------------------------- OTableColumn::~OTableColumn() { DBG_DTOR(OTableColumn,NULL); } -// com::sun::star::lang::XTypeProvider + //-------------------------------------------------------------------------- -Sequence< sal_Int8 > OTableColumn::getImplementationId() throw (RuntimeException) -{ - static OImplementationId * pId = 0; - if (! pId) - { - MutexGuard aGuard( Mutex::getGlobalMutex() ); - if (! pId) - { - static OImplementationId aId; - pId = &aId; - } - } - return pId->getImplementationId(); -} +IMPLEMENT_GET_IMPLEMENTATION_ID( OTableColumn ) -// ::com::sun::star::lang::XServiceInfo //------------------------------------------------------------------------------ rtl::OUString OTableColumn::getImplementationName( ) throw (RuntimeException) { @@ -402,75 +175,203 @@ rtl::OUString OTableColumn::getImplementationName( ) throw (RuntimeException) } //------------------------------------------------------------------------------ -Sequence< ::rtl::OUString > OTableColumn::getSupportedServiceNames( ) throw (RuntimeException) +::cppu::IPropertyArrayHelper& SAL_CALL OTableColumn::getInfoHelper() { - Sequence< ::rtl::OUString > aSNS( 2 ); - aSNS[0] = SERVICE_SDBCX_COLUMN; - aSNS[1] = SERVICE_SDB_COLUMNSETTINGS; - return aSNS; + return *OTableColumn_PBase::getArrayHelper(); } //------------------------------------------------------------------------------ -::cppu::IPropertyArrayHelper& OTableColumn::getInfoHelper() +::cppu::IPropertyArrayHelper* OTableColumn::createArrayHelper( ) const { - return *static_cast< ::comphelper::OPropertyArrayUsageHelper< OTableColumn >* >(this)->getArrayHelper(); + return OTableColumnDescriptor::createArrayHelper(); +} + +// ========================================================================= +//= OQueryColumn +// ========================================================================= +DBG_NAME( OQueryColumn ); + +// ------------------------------------------------------------------------- +OQueryColumn::OQueryColumn( const Reference< XPropertySet >& _rxParserColumn, const Reference< XConnection >& _rxConnection ) + :OTableColumnDescriptor( false /* do not act as descriptor */ ) +{ + const sal_Int32 nPropAttr = PropertyAttribute::READONLY; + registerProperty( PROPERTY_CATALOGNAME, PROPERTY_ID_CATALOGNAME, nPropAttr, &m_sCatalogName, ::getCppuType( &m_sCatalogName ) ); + registerProperty( PROPERTY_SCHEMANAME, PROPERTY_ID_SCHEMANAME, nPropAttr, &m_sSchemaName, ::getCppuType( &m_sSchemaName ) ); + registerProperty( PROPERTY_TABLENAME, PROPERTY_ID_TABLENAME, nPropAttr, &m_sTableName, ::getCppuType( &m_sTableName ) ); + registerProperty( PROPERTY_REALNAME, PROPERTY_ID_REALNAME, nPropAttr, &m_sRealName, ::getCppuType( &m_sRealName ) ); + + DBG_CTOR( OQueryColumn, NULL ); + + OSL_VERIFY( _rxParserColumn->getPropertyValue( PROPERTY_TYPENAME ) >>= m_aTypeName ); + OSL_VERIFY( _rxParserColumn->getPropertyValue( PROPERTY_ISNULLABLE ) >>= m_nIsNullable ); + OSL_VERIFY( _rxParserColumn->getPropertyValue( PROPERTY_PRECISION ) >>= m_nPrecision ); + OSL_VERIFY( _rxParserColumn->getPropertyValue( PROPERTY_SCALE ) >>= m_nScale ); + OSL_VERIFY( _rxParserColumn->getPropertyValue( PROPERTY_TYPE ) >>= m_nType ); + OSL_VERIFY( _rxParserColumn->getPropertyValue( PROPERTY_ISAUTOINCREMENT ) >>= m_bAutoIncrement ); + OSL_VERIFY( _rxParserColumn->getPropertyValue( PROPERTY_ISCURRENCY ) >>= m_bCurrency ); + OSL_VERIFY( _rxParserColumn->getPropertyValue( PROPERTY_NAME ) >>= m_sName ); + m_bRowVersion = sal_False; + + Reference< XPropertySetInfo > xPSI( _rxParserColumn->getPropertySetInfo(), UNO_SET_THROW ); + if ( xPSI->hasPropertyByName( PROPERTY_DEFAULTVALUE ) ) + OSL_VERIFY( _rxParserColumn->getPropertyValue( PROPERTY_DEFAULTVALUE ) >>= m_aDefaultValue ); + + // copy some optional properties from the parser column + struct PropertyDescriptor + { + ::rtl::OUString sName; + sal_Int32 nHandle; + }; + PropertyDescriptor aProps[] = + { + { PROPERTY_CATALOGNAME, PROPERTY_ID_CATALOGNAME }, + { PROPERTY_SCHEMANAME, PROPERTY_ID_SCHEMANAME }, + { PROPERTY_TABLENAME, PROPERTY_ID_TABLENAME }, + { PROPERTY_REALNAME, PROPERTY_ID_REALNAME } + }; + for ( size_t i=0; i < sizeof( aProps ) / sizeof( aProps[0] ); ++i ) + { + if ( xPSI->hasPropertyByName( aProps[i].sName ) ) + setFastPropertyValue_NoBroadcast( aProps[i].nHandle, _rxParserColumn->getPropertyValue( aProps[i].sName ) ); + } + + // determine the table column we're based on + osl_incrementInterlockedCount( &m_refCount ); + { + m_xOriginalTableColumn = impl_determineOriginalTableColumn( _rxConnection ); + } + osl_decrementInterlockedCount( &m_refCount ); +} + +//-------------------------------------------------------------------------- +OQueryColumn::~OQueryColumn() +{ + DBG_DTOR( OQueryColumn, NULL ); +} + +//-------------------------------------------------------------------------- +Reference< XPropertySet > OQueryColumn::impl_determineOriginalTableColumn( const Reference< XConnection >& _rxConnection ) +{ + OSL_PRECOND( _rxConnection.is(), "OQueryColumn::impl_determineOriginalTableColumn: illegal connection!" ); + if ( !_rxConnection.is() ) + return NULL; + + Reference< XPropertySet > xOriginalTableColumn; + try + { + // determine the composed table name, plus the column name, as indicated by the + // respective properties + ::rtl::OUString sCatalog, sSchema, sTable; + OSL_VERIFY( getPropertyValue( PROPERTY_CATALOGNAME ) >>= sCatalog ); + OSL_VERIFY( getPropertyValue( PROPERTY_SCHEMANAME ) >>= sSchema ); + OSL_VERIFY( getPropertyValue( PROPERTY_TABLENAME ) >>= sTable ); + if ( !sCatalog.getLength() && !sSchema.getLength() && !sTable.getLength() ) + return NULL; + + ::rtl::OUString sComposedTableName = ::dbtools::composeTableName( + _rxConnection->getMetaData(), sCatalog, sSchema, sTable, sal_False, ::dbtools::eComplete ); + + // retrieve the table in question + Reference< XTablesSupplier > xSuppTables( _rxConnection, UNO_QUERY_THROW ); + Reference< XNameAccess > xTables( xSuppTables->getTables(), UNO_QUERY_THROW ); + if ( !xTables->hasByName( sComposedTableName ) ) + return NULL; + + Reference< XColumnsSupplier > xSuppCols( xTables->getByName( sComposedTableName ), UNO_QUERY_THROW ); + Reference< XNameAccess > xColumns( xSuppCols->getColumns(), UNO_QUERY_THROW ); + + ::rtl::OUString sColumn; + OSL_VERIFY( getPropertyValue( PROPERTY_REALNAME ) >>= sColumn ); + if ( !xColumns->hasByName( sColumn ) ) + return NULL; + + xOriginalTableColumn.set( xColumns->getByName( sColumn ), UNO_QUERY ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + return xOriginalTableColumn; +} + +//-------------------------------------------------------------------------- +IMPLEMENT_GET_IMPLEMENTATION_ID( OQueryColumn ) + +//-------------------------------------------------------------------------- +::rtl::OUString SAL_CALL OQueryColumn::getImplementationName( ) throw(RuntimeException) +{ + return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "org.openoffice.comp.dbaccess.OQueryColumn" ) ); } -// comphelper::OPropertyArrayUsageHelper //------------------------------------------------------------------------------ -::cppu::IPropertyArrayHelper* OTableColumn::createArrayHelper( ) const +::cppu::IPropertyArrayHelper& SAL_CALL OQueryColumn::getInfoHelper() { - BEGIN_PROPERTY_HELPER(19) - DECL_PROP2(ALIGN, sal_Int32, BOUND, MAYBEVOID); - DECL_PROP2(CONTROLDEFAULT, ::rtl::OUString, BOUND,MAYBEVOID); - DECL_PROP1_IFACE(CONTROLMODEL, XPropertySet , BOUND); - DECL_PROP1(DEFAULTVALUE, ::rtl::OUString, READONLY); - DECL_PROP1(DESCRIPTION, ::rtl::OUString, READONLY); - DECL_PROP2(NUMBERFORMAT, sal_Int32, BOUND, MAYBEVOID); - DECL_PROP2(HELPTEXT, ::rtl::OUString, BOUND,MAYBEVOID); - DECL_PROP1_BOOL(HIDDEN, BOUND); - DECL_PROP1_BOOL(ISAUTOINCREMENT, READONLY); - DECL_PROP1_BOOL(ISCURRENCY, READONLY); - DECL_PROP1(ISNULLABLE, sal_Int32, READONLY); - DECL_PROP1_BOOL(ISROWVERSION, READONLY); - DECL_PROP1(NAME, ::rtl::OUString, READONLY); - DECL_PROP1(PRECISION, sal_Int32, READONLY); - DECL_PROP2(RELATIVEPOSITION, sal_Int32, BOUND, MAYBEVOID); - DECL_PROP1(SCALE, sal_Int32, READONLY); - DECL_PROP1(TYPE, sal_Int32, READONLY); - DECL_PROP1(TYPENAME, ::rtl::OUString, READONLY); - DECL_PROP2(WIDTH, sal_Int32, BOUND, MAYBEVOID); - END_PROPERTY_HELPER(); + return *OQueryColumn_PBase::getArrayHelper(); } -//============================================================ +//-------------------------------------------------------------------------- +::cppu::IPropertyArrayHelper* OQueryColumn::createArrayHelper() const +{ + return OTableColumnDescriptor::createArrayHelper(); +} + +//-------------------------------------------------------------------------- +void SAL_CALL OQueryColumn::getFastPropertyValue( Any& _rValue, sal_Int32 _nHandle ) const +{ + OTableColumnDescriptor::getFastPropertyValue( _rValue, _nHandle ); + + // special treatment for column settings: + if ( !OColumnSettings::isColumnSettingProperty( _nHandle ) ) + return; + + // If the setting has its default value, then try to obtain the value from the table column which + // this query column is based on + if ( !OColumnSettings::isDefaulted( _nHandle, _rValue ) ) + return; + + if ( !m_xOriginalTableColumn.is() ) + return; + + try + { + // determine original property name + ::rtl::OUString sPropName; + sal_Int16 nAttributes( 0 ); + const_cast< OQueryColumn* >( this )->getInfoHelper().fillPropertyMembersByHandle( &sPropName, &nAttributes, _nHandle ); + OSL_ENSURE( sPropName.getLength(), "OColumnWrapper::impl_getPropertyNameFromHandle: property not found!" ); + + _rValue = m_xOriginalTableColumn->getPropertyValue( sPropName ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } +} + +//========================================================================== //= OColumnWrapper -//============================================================ +//========================================================================== DBG_NAME(OColumnWrapper); //-------------------------------------------------------------------------- -OColumnWrapper::OColumnWrapper(const Reference< XPropertySet > & rCol) - :m_xAggregate(rCol) - ,m_nColTypeID(-1) +OColumnWrapper::OColumnWrapper( const Reference< XPropertySet > & rCol, const bool _bNameIsReadOnly ) + :OColumn( _bNameIsReadOnly ) + ,m_xAggregate(rCol) + ,m_nColTypeID(-1) { DBG_CTOR(OColumnWrapper,NULL); - // which type of aggregate property do we have - if (m_nColTypeID == -1) + // which type of aggregate property do we have? + // we distingish the properties by the containment of optional properties + m_nColTypeID = 0; + if ( m_xAggregate.is() ) { - // we distingish the properties by the containment of optional properties, these are: - // Description 0x0001 - // Hidden 0x0002 - // IsRowVersion 0x0004 - m_nColTypeID = 0; - if ( m_xAggregate.is() ) - { - Reference <XPropertySetInfo > xInfo(m_xAggregate->getPropertySetInfo()); - m_nColTypeID |= xInfo->hasPropertyByName(PROPERTY_DESCRIPTION) ? HAS_DESCRIPTION : 0; - m_nColTypeID |= xInfo->hasPropertyByName(PROPERTY_DEFAULTVALUE) ? HAS_DEFAULTVALUE : 0; - m_nColTypeID |= xInfo->hasPropertyByName(PROPERTY_ISROWVERSION) ? HAS_ROWVERSION : 0; - m_nColTypeID |= xInfo->hasPropertyByName(PROPERTY_AUTOINCREMENTCREATION) ? HAS_AUTOINCREMENT_CREATION : 0; + Reference <XPropertySetInfo > xInfo(m_xAggregate->getPropertySetInfo()); + m_nColTypeID |= xInfo->hasPropertyByName(PROPERTY_DESCRIPTION) ? HAS_DESCRIPTION : 0; + m_nColTypeID |= xInfo->hasPropertyByName(PROPERTY_DEFAULTVALUE) ? HAS_DEFAULTVALUE : 0; + m_nColTypeID |= xInfo->hasPropertyByName(PROPERTY_ISROWVERSION) ? HAS_ROWVERSION : 0; + m_nColTypeID |= xInfo->hasPropertyByName(PROPERTY_AUTOINCREMENTCREATION) ? HAS_AUTOINCREMENT_CREATION : 0; - m_xAggregate->getPropertyValue(PROPERTY_NAME) >>= m_sName; - } + m_xAggregate->getPropertyValue(PROPERTY_NAME) >>= m_sName; } } // ----------------------------------------------------------------------------- @@ -480,91 +381,91 @@ OColumnWrapper::~OColumnWrapper() } //------------------------------------------------------------------------------ +::rtl::OUString OColumnWrapper::impl_getPropertyNameFromHandle( const sal_Int32 _nHandle ) const +{ + ::rtl::OUString sPropName; + sal_Int16 nAttributes( 0 ); + const_cast< OColumnWrapper* >( this )->getInfoHelper().fillPropertyMembersByHandle( &sPropName, &nAttributes, _nHandle ); + OSL_ENSURE( sPropName.getLength(), "OColumnWrapper::impl_getPropertyNameFromHandle: property not found!" ); + return sPropName; +} + +//------------------------------------------------------------------------------ void OColumnWrapper::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const { - switch (nHandle) + // derived classes are free to either use the OPropertyContainer(Helper) mechanisms for properties, + // or to declare additional properties which are to be forwarded to the wrapped object. So we need + // to distinguish those cases. + if ( OColumn::isRegisteredProperty( nHandle ) ) { - case PROPERTY_ID_NAME: - rValue <<= m_sName; - break; - default: - { - // get the property name - ::rtl::OUString aPropName; - sal_Int16 nAttributes; - const_cast<OColumnWrapper*>(this)->getInfoHelper(). - fillPropertyMembersByHandle(&aPropName, &nAttributes, nHandle); - OSL_ENSURE(aPropName.getLength(), "property not found?"); - - // now read the value - rValue = m_xAggregate->getPropertyValue(aPropName); - } + OColumn::getFastPropertyValue( rValue, nHandle ); + } + else + { + rValue = m_xAggregate->getPropertyValue( impl_getPropertyNameFromHandle( nHandle ) ); } } //------------------------------------------------------------------------------ -sal_Bool OColumnWrapper::convertFastPropertyValue( - Any & rConvertedValue, - Any & rOldValue, - sal_Int32 nHandle, - const Any& rValue ) - throw (IllegalArgumentException) +sal_Bool OColumnWrapper::convertFastPropertyValue( Any & rConvertedValue, Any & rOldValue, sal_Int32 nHandle, + const Any& rValue ) throw (IllegalArgumentException) { - // used for the name - sal_Bool bModified = OColumn::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, rValue ); - - // get the property name - ::rtl::OUString aPropName; - sal_Int16 nAttributes; - getInfoHelper().fillPropertyMembersByHandle(&aPropName, &nAttributes, nHandle); - OSL_ENSURE(aPropName.getLength(), "property not found?"); - - // now read the value - m_xAggregate->setPropertyValue(aPropName, rValue); + sal_Bool bModified( sal_False ); + if ( OColumn::isRegisteredProperty( nHandle ) ) + { + bModified = OColumn::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, rValue ); + } + else + { + getFastPropertyValue( rOldValue, nHandle ); + if ( rOldValue != rValue ) + { + rConvertedValue = rValue; + bModified = sal_True; + } + } return bModified; } //------------------------------------------------------------------------------ -void OColumnWrapper::setFastPropertyValue_NoBroadcast( - sal_Int32 nHandle, - const Any& rValue - ) - throw (Exception) +void OColumnWrapper::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const Any& rValue ) throw (Exception) { - OColumn::setFastPropertyValue_NoBroadcast( nHandle, rValue ); + if ( OColumn::isRegisteredProperty( nHandle ) ) + { + OColumn::setFastPropertyValue_NoBroadcast( nHandle, rValue ); + } + else + { + m_xAggregate->setPropertyValue( impl_getPropertyNameFromHandle( nHandle ), rValue ); + } } + // ----------------------------------------------------------------------------- sal_Int64 SAL_CALL OColumnWrapper::getSomething( const Sequence< sal_Int8 >& aIdentifier ) throw(RuntimeException) { - sal_Int64 nRet = OColumn::getSomething(aIdentifier); - if(!nRet) - { - Reference<XUnoTunnel> xTunnel(m_xAggregate,UNO_QUERY); - if(xTunnel.is()) - nRet = xTunnel->getSomething(aIdentifier); - } - return nRet; + Reference< XUnoTunnel > xTunnel( m_xAggregate, UNO_QUERY); + if ( xTunnel.is() ) + return xTunnel->getSomething( aIdentifier ); + return 0; } + //============================================================ //= OTableColumnDescriptorWrapper //============================================================ -// com::sun::star::lang::XTypeProvider //-------------------------------------------------------------------------- -Sequence< sal_Int8 > OTableColumnDescriptorWrapper::getImplementationId() throw (RuntimeException) +OTableColumnDescriptorWrapper::OTableColumnDescriptorWrapper( const Reference< XPropertySet >& _rCol, const bool _bPureWrap, const bool _bIsDescriptor ) + :OColumnWrapper( _rCol, !_bIsDescriptor ) + ,m_bPureWrap( _bPureWrap ) + ,m_bIsDescriptor( _bIsDescriptor ) { - static OImplementationId * pId = 0; - if (! pId) - { - MutexGuard aGuard( Mutex::getGlobalMutex() ); - if (! pId) - { - static OImplementationId aId; - pId = &aId; - } - } - return pId->getImplementationId(); + // let the ColumnSettings register its properties + OColumnSettings::registerProperties( *this ); } +// com::sun::star::lang::XTypeProvider +//-------------------------------------------------------------------------- +IMPLEMENT_GET_IMPLEMENTATION_ID( OTableColumnDescriptorWrapper ) + // ::com::sun::star::lang::XServiceInfo //------------------------------------------------------------------------------ rtl::OUString OTableColumnDescriptorWrapper::getImplementationName( ) throw (RuntimeException) @@ -581,74 +482,72 @@ Sequence< ::rtl::OUString > OTableColumnDescriptorWrapper::getSupportedServiceNa return aSNS; } -// ----------------------------------------------------------------------------- -sal_Int64 SAL_CALL OTableColumnDescriptorWrapper::getSomething( const Sequence< sal_Int8 >& aIdentifier ) throw(RuntimeException) -{ - sal_Int64 nReturn = OColumnWrapper::getSomething( aIdentifier ); - if ( !nReturn ) - nReturn = OColumnSettings::getSomething( aIdentifier ); - return nReturn; -} - // comphelper::OPropertyArrayUsageHelper //------------------------------------------------------------------------------ ::cppu::IPropertyArrayHelper* OTableColumnDescriptorWrapper::createArrayHelper( sal_Int32 nId ) const { - // BEGIN_PROPERTY_HELPER(17) - sal_Int32 nPropertyCount = 16; - // How many properties do we have? + const sal_Int32 nHaveAlways = 7; + // Which optional properties are contained? + sal_Int32 nHaveOptionally = 0; if (nId & HAS_DESCRIPTION) - ++nPropertyCount; + ++nHaveOptionally; if (nId & HAS_DEFAULTVALUE) - ++nPropertyCount; + ++nHaveOptionally; if (nId & HAS_ROWVERSION) - ++nPropertyCount; + ++nHaveOptionally; if ( nId & HAS_AUTOINCREMENT_CREATION ) - ++nPropertyCount; + ++nHaveOptionally; - Sequence< Property> aDescriptor(nPropertyCount); - Property* pDesc = aDescriptor.getArray(); + const sal_Int32 nPropertyCount( nHaveAlways + nHaveOptionally ); + Sequence< Property > aTableDescProperties( nPropertyCount ); + Property* pDesc = aTableDescProperties.getArray(); sal_Int32 nPos = 0; - // Description, Defaultvalue, IsRowVersion - DECL_PROP2(ALIGN, sal_Int32, BOUND,MAYBEVOID); - if ( nId & HAS_AUTOINCREMENT_CREATION ) - { - DECL_PROP1(AUTOINCREMENTCREATION,::rtl::OUString, MAYBEVOID); - } - DECL_PROP2(CONTROLDEFAULT, ::rtl::OUString, BOUND,MAYBEVOID); - DECL_PROP1_IFACE(CONTROLMODEL, XPropertySet, BOUND ); - if (nId & HAS_DEFAULTVALUE) - { - DECL_PROP0(DEFAULTVALUE, ::rtl::OUString ); - } + DECL_PROP0_BOOL( ISAUTOINCREMENT ); + DECL_PROP0_BOOL( ISCURRENCY ); + DECL_PROP0( ISNULLABLE, sal_Int32 ); + DECL_PROP0( PRECISION, sal_Int32 ); + DECL_PROP0( SCALE, sal_Int32 ); + DECL_PROP0( TYPE, sal_Int32 ); + DECL_PROP0( TYPENAME, ::rtl::OUString ); - if (nId & HAS_DESCRIPTION) - { - DECL_PROP0(DESCRIPTION, ::rtl::OUString ); - } + if ( nId & HAS_AUTOINCREMENT_CREATION ) + { + DECL_PROP1( AUTOINCREMENTCREATION, ::rtl::OUString, MAYBEVOID ); + } + if ( nId & HAS_DEFAULTVALUE ) + { + DECL_PROP0( DEFAULTVALUE, ::rtl::OUString ); + } + if ( nId & HAS_DESCRIPTION ) + { + DECL_PROP0( DESCRIPTION, ::rtl::OUString ); + } + if ( nId & HAS_ROWVERSION ) + { + DECL_PROP0_BOOL( ISROWVERSION ); + } - DECL_PROP2(NUMBERFORMAT, sal_Int32, BOUND,MAYBEVOID); - DECL_PROP2(HELPTEXT, ::rtl::OUString, BOUND,MAYBEVOID); - DECL_PROP1_BOOL(HIDDEN, BOUND); - DECL_PROP0_BOOL(ISAUTOINCREMENT ); - DECL_PROP0_BOOL(ISCURRENCY ); - DECL_PROP0(ISNULLABLE, sal_Int32 ); + OSL_ENSURE( nPos == nPropertyCount, "OTableColumnDescriptorWrapper::createArrayHelper: something went wrong!" ); - if (nId & HAS_ROWVERSION) + if ( !m_bIsDescriptor ) + { + for ( Property* prop = aTableDescProperties.getArray(); + prop != aTableDescProperties.getArray() + aTableDescProperties.getLength(); + ++prop + ) { - DECL_PROP0_BOOL(ISROWVERSION ); + prop->Attributes |= PropertyAttribute::READONLY; } + } - DECL_PROP0(NAME, ::rtl::OUString ); - DECL_PROP0(PRECISION, sal_Int32 ); - DECL_PROP2(RELATIVEPOSITION, sal_Int32, BOUND, MAYBEVOID); - DECL_PROP0(SCALE, sal_Int32 ); - DECL_PROP0(TYPE, sal_Int32 ); - DECL_PROP0(TYPENAME, ::rtl::OUString ); - DECL_PROP1(WIDTH, sal_Int32, MAYBEVOID); - END_PROPERTY_HELPER(); + // finally also describe the properties which are maintained by our base class, in particular the OPropertyContainerHelper + Sequence< Property > aBaseProperties; + describeProperties( aBaseProperties ); + + Sequence< Property > aAllProperties( ::comphelper::concatSequences( aTableDescProperties, aBaseProperties ) ); + return new ::cppu::OPropertyArrayHelper( aAllProperties, sal_False ); } // cppu::OPropertySetHelper @@ -663,75 +562,36 @@ void OTableColumnDescriptorWrapper::getFastPropertyValue( Any& rValue, sal_Int32 { if ( m_bPureWrap ) { - // get the property name - ::rtl::OUString aPropName; - sal_Int16 nAttributes; - const_cast<OTableColumnDescriptorWrapper*>(this)->getInfoHelper(). - fillPropertyMembersByHandle(&aPropName, &nAttributes, nHandle); - OSL_ENSURE(aPropName.getLength(), "property not found?"); - - // now read the value - rValue = m_xAggregate->getPropertyValue(aPropName); + rValue = m_xAggregate->getPropertyValue( impl_getPropertyNameFromHandle( nHandle ) ); } else { - switch (nHandle) - { - case PROPERTY_ID_ALIGN: - case PROPERTY_ID_NUMBERFORMAT: - case PROPERTY_ID_RELATIVEPOSITION: - case PROPERTY_ID_WIDTH: - case PROPERTY_ID_HIDDEN: - case PROPERTY_ID_CONTROLMODEL: - case PROPERTY_ID_HELPTEXT: - case PROPERTY_ID_CONTROLDEFAULT: - OColumnSettings::getFastPropertyValue( rValue, nHandle ); - break; - default: - { - // get the property name - ::rtl::OUString aPropName; - sal_Int16 nAttributes; - const_cast<OTableColumnDescriptorWrapper*>(this)->getInfoHelper(). - fillPropertyMembersByHandle(&aPropName, &nAttributes, nHandle); - OSL_ENSURE(aPropName.getLength(), "property not found?"); - - // now read the value - rValue = m_xAggregate->getPropertyValue(aPropName); - } - } + OColumnWrapper::getFastPropertyValue( rValue, nHandle ); } } //------------------------------------------------------------------------------ -sal_Bool OTableColumnDescriptorWrapper::convertFastPropertyValue( - Any & rConvertedValue, - Any & rOldValue, - sal_Int32 nHandle, - const Any& rValue ) - throw (IllegalArgumentException) +sal_Bool OTableColumnDescriptorWrapper::convertFastPropertyValue( Any & rConvertedValue, Any & rOldValue, sal_Int32 nHandle, const Any& rValue ) throw (IllegalArgumentException) { sal_Bool bModified(sal_False); if ( m_bPureWrap ) - bModified = OColumnWrapper::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, rValue ); - else { - switch (nHandle) + // do not delegate to OColumnWrapper: It would, for the properties which were registered with registerProperty, + // ask the OPropertyContainer base class, which is not what we want here. + // TODO: the whole "m_bPureWrap"-thingie is strange. We should have a dedicated class doing this wrapping, + // not a class which normally serves other purposes, and only sometimes does a "pure wrap". It makes the + // code unnecessarily hard to maintain, and error prone. + rOldValue = m_xAggregate->getPropertyValue( impl_getPropertyNameFromHandle( nHandle ) ); + if ( rOldValue != rValue ) { - case PROPERTY_ID_ALIGN: - case PROPERTY_ID_NUMBERFORMAT: - case PROPERTY_ID_RELATIVEPOSITION: - case PROPERTY_ID_WIDTH: - case PROPERTY_ID_HIDDEN: - case PROPERTY_ID_CONTROLMODEL: - case PROPERTY_ID_HELPTEXT: - case PROPERTY_ID_CONTROLDEFAULT: - bModified = OColumnSettings::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, rValue ); - break; - default: - bModified = OColumnWrapper::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, rValue ); + rConvertedValue = rValue; + bModified = sal_True; } } + else + { + bModified = OColumnWrapper::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, rValue ); + } return bModified; } @@ -743,24 +603,12 @@ void OTableColumnDescriptorWrapper::setFastPropertyValue_NoBroadcast( throw (Exception) { if ( m_bPureWrap ) - OColumnWrapper::setFastPropertyValue_NoBroadcast( nHandle, rValue ); + { + m_xAggregate->setPropertyValue( impl_getPropertyNameFromHandle( nHandle ), rValue ); + } else { - switch (nHandle) - { - case PROPERTY_ID_ALIGN: - case PROPERTY_ID_NUMBERFORMAT: - case PROPERTY_ID_RELATIVEPOSITION: - case PROPERTY_ID_WIDTH: - case PROPERTY_ID_HIDDEN: - case PROPERTY_ID_CONTROLMODEL: - case PROPERTY_ID_HELPTEXT: - case PROPERTY_ID_CONTROLDEFAULT: - OColumnSettings::setFastPropertyValue_NoBroadcast( nHandle, rValue ); - break; - default: - OColumnWrapper::setFastPropertyValue_NoBroadcast( nHandle, rValue ); - } + OColumnWrapper::setFastPropertyValue_NoBroadcast( nHandle, rValue ); } } @@ -768,24 +616,23 @@ void OTableColumnDescriptorWrapper::setFastPropertyValue_NoBroadcast( //= OTableColumnWrapper //============================================================ //-------------------------------------------------------------------------- -OTableColumnWrapper::OTableColumnWrapper(const Reference< XPropertySet >& rCol - ,const Reference< XPropertySet >& _xColDefintion - ,sal_Bool _bPureWrap) - :OTableColumnDescriptorWrapper(rCol,_bPureWrap) +OTableColumnWrapper::OTableColumnWrapper( const Reference< XPropertySet >& rCol, const Reference< XPropertySet >& _xColDefintion, + bool _bPureWrap ) + :OTableColumnDescriptorWrapper( rCol, _bPureWrap, false ) { - osl_incrementInterlockedCount(&m_refCount); + osl_incrementInterlockedCount( &m_refCount ); if ( _xColDefintion.is() ) { try { - ::comphelper::copyProperties(_xColDefintion,this); + ::comphelper::copyProperties( _xColDefintion, this ); } - catch(Exception&) + catch( const Exception& ) { - OSL_ENSURE(sal_False, "OTableColumnWrapper::OTableColumnWrapper: caught an exception!"); + DBG_UNHANDLED_EXCEPTION(); } } - osl_decrementInterlockedCount(&m_refCount); + osl_decrementInterlockedCount( &m_refCount ); } //-------------------------------------------------------------------------- @@ -793,27 +640,13 @@ OTableColumnWrapper::~OTableColumnWrapper() { } -// com::sun::star::lang::XTypeProvider //-------------------------------------------------------------------------- -Sequence< sal_Int8 > OTableColumnWrapper::getImplementationId() throw (RuntimeException) -{ - static OImplementationId * pId = 0; - if (! pId) - { - MutexGuard aGuard( Mutex::getGlobalMutex() ); - if (! pId) - { - static OImplementationId aId; - pId = &aId; - } - } - return pId->getImplementationId(); -} -// ::com::sun::star::lang::XServiceInfo +IMPLEMENT_GET_IMPLEMENTATION_ID( OTableColumnWrapper ) + //------------------------------------------------------------------------------ rtl::OUString OTableColumnWrapper::getImplementationName( ) throw (RuntimeException) { - return rtl::OUString::createFromAscii("com.sun.star.sdb.OTableColumnWrapper"); + return rtl::OUString::createFromAscii( "com.sun.star.sdb.OTableColumnWrapper" ); } //------------------------------------------------------------------------------ @@ -835,206 +668,6 @@ Sequence< ::rtl::OUString > OTableColumnWrapper::getSupportedServiceNames( ) th //------------------------------------------------------------------------------ ::cppu::IPropertyArrayHelper* OTableColumnWrapper::createArrayHelper( sal_Int32 nId ) const { - // BEGIN_PROPERTY_HELPER(17) - sal_Int32 nPropertyCount = 16; - // How many properties do we have? - // Which optional properties are contained? - if (nId & HAS_DESCRIPTION) - nPropertyCount++; - if (nId & HAS_DEFAULTVALUE) - nPropertyCount++; - if (nId & HAS_ROWVERSION) - nPropertyCount++; - if ( nId & HAS_AUTOINCREMENT_CREATION ) - ++nPropertyCount; - - Sequence< Property> aDescriptor(nPropertyCount); - Property* pDesc = aDescriptor.getArray(); - sal_Int32 nPos = 0; - - // Description, Defaultvalue, IsRowVersion - DECL_PROP2(ALIGN, sal_Int32, BOUND, MAYBEVOID); - if ( nId & HAS_AUTOINCREMENT_CREATION ) - { - DECL_PROP1(AUTOINCREMENTCREATION,::rtl::OUString, MAYBEVOID); - } - DECL_PROP2(CONTROLDEFAULT, ::rtl::OUString, BOUND,MAYBEVOID); - DECL_PROP1_IFACE(CONTROLMODEL, XPropertySet , BOUND); - if (nId & HAS_DEFAULTVALUE) - { - DECL_PROP1(DEFAULTVALUE, ::rtl::OUString, READONLY); - } - - if (nId & HAS_DESCRIPTION) - { - DECL_PROP1(DESCRIPTION, ::rtl::OUString, READONLY); - } - - DECL_PROP2(NUMBERFORMAT, sal_Int32, BOUND, MAYBEVOID); - DECL_PROP2(HELPTEXT, ::rtl::OUString, BOUND,MAYBEVOID); - DECL_PROP1_BOOL(HIDDEN, BOUND); - DECL_PROP1_BOOL(ISAUTOINCREMENT, READONLY); - DECL_PROP1_BOOL(ISCURRENCY, READONLY); - - DECL_PROP1(ISNULLABLE, sal_Int32, READONLY); - - if (nId & HAS_ROWVERSION) - { - DECL_PROP1_BOOL(ISROWVERSION, READONLY); - } - - DECL_PROP1(NAME, ::rtl::OUString, READONLY); - DECL_PROP1(PRECISION, sal_Int32, READONLY); - DECL_PROP2(RELATIVEPOSITION, sal_Int32, BOUND, MAYBEVOID); - DECL_PROP1(SCALE, sal_Int32, READONLY); - DECL_PROP1(TYPE, sal_Int32, READONLY); - DECL_PROP1(TYPENAME, ::rtl::OUString, READONLY); - DECL_PROP2(WIDTH, sal_Int32, BOUND, MAYBEVOID); - END_PROPERTY_HELPER(); -} - -//============================================================ -//= OIndexColumnWrapper -//============================================================ -// com::sun::star::lang::XTypeProvider -//-------------------------------------------------------------------------- -Sequence< sal_Int8 > OIndexColumnWrapper::getImplementationId() throw (RuntimeException) -{ - static OImplementationId * pId = 0; - if (! pId) - { - MutexGuard aGuard( Mutex::getGlobalMutex() ); - if (! pId) - { - static OImplementationId aId; - pId = &aId; - } - } - return pId->getImplementationId(); -} -// ::com::sun::star::lang::XServiceInfo -//------------------------------------------------------------------------------ -rtl::OUString OIndexColumnWrapper::getImplementationName( ) throw (RuntimeException) -{ - return rtl::OUString::createFromAscii("com.sun.star.sdb.OIndexColumnWrapper"); -} - -//------------------------------------------------------------------------------ -Sequence< ::rtl::OUString > OIndexColumnWrapper::getSupportedServiceNames( ) throw (RuntimeException) -{ - Sequence< ::rtl::OUString > aSNS( 2 ); - aSNS[0] = SERVICE_SDBCX_COLUMN; - aSNS[1] = SERVICE_SDBCX_INDEXCOLUMN; - return aSNS; -} - -//------------------------------------------------------------------------------ -::cppu::IPropertyArrayHelper& OIndexColumnWrapper::getInfoHelper() -{ - return *static_cast< OPropertyArrayUsageHelper< OIndexColumnWrapper >* >(this)->getArrayHelper(); -} - -// comphelper::OPropertyArrayUsageHelper -//------------------------------------------------------------------------------ -::cppu::IPropertyArrayHelper* OIndexColumnWrapper::createArrayHelper() const -{ - BEGIN_PROPERTY_HELPER(9) - DECL_PROP1_BOOL(ISASCENDING, READONLY); - DECL_PROP1_BOOL(ISAUTOINCREMENT, READONLY); - DECL_PROP1_BOOL(ISCURRENCY, READONLY); - DECL_PROP1(ISNULLABLE, sal_Int32, READONLY); - DECL_PROP1(NAME, ::rtl::OUString, READONLY); - DECL_PROP1(PRECISION, sal_Int32, READONLY); - DECL_PROP1(SCALE, sal_Int32, READONLY); - DECL_PROP1(TYPE, sal_Int32, READONLY); - DECL_PROP1(TYPENAME, ::rtl::OUString, READONLY); - END_PROPERTY_HELPER(); -} - -//------------------------------------------------------------------------------ -void OIndexColumnWrapper::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const -{ - switch (nHandle) - { - case PROPERTY_ID_ISASCENDING: - { - sal_Bool bVal = m_bAscending; - rValue.setValue(&bVal, getBooleanCppuType()); - } break; - default: - OColumnWrapper::getFastPropertyValue( rValue, nHandle ); - } + return OTableColumnDescriptorWrapper::createArrayHelper( nId ); } -//============================================================ -//= OKeyColumnWrapper -//============================================================ -// com::sun::star::lang::XTypeProvider -//-------------------------------------------------------------------------- -Sequence< sal_Int8 > OKeyColumnWrapper::getImplementationId() throw (RuntimeException) -{ - static OImplementationId * pId = 0; - if (! pId) - { - MutexGuard aGuard( Mutex::getGlobalMutex() ); - if (! pId) - { - static OImplementationId aId; - pId = &aId; - } - } - return pId->getImplementationId(); -} -// ::com::sun::star::lang::XServiceInfo -//------------------------------------------------------------------------------ -rtl::OUString OKeyColumnWrapper::getImplementationName( ) throw (RuntimeException) -{ - return rtl::OUString::createFromAscii("com.sun.star.sdb.OIndexColumnWrapper"); -} - -//------------------------------------------------------------------------------ -Sequence< ::rtl::OUString > OKeyColumnWrapper::getSupportedServiceNames( ) throw (RuntimeException) -{ - Sequence< ::rtl::OUString > aSNS( 2 ); - aSNS[0] = SERVICE_SDBCX_COLUMN; - aSNS[1] = SERVICE_SDBCX_KEYCOLUMN; - return aSNS; -} - -//------------------------------------------------------------------------------ -::cppu::IPropertyArrayHelper& OKeyColumnWrapper::getInfoHelper() -{ - return *static_cast< OPropertyArrayUsageHelper< OKeyColumnWrapper >* >(this)->getArrayHelper(); -} - -// comphelper::OPropertyArrayUsageHelper -//------------------------------------------------------------------------------ -::cppu::IPropertyArrayHelper* OKeyColumnWrapper::createArrayHelper() const -{ - BEGIN_PROPERTY_HELPER(9) - DECL_PROP1_BOOL(ISAUTOINCREMENT, READONLY); - DECL_PROP1_BOOL(ISCURRENCY, READONLY); - DECL_PROP1(ISNULLABLE, sal_Int32, READONLY); - DECL_PROP1(NAME, ::rtl::OUString, READONLY); - DECL_PROP1(PRECISION, sal_Int32, READONLY); - DECL_PROP1(RELATEDCOLUMN, ::rtl::OUString, READONLY); - DECL_PROP1(SCALE, sal_Int32, READONLY); - DECL_PROP1(TYPE, sal_Int32, READONLY); - DECL_PROP1(TYPENAME, ::rtl::OUString, READONLY); - END_PROPERTY_HELPER(); -} - -//------------------------------------------------------------------------------ -void OKeyColumnWrapper::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const -{ - switch (nHandle) - { - case PROPERTY_ID_RELATEDCOLUMN: - rValue <<= m_aRelatedColumn; - break; - default: - OColumnWrapper::getFastPropertyValue( rValue, nHandle ); - } -} - - diff --git a/dbaccess/source/core/api/makefile.mk b/dbaccess/source/core/api/makefile.mk index 59d89fb9036f..f983db38b640 100644 --- a/dbaccess/source/core/api/makefile.mk +++ b/dbaccess/source/core/api/makefile.mk @@ -73,7 +73,8 @@ SLOFILES= \ $(SLO)$/tablecontainer.obj \ $(SLO)$/SingleSelectQueryComposer.obj \ $(SLO)$/HelperCollections.obj \ - $(SLO)$/datasettings.obj + $(SLO)$/datasettings.obj \ + $(SLO)$/columnsettings.obj # --- Targets ---------------------------------- diff --git a/dbaccess/source/core/api/preparedstatement.cxx b/dbaccess/source/core/api/preparedstatement.cxx index 761b27fc94ed..f2fd05cdf12c 100644 --- a/dbaccess/source/core/api/preparedstatement.cxx +++ b/dbaccess/source/core/api/preparedstatement.cxx @@ -30,39 +30,21 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_dbaccess.hxx" -#ifndef _DBA_COREAPI_PREPAREDSTATEMENT_HXX_ -#include <preparedstatement.hxx> -#endif -#ifndef _DBA_COREAPI_RESULTSET_HXX_ -#include <resultset.hxx> -#endif -#ifndef _DBA_COREAPI_RESULTCOLUMN_HXX_ -#include <resultcolumn.hxx> -#endif -#ifndef DBACCESS_SHARED_DBASTRINGS_HRC + #include "dbastrings.hrc" -#endif -#ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_ + #include <com/sun/star/lang/DisposedException.hpp> -#endif -#ifndef _COM_SUN_STAR_SDBC_XCONNECTION_HPP_ #include <com/sun/star/sdbc/XConnection.hpp> -#endif -#ifndef _COM_SUN_STAR_SDBC_XDATABASEMETADATA_HPP_ #include <com/sun/star/sdbc/XDatabaseMetaData.hpp> -#endif -#ifndef _COMPHELPER_SEQUENCE_HXX_ + +#include <comphelper/property.hxx> #include <comphelper/sequence.hxx> -#endif -#ifndef _CPPUHELPER_TYPEPROVIDER_HXX_ #include <cppuhelper/typeprovider.hxx> -#endif -#ifndef _COMPHELPER_PROPERTY_HXX_ -#include <comphelper/property.hxx> -#endif -#ifndef _TOOLS_DEBUG_HXX //autogen +#include <preparedstatement.hxx> +#include <resultcolumn.hxx> +#include <resultset.hxx> #include <tools/debug.hxx> -#endif +#include <tools/diagnose_ex.h> using namespace ::com::sun::star::sdbc; using namespace ::com::sun::star::sdbcx; @@ -203,27 +185,23 @@ Reference< ::com::sun::star::container::XNameAccess > OPreparedStatement::getCol { try { - // get the metadata - Reference< XResultSetMetaData > xMetaData = Reference< XResultSetMetaDataSupplier >(m_xAggregateAsSet, UNO_QUERY)->getMetaData(); - // do we have columns - if ( xMetaData.is() ) + Reference< XResultSetMetaDataSupplier > xSuppMeta( m_xAggregateAsSet, UNO_QUERY_THROW ); + Reference< XResultSetMetaData > xMetaData( xSuppMeta->getMetaData(), UNO_SET_THROW ); + + Reference< XConnection > xConn( getConnection(), UNO_SET_THROW ); + Reference< XDatabaseMetaData > xDBMeta( xConn->getMetaData(), UNO_SET_THROW ); + + for (sal_Int32 i = 0, nCount = xMetaData->getColumnCount(); i < nCount; ++i) { - Reference< XDatabaseMetaData > xDBMeta; - Reference< XConnection > xConn( getConnection() ); - if ( xConn.is() ) - xDBMeta = xConn->getMetaData(); - - for (sal_Int32 i = 0, nCount = xMetaData->getColumnCount(); i < nCount; ++i) - { - // retrieve the name of the column - rtl::OUString aName = xMetaData->getColumnName(i + 1); - OResultColumn* pColumn = new OResultColumn(xMetaData, i + 1, xDBMeta); - m_pColumns->append(aName, pColumn); - } + // retrieve the name of the column + rtl::OUString aName = xMetaData->getColumnName(i + 1); + OResultColumn* pColumn = new OResultColumn(xMetaData, i + 1, xDBMeta); + m_pColumns->append(aName, pColumn); } } - catch (SQLException) + catch (const SQLException& ) { + DBG_UNHANDLED_EXCEPTION(); } m_pColumns->setInitialized(); } @@ -236,7 +214,7 @@ Reference< XResultSetMetaData > OPreparedStatement::getMetaData(void) throw( SQL { MutexGuard aGuard(m_aMutex); ::connectivity::checkDisposed(OComponentHelper::rBHelper.bDisposed); - return Reference< XResultSetMetaDataSupplier >(m_xAggregateAsSet, UNO_QUERY)->getMetaData(); + return Reference< XResultSetMetaDataSupplier >( m_xAggregateAsSet, UNO_QUERY_THROW )->getMetaData(); } // XPreparedStatement @@ -249,7 +227,7 @@ Reference< XResultSet > OPreparedStatement::executeQuery() throw( SQLException, disposeResultSet(); Reference< XResultSet > xResultSet; - Reference< XResultSet > xDrvResultSet = Reference< XPreparedStatement >(m_xAggregateAsSet, UNO_QUERY)->executeQuery(); + Reference< XResultSet > xDrvResultSet = Reference< XPreparedStatement >( m_xAggregateAsSet, UNO_QUERY_THROW )->executeQuery(); if (xDrvResultSet.is()) { xResultSet = new OResultSet(xDrvResultSet, *this, m_pColumns->isCaseSensitive()); @@ -268,7 +246,7 @@ sal_Int32 OPreparedStatement::executeUpdate() throw( SQLException, RuntimeExcept disposeResultSet(); - return Reference< XPreparedStatement >(m_xAggregateAsSet, UNO_QUERY)->executeUpdate(); + return Reference< XPreparedStatement >( m_xAggregateAsSet, UNO_QUERY_THROW )->executeUpdate(); } //------------------------------------------------------------------------------ @@ -278,7 +256,8 @@ sal_Bool OPreparedStatement::execute() throw( SQLException, RuntimeException ) ::connectivity::checkDisposed(OComponentHelper::rBHelper.bDisposed); disposeResultSet(); - return Reference< XPreparedStatement >(m_xAggregateAsSet, UNO_QUERY)->execute(); + + return Reference< XPreparedStatement >( m_xAggregateAsSet, UNO_QUERY_THROW )->execute(); } //------------------------------------------------------------------------------ diff --git a/dbaccess/source/core/api/query.cxx b/dbaccess/source/core/api/query.cxx index 489ca625c5d7..7468e88f4fff 100644 --- a/dbaccess/source/core/api/query.cxx +++ b/dbaccess/source/core/api/query.cxx @@ -241,13 +241,12 @@ void OQuery::rebuildColumns() for ( ;pBegin != pEnd; ++pBegin) { Reference<XPropertySet> xSource(xColumns->getByName( *pBegin ),UNO_QUERY); - OTableColumn* pColumn = new OTableColumn( xSource ); - Reference<XChild> xChild(*pColumn,UNO_QUERY); - if ( xChild.is() ) - xChild->setParent(*this); + OQueryColumn* pColumn = new OQueryColumn( xSource, m_xConnection ); + Reference< XChild > xChild( *pColumn, UNO_QUERY_THROW ); + xChild->setParent( *this ); implAppendColumn( *pBegin, pColumn ); - Reference<XPropertySet> xDest(*pColumn,UNO_QUERY); + Reference< XPropertySet > xDest( *pColumn, UNO_QUERY_THROW ); if ( m_pColumnMediator.is() ) m_pColumnMediator->notifyElementCreated( *pBegin, xDest ); } diff --git a/dbaccess/source/core/api/querycontainer.cxx b/dbaccess/source/core/api/querycontainer.cxx index f86a1a8bf6e5..2d75ce3bf8bd 100644 --- a/dbaccess/source/core/api/querycontainer.cxx +++ b/dbaccess/source/core/api/querycontainer.cxx @@ -163,6 +163,10 @@ OQueryContainer::~OQueryContainer() } // ----------------------------------------------------------------------------- IMPLEMENT_FORWARD_XINTERFACE2( OQueryContainer,ODefinitionContainer,OQueryContainer_Base) + +//------------------------------------------------------------------------------ +IMPLEMENT_FORWARD_XTYPEPROVIDER2( OQueryContainer,ODefinitionContainer,OQueryContainer_Base) + //------------------------------------------------------------------------------ void OQueryContainer::disposing() { diff --git a/dbaccess/source/core/api/querydescriptor.cxx b/dbaccess/source/core/api/querydescriptor.cxx index 5f8c265e36df..2dfb6714ee63 100644 --- a/dbaccess/source/core/api/querydescriptor.cxx +++ b/dbaccess/source/core/api/querydescriptor.cxx @@ -242,7 +242,7 @@ Reference< XNameAccess > SAL_CALL OQueryDescriptor_Base::getColumns( ) throw (Ru { rebuildColumns(); } - catch(...) + catch ( const Exception& ) { setColumnsOutOfDate( sal_True ); throw; @@ -313,9 +313,10 @@ void OQueryDescriptor_Base::refreshColumns() } //------------------------------------------------------------------------------ -OColumn* OQueryDescriptor_Base::createColumn(const ::rtl::OUString& _rName) const +OColumn* OQueryDescriptor_Base::createColumn( const ::rtl::OUString& /*_rName*/ ) const { - return new OTableColumn(_rName); + // creating a column/descriptor for a query/descriptor does not make sense at all + return NULL; } // ----------------------------------------------------------------------------- //........................................................................ diff --git a/dbaccess/source/core/api/resultcolumn.cxx b/dbaccess/source/core/api/resultcolumn.cxx index 4fb765148df9..33cc93b02994 100644 --- a/dbaccess/source/core/api/resultcolumn.cxx +++ b/dbaccess/source/core/api/resultcolumn.cxx @@ -82,13 +82,12 @@ using namespace dbaccess; DBG_NAME(OResultColumn) //-------------------------------------------------------------------------- -OResultColumn::OResultColumn( - const Reference < XResultSetMetaData >& _xMetaData, - sal_Int32 _nPos, - const Reference< XDatabaseMetaData >& _rxDBMeta ) - :m_xMetaData(_xMetaData) - ,m_xDBMetaData(_rxDBMeta) - ,m_nPos(_nPos) +OResultColumn::OResultColumn( const Reference < XResultSetMetaData >& _xMetaData, sal_Int32 _nPos, + const Reference< XDatabaseMetaData >& _rxDBMeta ) + :OColumn( true ) + ,m_xMetaData( _xMetaData ) + ,m_xDBMetaData( _rxDBMeta ) + ,m_nPos( _nPos ) { DBG_CTOR(OResultColumn,NULL); } @@ -216,112 +215,95 @@ void OResultColumn::disposing() } //------------------------------------------------------------------------------ +namespace +{ + template< typename TYPE > + void obtain( Any& _out_rValue, ::boost::optional< TYPE > _rCache, const sal_Int32 _nPos, const Reference < XResultSetMetaData >& _rxResultMeta, TYPE (SAL_CALL XResultSetMetaData::*Getter)( sal_Int32 ) ) + { + if ( !_rCache ) + _rCache.reset( (_rxResultMeta.get()->*Getter)( _nPos ) ); + _out_rValue <<= *_rCache; + } +} + +//------------------------------------------------------------------------------ void OResultColumn::getFastPropertyValue( Any& rValue, sal_Int32 nHandle ) const { try { - switch (nHandle) + if ( OColumn::isRegisteredProperty( nHandle ) ) { - case PROPERTY_ID_ISROWVERSION: - const_cast< OResultColumn* >( this )->impl_determineIsRowVersion_nothrow(); - rValue = m_aIsRowVersion; - break; - case PROPERTY_ID_TABLENAME: - rValue <<= m_xMetaData->getTableName(m_nPos); - break; - case PROPERTY_ID_SCHEMANAME: - rValue <<= m_xMetaData->getSchemaName(m_nPos); - break; - case PROPERTY_ID_CATALOGNAME: - rValue <<= m_xMetaData->getCatalogName(m_nPos); - break; - case PROPERTY_ID_ISSIGNED: - { - if ( !m_isSigned ) - m_isSigned.reset( m_xMetaData->isSigned(m_nPos)); - rValue <<= *m_isSigned; - } break; - case PROPERTY_ID_ISCURRENCY: - { - if ( !m_isCurrency ) - m_isCurrency.reset( m_xMetaData->isCurrency(m_nPos)); - rValue <<= *m_isCurrency; - } break; - case PROPERTY_ID_ISSEARCHABLE: - { - if ( !m_bSearchable ) - m_bSearchable.reset( m_xMetaData->isSearchable(m_nPos)); - rValue <<= *m_bSearchable; - } break; - case PROPERTY_ID_ISCASESENSITIVE: - { - if ( !m_isCaseSensitive ) - m_isCaseSensitive.reset( m_xMetaData->isCaseSensitive(m_nPos)); - rValue <<= *m_isCaseSensitive; - } break; - case PROPERTY_ID_ISREADONLY: - { - if ( !m_isReadOnly ) - m_isReadOnly.reset( m_xMetaData->isReadOnly(m_nPos)); - rValue <<= *m_isReadOnly; - } break; - case PROPERTY_ID_ISWRITABLE: - { - if ( !m_isWritable ) - m_isWritable.reset( m_xMetaData->isWritable(m_nPos)); - rValue <<= *m_isWritable; - } break; - case PROPERTY_ID_ISDEFINITELYWRITABLE: - { - if ( !m_isDefinitelyWritable ) - m_isDefinitelyWritable.reset( m_xMetaData->isDefinitelyWritable(m_nPos)); - rValue <<= *m_isDefinitelyWritable; - } break; - case PROPERTY_ID_ISAUTOINCREMENT: + OColumn::getFastPropertyValue( rValue, nHandle ); + } + else + { + switch (nHandle) { - if ( !m_isAutoIncrement ) - m_isAutoIncrement.reset( m_xMetaData->isAutoIncrement(m_nPos)); - rValue <<= *m_isAutoIncrement; - } break; - case PROPERTY_ID_SERVICENAME: - rValue <<= m_xMetaData->getColumnServiceName(m_nPos); - break; - case PROPERTY_ID_LABEL: - if ( !m_sColumnLabel ) - m_sColumnLabel.reset( m_xMetaData->getColumnLabel(m_nPos)); - rValue <<= *m_sColumnLabel; - break; - case PROPERTY_ID_DISPLAYSIZE: - if ( !m_nColumnDisplaySize ) - m_nColumnDisplaySize.reset( m_xMetaData->getColumnDisplaySize(m_nPos)); - rValue <<= *m_nColumnDisplaySize; - break; - case PROPERTY_ID_TYPE: - if ( !m_nColumnType ) - m_nColumnType.reset( m_xMetaData->getColumnType(m_nPos)); - rValue <<= *m_nColumnType; - break; - case PROPERTY_ID_PRECISION: - if ( !m_nPrecision ) - m_nPrecision.reset( m_xMetaData->getPrecision(m_nPos)); - rValue <<= *m_nPrecision; - break; - case PROPERTY_ID_SCALE: - if ( !m_nScale ) - m_nScale.reset( m_xMetaData->getScale(m_nPos)); - rValue <<= *m_nScale; - break; - case PROPERTY_ID_ISNULLABLE: - if ( !m_isNullable ) - m_isNullable.reset( m_xMetaData->isNullable(m_nPos)); - rValue <<= *m_isNullable; - break; - case PROPERTY_ID_TYPENAME: - rValue <<= m_xMetaData->getColumnTypeName(m_nPos); - break; - case PROPERTY_ID_NAME: - OColumn::getFastPropertyValue( rValue, nHandle ); - break; + case PROPERTY_ID_ISROWVERSION: + const_cast< OResultColumn* >( this )->impl_determineIsRowVersion_nothrow(); + rValue = m_aIsRowVersion; + break; + case PROPERTY_ID_TABLENAME: + rValue <<= m_xMetaData->getTableName(m_nPos); + break; + case PROPERTY_ID_SCHEMANAME: + rValue <<= m_xMetaData->getSchemaName(m_nPos); + break; + case PROPERTY_ID_CATALOGNAME: + rValue <<= m_xMetaData->getCatalogName(m_nPos); + break; + case PROPERTY_ID_ISSIGNED: + obtain( rValue, m_isSigned, m_nPos, m_xMetaData, &XResultSetMetaData::isSigned ); + break; + case PROPERTY_ID_ISCURRENCY: + obtain( rValue, m_isCurrency, m_nPos, m_xMetaData, &XResultSetMetaData::isCurrency ); + break; + case PROPERTY_ID_ISSEARCHABLE: + obtain( rValue, m_bSearchable, m_nPos, m_xMetaData, &XResultSetMetaData::isSearchable ); + break; + case PROPERTY_ID_ISCASESENSITIVE: + obtain( rValue, m_isCaseSensitive, m_nPos, m_xMetaData, &XResultSetMetaData::isCaseSensitive ); + break; + case PROPERTY_ID_ISREADONLY: + obtain( rValue, m_isReadOnly, m_nPos, m_xMetaData, &XResultSetMetaData::isReadOnly ); + break; + case PROPERTY_ID_ISWRITABLE: + obtain( rValue, m_isWritable, m_nPos, m_xMetaData, &XResultSetMetaData::isWritable ); + break; + case PROPERTY_ID_ISDEFINITELYWRITABLE: + obtain( rValue, m_isDefinitelyWritable, m_nPos, m_xMetaData, &XResultSetMetaData::isDefinitelyWritable ); + break; + case PROPERTY_ID_ISAUTOINCREMENT: + obtain( rValue, m_isAutoIncrement, m_nPos, m_xMetaData, &XResultSetMetaData::isAutoIncrement ); + break; + case PROPERTY_ID_SERVICENAME: + rValue <<= m_xMetaData->getColumnServiceName(m_nPos); + break; + case PROPERTY_ID_LABEL: + obtain( rValue, m_sColumnLabel, m_nPos, m_xMetaData, &XResultSetMetaData::getColumnLabel ); + break; + case PROPERTY_ID_DISPLAYSIZE: + obtain( rValue, m_nColumnDisplaySize, m_nPos, m_xMetaData, &XResultSetMetaData::getColumnDisplaySize ); + break; + case PROPERTY_ID_TYPE: + obtain( rValue, m_nColumnType, m_nPos, m_xMetaData, &XResultSetMetaData::getColumnType ); + break; + case PROPERTY_ID_PRECISION: + obtain( rValue, m_nPrecision, m_nPos, m_xMetaData, &XResultSetMetaData::getPrecision ); + break; + case PROPERTY_ID_SCALE: + obtain( rValue, m_nScale, m_nPos, m_xMetaData, &XResultSetMetaData::getScale ); + break; + case PROPERTY_ID_ISNULLABLE: + obtain( rValue, m_isNullable, m_nPos, m_xMetaData, &XResultSetMetaData::isNullable ); + break; + case PROPERTY_ID_TYPENAME: + rValue <<= m_xMetaData->getColumnTypeName(m_nPos); + break; + default: + OSL_ENSURE( false, "OResultColumn::getFastPropertyValue: unknown property handle!" ); + break; + } } } catch (SQLException& ) diff --git a/dbaccess/source/core/api/table.cxx b/dbaccess/source/core/api/table.cxx index 9d2772a5f3ef..301038903b97 100644 --- a/dbaccess/source/core/api/table.cxx +++ b/dbaccess/source/core/api/table.cxx @@ -182,7 +182,7 @@ OColumn* ODBTable::createColumn(const ::rtl::OUString& _rName) const Reference<XPropertySet> xColumnDefintion; if ( m_xColumnDefinitions.is() && m_xColumnDefinitions->hasByName(_rName) ) xColumnDefintion.set(m_xColumnDefinitions->getByName(_rName),UNO_QUERY); - pReturn = new OTableColumnWrapper(xProp,xColumnDefintion); + pReturn = new OTableColumnWrapper( xProp, xColumnDefintion, false ); return pReturn; } @@ -468,7 +468,7 @@ Sequence< sal_Int8 > ODBTable::getUnoTunnelImplementationId() Reference< XPropertySet > ODBTable::createColumnDescriptor() { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "dbaccess", "Ocke.Janssen@sun.com", "ODBTable::createColumnDescriptor" ); - return new OTableColumnDescriptor(); + return new OTableColumnDescriptor( true ); } // ----------------------------------------------------------------------------- sdbcx::OCollection* ODBTable::createColumns(const TStringVector& _rNames) diff --git a/dbaccess/source/core/api/tablecontainer.cxx b/dbaccess/source/core/api/tablecontainer.cxx index 2d8ce453fb2c..8c1abc1f0048 100644 --- a/dbaccess/source/core/api/tablecontainer.cxx +++ b/dbaccess/source/core/api/tablecontainer.cxx @@ -364,15 +364,11 @@ ObjectType OTableContainer::appendObject( const ::rtl::OUString& _rForName, cons if ( !xColumnDefinitions->hasByName(*pIter) ) { Reference<XPropertySet> xColumn(xNames->getByName(*pIter),UNO_QUERY); - OColumnSettings* pColumnSettings = NULL; - if ( ::comphelper::getImplementation( pColumnSettings, xColumn ) ) + if ( !OColumnSettings::hasDefaultSettings( xColumn ) ) { - if ( ( pColumnSettings && !pColumnSettings->isDefaulted() ) ) - { - ::comphelper::copyProperties(xColumn,xProp); - xAppend->appendByDescriptor(xProp); - bModified = sal_True; - } + ::comphelper::copyProperties( xColumn, xProp ); + xAppend->appendByDescriptor( xProp ); + bModified = sal_True; } } } |