/**************************************************************
 * 
 * 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 MYSQLC_STATEMENT_HXX
#define MYSQLC_STATEMENT_HXX

#include "mysqlc_connection.hxx"
#include "mysqlc_subcomponent.hxx"

#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/sdbc/SQLWarning.hpp>
#include <com/sun/star/sdbc/XBatchExecution.hpp>
#include <com/sun/star/sdbc/XCloseable.hpp>
#include <com/sun/star/sdbc/XMultipleResults.hpp>
#include <com/sun/star/sdbc/XStatement.hpp>
#include <com/sun/star/sdbc/XWarningsSupplier.hpp>
#include <com/sun/star/util/XCancellable.hpp>

#include <preextstl.h>
#include <cppconn/statement.h>
#include <postextstl.h>
#include <cppuhelper/compbase5.hxx>
#include <list>

namespace connectivity
{
	namespace mysqlc
	{
		using ::com::sun::star::sdbc::SQLWarning;
		using ::com::sun::star::sdbc::SQLException;
		using ::com::sun::star::uno::Any;
		using ::com::sun::star::uno::RuntimeException;
		using ::rtl::OUString;

        typedef ::cppu::WeakComponentImplHelper5<	::com::sun::star::sdbc::XStatement,
                                                    ::com::sun::star::sdbc::XWarningsSupplier,
                                                    ::com::sun::star::util::XCancellable,
                                                    ::com::sun::star::sdbc::XCloseable,
                                                    ::com::sun::star::sdbc::XMultipleResults> OCommonStatement_IBase;

        class OCommonStatement;
        typedef OSubComponent< OCommonStatement, OCommonStatement_IBase >   OStatement_CBase;

		//**************************************************************
		//************ Class: OCommonStatement
		// is a base class for the normal statement and for the prepared statement
		//**************************************************************
        class OCommonStatement  :public OBase_Mutex
                                ,public OCommonStatement_IBase
                                ,public ::cppu::OPropertySetHelper
                                ,public OPropertyArrayUsageHelper<OCommonStatement>
                                ,public OStatement_CBase

		{
            friend class OSubComponent< OCommonStatement, OCommonStatement_IBase >;

        private:
			SQLWarning m_aLastWarning;

		protected:
			::std::list< OUString>	m_aBatchList;

			OConnection*			m_pConnection;	// The owning Connection object

			sql::Statement			*cppStatement;

		protected:
			void disposeResultSet();

			// OPropertyArrayUsageHelper
			::cppu::IPropertyArrayHelper* createArrayHelper( ) const;

			// OPropertySetHelper
			::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper();
			sal_Bool SAL_CALL convertFastPropertyValue(Any & rConvertedValue, Any & rOldValue,
															   sal_Int32 nHandle, const Any& rValue)
												throw (::com::sun::star::lang::IllegalArgumentException);

			void SAL_CALL setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, const Any& rValue)
												throw(::com::sun::star::uno::Exception);

			void SAL_CALL getFastPropertyValue(Any& rValue, sal_Int32 nHandle) const;
			virtual ~OCommonStatement();

        protected:
			OCommonStatement(OConnection* _pConnection, sql::Statement *_cppStatement);

		public:
			::cppu::OBroadcastHelper& rBHelper;
			using OCommonStatement_IBase::operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >;

			// OComponentHelper
			void SAL_CALL disposing(void);

			// XInterface
			void SAL_CALL release() 			throw();

			void SAL_CALL acquire() 			throw();

			// XInterface
			Any SAL_CALL queryInterface(const ::com::sun::star::uno::Type & rType)
												throw(RuntimeException);

			//XTypeProvider
			::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes()
												throw(RuntimeException);

			// XPropertySet
			::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo()
												throw(RuntimeException);

			// XStatement
			::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL executeQuery(const OUString& sql)
												throw(SQLException, RuntimeException);

			sal_Int32 SAL_CALL executeUpdate(const OUString& sql)
												throw(SQLException, RuntimeException);

			sal_Bool SAL_CALL execute( const OUString& sql )
												throw(SQLException, RuntimeException);

			::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL getConnection()
												throw(SQLException, RuntimeException);

			// XWarningsSupplier
			Any SAL_CALL getWarnings() 		throw(SQLException, RuntimeException);

			void SAL_CALL clearWarnings() 		throw(SQLException, RuntimeException);

			// XCancellable
			void SAL_CALL cancel() 				throw(RuntimeException);

			// XCloseable
			void SAL_CALL close() 				throw(SQLException, RuntimeException);

			// XMultipleResults
			::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getResultSet()
												throw(SQLException, RuntimeException);

			sal_Int32 SAL_CALL getUpdateCount() throw(SQLException, RuntimeException);

			sal_Bool SAL_CALL getMoreResults()	throw(SQLException, RuntimeException);

			// other methods
			OConnection* getOwnConnection() const { return m_pConnection;}

		private:
			using ::cppu::OPropertySetHelper::getFastPropertyValue;
		};


		class OStatement :	public OCommonStatement,
							public ::com::sun::star::sdbc::XBatchExecution,
							public ::com::sun::star::lang::XServiceInfo

		{
		protected:
			virtual ~OStatement(){}

		public:
			// ein Konstruktor, der fuer das Returnen des Objektes benoetigt wird:
			OStatement(OConnection* _pConnection, sql::Statement *_cppStatement) : OCommonStatement(_pConnection, _cppStatement) {}
			DECLARE_SERVICE_INFO();

			Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType )
												throw(RuntimeException);

			void SAL_CALL acquire() 			throw();
			void SAL_CALL release() 			throw();

			// XBatchExecution
			void SAL_CALL addBatch(const OUString& sql)
												throw(SQLException, RuntimeException);

			void SAL_CALL clearBatch()			throw(SQLException, RuntimeException);

			::com::sun::star::uno::Sequence< sal_Int32 > SAL_CALL executeBatch()
												throw(SQLException, RuntimeException);

		};
	}
}
#endif // MYSQLC_STATEMENT_HXX

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: noet sw=4 ts=4 fdm=marker
 * vim<600: noet sw=4 ts=4
 */
