Tag: cws_src680_qiq User: fs Date: 06/06/06 07:01:56 Modified: /dba/dbaccess/source/core/api/ SingleSelectQueryComposer.cxx
Log: #i51143# getColumns: provide columns even if we can parse, but not execute the statement (e.g. due to it containing parameters, which we cannot fill in just to examine the columns) File Changes: Directory: /dba/dbaccess/source/core/api/ ========================================= File [changed]: SingleSelectQueryComposer.cxx Url: http://dba.openoffice.org/source/browse/dba/dbaccess/source/core/api/SingleSelectQueryComposer.cxx?r1=1.13.18.6&r2=1.13.18.7 Delta lines: +38 -35 --------------------- --- SingleSelectQueryComposer.cxx 1 Jun 2006 12:29:00 -0000 1.13.18.6 +++ SingleSelectQueryComposer.cxx 6 Jun 2006 14:01:53 -0000 1.13.18.7 @@ -4,9 +4,9 @@ * * $RCSfile: SingleSelectQueryComposer.cxx,v $ * - * $Revision: 1.13.18.6 $ + * $Revision: 1.13.18.7 $ * - * last change: $Author: fs $ $Date: 2006/06/01 12:29:00 $ + * last change: $Author: fs $ $Date: 2006/06/06 14:01:53 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -83,6 +83,9 @@ #ifndef _UTL_CONFIGMGR_HXX_ #include <unotools/configmgr.hxx> #endif +#ifndef UNOTOOLS_INC_SHAREDUNOCOMPONENT_HXX +#include <unotools/sharedunocomponent.hxx> +#endif #ifndef _COMPHELPER_TYPES_HXX_ #include <comphelper/types.hxx> #endif @@ -737,16 +740,11 @@ try { + SharedUNOComponent< XStatement, DisposableComponent > xStatement; + SharedUNOComponent< XPreparedStatement, DisposableComponent > xPreparedStatement; + bCase = m_xMetaData->storesMixedCaseQuotedIdentifiers(); aSelectColumns = m_aSqlIterator.getSelectColumns(); - // now set the columns we have to look if the order of the columns is correct - Reference<XStatement> xStmt = m_xConnection->createStatement(); - if ( !xStmt.is() ) - { - for(OSQLColumns::const_iterator aIter = aSelectColumns->begin(); aIter != aSelectColumns->end();++aIter) - aNames.push_back(getString((*aIter)->getPropertyValue(PROPERTY_NAME))); - break; - } ::rtl::OUString sSql = m_aPureSelectSQL; sSql += STR_WHERE; @@ -762,9 +760,29 @@ if ( pStatementTree.get() ) pStatementTree->parseNodeToExecutableStatement( sSql, m_xConnection, m_aSqlParser ); - Reference<XResultSetMetaDataSupplier> xResMetaDataSup; - xResMetaDataSup = Reference<XResultSetMetaDataSupplier>(xStmt->executeQuery(sSql),UNO_QUERY); - Reference<XResultSetMetaData> xResultSetMeta = xResMetaDataSup->getMetaData(); + Reference< XResultSetMetaData > xResultSetMeta; + try + { + xStatement.reset( Reference< XStatement >( m_xConnection->createStatement(), UNO_QUERY_THROW ) ); + Reference< XResultSetMetaDataSupplier > xResMetaDataSup( xStatement->executeQuery( sSql ), UNO_QUERY_THROW ); + xResultSetMeta.set( xResMetaDataSup->getMetaData(), UNO_QUERY_THROW ); + } + catch( const Exception& ) { } + + if ( !xResultSetMeta.is() ) + { + xPreparedStatement.set( m_xConnection->prepareStatement( sSql ), UNO_QUERY_THROW ); + Reference< XResultSetMetaDataSupplier > xResMetaDataSup( xPreparedStatement, UNO_QUERY_THROW ); + xResultSetMeta.set( xResMetaDataSup->getMetaData(), UNO_QUERY_THROW ); + } + + if ( aSelectColumns->empty() ) + { + // This is a valid casse. If we can syntactically parse the query, but not semantically + // (e.g. because it is based on a table we do not know), then there will be no SelectColumns + aSelectColumns = ::connectivity::parse::OParseColumn::createColumnsForResultSet( xResultSetMeta, m_xMetaData ); + break; + } const ::comphelper::UStringMixEqual aCaseCompare( bCase ); const ::comphelper::TStringMixEqualFunctor aCaseCompareFunctor( bCase ); @@ -809,27 +827,9 @@ if ( i > static_cast< sal_Int32>( aSelectColumns->size() ) ) { - ::connectivity::parse::OParseColumn* pColumn = new ::connectivity::parse::OParseColumn( - sName, - xResultSetMeta->getColumnTypeName( i ), - ::rtl::OUString(), - xResultSetMeta->isNullable( i ), - xResultSetMeta->getPrecision( i ), - xResultSetMeta->getScale( i ), - xResultSetMeta->getColumnType( i ), - xResultSetMeta->isAutoIncrement( i ), - xResultSetMeta->isCurrency( i ), - bCase + aSelectColumns->push_back( + ::connectivity::parse::OParseColumn::createColumnForResultSet( xResultSetMeta, m_xMetaData, i ) ); - pColumn->setTableName( ::dbtools::composeTableName( m_xMetaData, - xResultSetMeta->getCatalogName( i ), - xResultSetMeta->getSchemaName( i ), - xResultSetMeta->getTableName( i ), - sal_False, - eComplete - ) ); - - aSelectColumns->push_back( pColumn ); OSL_ENSURE( aSelectColumns->size() == (size_t)i, "OSingleSelectQueryComposer::getColumns: inconsistency!" ); } else if ( aRealFind == aSelectColumns->end() ) @@ -872,7 +872,6 @@ aUsedSelectColumns.insert( (size_t)(i - 1) ); aNames.push_back( sName ); } - ::comphelper::disposeComponent(xStmt); } catch(const Exception&) { @@ -881,7 +880,11 @@ } while ( false ); - m_aCurrentColumns[SelectColumns] = new OPrivateColumns(aSelectColumns,bCase,*this,m_aMutex,aNames); + if ( aNames.empty() ) + m_aCurrentColumns[ SelectColumns ] = OPrivateColumns::createWithIntrinsicNames( aSelectColumns, bCase, *this, m_aMutex ); + else + m_aCurrentColumns[SelectColumns] = new OPrivateColumns( aSelectColumns, bCase, *this, m_aMutex, aNames ); + return m_aCurrentColumns[SelectColumns]; } // ------------------------------------------------------------------------- --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
