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]

Reply via email to