User: hr Date: 2006/08/15 03:41:09 Modified: dba/dbaccess/source/core/api/KeySet.cxx
Log: INTEGRATION: CWS dba30 (1.59.16); FILE MERGED 2006/07/20 08:56:09 fs 1.59.16.5: #i10000# 2006/07/19 12:08:29 fs 1.59.16.4: RESYNC: (1.60-1.62); FILE MERGED 2006/05/08 11:17:11 fs 1.59.16.3: RESYNC: (1.59-1.60); FILE MERGED 2006/01/02 09:17:06 oj 1.59.16.2: #i44200# use supportsMixedCaseQuotedIdentifiers where storesMixedCaseQuotedIdentifiers was used 2005/12/30 07:56:53 oj 1.59.16.1: #i58364# fix for foreign columns from join in select File Changes: Directory: /dba/dbaccess/source/core/api/ ========================================= File [changed]: KeySet.cxx Url: http://dba.openoffice.org/source/browse/dba/dbaccess/source/core/api/KeySet.cxx?r1=1.63&r2=1.64 Delta lines: +59 -7 -------------------- --- KeySet.cxx 4 Aug 2006 13:54:54 -0000 1.63 +++ KeySet.cxx 15 Aug 2006 10:41:07 -0000 1.64 @@ -126,6 +126,7 @@ using namespace ::com::sun::star::lang; using namespace ::com::sun::star::util; using namespace ::com::sun::star::io; +using namespace ::com::sun::star; using namespace ::cppu; using namespace ::osl; @@ -156,6 +157,7 @@ const Reference< XSingleSelectQueryAnalyzer >& _xComposer) :m_pKeyColumnNames(NULL) ,m_pColumnNames(NULL) + ,m_pForeignColumnNames(NULL) ,m_xTable(_xTable) ,m_xComposer(_xComposer) ,m_sUpdateTableName(_rUpdateTableName) @@ -182,6 +184,7 @@ m_xComposer = NULL; delete m_pKeyColumnNames; delete m_pColumnNames; + delete m_pForeignColumnNames; DBG_DTOR(OKeySet,NULL); } @@ -194,6 +197,7 @@ bool bCase = (xMeta.is() && xMeta->storesMixedCaseQuotedIdentifiers()) ? true : false; m_pKeyColumnNames = new SelectColumnsMetaData(bCase); m_pColumnNames = new SelectColumnsMetaData(bCase); + m_pForeignColumnNames = new SelectColumnsMetaData(bCase); Reference<XNameAccess> xKeyColumns = getKeyColumns(); Reference<XColumnsSupplier> xSup(m_xComposer,UNO_QUERY); @@ -238,14 +242,17 @@ sCatalog = sSchema = sTable = ::rtl::OUString(); ::dbtools::qualifiedNameComponents(xMetaData,m_sUpdateTableName,sCatalog,sSchema,sTable,::dbtools::eInDataManipulation); sComposedName = ::dbtools::composeTableName( xMetaData, sCatalog, sSchema, sTable, sal_True, ::dbtools::eInDataManipulation ); + + static ::rtl::OUString s_sDot(RTL_CONSTASCII_USTRINGPARAM(".")); + static ::rtl::OUString s_sParam(RTL_CONSTASCII_USTRINGPARAM(" = ?")); // create the where clause SelectColumnsMetaData::const_iterator aIter; for(aIter = (*m_pKeyColumnNames).begin();aIter != (*m_pKeyColumnNames).end();) { aFilter += sComposedName; - aFilter += ::rtl::OUString::createFromAscii("."); + aFilter += s_sDot; aFilter += ::dbtools::quoteName( aQuote,aIter->first); - aFilter += ::rtl::OUString::createFromAscii(" = ?"); + aFilter += s_sParam; ++aIter; if(aIter != (*m_pKeyColumnNames).end()) aFilter += aAnd; @@ -254,6 +261,40 @@ Reference< XMultiServiceFactory > xFactory(m_xConnection, UNO_QUERY_THROW); Reference<XSingleSelectQueryComposer> xAnalyzer(xFactory->createInstance(SERVICE_NAME_SINGLESELECTQUERYCOMPOSER),UNO_QUERY); xAnalyzer->setQuery(m_xComposer->getQuery()); + Reference<XTablesSupplier> xTabSup(xAnalyzer,uno::UNO_QUERY); + Reference<XIndexAccess> xSelectTables(xTabSup->getTables(),uno::UNO_QUERY); + sal_Int32 nCount = xSelectTables->getCount(); + if ( nCount > 1 ) // special handling for join + { + for (sal_Int32 i = 0; i < nCount; ++i) + { + connectivity::OSQLTable xSelColSup(xSelectTables->getByIndex(i),uno::UNO_QUERY); + if ( xSelColSup != m_xTable ) + { + Reference<XNameAccess > xSelectColumns = xSup->getColumns(); + Reference<XPropertySet> xProp(xSup,uno::UNO_QUERY); + ::rtl::OUString sSelectTableName = ::dbtools::composeTableName( xMetaData, xProp, ::dbtools::eInDataManipulation, false, false, false ); + ::dbaccess::getColumnPositions(xSelectColumns,xSelColSup->getColumns(),sSelectTableName,(*m_pForeignColumnNames)); + + uno::Sequence< ::rtl::OUString> aSeq = xSelectColumns->getElementNames(); + const ::rtl::OUString* pIter = aSeq.getConstArray(); + const ::rtl::OUString* pEnd = pIter + aSeq.getLength(); + for( ; pIter != pEnd ; ++pIter) + { + // look for columns not in the source columns to use them as filter as well + if ( !xSourceColumns->hasByName(*pIter) ) + { + aFilter += s_sDot; + aFilter += ::dbtools::quoteName( aQuote,*pIter); + aFilter += s_sParam; + if ( (pIter+1) != pEnd ) + aFilter += aAnd; + } + } + break; + } + } + } xAnalyzer->setFilter(aFilter); m_xStatement = m_xConnection->prepareStatement(xAnalyzer->getQueryWithSubstitution()); ::comphelper::disposeComponent(xAnalyzer); @@ -1030,6 +1071,9 @@ SelectColumnsMetaData::const_iterator aPosIter = (*m_pKeyColumnNames).begin(); for(;aPosIter != (*m_pKeyColumnNames).end();++aPosIter,++aIter,++nPos) setParameter(nPos,xParameter,*aIter); + aPosIter = (*m_pForeignColumnNames).begin(); + for(;aPosIter != (*m_pForeignColumnNames).end();++aPosIter,++aIter,++nPos) + setParameter(nPos,xParameter,*aIter); m_xSet = m_xStatement->executeQuery(); OSL_ENSURE(m_xSet.is(),"No resultset form statement!"); @@ -1047,12 +1091,20 @@ bRet = m_xDriverSet->next(); if ( bRet ) { - ORowSetRow aKeyRow = new connectivity::ORowVector< ORowSetValue >((*m_pKeyColumnNames).size()); + ORowSetRow aKeyRow = new connectivity::ORowVector< ORowSetValue >((*m_pKeyColumnNames).size() + m_pForeignColumnNames->size()); connectivity::ORowVector< ORowSetValue >::iterator aIter = aKeyRow->begin(); + // first fetch the values needed for the key column SelectColumnsMetaData::const_iterator aPosIter = (*m_pKeyColumnNames).begin(); for(;aPosIter != (*m_pKeyColumnNames).end();++aPosIter,++aIter) { const SelectColumnDescription& rColDesc = aPosIter->second; + aIter->fill(rColDesc.nPosition,rColDesc.nType,m_xDriverRow); + } + // now fetch the values from the missing columns from other tables + aPosIter = (*m_pForeignColumnNames).begin(); + for(;aPosIter != (*m_pForeignColumnNames).end();++aPosIter,++aIter) + { + const SelectColumnDescription& rColDesc = aPosIter->second; aIter->fill(rColDesc.nPosition,rColDesc.nType,m_xDriverRow); } m_aKeyIter = m_aKeyMap.insert(OKeySetMatrix::value_type(m_aKeyMap.rbegin()->first+1,OKeySetValue(aKeyRow,0))).first; --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
