Tag: cws_src680_dba30 User: oj Date: 05/12/29 23:56:56 Modified: /dba/dbaccess/source/core/api/ KeySet.cxx, KeySet.hxx
Log: #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.59&r2=1.59.16.1 Delta lines: +58 -6 -------------------- --- KeySet.cxx 23 Sep 2005 12:02:11 -0000 1.59 +++ KeySet.cxx 30 Dec 2005 07:56:53 -0000 1.59.16.1 @@ -4,9 +4,9 @@ * * $RCSfile: KeySet.cxx,v $ * - * $Revision: 1.59 $ + * $Revision: 1.59.16.1 $ * - * last change: $Author: hr $ $Date: 2005/09/23 12:02:11 $ + * last change: $Author: oj $ $Date: 2005/12/30 07:56:53 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -122,6 +122,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 @@ ,m_sUpdateTableName(_rUpdateTableName) ,m_pKeyColumnNames(NULL) ,m_pColumnNames(NULL) + ,m_pForeignColumnNames(NULL) { DBG_CTOR(OKeySet,NULL); @@ -178,6 +180,7 @@ m_xComposer = NULL; delete m_pKeyColumnNames; delete m_pColumnNames; + delete m_pForeignColumnNames; DBG_DTOR(OKeySet,NULL); } @@ -190,6 +193,7 @@ bool bCase = (xMeta.is() && xMeta->storesMixedCaseQuotedIdentifiers()) ? true : false; m_pKeyColumnNames = new OColumnNamePos(bCase); m_pColumnNames = new OColumnNamePos(bCase); + m_pForeignColumnNames = new OColumnNamePos(bCase); Reference<XNameAccess> xKeyColumns = getKeyColumns(); Reference<XColumnsSupplier> xSup(m_xComposer,UNO_QUERY); @@ -234,14 +238,17 @@ sCatalog = sSchema = sTable = ::rtl::OUString(); ::dbtools::qualifiedNameComponents(xMetaData,m_sUpdateTableName,sCatalog,sSchema,sTable,::dbtools::eInDataManipulation); ::dbtools::composeTableName(xMetaData,sCatalog,sSchema,sTable,sComposedName,sal_True,::dbtools::eInDataManipulation); + + static ::rtl::OUString s_sDot(RTL_CONSTASCII_USTRINGPARAM(".")); + static ::rtl::OUString s_sParam(RTL_CONSTASCII_USTRINGPARAM(" = ?")); // create the where clause OColumnNamePos::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; @@ -250,6 +257,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,sal_False,::dbtools::eInDataManipulation); + ::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->getQuery()); ::comphelper::disposeComponent(xAnalyzer); @@ -1024,6 +1065,9 @@ OColumnNamePos::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!"); @@ -1039,10 +1083,18 @@ sal_Bool bRet = sal_False; if(!m_bRowCountFinal && (bRet = m_xDriverSet->next())) { - 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 OColumnNamePos::const_iterator aPosIter = (*m_pKeyColumnNames).begin(); for(;aPosIter != (*m_pKeyColumnNames).end();++aPosIter,++aIter) + { + const TPositionTypePair& rPair = aPosIter->second; + aIter->fill(rPair.first,rPair.second.first,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 TPositionTypePair& rPair = aPosIter->second; aIter->fill(rPair.first,rPair.second.first,m_xDriverRow); File [changed]: KeySet.hxx Url: http://dba.openoffice.org/source/browse/dba/dbaccess/source/core/api/KeySet.hxx?r1=1.23&r2=1.23.16.1 Delta lines: +5 -4 ------------------- --- KeySet.hxx 23 Sep 2005 12:02:30 -0000 1.23 +++ KeySet.hxx 30 Dec 2005 07:56:53 -0000 1.23.16.1 @@ -4,9 +4,9 @@ * * $RCSfile: KeySet.hxx,v $ * - * $Revision: 1.23 $ + * $Revision: 1.23.16.1 $ * - * last change: $Author: hr $ $Date: 2005/09/23 12:02:30 $ + * last change: $Author: oj $ $Date: 2005/12/30 07:56:53 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -78,7 +78,8 @@ ::std::vector< ::rtl::OUString > m_aAutoColumns; // contains all columns which are autoincrement ones OColumnNamePos* m_pKeyColumnNames; // contains all key column names - OColumnNamePos* m_pColumnNames; // contains all column names + OColumnNamePos* m_pColumnNames; // contains all column names of the update table + OColumnNamePos* m_pForeignColumnNames; // contains all column names of the rest connectivity::OSQLTable m_xTable; // reference to our table ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPreparedStatement> m_xStatement; ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet> m_xSet; --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
