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]

Reply via email to