|  | /************************************************************** | 
|  | * | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements.  See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership.  The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License.  You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | #ifndef _CONNECTIVITY_EVOAB_STATEMENT_HXX_ | 
|  | #define _CONNECTIVITY_EVOAB_STATEMENT_HXX_ | 
|  |  | 
|  | #include <com/sun/star/sdbc/XStatement.hpp> | 
|  | #include <com/sun/star/sdbc/XWarningsSupplier.hpp> | 
|  | #include <com/sun/star/sdbc/XMultipleResults.hpp> | 
|  | #include <com/sun/star/sdbc/XCloseable.hpp> | 
|  | #include <com/sun/star/sdbc/SQLWarning.hpp> | 
|  | #include <comphelper/proparrhlp.hxx> | 
|  | #include <cppuhelper/compbase2.hxx> | 
|  | #include <comphelper/uno3.hxx> | 
|  | #include "connectivity/CommonTools.hxx" | 
|  | #include <com/sun/star/lang/XServiceInfo.hpp> | 
|  | #include <comphelper/broadcasthelper.hxx> | 
|  | #include "connectivity/sqliterator.hxx" | 
|  | #include "connectivity/sqlparse.hxx" | 
|  | #include <connectivity/FValue.hxx> | 
|  | #include "OSubComponent.hxx" | 
|  | #include <com/sun/star/util/XCancellable.hpp> | 
|  | #include <cppuhelper/compbase5.hxx> | 
|  | #include <comphelper/propertycontainer.hxx> | 
|  | #include <com/sun/star/lang/XServiceInfo.hpp> | 
|  |  | 
|  | #include "EApi.h" | 
|  |  | 
|  | #include <list> | 
|  |  | 
|  | namespace connectivity | 
|  | { | 
|  | namespace evoab | 
|  | { | 
|  | class OEvoabResultSet; | 
|  | class OEvoabConnection; | 
|  | typedef ::cppu::WeakComponentImplHelper2    <   ::com::sun::star::sdbc::XWarningsSupplier | 
|  | ,   ::com::sun::star::sdbc::XCloseable | 
|  | >   OCommonStatement_IBase; | 
|  |  | 
|  | struct FieldSort | 
|  | { | 
|  | sal_Int32       nField; | 
|  | bool            bAscending; | 
|  |  | 
|  | FieldSort() : nField(0), bAscending( true ) { } | 
|  | FieldSort( const sal_Int32 _nField, const bool _bAscending ) : nField( _nField ), bAscending( _bAscending ) { } | 
|  | }; | 
|  | typedef ::std::vector< FieldSort >  SortDescriptor; | 
|  |  | 
|  | enum QueryFilterType | 
|  | { | 
|  | eFilterAlwaysFalse, | 
|  | eFilterNone, | 
|  | eFilterOther | 
|  | }; | 
|  |  | 
|  | struct QueryData | 
|  | { | 
|  | private: | 
|  | EBookQuery*     pQuery; | 
|  |  | 
|  | public: | 
|  | ::rtl::OUString                             sTable; | 
|  | QueryFilterType                             eFilterType; | 
|  | ::vos::ORef< ::connectivity::OSQLColumns >  xSelectColumns; | 
|  | SortDescriptor                              aSortOrder; | 
|  |  | 
|  | QueryData() | 
|  | :pQuery( NULL ) | 
|  | ,sTable() | 
|  | ,eFilterType( eFilterOther ) | 
|  | ,xSelectColumns() | 
|  | ,aSortOrder() | 
|  | { | 
|  | } | 
|  |  | 
|  | QueryData( const QueryData& _rhs ) | 
|  | :pQuery( NULL ) | 
|  | ,sTable() | 
|  | ,eFilterType( eFilterType ) | 
|  | ,xSelectColumns() | 
|  | ,aSortOrder() | 
|  | { | 
|  | *this = _rhs; | 
|  | } | 
|  |  | 
|  | QueryData& operator=( const QueryData& _rhs ) | 
|  | { | 
|  | if ( this == &_rhs ) | 
|  | return *this; | 
|  |  | 
|  | setQuery( _rhs.pQuery ); | 
|  | sTable = _rhs.sTable; | 
|  | eFilterType = _rhs.eFilterType; | 
|  | xSelectColumns = _rhs.xSelectColumns; | 
|  | aSortOrder = _rhs.aSortOrder; | 
|  |  | 
|  | return *this; | 
|  | } | 
|  |  | 
|  | ~QueryData() | 
|  | { | 
|  | setQuery( NULL ); | 
|  | } | 
|  |  | 
|  | EBookQuery* getQuery() const { return pQuery; } | 
|  |  | 
|  | void setQuery( EBookQuery* _pQuery ) | 
|  | { | 
|  | if ( pQuery ) | 
|  | e_book_query_unref( pQuery ); | 
|  | pQuery = _pQuery; | 
|  | if ( pQuery ) | 
|  | e_book_query_ref( pQuery ); | 
|  | } | 
|  | }; | 
|  |  | 
|  | //************************************************************** | 
|  | //************ Class: OCommonStatement | 
|  | // is a base class for the normal statement and for the prepared statement | 
|  | //************************************************************** | 
|  | class OCommonStatement; | 
|  | typedef OSubComponent< OCommonStatement, OCommonStatement_IBase >   OStatement_CBase; | 
|  |  | 
|  | class OCommonStatement  :public comphelper::OBaseMutex | 
|  | ,public OCommonStatement_IBase | 
|  | ,public ::comphelper::OPropertyContainer | 
|  | ,public ::comphelper::OPropertyArrayUsageHelper< OCommonStatement > | 
|  | ,public OStatement_CBase | 
|  | { | 
|  | friend class OSubComponent< OCommonStatement, OCommonStatement_IBase >; | 
|  |  | 
|  | private: | 
|  | ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XResultSet>    m_xResultSet;   // The last ResultSet created | 
|  | OEvoabResultSet                      *m_pResultSet; | 
|  | OEvoabConnection                     *m_pConnection; | 
|  | connectivity::OSQLParser			  m_aParser; | 
|  | connectivity::OSQLParseTreeIterator   m_aSQLIterator; | 
|  | connectivity::OSQLParseNode          *m_pParseTree; | 
|  |  | 
|  | // <properties> | 
|  | ::rtl::OUString								m_aCursorName; | 
|  | sal_Int32									m_nMaxFieldSize; | 
|  | sal_Int32									m_nMaxRows; | 
|  | sal_Int32									m_nQueryTimeOut; | 
|  | sal_Int32									m_nFetchSize; | 
|  | sal_Int32									m_nResultSetType; | 
|  | sal_Int32									m_nFetchDirection; | 
|  | sal_Int32									m_nResultSetConcurrency; | 
|  | sal_Bool									m_bEscapeProcessing; | 
|  | // </properties> | 
|  |  | 
|  | ::cppu::OBroadcastHelper& rBHelper; | 
|  |  | 
|  | protected: | 
|  |  | 
|  | void disposeResultSet(); | 
|  |  | 
|  | // OPropertyArrayUsageHelper | 
|  | virtual ::cppu::IPropertyArrayHelper* createArrayHelper() const; | 
|  | // OPropertySetHelper | 
|  | virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); | 
|  |  | 
|  | virtual ~OCommonStatement(); | 
|  |  | 
|  | protected: | 
|  | void         reset () throw( ::com::sun::star::sdbc::SQLException); | 
|  | void         clearMyResultSet () throw( ::com::sun::star::sdbc::SQLException); | 
|  | void         parseSql( const ::rtl::OUString& sql, QueryData& _out_rQueryData ); | 
|  | EBookQuery  *whereAnalysis( const OSQLParseNode*  parseTree ); | 
|  | void         orderByAnalysis( const OSQLParseNode* _pOrderByClause, SortDescriptor& _out_rSort ); | 
|  | rtl::OUString getTableName(); | 
|  | EBookQuery  *createTrue(); | 
|  | EBookQuery  *createTest( const ::rtl::OUString &aColumnName, | 
|  | EBookQueryTest eTest, | 
|  | const ::rtl::OUString &aMatch ); | 
|  |  | 
|  | public: | 
|  |  | 
|  | // other methods | 
|  | OEvoabConnection* getOwnConnection() const { return m_pConnection;} | 
|  |  | 
|  | using OCommonStatement_IBase::operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >; | 
|  |  | 
|  | protected: | 
|  | OCommonStatement( OEvoabConnection* _pConnection ); | 
|  |  | 
|  | // OComponentHelper | 
|  | virtual void SAL_CALL disposing(void); | 
|  | // XInterface | 
|  | virtual void SAL_CALL release() throw(); | 
|  | virtual void SAL_CALL acquire() throw(); | 
|  | // XInterface | 
|  | virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); | 
|  | //XTypeProvider | 
|  | virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException); | 
|  |  | 
|  | // XPropertySet | 
|  | virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo(  ) throw(::com::sun::star::uno::RuntimeException); | 
|  |  | 
|  | // XWarningsSupplier | 
|  | virtual ::com::sun::star::uno::Any SAL_CALL getWarnings(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); | 
|  | virtual void SAL_CALL clearWarnings(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); | 
|  |  | 
|  | // XCloseable | 
|  | virtual void SAL_CALL close(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); | 
|  |  | 
|  | protected: | 
|  | /** will return the EBookQuery representing the stamement's WHERE condition, or throw | 
|  |  | 
|  | Also, all statement dependent members (such as the parser/iterator) will be inited afterwards. | 
|  | */ | 
|  | QueryData | 
|  | impl_getEBookQuery_throw( const ::rtl::OUString& _rSql ); | 
|  |  | 
|  | ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > | 
|  | impl_executeQuery_throw( const ::rtl::OUString& _rSql ); | 
|  |  | 
|  | ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > | 
|  | impl_executeQuery_throw( const QueryData& _rData ); | 
|  |  | 
|  | ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > | 
|  | impl_getConnection() { return ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >( (::com::sun::star::sdbc::XConnection*)m_pConnection ); } | 
|  |  | 
|  | ::rtl::OUString | 
|  | impl_getColumnRefColumnName_throw( const ::connectivity::OSQLParseNode& _rColumnRef ); | 
|  | }; | 
|  |  | 
|  | typedef ::cppu::ImplHelper2 <   ::com::sun::star::lang::XServiceInfo | 
|  | ,   ::com::sun::star::sdbc::XStatement | 
|  | >   OStatement_IBase; | 
|  | class OStatement    :public OCommonStatement | 
|  | ,public OStatement_IBase | 
|  | { | 
|  | protected: | 
|  | virtual ~OStatement(){} | 
|  |  | 
|  | public: | 
|  | OStatement( OEvoabConnection* _pConnection) | 
|  | :OCommonStatement( _pConnection) | 
|  | { | 
|  | } | 
|  |  | 
|  | // XInterface | 
|  | virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); | 
|  | virtual void SAL_CALL acquire() throw(); | 
|  | virtual void SAL_CALL release() throw(); | 
|  |  | 
|  | // XTypeProvider | 
|  | DECLARE_XTYPEPROVIDER() | 
|  |  | 
|  | // XServiceInfo | 
|  | DECLARE_SERVICE_INFO(); | 
|  |  | 
|  | // XStatement | 
|  | virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL executeQuery( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ; | 
|  | virtual sal_Int32 SAL_CALL executeUpdate( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ; | 
|  | virtual sal_Bool SAL_CALL execute( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ; | 
|  | virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnection(  ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException) ; | 
|  | }; | 
|  | } | 
|  | } | 
|  | #endif // CONNECTIVITY_SSTATEMENT_HXX |