blob: b669071fcdb5e4fba3335606c03722141fb5acf9 [file] [log] [blame]
/**************************************************************
*
* 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 _DBHELPER_DBEXCEPTION_HXX_
#define _DBHELPER_DBEXCEPTION_HXX_
#include <com/sun/star/sdbc/SQLException.hpp>
#include "connectivity/standardsqlstate.hxx"
#include "connectivity/dbtoolsdllapi.hxx"
namespace com
{
namespace sun
{
namespace star
{
namespace sdb
{
class SQLContext;
struct SQLErrorEvent;
}
namespace sdbc
{
class SQLWarning;
}
}
}
}
//.........................................................................
namespace dbtools
{
//.........................................................................
//==============================================================================
//= Special exception if cancel is pressed in DBA UI
//==============================================================================
enum OOoBaseErrorCode
{
ParameterInteractionCancelled = 1
};
//==============================================================================
//= SQLExceptionInfo - encapsulating the type info of an SQLException-derived class
//==============================================================================
class OOO_DLLPUBLIC_DBTOOLS SQLExceptionInfo
{
public:
enum TYPE { SQL_EXCEPTION, SQL_WARNING, SQL_CONTEXT, UNDEFINED };
private:
::com::sun::star::uno::Any m_aContent;
TYPE m_eType; // redundant (could be derived from m_aContent.getValueType())
public:
SQLExceptionInfo();
SQLExceptionInfo(const ::com::sun::star::sdbc::SQLException& _rError);
SQLExceptionInfo(const ::com::sun::star::sdbc::SQLWarning& _rError);
SQLExceptionInfo(const ::com::sun::star::sdb::SQLContext& _rError);
/** convenience constructor
If your error processing relies on SQLExceptions, and SQLExceptionInfos, you still may
need to display an error which consists of a simple message string only.
In those cases, you can use this constructor, which behaves as if you would have used
an SQLException containing exactly the given error message.
*/
SQLExceptionInfo( const ::rtl::OUString& _rSimpleErrorMessage );
SQLExceptionInfo(const SQLExceptionInfo& _rCopySource);
SQLExceptionInfo(const ::com::sun::star::sdb::SQLErrorEvent& _rError);
// use for events got via XSQLErrorListener::errorOccured
SQLExceptionInfo(const ::com::sun::star::uno::Any& _rError);
// use with the Reason member of an SQLErrorEvent or with NextElement of an SQLException
/** prepends a plain error message to the chain of exceptions
@param _rSimpleErrorMessage
the error message to prepend
@param _pAsciiSQLState
the SQLState of the to-be-constructed SQLException, or NULL if this should be defaulted to HY000
@param _nErrorCode
the ErrorCode of the to-be-constructed SQLException
*/
void prepend( const ::rtl::OUString& _rErrorMessage, const sal_Char* _pAsciiSQLState = NULL, const sal_Int32 _nErrorCode = 0 );
/** appends a plain message to the chain of exceptions
@param _eType
the type of exception to append. Must be SQL_EXCEPTION, SQL_WARNING, SQL_CONTEXT, for all other
values, the behavior is undefined.
@param _rErrorMessage
the message to append
@param _pAsciiSQLState
the SQLState of the exception to append
@param _nErrorCode
the error code of the exception to append
*/
void append( TYPE _eType, const ::rtl::OUString& _rErrorMessage, const sal_Char* _pAsciiSQLState = NULL, const sal_Int32 _nErrorCode = 0 );
/** throws (properly typed) the exception contained in the object
@precond
isValid() returns <TRUE/>
@throws SQLException
@throws RuntimeException
if the instance does not contain an SQLException
*/
void doThrow();
const SQLExceptionInfo& operator=(const ::com::sun::star::sdbc::SQLException& _rError);
const SQLExceptionInfo& operator=(const ::com::sun::star::sdbc::SQLWarning& _rError);
const SQLExceptionInfo& operator=(const ::com::sun::star::sdb::SQLContext& _rError);
const SQLExceptionInfo& operator=(const ::com::sun::star::sdb::SQLErrorEvent& _rErrorEvent);
const SQLExceptionInfo& operator=(const ::com::sun::star::uno::Any& _rCaughtSQLException);
sal_Bool isKindOf(TYPE _eType) const;
// not just a simple comparisation ! e.g. getType() == SQL_CONTEXT implies isKindOf(SQL_EXCEPTION) == sal_True !
sal_Bool isValid() const { return m_eType != UNDEFINED; }
TYPE getType() const { return m_eType; }
operator const ::com::sun::star::sdbc::SQLException* () const;
operator const ::com::sun::star::sdbc::SQLWarning* () const;
operator const ::com::sun::star::sdb::SQLContext* () const;
const ::com::sun::star::uno::Any& get() const { return m_aContent; }
void clear()
{
m_aContent.clear();
m_eType = UNDEFINED;
}
protected:
void implDetermineType();
};
//==============================================================================
//= SQLExceptionIteratorHelper - iterating through an SQLException chain
//==============================================================================
class OOO_DLLPUBLIC_DBTOOLS SQLExceptionIteratorHelper
{
protected:
const ::com::sun::star::sdbc::SQLException* m_pCurrent;
SQLExceptionInfo::TYPE m_eCurrentType;
public:
/** constructs an iterator instance from an SQLException
@param _rChainStart
the start of the exception chain to iterate. Must live as long as the iterator
instances lives, at least.
*/
SQLExceptionIteratorHelper( const ::com::sun::star::sdbc::SQLException& _rChainStart );
/** constructs an iterator instance from an SQLWarning
@param _rChainStart
the start of the exception chain to iterate. Must live as long as the iterator
instances lives, at least.
*/
SQLExceptionIteratorHelper( const ::com::sun::star::sdbc::SQLWarning& _rChainStart );
/** constructs an iterator instance from an SQLContext
@param _rChainStart
the start of the exception chain to iterate. Must live as long as the iterator
instances lives, at least.
*/
SQLExceptionIteratorHelper( const ::com::sun::star::sdb::SQLContext& _rChainStart );
/** constructs an iterator instance from an SQLExceptionInfo
@param _rErrorInfo
the start of the exception chain to iterate. Must live as long as the iterator
instances lives, at least.
*/
SQLExceptionIteratorHelper( const SQLExceptionInfo& _rErrorInfo );
/** determines whether there are more elements in the exception chain
*/
sal_Bool hasMoreElements() const { return ( m_pCurrent != NULL ); }
/** returns the type of the current element in the exception chain
*/
SQLExceptionInfo::TYPE currentType() const { return m_eCurrentType; }
/** retrieves the current element in the chain, or <NULL/> if the chain has been completely
traveled.
*/
const ::com::sun::star::sdbc::SQLException* current() const { return m_pCurrent; }
/** retrieves the current element in the chain, or <NULL/> if the chain has been completely
traveled.
In opposite to the second <member>current</member>, this version allows typed access to
the respective SQLException.
*/
void current( SQLExceptionInfo& _out_rInfo ) const;
/** proceeds to the next element in the chain
@return the current element in the chain, as <b>before</em> the chain move.
*/
const ::com::sun::star::sdbc::SQLException* next();
/** proceeds to the next element in the chain
In opposite to the second <member>current</member>, this version allows typed access to
the respective SQLException.
*/
void next( SQLExceptionInfo& _out_rInfo );
};
//==================================================================================
//= StandardExceptions
//==================================================================================
//----------------------------------------------------------------------------------
/** returns a standard error string for a given SQLState
@param _eState
describes the state whose description is to retrieve. Must not be SQL_ERROR_UNSPECIFIED.
@raises RuntimeException
in case of an internal error
*/
OOO_DLLPUBLIC_DBTOOLS ::rtl::OUString getStandardSQLState( StandardSQLState _eState );
//----------------------------------------------------------------------------------
/** returns a standard ASCII string for a given SQLState
@param _eState
describes the state whose description is to retrieve. Must not be SQL_ERROR_UNSPECIFIED.
@return
a non-<NULL/> pointer to an ASCII character string denoting the requested SQLState
@raises RuntimeException
in case of an internal error
*/
OOO_DLLPUBLIC_DBTOOLS const sal_Char* getStandardSQLStateAscii( StandardSQLState _eState );
//----------------------------------------------------------------------------------
OOO_DLLPUBLIC_DBTOOLS void throwFunctionNotSupportedException(
const ::rtl::OUString& _rMsg,
const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _Context,
const ::com::sun::star::uno::Any& _Next = ::com::sun::star::uno::Any()
)
throw ( ::com::sun::star::sdbc::SQLException );
//----------------------------------------------------------------------------------
/** throws an exception with SQL state IM001, saying that a certain function is not supported
*/
OOO_DLLPUBLIC_DBTOOLS void throwFunctionNotSupportedException(
const sal_Char* _pAsciiFunctionName,
const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext,
const ::com::sun::star::uno::Any* _pNextException = NULL
)
throw ( ::com::sun::star::sdbc::SQLException );
//----------------------------------------------------------------------------------
/** throws a function sequence (HY010) exception
*/
OOO_DLLPUBLIC_DBTOOLS void throwFunctionSequenceException(
const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _Context,
const ::com::sun::star::uno::Any& _Next = ::com::sun::star::uno::Any()
)
throw ( ::com::sun::star::sdbc::SQLException );
//----------------------------------------------------------------------------------
/** throw a invalid index sqlexception
*/
OOO_DLLPUBLIC_DBTOOLS void throwInvalidIndexException(
const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _Context,
const ::com::sun::star::uno::Any& _Next = ::com::sun::star::uno::Any()
)
throw ( ::com::sun::star::sdbc::SQLException );
//----------------------------------------------------------------------------------
/** throw a generic SQLException, i.e. one with an SQLState of HY000, an ErrorCode of 0 and no NextException
*/
OOO_DLLPUBLIC_DBTOOLS void throwGenericSQLException(
const ::rtl::OUString& _rMsg,
const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxSource
)
throw (::com::sun::star::sdbc::SQLException);
//----------------------------------------------------------------------------------
/** throw a generic SQLException, i.e. one with an SQLState of HY000, an ErrorCode of 0 and no NextException
*/
OOO_DLLPUBLIC_DBTOOLS void throwGenericSQLException(
const ::rtl::OUString& _rMsg,
const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxSource,
const ::com::sun::star::uno::Any& _rNextException
)
throw (::com::sun::star::sdbc::SQLException);
//----------------------------------------------------------------------------------
/** throw a SQLException with SQLState HYC00 (Optional feature not implemented)
@param _pAsciiFeatureName
an ASCII description of the feature which is not implemented. It's recommended that the feature
name is built from the name of the interface plus its method, for instance "XParameters::updateBinaryStream"
@param _rxContext
the context of the exception
@param _pNextException
the next exception to chain into the thrown exception, if any
*/
OOO_DLLPUBLIC_DBTOOLS void throwFeatureNotImplementedException(
const sal_Char* _pAsciiFeatureName,
const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext,
const ::com::sun::star::uno::Any* _pNextException = NULL
)
throw (::com::sun::star::sdbc::SQLException);
//----------------------------------------------------------------------------------
/** throws an SQLException
*/
OOO_DLLPUBLIC_DBTOOLS void throwSQLException(
const sal_Char* _pAsciiMessage,
const sal_Char* _pAsciiState,
const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext,
const sal_Int32 _nErrorCode = 0,
const ::com::sun::star::uno::Any* _pNextException = NULL
)
throw (::com::sun::star::sdbc::SQLException);
//----------------------------------------------------------------------------------
/** throws an SQLException
*/
OOO_DLLPUBLIC_DBTOOLS void throwSQLException(
const sal_Char* _pAsciiMessage,
StandardSQLState _eSQLState,
const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext,
const sal_Int32 _nErrorCode = 0,
const ::com::sun::star::uno::Any* _pNextException = NULL
)
throw (::com::sun::star::sdbc::SQLException);
//----------------------------------------------------------------------------------
/** throws an SQLException
*/
OOO_DLLPUBLIC_DBTOOLS void throwSQLException(
const ::rtl::OUString& _rMessage,
StandardSQLState _eSQLState,
const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext,
const sal_Int32 _nErrorCode = 0,
const ::com::sun::star::uno::Any* _pNextException = NULL
)
throw (::com::sun::star::sdbc::SQLException);
//.........................................................................
} // namespace dbtools
//.........................................................................
#endif // _DBHELPER_DBEXCEPTION_HXX_