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]

Reply via email to