1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_CONNECTIVITY_DBEXCEPTION_HXX
21 #define INCLUDED_CONNECTIVITY_DBEXCEPTION_HXX
23 #include <connectivity/standardsqlstate.hxx>
24 #include <connectivity/dbtoolsdllapi.hxx>
25 #include <com/sun/star/uno/Reference.hxx>
51 //= Special exception if cancel is pressed in DBA UI
55 ParameterInteractionCancelled
= 1
59 //= SQLExceptionInfo - encapsulating the type info of an SQLException-derived class
62 class OOO_DLLPUBLIC_DBTOOLS SQLExceptionInfo final
65 enum class TYPE
{ SQLException
, SQLWarning
, SQLContext
, Undefined
};
68 css::uno::Any m_aContent
;
69 TYPE m_eType
; // redundant (could be derived from m_aContent.getValueType())
73 SQLExceptionInfo(const css::sdbc::SQLException
& _rError
);
74 SQLExceptionInfo(const css::sdbc::SQLWarning
& _rError
);
75 SQLExceptionInfo(const css::sdb::SQLContext
& _rError
);
77 /** convenience constructor
79 If your error processing relies on SQLExceptions, and SQLExceptionInfos, you still may
80 need to display an error which consists of a simple message string only.
81 In those cases, you can use this constructor, which behaves as if you would have used
82 an SQLException containing exactly the given error message.
84 SQLExceptionInfo( const OUString
& _rSimpleErrorMessage
);
86 // use for events got via XSQLErrorListener::errorOccured
87 SQLExceptionInfo(const css::uno::Any
& _rError
);
88 // use with the Reason member of an SQLErrorEvent or with NextElement of an SQLException
90 /** prepends a plain error message to the chain of exceptions
91 @param _rSimpleErrorMessage
92 the error message to prepend
94 void prepend( const OUString
& _rErrorMessage
);
96 /** appends a plain message to the chain of exceptions
98 the type of exception to append. Must be SQL_EXCEPTION, SQL_WARNING, SQL_CONTEXT, for all other
99 values, the behavior is undefined.
100 @param _rErrorMessage
101 the message to append
103 the SQLState of the exception to append
105 the error code of the exception to append
107 void append( TYPE _eType
, const OUString
& _rErrorMessage
, const OUString
& _rSQLState
= OUString(), const sal_Int32 _nErrorCode
= 0 );
109 /** throws (properly typed) the exception contained in the object
111 isValid() returns <TRUE/>
113 @throws RuntimeException
114 if the instance does not contain an SQLException
118 SQLExceptionInfo
& operator=(const css::sdbc::SQLException
& _rError
);
119 SQLExceptionInfo
& operator=(const css::sdbc::SQLWarning
& _rError
);
120 SQLExceptionInfo
& operator=(const css::sdb::SQLContext
& _rError
);
121 SQLExceptionInfo
& operator=(const css::sdb::SQLErrorEvent
& _rErrorEvent
);
122 SQLExceptionInfo
& operator=(const css::uno::Any
& _rCaughtSQLException
);
124 bool isKindOf(TYPE _eType
) const;
125 // not just a simple comparison ! e.g. getType() == SQL_CONTEXT implies isKindOf(SQL_EXCEPTION) == sal_True !
126 bool isValid() const { return m_eType
!= TYPE::Undefined
; }
127 TYPE
getType() const { return m_eType
; }
129 operator const css::sdbc::SQLException
* () const;
130 operator const css::sdb::SQLContext
* () const;
132 const css::uno::Any
& get() const { return m_aContent
; }
137 m_eType
= TYPE::Undefined
;
141 void implDetermineType();
145 //= SQLExceptionIteratorHelper - iterating through an SQLException chain
148 class OOO_DLLPUBLIC_DBTOOLS SQLExceptionIteratorHelper final
150 const css::sdbc::SQLException
* m_pCurrent
;
151 SQLExceptionInfo::TYPE m_eCurrentType
;
154 /** constructs an iterator instance from an SQLException
157 the start of the exception chain to iterate. Must live as long as the iterator
158 instances lives, at least.
160 SQLExceptionIteratorHelper( const css::sdbc::SQLException
& _rChainStart
);
162 /** constructs an iterator instance from an SQLExceptionInfo
165 the start of the exception chain to iterate. Must live as long as the iterator
166 instances lives, at least.
168 SQLExceptionIteratorHelper( const SQLExceptionInfo
& _rErrorInfo
);
170 /** determines whether there are more elements in the exception chain
172 bool hasMoreElements() const { return ( m_pCurrent
!= nullptr ); }
174 /** retrieves the current element in the chain, or <NULL/> if the chain has been completely
177 In opposite to the second <member>current</member>, this version allows typed access to
178 the respective SQLException.
180 void current( SQLExceptionInfo
& _out_rInfo
) const;
182 /** proceeds to the next element in the chain
184 @return the current element in the chain, as <b>before</em> the chain move.
186 const css::sdbc::SQLException
* next();
188 /** proceeds to the next element in the chain
190 In opposite to the second <member>current</member>, this version allows typed access to
191 the respective SQLException.
193 void next( SQLExceptionInfo
& _out_rInfo
);
197 //= StandardExceptions
200 /** returns a standard error string for a given SQLState
203 describes the state whose description is to retrieve. Must not be SQL_ERROR_UNSPECIFIED.
204 @throws RuntimeException
205 in case of an internal error
207 OOO_DLLPUBLIC_DBTOOLS OUString
getStandardSQLState( StandardSQLState _eState
);
210 /** throws an exception with SQL state IM001, saying that a certain function is not supported
212 @throws css::sdbc::SQLException
214 OOO_DLLPUBLIC_DBTOOLS
void throwFunctionNotSupportedSQLException(
215 const OUString
& _rFunctionName
,
216 const css::uno::Reference
< css::uno::XInterface
>& _rxContext
219 /// @throws css::uno::RuntimeException
220 OOO_DLLPUBLIC_DBTOOLS
void throwFunctionNotSupportedRuntimeException(
221 const OUString
& _rFunctionName
,
222 const css::uno::Reference
< css::uno::XInterface
>& _rxContext
225 /** throws a function sequence (HY010) exception
227 @throws css::sdbc::SQLException
229 OOO_DLLPUBLIC_DBTOOLS
void throwFunctionSequenceException(
230 const css::uno::Reference
< css::uno::XInterface
>& Context
,
231 const css::uno::Any
& Next
= css::uno::Any()
235 /** throw an invalid index sqlexception
237 @throws css::sdbc::SQLException
239 OOO_DLLPUBLIC_DBTOOLS
void throwInvalidIndexException(
240 const css::uno::Reference
< css::uno::XInterface
>& Context
,
241 const css::uno::Any
& Next
= css::uno::Any()
245 /** throw a generic SQLException, i.e. one with an SQLState of HY000, an ErrorCode of 0 and no NextException
247 @throws css::sdbc::SQLException
249 OOO_DLLPUBLIC_DBTOOLS
void throwGenericSQLException(
250 const OUString
& _rMsg
,
251 const css::uno::Reference
< css::uno::XInterface
>& _rxSource
255 /** throw a generic SQLException, i.e. one with an SQLState of HY000, an ErrorCode of 0 and no NextException
257 @throws css::sdbc::SQLException
259 OOO_DLLPUBLIC_DBTOOLS
void throwGenericSQLException(
260 const OUString
& _rMsg
,
261 const css::uno::Reference
< css::uno::XInterface
>& _rxSource
,
262 const css::uno::Any
& _rNextException
266 /** throw a SQLException with SQLState HYC00 (Optional feature not implemented)
268 a description of the feature which is not implemented. It's recommended that the feature
269 name is built from the name of the interface plus its method, for instance "XParameters::updateBinaryStream"
271 the context of the exception
272 @throws css::sdbc::SQLException
274 OOO_DLLPUBLIC_DBTOOLS
void throwFeatureNotImplementedSQLException(
275 const OUString
& _rFeatureName
,
276 const css::uno::Reference
< css::uno::XInterface
>& _rxContext
,
277 const css::uno::Any
& _rNextException
= css::uno::Any()
280 /** throw a RuntimeException (Optional feature not implemented)
282 a description of the feature which is not implemented. It's recommended that the feature
283 name is built from the name of the interface plus its method, for instance "XParameters::updateBinaryStream"
285 the context of the exception
286 @throws css::uno::RuntimeException
288 OOO_DLLPUBLIC_DBTOOLS
void throwFeatureNotImplementedRuntimeException(
289 const OUString
& _rFeatureName
,
290 const css::uno::Reference
< css::uno::XInterface
>& _rxContext
293 /** throw a SQLException with SQLState 42S22 (Column Not Found)
294 @param _rColumnNameName
295 The column that couldn't be found.
297 the context of the exception
298 @throws css::sdbc::SQLException
300 OOO_DLLPUBLIC_DBTOOLS
void throwInvalidColumnException(
301 const OUString
& _rColumnName
,
302 const css::uno::Reference
< css::uno::XInterface
>& _rxContext
306 /** @throws css::sdbc::SQLException
308 OOO_DLLPUBLIC_DBTOOLS
void throwSQLException(
309 const OUString
& _rMessage
,
310 const OUString
& _rSQLState
,
311 const css::uno::Reference
< css::uno::XInterface
>& _rxContext
,
312 const sal_Int32 _nErrorCode
316 /** @throws css::sdbc::SQLException
318 OOO_DLLPUBLIC_DBTOOLS
void throwSQLException(
319 const OUString
& _rMessage
,
320 StandardSQLState _eSQLState
,
321 const css::uno::Reference
< css::uno::XInterface
>& _rxContext
,
322 const sal_Int32 _nErrorCode
= 0
326 } // namespace dbtools
329 #endif // INCLUDED_CONNECTIVITY_DBEXCEPTION_HXX
332 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */