1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_connectivity.hxx"
26*b1cdbd2cSJim Jagielski #include <connectivity/statementcomposer.hxx>
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <connectivity/dbtools.hxx>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/
31*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/CommandType.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/NullPointerException.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/XQueriesSupplier.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
36*b1cdbd2cSJim Jagielski /** === end UNO includes === **/
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #include <unotools/sharedunocomponent.hxx>
39*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
40*b1cdbd2cSJim Jagielski #include <comphelper/property.hxx>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski //........................................................................
43*b1cdbd2cSJim Jagielski namespace dbtools
44*b1cdbd2cSJim Jagielski {
45*b1cdbd2cSJim Jagielski //........................................................................
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski 	/** === begin UNO using === **/
48*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Reference;
49*b1cdbd2cSJim Jagielski     using ::com::sun::star::sdbc::XConnection;
50*b1cdbd2cSJim Jagielski     using ::com::sun::star::sdb::XSingleSelectQueryComposer;
51*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::NullPointerException;
52*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::Exception;
53*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::XComponent;
54*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::UNO_QUERY_THROW;
55*b1cdbd2cSJim Jagielski     using ::com::sun::star::sdb::XQueriesSupplier;
56*b1cdbd2cSJim Jagielski     using ::com::sun::star::container::XNameAccess;
57*b1cdbd2cSJim Jagielski     using ::com::sun::star::uno::UNO_QUERY;
58*b1cdbd2cSJim Jagielski     using ::com::sun::star::beans::XPropertySet;
59*b1cdbd2cSJim Jagielski     using ::com::sun::star::lang::XMultiServiceFactory;
60*b1cdbd2cSJim Jagielski     using ::com::sun::star::sdbc::SQLException;
61*b1cdbd2cSJim Jagielski 	/** === end UNO using === **/
62*b1cdbd2cSJim Jagielski     namespace CommandType = ::com::sun::star::sdb::CommandType;
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski 	//====================================================================
65*b1cdbd2cSJim Jagielski 	//= StatementComposer_Data
66*b1cdbd2cSJim Jagielski 	//====================================================================
67*b1cdbd2cSJim Jagielski     struct StatementComposer_Data
68*b1cdbd2cSJim Jagielski     {
69*b1cdbd2cSJim Jagielski         const Reference< XConnection >          xConnection;
70*b1cdbd2cSJim Jagielski         Reference< XSingleSelectQueryComposer > xComposer;
71*b1cdbd2cSJim Jagielski         ::rtl::OUString                         sCommand;
72*b1cdbd2cSJim Jagielski         ::rtl::OUString                         sFilter;
73*b1cdbd2cSJim Jagielski         ::rtl::OUString                         sOrder;
74*b1cdbd2cSJim Jagielski         sal_Int32                               nCommandType;
75*b1cdbd2cSJim Jagielski         sal_Bool                                bEscapeProcessing;
76*b1cdbd2cSJim Jagielski         bool                                    bComposerDirty;
77*b1cdbd2cSJim Jagielski         bool                                    bDisposeComposer;
78*b1cdbd2cSJim Jagielski 
StatementComposer_Datadbtools::StatementComposer_Data79*b1cdbd2cSJim Jagielski         StatementComposer_Data( const Reference< XConnection >& _rxConnection )
80*b1cdbd2cSJim Jagielski             :xConnection( _rxConnection )
81*b1cdbd2cSJim Jagielski             ,sCommand()
82*b1cdbd2cSJim Jagielski             ,sFilter()
83*b1cdbd2cSJim Jagielski             ,sOrder()
84*b1cdbd2cSJim Jagielski             ,nCommandType( CommandType::COMMAND )
85*b1cdbd2cSJim Jagielski             ,bEscapeProcessing( sal_True )
86*b1cdbd2cSJim Jagielski             ,bComposerDirty( true )
87*b1cdbd2cSJim Jagielski             ,bDisposeComposer( true )
88*b1cdbd2cSJim Jagielski         {
89*b1cdbd2cSJim Jagielski             if ( !_rxConnection.is() )
90*b1cdbd2cSJim Jagielski                 throw NullPointerException();
91*b1cdbd2cSJim Jagielski         }
92*b1cdbd2cSJim Jagielski     };
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
95*b1cdbd2cSJim Jagielski     namespace
96*b1cdbd2cSJim Jagielski     {
97*b1cdbd2cSJim Jagielski         //----------------------------------------------------------------
lcl_resetComposer(StatementComposer_Data & _rData)98*b1cdbd2cSJim Jagielski         void    lcl_resetComposer( StatementComposer_Data& _rData )
99*b1cdbd2cSJim Jagielski         {
100*b1cdbd2cSJim Jagielski             if ( _rData.bDisposeComposer && _rData.xComposer.is() )
101*b1cdbd2cSJim Jagielski             {
102*b1cdbd2cSJim Jagielski                 try
103*b1cdbd2cSJim Jagielski                 {
104*b1cdbd2cSJim Jagielski                     Reference< XComponent > xComposerComponent( _rData.xComposer, UNO_QUERY_THROW );
105*b1cdbd2cSJim Jagielski                     xComposerComponent->dispose();
106*b1cdbd2cSJim Jagielski                 }
107*b1cdbd2cSJim Jagielski                 catch( const Exception& )
108*b1cdbd2cSJim Jagielski                 {
109*b1cdbd2cSJim Jagielski         	        DBG_UNHANDLED_EXCEPTION();
110*b1cdbd2cSJim Jagielski                 }
111*b1cdbd2cSJim Jagielski             }
112*b1cdbd2cSJim Jagielski             _rData.xComposer.clear();
113*b1cdbd2cSJim Jagielski         }
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski         //----------------------------------------------------------------
lcl_ensureUpToDateComposer_nothrow(StatementComposer_Data & _rData)116*b1cdbd2cSJim Jagielski         bool    lcl_ensureUpToDateComposer_nothrow( StatementComposer_Data& _rData )
117*b1cdbd2cSJim Jagielski         {
118*b1cdbd2cSJim Jagielski             if ( !_rData.bComposerDirty )
119*b1cdbd2cSJim Jagielski                 return _rData.xComposer.is();
120*b1cdbd2cSJim Jagielski             lcl_resetComposer( _rData );
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski             try
123*b1cdbd2cSJim Jagielski             {
124*b1cdbd2cSJim Jagielski                 ::rtl::OUString sStatement;
125*b1cdbd2cSJim Jagielski                 switch ( _rData.nCommandType )
126*b1cdbd2cSJim Jagielski 	            {
127*b1cdbd2cSJim Jagielski 		            case CommandType::COMMAND:
128*b1cdbd2cSJim Jagielski 			            if ( _rData.bEscapeProcessing )
129*b1cdbd2cSJim Jagielski 				            sStatement = _rData.sCommand;
130*b1cdbd2cSJim Jagielski 			            // (in case of no escape processing  we assume a not parseable statement)
131*b1cdbd2cSJim Jagielski 			            break;
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski                     case CommandType::TABLE:
134*b1cdbd2cSJim Jagielski 		            {
135*b1cdbd2cSJim Jagielski 			            if ( !_rData.sCommand.getLength() )
136*b1cdbd2cSJim Jagielski                             break;
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski 			            sStatement = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "SELECT * FROM " ) );
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski 	                    ::rtl::OUString sCatalog, sSchema, sTable;
141*b1cdbd2cSJim Jagielski 	                    qualifiedNameComponents( _rData.xConnection->getMetaData(), _rData.sCommand, sCatalog, sSchema, sTable, eInDataManipulation );
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski                         sStatement += composeTableNameForSelect( _rData.xConnection, sCatalog, sSchema, sTable );
144*b1cdbd2cSJim Jagielski 		            }
145*b1cdbd2cSJim Jagielski 		            break;
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski 		            case CommandType::QUERY:
148*b1cdbd2cSJim Jagielski 		            {
149*b1cdbd2cSJim Jagielski 			            // ask the connection for the query
150*b1cdbd2cSJim Jagielski 			            Reference< XQueriesSupplier > xSupplyQueries( _rData.xConnection, UNO_QUERY_THROW );
151*b1cdbd2cSJim Jagielski 			            Reference< XNameAccess >      xQueries( xSupplyQueries->getQueries(), UNO_QUERY_THROW );
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski 			            if ( !xQueries->hasByName( _rData.sCommand ) )
154*b1cdbd2cSJim Jagielski 				            break;
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 			            Reference< XPropertySet > xQuery( xQueries->getByName( _rData.sCommand ), UNO_QUERY_THROW );
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski                         //  a native query ?
159*b1cdbd2cSJim Jagielski                         sal_Bool bQueryEscapeProcessing = sal_False;
160*b1cdbd2cSJim Jagielski                         xQuery->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "EscapeProcessing" ) ) ) >>= bQueryEscapeProcessing;
161*b1cdbd2cSJim Jagielski 			            if ( !bQueryEscapeProcessing )
162*b1cdbd2cSJim Jagielski 				            break;
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 			            // the command used by the query
165*b1cdbd2cSJim Jagielski 			            xQuery->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Command" ) ) ) >>= sStatement;
166*b1cdbd2cSJim Jagielski                         if ( !sStatement.getLength() )
167*b1cdbd2cSJim Jagielski                             break;
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 			            // use a composer to build a statement from the query filter/order props
170*b1cdbd2cSJim Jagielski                         Reference< XMultiServiceFactory > xFactory( _rData.xConnection, UNO_QUERY_THROW );
171*b1cdbd2cSJim Jagielski                         ::utl::SharedUNOComponent< XSingleSelectQueryComposer > xComposer;
172*b1cdbd2cSJim Jagielski                         xComposer.set(
173*b1cdbd2cSJim Jagielski                             xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.SingleSelectQueryComposer" ) ) ),
174*b1cdbd2cSJim Jagielski                             UNO_QUERY_THROW
175*b1cdbd2cSJim Jagielski                         );
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski                         // the "basic" statement
178*b1cdbd2cSJim Jagielski 			            xComposer->setElementaryQuery( sStatement );
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski                         // the sort order
181*b1cdbd2cSJim Jagielski                         const ::rtl::OUString sPropOrder( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Order" ) ) );
182*b1cdbd2cSJim Jagielski                         if ( ::comphelper::hasProperty( sPropOrder, xQuery ) )
183*b1cdbd2cSJim Jagielski                         {
184*b1cdbd2cSJim Jagielski                             ::rtl::OUString sOrder;
185*b1cdbd2cSJim Jagielski                             OSL_VERIFY( xQuery->getPropertyValue( sPropOrder ) >>= sOrder );
186*b1cdbd2cSJim Jagielski 				            xComposer->setOrder( sOrder );
187*b1cdbd2cSJim Jagielski                         }
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski                         // the filter
190*b1cdbd2cSJim Jagielski 			            sal_Bool bApplyFilter = sal_True;
191*b1cdbd2cSJim Jagielski 			            const ::rtl::OUString sPropApply = ::rtl::OUString::createFromAscii( "ApplyFilter" );
192*b1cdbd2cSJim Jagielski                         if ( ::comphelper::hasProperty( sPropApply, xQuery ) )
193*b1cdbd2cSJim Jagielski                         {
194*b1cdbd2cSJim Jagielski                             OSL_VERIFY( xQuery->getPropertyValue( sPropApply ) >>= bApplyFilter );
195*b1cdbd2cSJim Jagielski                         }
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski 			            if ( bApplyFilter )
198*b1cdbd2cSJim Jagielski                         {
199*b1cdbd2cSJim Jagielski                             ::rtl::OUString sFilter;
200*b1cdbd2cSJim Jagielski                             OSL_VERIFY( xQuery->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Filter" ) ) ) >>= sFilter );
201*b1cdbd2cSJim Jagielski                             xComposer->setFilter( sFilter );
202*b1cdbd2cSJim Jagielski                         }
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski                         // the composed statement
205*b1cdbd2cSJim Jagielski                         sStatement = xComposer->getQuery();
206*b1cdbd2cSJim Jagielski 		            }
207*b1cdbd2cSJim Jagielski 		            break;
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski                     default:
210*b1cdbd2cSJim Jagielski 			            OSL_ENSURE(sal_False, "lcl_ensureUpToDateComposer_nothrow: no table, no query, no statement - what else ?!");
211*b1cdbd2cSJim Jagielski 			            break;
212*b1cdbd2cSJim Jagielski 	            }
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 	            if ( sStatement.getLength() )
215*b1cdbd2cSJim Jagielski 	            {
216*b1cdbd2cSJim Jagielski 		            // create an composer
217*b1cdbd2cSJim Jagielski                     Reference< XMultiServiceFactory > xFactory( _rData.xConnection, UNO_QUERY_THROW );
218*b1cdbd2cSJim Jagielski                     Reference< XSingleSelectQueryComposer > xComposer( xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.SingleSelectQueryComposer" ) ) ),
219*b1cdbd2cSJim Jagielski                         UNO_QUERY_THROW );
220*b1cdbd2cSJim Jagielski 			        xComposer->setElementaryQuery( sStatement );
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski 			        // append sort/filter
223*b1cdbd2cSJim Jagielski 				    xComposer->setOrder( _rData.sOrder );
224*b1cdbd2cSJim Jagielski 					xComposer->setFilter( _rData.sFilter );
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski                     sStatement = xComposer->getQuery();
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski                     _rData.xComposer = xComposer;
229*b1cdbd2cSJim Jagielski                     _rData.bComposerDirty = false;
230*b1cdbd2cSJim Jagielski 		        }
231*b1cdbd2cSJim Jagielski             }
232*b1cdbd2cSJim Jagielski             catch( const SQLException& )
233*b1cdbd2cSJim Jagielski             {
234*b1cdbd2cSJim Jagielski                 // allowed to leave here
235*b1cdbd2cSJim Jagielski             }
236*b1cdbd2cSJim Jagielski             catch( const Exception& )
237*b1cdbd2cSJim Jagielski             {
238*b1cdbd2cSJim Jagielski             	DBG_UNHANDLED_EXCEPTION();
239*b1cdbd2cSJim Jagielski             }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski             return _rData.xComposer.is();
242*b1cdbd2cSJim Jagielski         }
243*b1cdbd2cSJim Jagielski     }
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski 	//====================================================================
246*b1cdbd2cSJim Jagielski 	//= StatementComposer
247*b1cdbd2cSJim Jagielski 	//====================================================================
248*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
StatementComposer(const Reference<XConnection> & _rxConnection,const::rtl::OUString & _rCommand,const sal_Int32 _nCommandType,const sal_Bool _bEscapeProcessing)249*b1cdbd2cSJim Jagielski     StatementComposer::StatementComposer( const Reference< XConnection >& _rxConnection,
250*b1cdbd2cSJim Jagielski         const ::rtl::OUString&  _rCommand, const sal_Int32 _nCommandType, const sal_Bool _bEscapeProcessing )
251*b1cdbd2cSJim Jagielski         :m_pData( new StatementComposer_Data( _rxConnection ) )
252*b1cdbd2cSJim Jagielski     {
253*b1cdbd2cSJim Jagielski         OSL_PRECOND( _rxConnection.is(), "StatementComposer::StatementComposer: illegal connection!" );
254*b1cdbd2cSJim Jagielski         m_pData->sCommand = _rCommand;
255*b1cdbd2cSJim Jagielski         m_pData->nCommandType = _nCommandType;
256*b1cdbd2cSJim Jagielski         m_pData->bEscapeProcessing = _bEscapeProcessing;
257*b1cdbd2cSJim Jagielski     }
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
~StatementComposer()260*b1cdbd2cSJim Jagielski     StatementComposer::~StatementComposer()
261*b1cdbd2cSJim Jagielski     {
262*b1cdbd2cSJim Jagielski         lcl_resetComposer( *m_pData );
263*b1cdbd2cSJim Jagielski     }
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
setDisposeComposer(bool _bDoDispose)266*b1cdbd2cSJim Jagielski     void StatementComposer::setDisposeComposer( bool _bDoDispose )
267*b1cdbd2cSJim Jagielski     {
268*b1cdbd2cSJim Jagielski         m_pData->bDisposeComposer = _bDoDispose;
269*b1cdbd2cSJim Jagielski     }
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
getDisposeComposer() const272*b1cdbd2cSJim Jagielski     bool StatementComposer::getDisposeComposer() const
273*b1cdbd2cSJim Jagielski     {
274*b1cdbd2cSJim Jagielski         return m_pData->bDisposeComposer;
275*b1cdbd2cSJim Jagielski     }
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski     //--------------------------------------------------------------------
setFilter(const::rtl::OUString & _rFilter)278*b1cdbd2cSJim Jagielski     void StatementComposer::setFilter( const ::rtl::OUString& _rFilter )
279*b1cdbd2cSJim Jagielski     {
280*b1cdbd2cSJim Jagielski         m_pData->sFilter = _rFilter;
281*b1cdbd2cSJim Jagielski         m_pData->bComposerDirty = true;
282*b1cdbd2cSJim Jagielski     }
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
setOrder(const::rtl::OUString & _rOrder)285*b1cdbd2cSJim Jagielski     void StatementComposer::setOrder( const ::rtl::OUString& _rOrder )
286*b1cdbd2cSJim Jagielski     {
287*b1cdbd2cSJim Jagielski         m_pData->sOrder = _rOrder;
288*b1cdbd2cSJim Jagielski         m_pData->bComposerDirty = true;
289*b1cdbd2cSJim Jagielski     }
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getComposer()292*b1cdbd2cSJim Jagielski     Reference< XSingleSelectQueryComposer > StatementComposer::getComposer()
293*b1cdbd2cSJim Jagielski     {
294*b1cdbd2cSJim Jagielski         lcl_ensureUpToDateComposer_nothrow( *m_pData );
295*b1cdbd2cSJim Jagielski         return m_pData->xComposer;
296*b1cdbd2cSJim Jagielski     }
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski 	//--------------------------------------------------------------------
getQuery()299*b1cdbd2cSJim Jagielski     ::rtl::OUString StatementComposer::getQuery()
300*b1cdbd2cSJim Jagielski     {
301*b1cdbd2cSJim Jagielski         if ( lcl_ensureUpToDateComposer_nothrow( *m_pData ) )
302*b1cdbd2cSJim Jagielski         {
303*b1cdbd2cSJim Jagielski             return m_pData->xComposer->getQuery();
304*b1cdbd2cSJim Jagielski         }
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski         return ::rtl::OUString();
307*b1cdbd2cSJim Jagielski     }
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski //........................................................................
310*b1cdbd2cSJim Jagielski } // namespace dbtools
311*b1cdbd2cSJim Jagielski //........................................................................
312