User: obo Date: 2006/07/10 07:20:31 Modified: dba/connectivity/source/commontools/dbtools.cxx
Log: INTEGRATION: CWS qiq (1.59.34); FILE MERGED 2006/06/28 08:40:40 fs 1.59.34.5: #i10000# 2006/06/27 13:58:09 fs 1.59.34.4: RESYNC: (1.59-1.60); FILE MERGED 2006/05/24 11:42:55 fs 1.59.34.3: #i10000# 2006/05/23 13:22:03 fs 1.59.34.2: some refactoring of compose/quoteTableName and friends, in preparation of #i51143# 2006/05/11 10:31:09 fs 1.59.34.1: #i51143# +prependErrorInfo File Changes: Directory: /dba/connectivity/source/commontools/ ================================================ File [changed]: dbtools.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/commontools/dbtools.cxx?r1=1.60&r2=1.61 Delta lines: +179 -83 ---------------------- --- dbtools.cxx 20 Jun 2006 01:06:02 -0000 1.60 +++ dbtools.cxx 10 Jul 2006 14:20:29 -0000 1.61 @@ -217,6 +217,12 @@ //============================================================================== //============================================================================== +namespace +{ + typedef sal_Bool (SAL_CALL XDatabaseMetaData::*FMetaDataSupport)(); +} +//============================================================================== +//============================================================================== sal_Int32 getDefaultNumberFormat(const Reference< XPropertySet >& _xColumn, const Reference< XNumberFormatTypes >& _xTypes, const Locale& _rLocale) @@ -845,25 +851,110 @@ //------------------------------------------------------------------------------ SQLContext prependContextInfo(const SQLException& _rException, const Reference< XInterface >& _rxContext, const ::rtl::OUString& _rContextDescription, const ::rtl::OUString& _rContextDetails) { - // determine the type of the exception - SQLExceptionInfo aInfo(_rException); + return SQLContext( _rContextDescription, _rxContext, ::rtl::OUString(), 0, makeAny( _rException ), _rContextDetails ); +} +//------------------------------------------------------------------------------ +SQLException prependErrorInfo( const SQLException& _rChainedException, const Reference< XInterface >& _rxContext, + const ::rtl::OUString& _rAdditionalError, const StandardSQLState _eSQLState, const sal_Int32 _nErrorCode ) +{ + return SQLException( _rAdditionalError, _rxContext, + _eSQLState == SQL_ERROR_UNSPECIFIED ? ::rtl::OUString() : getStandardSQLState( _eSQLState ), + _nErrorCode, makeAny( _rChainedException ) ); +} + +//-------------------------------------------------------------------------- +static ::rtl::OUString impl_doComposeTableName( const Reference< XDatabaseMetaData >& _rxMetaData, + const ::rtl::OUString& _rCatalog, const ::rtl::OUString& _rSchema, const ::rtl::OUString& _rName, + sal_Bool _bQuote, EComposeRule _eComposeRule ) +{ + ::rtl::OUString sComposedName; + + OSL_ENSURE(_rxMetaData.is(), "impl_doComposeTableName : invalid meta data !"); + if ( !_rxMetaData.is() ) + return sComposedName; + OSL_ENSURE(_rName.getLength(), "impl_doComposeTableName : at least the name should be non-empty !"); + + FMetaDataSupport pCatalogCall = &XDatabaseMetaData::supportsCatalogsInDataManipulation; + FMetaDataSupport pSchemaCall = &XDatabaseMetaData::supportsSchemasInDataManipulation; + bool bIgnoreMetaData = false; + + switch ( _eComposeRule ) + { + case eInTableDefinitions: + pCatalogCall = &XDatabaseMetaData::supportsCatalogsInTableDefinitions; + pSchemaCall = &XDatabaseMetaData::supportsSchemasInTableDefinitions; + break; + case eInIndexDefinitions: + pCatalogCall = &XDatabaseMetaData::supportsCatalogsInIndexDefinitions; + pSchemaCall = &XDatabaseMetaData::supportsSchemasInIndexDefinitions; + break; + case eInProcedureCalls: + pCatalogCall = &XDatabaseMetaData::supportsCatalogsInProcedureCalls; + pSchemaCall = &XDatabaseMetaData::supportsSchemasInProcedureCalls; + break; + case eInPrivilegeDefinitions: + pCatalogCall = &XDatabaseMetaData::supportsCatalogsInPrivilegeDefinitions; + pSchemaCall = &XDatabaseMetaData::supportsSchemasInPrivilegeDefinitions; + break; + case eComplete: + bIgnoreMetaData = true; + break; + case eInDataManipulation: + // already properly set above + break; + } + + + ::rtl::OUString sQuoteString = _rxMetaData->getIdentifierQuoteString(); +#define QUOTE(s,s2) if (_bQuote) s += quoteName(sQuoteString,s2); else s += s2 + + static ::rtl::OUString sSeparator = ::rtl::OUString::createFromAscii("."); + + ::rtl::OUString sCatalogSep; + sal_Bool bCatlogAtStart = sal_True; + if ( _rCatalog.getLength() && ( bIgnoreMetaData || (_rxMetaData.get()->*pCatalogCall)() ) ) + { + sCatalogSep = _rxMetaData->getCatalogSeparator(); + bCatlogAtStart = _rxMetaData->isCatalogAtStart(); + + if ( bCatlogAtStart && sCatalogSep.getLength()) + { + QUOTE(sComposedName,_rCatalog); + sComposedName += sCatalogSep; + } + } + + if ( _rSchema.getLength() && ( bIgnoreMetaData || (_rxMetaData.get()->*pSchemaCall)() ) ) + { + QUOTE(sComposedName,_rSchema); + sComposedName += sSeparator; + } + + QUOTE(sComposedName,_rName); + + if ( _rCatalog.getLength() + && !bCatlogAtStart + && sCatalogSep.getLength() + && ( bIgnoreMetaData + || (_rxMetaData.get()->*pCatalogCall)() + ) + ) + { + sComposedName += sCatalogSep; + QUOTE(sComposedName,_rCatalog); + } - // the new first chain element - SQLContext aContextDescription(_rContextDescription, _rxContext, ::rtl::OUString(), 0, aInfo.get(), _rContextDetails); - return aContextDescription; + return sComposedName; } + //------------------------------------------------------------------------------ ::rtl::OUString quoteTableName(const Reference< XDatabaseMetaData>& _rxMeta , const ::rtl::OUString& _rName - , EComposeRule _eComposeRule - , sal_Bool _bUseCatalogInSelect - , sal_Bool _bUseSchemaInSelect) + , EComposeRule _eComposeRule) { - ::rtl::OUString sCatalog,sSchema,sTable,sQuotedName; + ::rtl::OUString sCatalog, sSchema, sTable; qualifiedNameComponents(_rxMeta,_rName,sCatalog,sSchema,sTable,_eComposeRule); - composeTableName(_rxMeta,sCatalog,sSchema,sTable,sQuotedName,sal_True,_eComposeRule,_bUseCatalogInSelect,_bUseSchemaInSelect); - - return sQuotedName; + return impl_doComposeTableName( _rxMeta, sCatalog, sSchema, sTable, sal_True, _eComposeRule ); } //------------------------------------------------------------------------------ @@ -1278,10 +1369,12 @@ if ( !sCommand.getLength() ) break; - sal_Bool bUseCatalogInSelect = isDataSourcePropertyEnabled(xConn,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UseCatalogInSelect")),sal_True); - sal_Bool bUseSchemaInSelect = isDataSourcePropertyEnabled(xConn,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UseSchemaInSelect")),sal_True); sStatement = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SELECT * FROM ")); - sStatement += quoteTableName(xConn->getMetaData(), sCommand,eInDataManipulation,bUseCatalogInSelect,bUseSchemaInSelect); + + ::rtl::OUString sCatalog, sSchema, sTable; + qualifiedNameComponents( xConn->getMetaData(), sCommand, sCatalog, sSchema, sTable, eInDataManipulation ); + + sStatement += composeTableNameForSelect( xConn, sCatalog, sSchema, sTable ); } break; @@ -1422,84 +1515,87 @@ return xReturn; } //-------------------------------------------------------------------------- -void composeTableName( const Reference< XDatabaseMetaData >& _rxMetaData, +::rtl::OUString composeTableName( const Reference< XDatabaseMetaData >& _rxMetaData, const ::rtl::OUString& _rCatalog, const ::rtl::OUString& _rSchema, const ::rtl::OUString& _rName, - ::rtl::OUString& _rComposedName, sal_Bool _bQuote, - EComposeRule _eComposeRule - , sal_Bool _bUseCatalogInSelect - , sal_Bool _bUseSchemaInSelect) + EComposeRule _eComposeRule) { - OSL_ENSURE(_rxMetaData.is(), "composeTableName : invalid meta data !"); - if ( !_rxMetaData.is() ) - return; // just to be save here - OSL_ENSURE(_rName.getLength(), "composeTableName : at least the name should be non-empty !"); - - typedef sal_Bool (SAL_CALL XDatabaseMetaData::*GetBooleanMetaData)(); - GetBooleanMetaData catalogUsage = &XDatabaseMetaData::supportsCatalogsInDataManipulation; - GetBooleanMetaData schemaUsage = &XDatabaseMetaData::supportsSchemasInDataManipulation; - - switch ( _eComposeRule ) - { - case eInTableDefinitions: - catalogUsage = &XDatabaseMetaData::supportsCatalogsInTableDefinitions; - schemaUsage = &XDatabaseMetaData::supportsSchemasInTableDefinitions; - break; - case eInIndexDefinitions: - catalogUsage = &XDatabaseMetaData::supportsCatalogsInIndexDefinitions; - schemaUsage = &XDatabaseMetaData::supportsSchemasInIndexDefinitions; - break; - case eInProcedureCalls: - catalogUsage = &XDatabaseMetaData::supportsCatalogsInProcedureCalls; - schemaUsage = &XDatabaseMetaData::supportsSchemasInProcedureCalls; - break; - case eInPrivilegeDefinitions: - catalogUsage = &XDatabaseMetaData::supportsCatalogsInPrivilegeDefinitions; - schemaUsage = &XDatabaseMetaData::supportsSchemasInPrivilegeDefinitions; - break; - case eInDataManipulation: - catalogUsage = &XDatabaseMetaData::supportsCatalogsInDataManipulation; - schemaUsage = &XDatabaseMetaData::supportsSchemasInDataManipulation; - break; - } - - - ::rtl::OUString sQuoteString = _rxMetaData->getIdentifierQuoteString(); -#define QUOTE(s,s2) if (_bQuote) s += quoteName(sQuoteString,s2); else s += s2 + return impl_doComposeTableName( _rxMetaData, _rCatalog, _rSchema, _rName, _bQuote, _eComposeRule ); +} - static ::rtl::OUString sEmpty; - static ::rtl::OUString sSeparator = ::rtl::OUString::createFromAscii("."); +// ----------------------------------------------------------------------------- +::rtl::OUString composeTableNameForSelect( const Reference< XConnection >& _rxConnection, + const ::rtl::OUString& _rCatalog, const ::rtl::OUString& _rSchema, const ::rtl::OUString& _rName ) +{ + sal_Bool bUseCatalogInSelect = isDataSourcePropertyEnabled( _rxConnection, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UseCatalogInSelect" ) ), sal_True ); + sal_Bool bUseSchemaInSelect = isDataSourcePropertyEnabled( _rxConnection, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UseSchemaInSelect" ) ), sal_True ); - _rComposedName = sEmpty; - ::rtl::OUString sCatalogSep; - sal_Bool bCatlogAtStart = sal_True; - if ( _bUseCatalogInSelect && _rCatalog.getLength() && (_rxMetaData.get()->*catalogUsage)() ) - { - sCatalogSep = _rxMetaData->getCatalogSeparator(); - bCatlogAtStart = _rxMetaData->isCatalogAtStart(); + return impl_doComposeTableName( + _rxConnection->getMetaData(), + bUseCatalogInSelect ? _rCatalog : ::rtl::OUString(), + bUseSchemaInSelect ? _rSchema : ::rtl::OUString(), + _rName, + true, + eInDataManipulation + ); +} - if ( bCatlogAtStart && sCatalogSep.getLength()) +// ----------------------------------------------------------------------------- +namespace +{ + static void lcl_getTableNameComponents( const Reference<XPropertySet>& _xTable, + ::rtl::OUString& _out_rCatalog, ::rtl::OUString& _out_rSchema, ::rtl::OUString& _out_rName ) { - QUOTE(_rComposedName,_rCatalog); - _rComposedName += sCatalogSep; + ::dbtools::OPropertyMap& rPropMap = OMetaConnection::getPropMap(); + Reference< XPropertySetInfo > xInfo = _xTable->getPropertySetInfo(); + if ( xInfo.is() + && xInfo->hasPropertyByName(rPropMap.getNameByIndex(PROPERTY_ID_CATALOGNAME)) + && xInfo->hasPropertyByName(rPropMap.getNameByIndex(PROPERTY_ID_SCHEMANAME)) + && xInfo->hasPropertyByName(rPropMap.getNameByIndex(PROPERTY_ID_NAME)) ) + { + + ::rtl::OUString aCatalog; + ::rtl::OUString aSchema; + ::rtl::OUString aTable; + _xTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_CATALOGNAME)) >>= _out_rCatalog; + _xTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_SCHEMANAME)) >>= _out_rSchema; + _xTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_NAME)) >>= _out_rName; } + else + OSL_ENSURE( false, "::dbtools::lcl_getTableNameComponents: this is no table object!" ); } +} - if ( _bUseSchemaInSelect && _rSchema.getLength() && (_rxMetaData.get()->*schemaUsage)() ) - { - QUOTE(_rComposedName,_rSchema); - _rComposedName += sSeparator; - } +// ----------------------------------------------------------------------------- +::rtl::OUString composeTableNameForSelect( const Reference< XConnection >& _rxConnection, const Reference<XPropertySet>& _xTable ) +{ + ::rtl::OUString sCatalog, sSchema, sName; + lcl_getTableNameComponents( _xTable, sCatalog, sSchema, sName ); - QUOTE(_rComposedName,_rName); + return composeTableNameForSelect( _rxConnection, sCatalog, sSchema, sName ); +} - if ( _bUseCatalogInSelect && _rCatalog.getLength() && !bCatlogAtStart && sCatalogSep.getLength() && (_rxMetaData.get()->*catalogUsage)() ) - { - _rComposedName += sCatalogSep; - QUOTE(_rComposedName,_rCatalog); - } +// ----------------------------------------------------------------------------- +::rtl::OUString composeTableName(const Reference<XDatabaseMetaData>& _xMetaData, + const Reference<XPropertySet>& _xTable, + EComposeRule _eComposeRule, + bool _bSuppressCatalog, + bool _bSuppressSchema, + bool _bQuote ) +{ + ::rtl::OUString sCatalog, sSchema, sName; + lcl_getTableNameComponents( _xTable, sCatalog, sSchema, sName ); + + return impl_doComposeTableName( + _xMetaData, + _bSuppressCatalog ? ::rtl::OUString() : sCatalog, + _bSuppressSchema ? ::rtl::OUString() : sSchema, + sName, + _bQuote, + _eComposeRule + ); } // ----------------------------------------------------------------------------- sal_Int32 getSearchColumnFlag( const Reference< XConnection>& _rxConn,sal_Int32 _nDataType) --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
