19b5730f6SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
39b5730f6SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
49b5730f6SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
59b5730f6SAndrew Rist  * distributed with this work for additional information
69b5730f6SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
79b5730f6SAndrew Rist  * to you under the Apache License, Version 2.0 (the
89b5730f6SAndrew Rist  * "License"); you may not use this file except in compliance
99b5730f6SAndrew Rist  * with the License.  You may obtain a copy of the License at
109b5730f6SAndrew Rist  *
119b5730f6SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
129b5730f6SAndrew Rist  *
139b5730f6SAndrew Rist  * Unless required by applicable law or agreed to in writing,
149b5730f6SAndrew Rist  * software distributed under the License is distributed on an
159b5730f6SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169b5730f6SAndrew Rist  * KIND, either express or implied.  See the License for the
179b5730f6SAndrew Rist  * specific language governing permissions and limitations
189b5730f6SAndrew Rist  * under the License.
199b5730f6SAndrew Rist  *
209b5730f6SAndrew Rist  *************************************************************/
219b5730f6SAndrew Rist 
229b5730f6SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_connectivity.hxx"
26cdf0e10cSrcweir #include <osl/diagnose.h>
27cdf0e10cSrcweir #include "file/FStatement.hxx"
28cdf0e10cSrcweir #include "file/FConnection.hxx"
29cdf0e10cSrcweir #include "file/FDriver.hxx"
30cdf0e10cSrcweir #include "file/FResultSet.hxx"
31cdf0e10cSrcweir #include <comphelper/property.hxx>
32cdf0e10cSrcweir #include <comphelper/uno3.hxx>
33cdf0e10cSrcweir #include <osl/thread.h>
34cdf0e10cSrcweir #include <com/sun/star/sdbc/ResultSetConcurrency.hpp>
35cdf0e10cSrcweir #include <com/sun/star/sdbc/ResultSetType.hpp>
36cdf0e10cSrcweir #include <com/sun/star/sdbc/FetchDirection.hpp>
37cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp>
38cdf0e10cSrcweir #include <comphelper/sequence.hxx>
39cdf0e10cSrcweir #include <cppuhelper/typeprovider.hxx>
40cdf0e10cSrcweir #include "connectivity/dbexception.hxx"
41cdf0e10cSrcweir #include "resource/file_res.hrc"
42cdf0e10cSrcweir #include <algorithm>
43cdf0e10cSrcweir #include <tools/debug.hxx>
44cdf0e10cSrcweir #include <rtl/logfile.hxx>
45cdf0e10cSrcweir 
46cdf0e10cSrcweir #define THROW_SQL(x) \
47cdf0e10cSrcweir 	OTools::ThrowException(x,m_aStatementHandle,SQL_HANDLE_STMT,*this)
48cdf0e10cSrcweir 
49cdf0e10cSrcweir namespace connectivity
50cdf0e10cSrcweir {
51cdf0e10cSrcweir 	namespace file
52cdf0e10cSrcweir 	{
53cdf0e10cSrcweir 
54cdf0e10cSrcweir //------------------------------------------------------------------------------
55cdf0e10cSrcweir using namespace dbtools;
56cdf0e10cSrcweir using namespace com::sun::star::uno;
57cdf0e10cSrcweir using namespace com::sun::star::lang;
58cdf0e10cSrcweir using namespace com::sun::star::beans;
59cdf0e10cSrcweir using namespace com::sun::star::sdbc;
60cdf0e10cSrcweir using namespace com::sun::star::sdbcx;
61cdf0e10cSrcweir using namespace com::sun::star::container;
DBG_NAME(file_OStatement_Base)62cdf0e10cSrcweir DBG_NAME( file_OStatement_Base )
63cdf0e10cSrcweir 
64cdf0e10cSrcweir //------------------------------------------------------------------------------
65cdf0e10cSrcweir OStatement_Base::OStatement_Base(OConnection* _pConnection )
66cdf0e10cSrcweir     :OStatement_BASE(m_aMutex)
67cdf0e10cSrcweir 	,::comphelper::OPropertyContainer(OStatement_BASE::rBHelper)
68cdf0e10cSrcweir     ,m_xDBMetaData(_pConnection->getMetaData())
69cdf0e10cSrcweir 	,m_aParser(_pConnection->getDriver()->getFactory())
70cdf0e10cSrcweir 	,m_aSQLIterator( _pConnection, _pConnection->createCatalog()->getTables(), m_aParser, NULL )
71cdf0e10cSrcweir     ,m_pConnection(_pConnection)
72cdf0e10cSrcweir     ,m_pParseTree(NULL)
73cdf0e10cSrcweir     ,m_pSQLAnalyzer(NULL)
74cdf0e10cSrcweir     ,m_pEvaluationKeySet(NULL)
75cdf0e10cSrcweir     ,m_pTable(NULL)
76cdf0e10cSrcweir 	,m_nMaxFieldSize(0)
77cdf0e10cSrcweir 	,m_nMaxRows(0)
78cdf0e10cSrcweir 	,m_nQueryTimeOut(0)
79cdf0e10cSrcweir 	,m_nFetchSize(0)
80cdf0e10cSrcweir 	,m_nResultSetType(ResultSetType::FORWARD_ONLY)
81cdf0e10cSrcweir 	,m_nFetchDirection(FetchDirection::FORWARD)
82cdf0e10cSrcweir 	,m_nResultSetConcurrency(ResultSetConcurrency::UPDATABLE)
83cdf0e10cSrcweir     ,m_bEscapeProcessing(sal_True)
84cdf0e10cSrcweir     ,rBHelper(OStatement_BASE::rBHelper)
85cdf0e10cSrcweir {
86cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::OStatement_Base" );
87cdf0e10cSrcweir 	DBG_CTOR( file_OStatement_Base, NULL );
88cdf0e10cSrcweir 
89cdf0e10cSrcweir 	m_pConnection->acquire();
90cdf0e10cSrcweir 
91cdf0e10cSrcweir 	sal_Int32 nAttrib = 0;
92cdf0e10cSrcweir 
93*bccc1572SDon Lewis 	registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CURSORNAME),		PROPERTY_ID_CURSORNAME,			nAttrib,&m_aCursorName,		::getCppuType(static_cast< ::rtl::OUString*>(NULL)));
94*bccc1572SDon Lewis 	registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXFIELDSIZE),	PROPERTY_ID_MAXFIELDSIZE,		nAttrib,&m_nMaxFieldSize,		::getCppuType(static_cast<sal_Int32*>(NULL)));
95*bccc1572SDon Lewis 	registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_MAXROWS),			PROPERTY_ID_MAXROWS,			nAttrib,&m_nMaxRows,		::getCppuType(static_cast<sal_Int32*>(NULL)));
96*bccc1572SDon Lewis 	registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_QUERYTIMEOUT),	PROPERTY_ID_QUERYTIMEOUT,		nAttrib,&m_nQueryTimeOut,	::getCppuType(static_cast<sal_Int32*>(NULL)));
97*bccc1572SDon Lewis 	registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHSIZE),		PROPERTY_ID_FETCHSIZE,			nAttrib,&m_nFetchSize,		::getCppuType(static_cast<sal_Int32*>(NULL)));
98*bccc1572SDon Lewis 	registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETTYPE),	PROPERTY_ID_RESULTSETTYPE,		nAttrib,&m_nResultSetType,	::getCppuType(static_cast<sal_Int32*>(NULL)));
99*bccc1572SDon Lewis 	registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FETCHDIRECTION),	PROPERTY_ID_FETCHDIRECTION,		nAttrib,&m_nFetchDirection,	::getCppuType(static_cast<sal_Int32*>(NULL)));
100cdf0e10cSrcweir 	registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ESCAPEPROCESSING),PROPERTY_ID_ESCAPEPROCESSING,	nAttrib,&m_bEscapeProcessing,::getCppuBooleanType());
101cdf0e10cSrcweir 
102*bccc1572SDon Lewis 	registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_RESULTSETCONCURRENCY),		PROPERTY_ID_RESULTSETCONCURRENCY,	nAttrib,&m_nResultSetConcurrency,		::getCppuType(static_cast<sal_Int32*>(NULL)));
103cdf0e10cSrcweir }
104cdf0e10cSrcweir // -----------------------------------------------------------------------------
~OStatement_Base()105cdf0e10cSrcweir OStatement_Base::~OStatement_Base()
106cdf0e10cSrcweir {
107cdf0e10cSrcweir 	osl_incrementInterlockedCount( &m_refCount );
108cdf0e10cSrcweir 	disposing();
109cdf0e10cSrcweir 	delete m_pSQLAnalyzer;
110cdf0e10cSrcweir 
111cdf0e10cSrcweir 	DBG_DTOR( file_OStatement_Base, NULL );
112cdf0e10cSrcweir }
113cdf0e10cSrcweir //------------------------------------------------------------------------------
disposeResultSet()114cdf0e10cSrcweir void OStatement_Base::disposeResultSet()
115cdf0e10cSrcweir {
116cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::disposeResultSet" );
117cdf0e10cSrcweir 	// free the cursor if alive
118cdf0e10cSrcweir     Reference< XComponent > xComp(m_xResultSet.get(), UNO_QUERY);
119cdf0e10cSrcweir 	if (xComp.is())
120cdf0e10cSrcweir 		xComp->dispose();
121cdf0e10cSrcweir     m_xResultSet = Reference< XResultSet>();
122cdf0e10cSrcweir }
123cdf0e10cSrcweir //------------------------------------------------------------------------------
disposing()124cdf0e10cSrcweir void OStatement_BASE2::disposing()
125cdf0e10cSrcweir {
126cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_aMutex);
127cdf0e10cSrcweir 
128cdf0e10cSrcweir 	disposeResultSet();
129cdf0e10cSrcweir 
130cdf0e10cSrcweir 	if(m_pSQLAnalyzer)
131cdf0e10cSrcweir 		m_pSQLAnalyzer->dispose();
132cdf0e10cSrcweir 
133cdf0e10cSrcweir 	if(m_aRow.isValid())
134cdf0e10cSrcweir 	{
135cdf0e10cSrcweir 		m_aRow->get().clear();
136cdf0e10cSrcweir 		m_aRow = NULL;
137cdf0e10cSrcweir 	}
138cdf0e10cSrcweir 
139cdf0e10cSrcweir 	m_aSQLIterator.dispose();
140cdf0e10cSrcweir 
141cdf0e10cSrcweir 	if(m_pTable)
142cdf0e10cSrcweir 	{
143cdf0e10cSrcweir 		m_pTable->release();
144cdf0e10cSrcweir 		m_pTable = NULL;
145cdf0e10cSrcweir 	}
146cdf0e10cSrcweir 
147cdf0e10cSrcweir 	if (m_pConnection)
148cdf0e10cSrcweir 	{
149cdf0e10cSrcweir 		m_pConnection->release();
150cdf0e10cSrcweir 		m_pConnection = NULL;
151cdf0e10cSrcweir 	}
152cdf0e10cSrcweir 
153cdf0e10cSrcweir 	dispose_ChildImpl();
154cdf0e10cSrcweir 
155cdf0e10cSrcweir 	if ( m_pParseTree )
156cdf0e10cSrcweir 	{
157cdf0e10cSrcweir 		delete m_pParseTree;
158cdf0e10cSrcweir 		m_pParseTree = NULL;
159cdf0e10cSrcweir 	}
160cdf0e10cSrcweir 
161cdf0e10cSrcweir 	OStatement_Base::disposing();
162cdf0e10cSrcweir }
163cdf0e10cSrcweir // -----------------------------------------------------------------------------
acquire()164cdf0e10cSrcweir void SAL_CALL OStatement_Base::acquire() throw()
165cdf0e10cSrcweir {
166cdf0e10cSrcweir 	OStatement_BASE::acquire();
167cdf0e10cSrcweir }
168cdf0e10cSrcweir //-----------------------------------------------------------------------------
release()169cdf0e10cSrcweir void SAL_CALL OStatement_BASE2::release() throw()
170cdf0e10cSrcweir {
171cdf0e10cSrcweir 	relase_ChildImpl();
172cdf0e10cSrcweir }
173cdf0e10cSrcweir //-----------------------------------------------------------------------------
queryInterface(const Type & rType)174cdf0e10cSrcweir Any SAL_CALL OStatement_Base::queryInterface( const Type & rType ) throw(RuntimeException)
175cdf0e10cSrcweir {
176cdf0e10cSrcweir     //RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::queryInterface" );
177cdf0e10cSrcweir     const Any aRet = OStatement_BASE::queryInterface(rType);
178cdf0e10cSrcweir 	return aRet.hasValue() ? aRet : OPropertySetHelper::queryInterface(rType);
179cdf0e10cSrcweir }
180cdf0e10cSrcweir // -------------------------------------------------------------------------
getTypes()181cdf0e10cSrcweir Sequence< Type > SAL_CALL OStatement_Base::getTypes(  ) throw(RuntimeException)
182cdf0e10cSrcweir {
183cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::getTypes" );
184cdf0e10cSrcweir     ::cppu::OTypeCollection aTypes( ::getCppuType( (const Reference< ::com::sun::star::beans::XMultiPropertySet > *)0 ),
185cdf0e10cSrcweir                                                                     ::getCppuType( (const Reference< ::com::sun::star::beans::XFastPropertySet > *)0 ),
186cdf0e10cSrcweir                                                                     ::getCppuType( (const Reference< ::com::sun::star::beans::XPropertySet > *)0 ));
187cdf0e10cSrcweir 
188cdf0e10cSrcweir 	return ::comphelper::concatSequences(aTypes.getTypes(),OStatement_BASE::getTypes());
189cdf0e10cSrcweir }
190cdf0e10cSrcweir // -------------------------------------------------------------------------
191cdf0e10cSrcweir 
cancel()192cdf0e10cSrcweir void SAL_CALL OStatement_Base::cancel(  ) throw(RuntimeException)
193cdf0e10cSrcweir {
194cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::cancel" );
195cdf0e10cSrcweir }
196cdf0e10cSrcweir // -------------------------------------------------------------------------
197cdf0e10cSrcweir 
close()198cdf0e10cSrcweir void SAL_CALL OStatement_Base::close(  ) throw(SQLException, RuntimeException)
199cdf0e10cSrcweir {
200cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::close" );
201cdf0e10cSrcweir 	{
202cdf0e10cSrcweir 		::osl::MutexGuard aGuard( m_aMutex );
203cdf0e10cSrcweir 		checkDisposed(OStatement_BASE::rBHelper.bDisposed);
204cdf0e10cSrcweir 	}
205cdf0e10cSrcweir 	dispose();
206cdf0e10cSrcweir }
207cdf0e10cSrcweir // -------------------------------------------------------------------------
208cdf0e10cSrcweir 
reset()209cdf0e10cSrcweir void OStatement_Base::reset() throw (SQLException)
210cdf0e10cSrcweir {
211cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::reset" );
212cdf0e10cSrcweir 	::osl::MutexGuard aGuard( m_aMutex );
213cdf0e10cSrcweir 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
214cdf0e10cSrcweir 
215cdf0e10cSrcweir 
216cdf0e10cSrcweir 	clearWarnings ();
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 	if (m_xResultSet.get().is())
219cdf0e10cSrcweir 		clearMyResultSet();
220cdf0e10cSrcweir }
221cdf0e10cSrcweir //--------------------------------------------------------------------
222cdf0e10cSrcweir // clearMyResultSet
223cdf0e10cSrcweir // If a ResultSet was created for this Statement, close it
224cdf0e10cSrcweir //--------------------------------------------------------------------
225cdf0e10cSrcweir 
clearMyResultSet()226cdf0e10cSrcweir void OStatement_Base::clearMyResultSet () throw (SQLException)
227cdf0e10cSrcweir {
228cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::clearMyResultSet " );
229cdf0e10cSrcweir 	::osl::MutexGuard aGuard( m_aMutex );
230cdf0e10cSrcweir 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
231cdf0e10cSrcweir 
232cdf0e10cSrcweir     try
233cdf0e10cSrcweir     {
234cdf0e10cSrcweir         Reference<XCloseable> xCloseable;
235cdf0e10cSrcweir         if ( ::comphelper::query_interface( m_xResultSet.get(), xCloseable ) )
236cdf0e10cSrcweir             xCloseable->close();
237cdf0e10cSrcweir     }
238cdf0e10cSrcweir     catch( const DisposedException& ) { }
239cdf0e10cSrcweir 
240cdf0e10cSrcweir 	m_xResultSet = Reference< XResultSet>();
241cdf0e10cSrcweir }
242cdf0e10cSrcweir //--------------------------------------------------------------------
243cdf0e10cSrcweir // setWarning
244cdf0e10cSrcweir // Sets the warning
245cdf0e10cSrcweir //--------------------------------------------------------------------
246cdf0e10cSrcweir 
setWarning(const SQLWarning & ex)247cdf0e10cSrcweir void OStatement_Base::setWarning (const SQLWarning &ex) throw( SQLException)
248cdf0e10cSrcweir {
249cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::setWarning " );
250cdf0e10cSrcweir 	::osl::MutexGuard aGuard( m_aMutex );
251cdf0e10cSrcweir 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 
254cdf0e10cSrcweir 	m_aLastWarning = ex;
255cdf0e10cSrcweir }
256cdf0e10cSrcweir 
257cdf0e10cSrcweir // -------------------------------------------------------------------------
getWarnings()258cdf0e10cSrcweir Any SAL_CALL OStatement_Base::getWarnings(  ) throw(SQLException, RuntimeException)
259cdf0e10cSrcweir {
260cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::getWarnings" );
261cdf0e10cSrcweir 	::osl::MutexGuard aGuard( m_aMutex );
262cdf0e10cSrcweir 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
263cdf0e10cSrcweir 
264cdf0e10cSrcweir 	return makeAny(m_aLastWarning);
265cdf0e10cSrcweir }
266cdf0e10cSrcweir // -------------------------------------------------------------------------
clearWarnings()267cdf0e10cSrcweir void SAL_CALL OStatement_Base::clearWarnings(  ) throw(SQLException, RuntimeException)
268cdf0e10cSrcweir {
269cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::clearWarnings" );
270cdf0e10cSrcweir 	::osl::MutexGuard aGuard( m_aMutex );
271cdf0e10cSrcweir 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
272cdf0e10cSrcweir 
273cdf0e10cSrcweir 	m_aLastWarning = SQLWarning();
274cdf0e10cSrcweir }
275cdf0e10cSrcweir // -------------------------------------------------------------------------
createArrayHelper() const276cdf0e10cSrcweir ::cppu::IPropertyArrayHelper* OStatement_Base::createArrayHelper( ) const
277cdf0e10cSrcweir {
278cdf0e10cSrcweir     //RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::createArrayHelper" );
279cdf0e10cSrcweir 	Sequence< Property > aProps;
280cdf0e10cSrcweir 	describeProperties(aProps);
281cdf0e10cSrcweir 	return new ::cppu::OPropertyArrayHelper(aProps);
282cdf0e10cSrcweir }
283cdf0e10cSrcweir 
284cdf0e10cSrcweir // -------------------------------------------------------------------------
getInfoHelper()285cdf0e10cSrcweir ::cppu::IPropertyArrayHelper & OStatement_Base::getInfoHelper()
286cdf0e10cSrcweir {
287cdf0e10cSrcweir     //RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::getInfoHelper" );
288cdf0e10cSrcweir 	return *const_cast<OStatement_Base*>(this)->getArrayHelper();
289cdf0e10cSrcweir }
290cdf0e10cSrcweir // -------------------------------------------------------------------------
createResultSet()291cdf0e10cSrcweir OResultSet* OStatement::createResultSet()
292cdf0e10cSrcweir {
293cdf0e10cSrcweir 	return new OResultSet(this,m_aSQLIterator);
294cdf0e10cSrcweir }
295cdf0e10cSrcweir // -------------------------------------------------------------------------
296cdf0e10cSrcweir IMPLEMENT_SERVICE_INFO(OStatement,"com.sun.star.sdbc.driver.file.Statement","com.sun.star.sdbc.Statement");
297cdf0e10cSrcweir // -----------------------------------------------------------------------------
acquire()298cdf0e10cSrcweir void SAL_CALL OStatement::acquire() throw()
299cdf0e10cSrcweir {
300cdf0e10cSrcweir 	OStatement_BASE2::acquire();
301cdf0e10cSrcweir }
302cdf0e10cSrcweir // -----------------------------------------------------------------------------
release()303cdf0e10cSrcweir void SAL_CALL OStatement::release() throw()
304cdf0e10cSrcweir {
305cdf0e10cSrcweir 	OStatement_BASE2::release();
306cdf0e10cSrcweir }
307cdf0e10cSrcweir // -----------------------------------------------------------------------------
308cdf0e10cSrcweir // -------------------------------------------------------------------------
execute(const::rtl::OUString & sql)309cdf0e10cSrcweir sal_Bool SAL_CALL OStatement::execute( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
310cdf0e10cSrcweir {
311cdf0e10cSrcweir 	::osl::MutexGuard aGuard( m_aMutex );
312cdf0e10cSrcweir 
313cdf0e10cSrcweir     executeQuery(sql);
314cdf0e10cSrcweir 
315cdf0e10cSrcweir 	return m_aSQLIterator.getStatementType() == SQL_STATEMENT_SELECT;
316cdf0e10cSrcweir }
317cdf0e10cSrcweir 
318cdf0e10cSrcweir // -------------------------------------------------------------------------
319cdf0e10cSrcweir 
executeQuery(const::rtl::OUString & sql)320cdf0e10cSrcweir Reference< XResultSet > SAL_CALL OStatement::executeQuery( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
321cdf0e10cSrcweir {
322cdf0e10cSrcweir 	::osl::MutexGuard aGuard( m_aMutex );
323cdf0e10cSrcweir 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
324cdf0e10cSrcweir 
325cdf0e10cSrcweir     construct(sql);
326cdf0e10cSrcweir     Reference< XResultSet > xRS;
327cdf0e10cSrcweir 	OResultSet* pResult = createResultSet();
328cdf0e10cSrcweir 	xRS = pResult;
329cdf0e10cSrcweir 	initializeResultSet(pResult);
330cdf0e10cSrcweir     m_xResultSet = Reference<XResultSet>(pResult);
331cdf0e10cSrcweir 
332cdf0e10cSrcweir 	pResult->OpenImpl();
333cdf0e10cSrcweir 
334cdf0e10cSrcweir 	return xRS;
335cdf0e10cSrcweir }
336cdf0e10cSrcweir // -------------------------------------------------------------------------
getConnection()337cdf0e10cSrcweir Reference< XConnection > SAL_CALL OStatement::getConnection(  ) throw(SQLException, RuntimeException)
338cdf0e10cSrcweir {
339cdf0e10cSrcweir 	return (Reference< XConnection >)m_pConnection;
340cdf0e10cSrcweir }
341cdf0e10cSrcweir // -------------------------------------------------------------------------
executeUpdate(const::rtl::OUString & sql)342cdf0e10cSrcweir sal_Int32 SAL_CALL OStatement::executeUpdate( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException)
343cdf0e10cSrcweir {
344cdf0e10cSrcweir 	::osl::MutexGuard aGuard( m_aMutex );
345cdf0e10cSrcweir 	checkDisposed(OStatement_BASE::rBHelper.bDisposed);
346cdf0e10cSrcweir 
347cdf0e10cSrcweir 
348cdf0e10cSrcweir 	construct(sql);
349cdf0e10cSrcweir 	OResultSet* pResult = createResultSet();
350cdf0e10cSrcweir 	Reference< XResultSet > xRS = pResult;
351cdf0e10cSrcweir 	initializeResultSet(pResult);
352cdf0e10cSrcweir 	pResult->OpenImpl();
353cdf0e10cSrcweir 
354cdf0e10cSrcweir 	return pResult->getRowCountResult();
355cdf0e10cSrcweir }
356cdf0e10cSrcweir 
357cdf0e10cSrcweir // -----------------------------------------------------------------------------
disposing(void)358cdf0e10cSrcweir void SAL_CALL OStatement_Base::disposing(void)
359cdf0e10cSrcweir {
360cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::disposing" );
361cdf0e10cSrcweir 	if(m_aEvaluateRow.isValid())
362cdf0e10cSrcweir 	{
363cdf0e10cSrcweir 		m_aEvaluateRow->get().clear();
364cdf0e10cSrcweir 		m_aEvaluateRow = NULL;
365cdf0e10cSrcweir 	}
366cdf0e10cSrcweir 	delete m_pEvaluationKeySet;
367cdf0e10cSrcweir 	OStatement_BASE::disposing();
368cdf0e10cSrcweir }
369cdf0e10cSrcweir // -----------------------------------------------------------------------------
getPropertySetInfo()370cdf0e10cSrcweir Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL OStatement_Base::getPropertySetInfo(  ) throw(RuntimeException)
371cdf0e10cSrcweir {
372cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::getPropertySetInfo" );
373cdf0e10cSrcweir 	return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper());
374cdf0e10cSrcweir }
375cdf0e10cSrcweir // -----------------------------------------------------------------------------
queryInterface(const Type & rType)376cdf0e10cSrcweir Any SAL_CALL OStatement::queryInterface( const Type & rType ) throw(RuntimeException)
377cdf0e10cSrcweir {
378cdf0e10cSrcweir 	Any aRet = OStatement_XStatement::queryInterface( rType);
379cdf0e10cSrcweir 	return aRet.hasValue() ? aRet : OStatement_BASE2::queryInterface( rType);
380cdf0e10cSrcweir }
381cdf0e10cSrcweir // -----------------------------------------------------------------------------
createAnalyzer()382cdf0e10cSrcweir OSQLAnalyzer* OStatement_Base::createAnalyzer()
383cdf0e10cSrcweir {
384cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::createAnalyzer" );
385cdf0e10cSrcweir 	return new OSQLAnalyzer(m_pConnection);
386cdf0e10cSrcweir }
387cdf0e10cSrcweir // -----------------------------------------------------------------------------
anylizeSQL()388cdf0e10cSrcweir void OStatement_Base::anylizeSQL()
389cdf0e10cSrcweir {
390cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::anylizeSQL" );
391cdf0e10cSrcweir 	OSL_ENSURE(m_pSQLAnalyzer,"OResultSet::anylizeSQL: Analyzer isn't set!");
392cdf0e10cSrcweir 	// start analysing the statement
393cdf0e10cSrcweir 	m_pSQLAnalyzer->setOrigColumns(m_xColNames);
394cdf0e10cSrcweir 	m_pSQLAnalyzer->start(m_pParseTree);
395cdf0e10cSrcweir 
396cdf0e10cSrcweir 	const OSQLParseNode* pOrderbyClause = m_aSQLIterator.getOrderTree();
397cdf0e10cSrcweir 	if(pOrderbyClause)
398cdf0e10cSrcweir 	{
399cdf0e10cSrcweir 		OSQLParseNode * pOrderingSpecCommalist = pOrderbyClause->getChild(2);
400cdf0e10cSrcweir 		OSL_ENSURE(SQL_ISRULE(pOrderingSpecCommalist,ordering_spec_commalist),"OResultSet: Fehler im Parse Tree");
401cdf0e10cSrcweir 
402cdf0e10cSrcweir 		for (sal_uInt32 m = 0; m < pOrderingSpecCommalist->count(); m++)
403cdf0e10cSrcweir 		{
404cdf0e10cSrcweir 			OSQLParseNode * pOrderingSpec = pOrderingSpecCommalist->getChild(m);
405cdf0e10cSrcweir 			OSL_ENSURE(SQL_ISRULE(pOrderingSpec,ordering_spec),"OResultSet: Fehler im Parse Tree");
406cdf0e10cSrcweir 			OSL_ENSURE(pOrderingSpec->count() == 2,"OResultSet: Fehler im Parse Tree");
407cdf0e10cSrcweir 
408cdf0e10cSrcweir 			OSQLParseNode * pColumnRef = pOrderingSpec->getChild(0);
409cdf0e10cSrcweir 			if(!SQL_ISRULE(pColumnRef,column_ref))
410cdf0e10cSrcweir 			{
411cdf0e10cSrcweir 				throw SQLException();
412cdf0e10cSrcweir 			}
413cdf0e10cSrcweir 			OSQLParseNode * pAscendingDescending = pOrderingSpec->getChild(1);
414cdf0e10cSrcweir 			setOrderbyColumn(pColumnRef,pAscendingDescending);
415cdf0e10cSrcweir 		}
416cdf0e10cSrcweir 	}
417cdf0e10cSrcweir }
418cdf0e10cSrcweir //------------------------------------------------------------------
setOrderbyColumn(OSQLParseNode * pColumnRef,OSQLParseNode * pAscendingDescending)419cdf0e10cSrcweir void OStatement_Base::setOrderbyColumn(	OSQLParseNode* pColumnRef,
420cdf0e10cSrcweir 										OSQLParseNode* pAscendingDescending)
421cdf0e10cSrcweir {
422cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::setOrderbyColumn" );
423cdf0e10cSrcweir 	::rtl::OUString aColumnName;
424cdf0e10cSrcweir 	if (pColumnRef->count() == 1)
425cdf0e10cSrcweir 		aColumnName = pColumnRef->getChild(0)->getTokenValue();
426cdf0e10cSrcweir 	else if (pColumnRef->count() == 3)
427cdf0e10cSrcweir 	{
428cdf0e10cSrcweir 		// Nur die Table Range-Variable darf hier vorkommen:
429cdf0e10cSrcweir //		if (!(pColumnRef->getChild(0)->getTokenValue() == aTableRange))
430cdf0e10cSrcweir //		{
431cdf0e10cSrcweir //			aStatus.Set(SQL_STAT_ERROR,
432cdf0e10cSrcweir //						String::CreateFromAscii("S1000"),
433cdf0e10cSrcweir //						aStatus.CreateErrorMessage(String(SdbResId(STR_STAT_INVALID_RANGE_VAR))),
434cdf0e10cSrcweir //						0, String() );
435cdf0e10cSrcweir 			//	return;
436cdf0e10cSrcweir 		//	}
437cdf0e10cSrcweir 		pColumnRef->getChild(2)->parseNodeToStr( aColumnName, getOwnConnection(), NULL, sal_False, sal_False );
438cdf0e10cSrcweir 	}
439cdf0e10cSrcweir 	else
440cdf0e10cSrcweir 	{
441cdf0e10cSrcweir 		//	aStatus.SetStatementTooComplex();
442cdf0e10cSrcweir 		throw SQLException();
443cdf0e10cSrcweir 	}
444cdf0e10cSrcweir 
445cdf0e10cSrcweir 	Reference<XColumnLocate> xColLocate(m_xColNames,UNO_QUERY);
446cdf0e10cSrcweir 	if(!xColLocate.is())
447cdf0e10cSrcweir 		return;
448cdf0e10cSrcweir 	// Alles geprueft und wir haben den Namen der Column.
449cdf0e10cSrcweir 	// Die wievielte Column ist das?
450cdf0e10cSrcweir 	::vos::ORef<OSQLColumns> aSelectColumns = m_aSQLIterator.getSelectColumns();
451cdf0e10cSrcweir 	::comphelper::UStringMixEqual aCase;
452cdf0e10cSrcweir 	OSQLColumns::Vector::const_iterator aFind = ::connectivity::find(aSelectColumns->get().begin(),aSelectColumns->get().end(),aColumnName,aCase);
453cdf0e10cSrcweir 	if ( aFind == aSelectColumns->get().end() )
454cdf0e10cSrcweir 		throw SQLException();
455cdf0e10cSrcweir 	m_aOrderbyColumnNumber.push_back((aFind - aSelectColumns->get().begin()) + 1);
456cdf0e10cSrcweir 
457cdf0e10cSrcweir 	// Ascending or Descending?
458cdf0e10cSrcweir 	m_aOrderbyAscending.push_back((SQL_ISTOKEN(pAscendingDescending,DESC)) ? SQL_DESC : SQL_ASC);
459cdf0e10cSrcweir }
460cdf0e10cSrcweir 
461cdf0e10cSrcweir // -----------------------------------------------------------------------------
construct(const::rtl::OUString & sql)462cdf0e10cSrcweir void OStatement_Base::construct(const ::rtl::OUString& sql)  throw(SQLException, RuntimeException)
463cdf0e10cSrcweir {
464cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::construct" );
465cdf0e10cSrcweir 	::rtl::OUString aErr;
466cdf0e10cSrcweir 	m_pParseTree = m_aParser.parseTree(aErr,sql);
467cdf0e10cSrcweir 	if(m_pParseTree)
468cdf0e10cSrcweir 	{
469cdf0e10cSrcweir 		m_aSQLIterator.setParseTree(m_pParseTree);
470cdf0e10cSrcweir 		m_aSQLIterator.traverseAll();
471cdf0e10cSrcweir 		const OSQLTables& xTabs = m_aSQLIterator.getTables();
472cdf0e10cSrcweir 
473cdf0e10cSrcweir         // sanity checks
474cdf0e10cSrcweir 		if ( xTabs.empty() )
475cdf0e10cSrcweir             // no tables -> nothing to operate on -> error
476cdf0e10cSrcweir             m_pConnection->throwGenericSQLException(STR_QUERY_NO_TABLE,*this);
477cdf0e10cSrcweir 
478cdf0e10cSrcweir         if ( xTabs.size() > 1 || m_aSQLIterator.hasErrors() )
479cdf0e10cSrcweir             // more than one table -> can't operate on them -> error
480cdf0e10cSrcweir             m_pConnection->throwGenericSQLException(STR_QUERY_MORE_TABLES,*this);
481cdf0e10cSrcweir 
482cdf0e10cSrcweir 		if ( (m_aSQLIterator.getStatementType() == SQL_STATEMENT_SELECT) && m_aSQLIterator.getSelectColumns()->get().empty() )
483cdf0e10cSrcweir             // SELECT statement without columns -> error
484cdf0e10cSrcweir             m_pConnection->throwGenericSQLException(STR_QUERY_NO_COLUMN,*this);
485cdf0e10cSrcweir 
486cdf0e10cSrcweir 		switch(m_aSQLIterator.getStatementType())
487cdf0e10cSrcweir 		{
488cdf0e10cSrcweir 			case SQL_STATEMENT_CREATE_TABLE:
489cdf0e10cSrcweir 			case SQL_STATEMENT_ODBC_CALL:
490cdf0e10cSrcweir 			case SQL_STATEMENT_UNKNOWN:
491cdf0e10cSrcweir 				m_pConnection->throwGenericSQLException(STR_QUERY_TOO_COMPLEX,*this);
492cdf0e10cSrcweir 				break;
493cdf0e10cSrcweir 			default:
494cdf0e10cSrcweir 				break;
495cdf0e10cSrcweir 		}
496cdf0e10cSrcweir 
497cdf0e10cSrcweir 		// at this moment we support only one table per select statement
498cdf0e10cSrcweir 		Reference< ::com::sun::star::lang::XUnoTunnel> xTunnel(xTabs.begin()->second,UNO_QUERY);
499cdf0e10cSrcweir 		if(xTunnel.is())
500cdf0e10cSrcweir 		{
501cdf0e10cSrcweir 			if(m_pTable)
502cdf0e10cSrcweir 				m_pTable->release();
503cdf0e10cSrcweir 			m_pTable = reinterpret_cast<OFileTable*>(xTunnel->getSomething(OFileTable::getUnoTunnelImplementationId()));
504cdf0e10cSrcweir 			if(m_pTable)
505cdf0e10cSrcweir 				m_pTable->acquire();
506cdf0e10cSrcweir 		}
507cdf0e10cSrcweir 		OSL_ENSURE(m_pTable,"No table!");
508cdf0e10cSrcweir         if ( m_pTable )
509cdf0e10cSrcweir 		    m_xColNames		= m_pTable->getColumns();
510cdf0e10cSrcweir 		Reference<XIndexAccess> xNames(m_xColNames,UNO_QUERY);
511cdf0e10cSrcweir 		// set the binding of the resultrow
512cdf0e10cSrcweir 		m_aRow			= new OValueRefVector(xNames->getCount());
513cdf0e10cSrcweir 		(m_aRow->get())[0]->setBound(sal_True);
514cdf0e10cSrcweir 		::std::for_each(m_aRow->get().begin()+1,m_aRow->get().end(),TSetRefBound(sal_False));
515cdf0e10cSrcweir 
516cdf0e10cSrcweir 		// set the binding of the resultrow
517cdf0e10cSrcweir 		m_aEvaluateRow	= new OValueRefVector(xNames->getCount());
518cdf0e10cSrcweir 
519cdf0e10cSrcweir 		(m_aEvaluateRow->get())[0]->setBound(sal_True);
520cdf0e10cSrcweir 		::std::for_each(m_aEvaluateRow->get().begin()+1,m_aEvaluateRow->get().end(),TSetRefBound(sal_False));
521cdf0e10cSrcweir 
522cdf0e10cSrcweir 		// set the select row
523cdf0e10cSrcweir 		m_aSelectRow = new OValueRefVector(m_aSQLIterator.getSelectColumns()->get().size());
524cdf0e10cSrcweir 		::std::for_each(m_aSelectRow->get().begin(),m_aSelectRow->get().end(),TSetRefBound(sal_True));
525cdf0e10cSrcweir 
526cdf0e10cSrcweir 		// create the column mapping
527cdf0e10cSrcweir 		createColumnMapping();
528cdf0e10cSrcweir 
529cdf0e10cSrcweir 		m_pSQLAnalyzer	= createAnalyzer();
530cdf0e10cSrcweir 
531cdf0e10cSrcweir 		Reference<XIndexesSupplier> xIndexSup(xTunnel,UNO_QUERY);
532cdf0e10cSrcweir 		if(xIndexSup.is())
533cdf0e10cSrcweir 			m_pSQLAnalyzer->setIndexes(xIndexSup->getIndexes());
534cdf0e10cSrcweir 
535cdf0e10cSrcweir 		anylizeSQL();
536cdf0e10cSrcweir 	}
537cdf0e10cSrcweir 	else
538cdf0e10cSrcweir 		throw SQLException(aErr,*this,::rtl::OUString(),0,Any());
539cdf0e10cSrcweir }
540cdf0e10cSrcweir // -----------------------------------------------------------------------------
createColumnMapping()541cdf0e10cSrcweir void OStatement_Base::createColumnMapping()
542cdf0e10cSrcweir {
543cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::createColumnMapping" );
544cdf0e10cSrcweir 	// initialize the column index map (mapping select columns to table columns)
545cdf0e10cSrcweir 	::vos::ORef<connectivity::OSQLColumns>	xColumns = m_aSQLIterator.getSelectColumns();
546cdf0e10cSrcweir 	m_aColMapping.resize(xColumns->get().size() + 1);
547cdf0e10cSrcweir 	for (sal_Int32 i=0; i<(sal_Int32)m_aColMapping.size(); ++i)
548cdf0e10cSrcweir 		m_aColMapping[i] = i;
549cdf0e10cSrcweir 
550cdf0e10cSrcweir 	Reference<XIndexAccess> xNames(m_xColNames,UNO_QUERY);
551cdf0e10cSrcweir 	// now check which columns are bound
552cdf0e10cSrcweir 	OResultSet::setBoundedColumns(m_aRow,m_aSelectRow,xColumns,xNames,sal_True,m_xDBMetaData,m_aColMapping);
553cdf0e10cSrcweir }
554cdf0e10cSrcweir // -----------------------------------------------------------------------------
initializeResultSet(OResultSet * _pResult)555cdf0e10cSrcweir void OStatement_Base::initializeResultSet(OResultSet* _pResult)
556cdf0e10cSrcweir {
557cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::initializeResultSet" );
558cdf0e10cSrcweir 	GetAssignValues();
559cdf0e10cSrcweir 
560cdf0e10cSrcweir 	_pResult->setSqlAnalyzer(m_pSQLAnalyzer);
561cdf0e10cSrcweir 	_pResult->setOrderByColumns(m_aOrderbyColumnNumber);
562cdf0e10cSrcweir 	_pResult->setOrderByAscending(m_aOrderbyAscending);
563cdf0e10cSrcweir 	_pResult->setBindingRow(m_aRow);
564cdf0e10cSrcweir 	_pResult->setColumnMapping(m_aColMapping);
565cdf0e10cSrcweir 	_pResult->setEvaluationRow(m_aEvaluateRow);
566cdf0e10cSrcweir 	_pResult->setAssignValues(m_aAssignValues);
567cdf0e10cSrcweir 	_pResult->setSelectRow(m_aSelectRow);
568cdf0e10cSrcweir 
569cdf0e10cSrcweir 	m_pSQLAnalyzer->bindSelectRow(m_aRow);
570cdf0e10cSrcweir 	m_pEvaluationKeySet = m_pSQLAnalyzer->bindEvaluationRow(m_aEvaluateRow);	// Werte im Code des Compilers setzen
571cdf0e10cSrcweir 	_pResult->setEvaluationKeySet(m_pEvaluationKeySet);
572cdf0e10cSrcweir }
573cdf0e10cSrcweir // -----------------------------------------------------------------------------
GetAssignValues()574cdf0e10cSrcweir void OStatement_Base::GetAssignValues()
575cdf0e10cSrcweir {
576cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::GetAssignValues" );
577cdf0e10cSrcweir 	if (m_pParseTree == NULL)
578cdf0e10cSrcweir 	{
579cdf0e10cSrcweir 		::dbtools::throwFunctionSequenceException(*this);
580cdf0e10cSrcweir 		return;
581cdf0e10cSrcweir 	}
582cdf0e10cSrcweir 
583cdf0e10cSrcweir 	if (SQL_ISRULE(m_pParseTree,select_statement))
584cdf0e10cSrcweir 		// Keine zu setzenden Werte bei SELECT
585cdf0e10cSrcweir 		return;
586cdf0e10cSrcweir 	else if (SQL_ISRULE(m_pParseTree,insert_statement))
587cdf0e10cSrcweir 	{
588cdf0e10cSrcweir 		// Row fuer die zu setzenden Werte anlegen (Referenz durch new)
589cdf0e10cSrcweir 		if(m_aAssignValues.isValid())
590cdf0e10cSrcweir 			m_aAssignValues->get().clear();
591cdf0e10cSrcweir 		sal_Int32 nCount = Reference<XIndexAccess>(m_xColNames,UNO_QUERY)->getCount();
592cdf0e10cSrcweir 		m_aAssignValues = new OAssignValues(nCount);
593cdf0e10cSrcweir 		// unbound all
594cdf0e10cSrcweir 		::std::for_each(m_aAssignValues->get().begin()+1,m_aAssignValues->get().end(),TSetRefBound(sal_False));
595cdf0e10cSrcweir 
596cdf0e10cSrcweir 		m_aParameterIndexes.resize(nCount+1,SQL_NO_PARAMETER);
597cdf0e10cSrcweir 
598cdf0e10cSrcweir 		// Liste der Columns-Namen, die in der column_commalist vorkommen (mit ; getrennt):
599cdf0e10cSrcweir 		::std::vector<String> aColumnNameList;
600cdf0e10cSrcweir 
601cdf0e10cSrcweir 		OSL_ENSURE(m_pParseTree->count() >= 4,"OResultSet: Fehler im Parse Tree");
602cdf0e10cSrcweir 
603cdf0e10cSrcweir 		OSQLParseNode * pOptColumnCommalist = m_pParseTree->getChild(3);
604cdf0e10cSrcweir 		OSL_ENSURE(pOptColumnCommalist != NULL,"OResultSet: Fehler im Parse Tree");
605cdf0e10cSrcweir 		OSL_ENSURE(SQL_ISRULE(pOptColumnCommalist,opt_column_commalist),"OResultSet: Fehler im Parse Tree");
606cdf0e10cSrcweir 		if (pOptColumnCommalist->count() == 0)
607cdf0e10cSrcweir 		{
608cdf0e10cSrcweir 			const Sequence< ::rtl::OUString>& aNames = m_xColNames->getElementNames();
609cdf0e10cSrcweir 			const ::rtl::OUString* pBegin = aNames.getConstArray();
610cdf0e10cSrcweir 			const ::rtl::OUString* pEnd = pBegin + aNames.getLength();
611cdf0e10cSrcweir             for (; pBegin != pEnd; ++pBegin)
612cdf0e10cSrcweir                 aColumnNameList.push_back(*pBegin);
613cdf0e10cSrcweir 		}
614cdf0e10cSrcweir 		else
615cdf0e10cSrcweir 		{
616cdf0e10cSrcweir 			OSL_ENSURE(pOptColumnCommalist->count() == 3,"OResultSet: Fehler im Parse Tree");
617cdf0e10cSrcweir 
618cdf0e10cSrcweir 			OSQLParseNode * pColumnCommalist = pOptColumnCommalist->getChild(1);
619cdf0e10cSrcweir 			OSL_ENSURE(pColumnCommalist != NULL,"OResultSet: Fehler im Parse Tree");
620cdf0e10cSrcweir 			OSL_ENSURE(SQL_ISRULE(pColumnCommalist,column_commalist),"OResultSet: Fehler im Parse Tree");
621cdf0e10cSrcweir 			OSL_ENSURE(pColumnCommalist->count() > 0,"OResultSet: Fehler im Parse Tree");
622cdf0e10cSrcweir 
623cdf0e10cSrcweir 			// Alle Columns in der column_commalist ...
624cdf0e10cSrcweir 			for (sal_uInt32 i = 0; i < pColumnCommalist->count(); i++)
625cdf0e10cSrcweir 			{
626cdf0e10cSrcweir 				OSQLParseNode * pCol = pColumnCommalist->getChild(i);
627cdf0e10cSrcweir 				OSL_ENSURE(pCol != NULL,"OResultSet: Fehler im Parse Tree");
628cdf0e10cSrcweir 				aColumnNameList.push_back(pCol->getTokenValue());
629cdf0e10cSrcweir 			}
630cdf0e10cSrcweir 		}
631cdf0e10cSrcweir 		if ( aColumnNameList.empty() )
632cdf0e10cSrcweir 			throwFunctionSequenceException(*this);
633cdf0e10cSrcweir 
634cdf0e10cSrcweir 		// Werte ...
635cdf0e10cSrcweir 		OSQLParseNode * pValuesOrQuerySpec = m_pParseTree->getChild(4);
636cdf0e10cSrcweir 		OSL_ENSURE(pValuesOrQuerySpec != NULL,"OResultSet: pValuesOrQuerySpec darf nicht NULL sein!");
637cdf0e10cSrcweir 		OSL_ENSURE(SQL_ISRULE(pValuesOrQuerySpec,values_or_query_spec),"OResultSet: ! SQL_ISRULE(pValuesOrQuerySpec,values_or_query_spec)");
638cdf0e10cSrcweir 		OSL_ENSURE(pValuesOrQuerySpec->count() > 0,"OResultSet: pValuesOrQuerySpec->count() <= 0");
639cdf0e10cSrcweir 
640cdf0e10cSrcweir 		// nur "VALUES" ist erlaubt ...
641cdf0e10cSrcweir 		if (! SQL_ISTOKEN(pValuesOrQuerySpec->getChild(0),VALUES))
642cdf0e10cSrcweir 			throwFunctionSequenceException(*this);
643cdf0e10cSrcweir 
644cdf0e10cSrcweir 		OSL_ENSURE(pValuesOrQuerySpec->count() == 4,"OResultSet: pValuesOrQuerySpec->count() != 4");
645cdf0e10cSrcweir 
646cdf0e10cSrcweir 		// Liste von Werten
647cdf0e10cSrcweir 		OSQLParseNode * pInsertAtomCommalist = pValuesOrQuerySpec->getChild(2);
648cdf0e10cSrcweir 		OSL_ENSURE(pInsertAtomCommalist != NULL,"OResultSet: pInsertAtomCommalist darf nicht NULL sein!");
649cdf0e10cSrcweir 		OSL_ENSURE(pInsertAtomCommalist->count() > 0,"OResultSet: pInsertAtomCommalist <= 0");
650cdf0e10cSrcweir 
651cdf0e10cSrcweir 		String aColumnName;
652cdf0e10cSrcweir 		OSQLParseNode * pRow_Value_Const;
653cdf0e10cSrcweir 		xub_StrLen nIndex=0;
654cdf0e10cSrcweir 		for (sal_uInt32 i = 0; i < pInsertAtomCommalist->count(); i++)
655cdf0e10cSrcweir 		{
656cdf0e10cSrcweir 			pRow_Value_Const = pInsertAtomCommalist->getChild(i); // row_value_constructor
657cdf0e10cSrcweir 			OSL_ENSURE(pRow_Value_Const != NULL,"OResultSet: pRow_Value_Const darf nicht NULL sein!");
658cdf0e10cSrcweir 			if(SQL_ISRULE(pRow_Value_Const,parameter))
659cdf0e10cSrcweir 			{
660cdf0e10cSrcweir 				ParseAssignValues(aColumnNameList,pRow_Value_Const,nIndex++); // kann nur ein Columnname vorhanden sein pro Schleife
661cdf0e10cSrcweir 			}
662cdf0e10cSrcweir 			else if(pRow_Value_Const->isToken())
663cdf0e10cSrcweir 				ParseAssignValues(aColumnNameList,pRow_Value_Const,static_cast<xub_StrLen>(i));
664cdf0e10cSrcweir 			else
665cdf0e10cSrcweir 			{
666cdf0e10cSrcweir 				if(pRow_Value_Const->count() == aColumnNameList.size())
667cdf0e10cSrcweir 				{
668cdf0e10cSrcweir 					for (sal_uInt32 j = 0; j < pRow_Value_Const->count(); ++j)
669cdf0e10cSrcweir 						ParseAssignValues(aColumnNameList,pRow_Value_Const->getChild(j),nIndex++);
670cdf0e10cSrcweir 				}
671cdf0e10cSrcweir 				else
672cdf0e10cSrcweir 					throwFunctionSequenceException(*this);
673cdf0e10cSrcweir 			}
674cdf0e10cSrcweir 		}
675cdf0e10cSrcweir 	}
676cdf0e10cSrcweir 	else if (SQL_ISRULE(m_pParseTree,update_statement_searched))
677cdf0e10cSrcweir 	{
678cdf0e10cSrcweir 		if(m_aAssignValues.isValid())
679cdf0e10cSrcweir 			m_aAssignValues->get().clear();
680cdf0e10cSrcweir 		sal_Int32 nCount = Reference<XIndexAccess>(m_xColNames,UNO_QUERY)->getCount();
681cdf0e10cSrcweir 		m_aAssignValues = new OAssignValues(nCount);
682cdf0e10cSrcweir 		// unbound all
683cdf0e10cSrcweir 		::std::for_each(m_aAssignValues->get().begin()+1,m_aAssignValues->get().end(),TSetRefBound(sal_False));
684cdf0e10cSrcweir 
685cdf0e10cSrcweir 		m_aParameterIndexes.resize(nCount+1,SQL_NO_PARAMETER);
686cdf0e10cSrcweir 
687cdf0e10cSrcweir 		OSL_ENSURE(m_pParseTree->count() >= 4,"OResultSet: Fehler im Parse Tree");
688cdf0e10cSrcweir 
689cdf0e10cSrcweir 		OSQLParseNode * pAssignmentCommalist = m_pParseTree->getChild(3);
690cdf0e10cSrcweir 		OSL_ENSURE(pAssignmentCommalist != NULL,"OResultSet: pAssignmentCommalist == NULL");
691cdf0e10cSrcweir 		OSL_ENSURE(SQL_ISRULE(pAssignmentCommalist,assignment_commalist),"OResultSet: Fehler im Parse Tree");
692cdf0e10cSrcweir 		OSL_ENSURE(pAssignmentCommalist->count() > 0,"OResultSet: pAssignmentCommalist->count() <= 0");
693cdf0e10cSrcweir 
694cdf0e10cSrcweir 		// Alle Zuweisungen (Kommaliste) bearbeiten ...
695cdf0e10cSrcweir 		::std::vector< String> aList(1);
696cdf0e10cSrcweir 		for (sal_uInt32 i = 0; i < pAssignmentCommalist->count(); i++)
697cdf0e10cSrcweir 		{
698cdf0e10cSrcweir 			OSQLParseNode * pAssignment = pAssignmentCommalist->getChild(i);
699cdf0e10cSrcweir 			OSL_ENSURE(pAssignment != NULL,"OResultSet: pAssignment == NULL");
700cdf0e10cSrcweir 			OSL_ENSURE(SQL_ISRULE(pAssignment,assignment),"OResultSet: Fehler im Parse Tree");
701cdf0e10cSrcweir 			OSL_ENSURE(pAssignment->count() == 3,"OResultSet: pAssignment->count() != 3");
702cdf0e10cSrcweir 
703cdf0e10cSrcweir 			OSQLParseNode * pCol = pAssignment->getChild(0);
704cdf0e10cSrcweir 			OSL_ENSURE(pCol != NULL,"OResultSet: pCol == NULL");
705cdf0e10cSrcweir 
706cdf0e10cSrcweir 			OSQLParseNode * pComp = pAssignment->getChild(1);
707cdf0e10cSrcweir 			OSL_ENSURE(pComp != NULL,"OResultSet: pComp == NULL");
708cdf0e10cSrcweir 			OSL_ENSURE(pComp->getNodeType() == SQL_NODE_EQUAL,"OResultSet: pComp->getNodeType() != SQL_NODE_COMPARISON");
709cdf0e10cSrcweir 			if (pComp->getTokenValue().toChar() != '=')
710cdf0e10cSrcweir 			{
711cdf0e10cSrcweir 				//	aStatus.SetInvalidStatement();
712cdf0e10cSrcweir 				throwFunctionSequenceException(*this);
713cdf0e10cSrcweir 			}
714cdf0e10cSrcweir 
715cdf0e10cSrcweir 			OSQLParseNode * pVal = pAssignment->getChild(2);
716cdf0e10cSrcweir 			OSL_ENSURE(pVal != NULL,"OResultSet: pVal == NULL");
717cdf0e10cSrcweir 			aList[0] = pCol->getTokenValue();
718cdf0e10cSrcweir 			ParseAssignValues(aList,pVal,0);
719cdf0e10cSrcweir 		}
720cdf0e10cSrcweir 
721cdf0e10cSrcweir 	}
722cdf0e10cSrcweir }
723cdf0e10cSrcweir // -------------------------------------------------------------------------
ParseAssignValues(const::std::vector<String> & aColumnNameList,OSQLParseNode * pRow_Value_Constructor_Elem,xub_StrLen nIndex)724cdf0e10cSrcweir void OStatement_Base::ParseAssignValues(const ::std::vector< String>& aColumnNameList,OSQLParseNode* pRow_Value_Constructor_Elem,xub_StrLen nIndex)
725cdf0e10cSrcweir {
726cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::ParseAssignValues" );
727cdf0e10cSrcweir 	OSL_ENSURE(nIndex <= aColumnNameList.size(),"SdbFileCursor::ParseAssignValues: nIndex > aColumnNameList.GetTokenCount()");
728cdf0e10cSrcweir 	String aColumnName(aColumnNameList[nIndex]);
729cdf0e10cSrcweir 	OSL_ENSURE(aColumnName.Len() > 0,"OResultSet: Column-Name nicht gefunden");
730cdf0e10cSrcweir 	OSL_ENSURE(pRow_Value_Constructor_Elem != NULL,"OResultSet: pRow_Value_Constructor_Elem darf nicht NULL sein!");
731cdf0e10cSrcweir 
732cdf0e10cSrcweir 	if (pRow_Value_Constructor_Elem->getNodeType() == SQL_NODE_STRING ||
733cdf0e10cSrcweir 		pRow_Value_Constructor_Elem->getNodeType() == SQL_NODE_INTNUM ||
734cdf0e10cSrcweir 		pRow_Value_Constructor_Elem->getNodeType() == SQL_NODE_APPROXNUM)
735cdf0e10cSrcweir 	{
736cdf0e10cSrcweir 		// Wert setzen:
737cdf0e10cSrcweir 		SetAssignValue(aColumnName, pRow_Value_Constructor_Elem->getTokenValue());
738cdf0e10cSrcweir 	}
739cdf0e10cSrcweir 	else if (SQL_ISTOKEN(pRow_Value_Constructor_Elem,NULL))
740cdf0e10cSrcweir 	{
741cdf0e10cSrcweir 		// NULL setzen
742cdf0e10cSrcweir 		SetAssignValue(aColumnName, String(), sal_True);
743cdf0e10cSrcweir 	}
744cdf0e10cSrcweir 	else if (SQL_ISRULE(pRow_Value_Constructor_Elem,parameter))
745cdf0e10cSrcweir 		parseParamterElem(aColumnName,pRow_Value_Constructor_Elem);
746cdf0e10cSrcweir 	else
747cdf0e10cSrcweir 	{
748cdf0e10cSrcweir 		//	aStatus.SetStatementTooComplex();
749cdf0e10cSrcweir 		throwFunctionSequenceException(*this);
750cdf0e10cSrcweir 	}
751cdf0e10cSrcweir }
752cdf0e10cSrcweir //------------------------------------------------------------------
SetAssignValue(const String & aColumnName,const String & aValue,sal_Bool bSetNull,sal_uInt32 nParameter)753cdf0e10cSrcweir void OStatement_Base::SetAssignValue(const String& aColumnName,
754cdf0e10cSrcweir 								   const String& aValue,
755cdf0e10cSrcweir 								   sal_Bool bSetNull,
756cdf0e10cSrcweir 								   sal_uInt32 nParameter)
757cdf0e10cSrcweir {
758cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::SetAssignValue" );
759cdf0e10cSrcweir 	Reference<XPropertySet> xCol;
760cdf0e10cSrcweir 	m_xColNames->getByName(aColumnName) >>= xCol;
761cdf0e10cSrcweir 	sal_Int32 nId = Reference<XColumnLocate>(m_xColNames,UNO_QUERY)->findColumn(aColumnName);
762cdf0e10cSrcweir 	// Kommt diese Column ueberhaupt in der Datei vor?
763cdf0e10cSrcweir 
764cdf0e10cSrcweir 	if (!xCol.is())
765cdf0e10cSrcweir 	{
766cdf0e10cSrcweir 		// Diese Column gibt es nicht!
767cdf0e10cSrcweir //		aStatus.Set(SQL_STAT_ERROR,
768cdf0e10cSrcweir //					String::CreateFromAscii("S0022"),
769cdf0e10cSrcweir //					aStatus.CreateErrorMessage(String(SdbResId(STR_STAT_COLUMN_NOT_FOUND))),
770cdf0e10cSrcweir //					0, String() );
771cdf0e10cSrcweir 		throwFunctionSequenceException(*this);
772cdf0e10cSrcweir 	}
773cdf0e10cSrcweir 
774cdf0e10cSrcweir 	// Value an die Row mit den zuzuweisenden Werten binden:
775cdf0e10cSrcweir 	//	const ODbVariantRef& xValue = (*aAssignValues)[pFileColumn->GetId()];
776cdf0e10cSrcweir 
777cdf0e10cSrcweir 	// Alles geprueft und wir haben den Namen der Column.
778cdf0e10cSrcweir 	// Jetzt eine Value allozieren, den Wert setzen und die Value an die Row binden.
779cdf0e10cSrcweir 	if (bSetNull)
780cdf0e10cSrcweir 		(m_aAssignValues->get())[nId]->setNull();
781cdf0e10cSrcweir 	else
782cdf0e10cSrcweir 	{
783cdf0e10cSrcweir 		switch (::comphelper::getINT32(xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))))
784cdf0e10cSrcweir 		{
785cdf0e10cSrcweir 			// Kriterium je nach Typ als String oder double in die Variable packen ...
786cdf0e10cSrcweir 			case DataType::CHAR:
787cdf0e10cSrcweir 			case DataType::VARCHAR:
788cdf0e10cSrcweir             case DataType::LONGVARCHAR:
789cdf0e10cSrcweir 				*(m_aAssignValues->get())[nId] = ORowSetValue(aValue);
790cdf0e10cSrcweir 				// Zeichensatz ist bereits konvertiert, da ja das gesamte Statement konvertiert wurde
791cdf0e10cSrcweir 				break;
792cdf0e10cSrcweir 
793cdf0e10cSrcweir 			case DataType::BIT:
794cdf0e10cSrcweir 				{
795cdf0e10cSrcweir 					if (aValue.EqualsIgnoreCaseAscii("TRUE")  || aValue.GetChar(0) == '1')
796cdf0e10cSrcweir 						*(m_aAssignValues->get())[nId] = sal_True;
797cdf0e10cSrcweir 					else if (aValue.EqualsIgnoreCaseAscii("FALSE") || aValue.GetChar(0) == '0')
798cdf0e10cSrcweir 						*(m_aAssignValues->get())[nId] = sal_False;
799cdf0e10cSrcweir 					else
800cdf0e10cSrcweir 					{
801cdf0e10cSrcweir 						//	aStatus.Set(SQL_STAT_ERROR);	// nyi: genauer!
802cdf0e10cSrcweir 						throwFunctionSequenceException(*this);
803cdf0e10cSrcweir 					}
804cdf0e10cSrcweir 				}
805cdf0e10cSrcweir 				break;
806cdf0e10cSrcweir 			case DataType::TINYINT:
807cdf0e10cSrcweir 			case DataType::SMALLINT:
808cdf0e10cSrcweir 			case DataType::INTEGER:
809cdf0e10cSrcweir 			case DataType::DECIMAL:
810cdf0e10cSrcweir 			case DataType::NUMERIC:
811cdf0e10cSrcweir 			case DataType::REAL:
812cdf0e10cSrcweir 			case DataType::DOUBLE:
813cdf0e10cSrcweir 			case DataType::DATE:
814cdf0e10cSrcweir 			case DataType::TIME:
815cdf0e10cSrcweir 			case DataType::TIMESTAMP:
816cdf0e10cSrcweir 			{
817cdf0e10cSrcweir 				*(m_aAssignValues->get())[nId] = ORowSetValue(aValue); // .ToDouble
818cdf0e10cSrcweir //				try
819cdf0e10cSrcweir //				{
820cdf0e10cSrcweir //					double n = xValue->toDouble();
821cdf0e10cSrcweir //					xValue->setDouble(n);
822cdf0e10cSrcweir //				}
823cdf0e10cSrcweir //				catch ( ... )
824cdf0e10cSrcweir //				{
825cdf0e10cSrcweir //					aStatus.SetDriverNotCapableError();
826cdf0e10cSrcweir //				}
827cdf0e10cSrcweir 			}	break;
828cdf0e10cSrcweir 			default:
829cdf0e10cSrcweir 				throwFunctionSequenceException(*this);
830cdf0e10cSrcweir 		}
831cdf0e10cSrcweir 	}
832cdf0e10cSrcweir 
833cdf0e10cSrcweir 	// Parameter-Nr. merken (als User Data)
834cdf0e10cSrcweir 	// SQL_NO_PARAMETER = kein Parameter.
835cdf0e10cSrcweir 	m_aAssignValues->setParameterIndex(nId,nParameter);
836cdf0e10cSrcweir 	if(nParameter != SQL_NO_PARAMETER)
837cdf0e10cSrcweir 		m_aParameterIndexes[nParameter] = nId;
838cdf0e10cSrcweir }
839cdf0e10cSrcweir // -----------------------------------------------------------------------------
parseParamterElem(const String &,OSQLParseNode *)840cdf0e10cSrcweir void OStatement_Base::parseParamterElem(const String& /*_sColumnName*/,OSQLParseNode* /*pRow_Value_Constructor_Elem*/)
841cdf0e10cSrcweir {
842cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OStatement_Base::parseParamterElem" );
843cdf0e10cSrcweir 	// do nothing here
844cdf0e10cSrcweir }
845cdf0e10cSrcweir // =============================================================================
846cdf0e10cSrcweir 	} // namespace file
847cdf0e10cSrcweir // =============================================================================
848cdf0e10cSrcweir }// namespace connectivity
849cdf0e10cSrcweir // -----------------------------------------------------------------------------
850