Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
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/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
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 .
18 : : */
19 : :
20 : : #include <connectivity/dbexception.hxx>
21 : : #include <comphelper/types.hxx>
22 : : #include <cppuhelper/exc_hlp.hxx>
23 : : #include <osl/diagnose.h>
24 : : #include <com/sun/star/sdb/SQLContext.hpp>
25 : : #include <com/sun/star/sdbc/SQLWarning.hpp>
26 : : #include <com/sun/star/sdb/SQLErrorEvent.hpp>
27 : : #include "TConnection.hxx"
28 : : #include "resource/common_res.hrc"
29 : : #include "resource/sharedresources.hxx"
30 : :
31 : : //.........................................................................
32 : : namespace dbtools
33 : : {
34 : : //.........................................................................
35 : :
36 : : using namespace ::com::sun::star::uno;
37 : : using namespace ::com::sun::star::sdb;
38 : : using namespace ::com::sun::star::sdbc;
39 : : using namespace ::comphelper;
40 : : using namespace ::connectivity;
41 : :
42 : : //==============================================================================
43 : : //= SQLExceptionInfo - encapsulating the type info of an SQLException-derived class
44 : : //==============================================================================
45 : : //------------------------------------------------------------------------------
46 : 8 : SQLExceptionInfo::SQLExceptionInfo()
47 : 8 : :m_eType(UNDEFINED)
48 : : {
49 : 8 : }
50 : :
51 : : //------------------------------------------------------------------------------
52 : 0 : SQLExceptionInfo::SQLExceptionInfo(const ::com::sun::star::sdbc::SQLException& _rError)
53 : : {
54 [ # # ]: 0 : m_aContent <<= _rError;
55 [ # # ]: 0 : implDetermineType();
56 : 0 : }
57 : :
58 : : //------------------------------------------------------------------------------
59 : 0 : SQLExceptionInfo::SQLExceptionInfo(const ::com::sun::star::sdbc::SQLWarning& _rError)
60 : : {
61 [ # # ]: 0 : m_aContent <<= _rError;
62 [ # # ]: 0 : implDetermineType();
63 : 0 : }
64 : :
65 : : //------------------------------------------------------------------------------
66 : 0 : SQLExceptionInfo::SQLExceptionInfo(const ::com::sun::star::sdb::SQLContext& _rError)
67 : : {
68 [ # # ]: 0 : m_aContent <<= _rError;
69 [ # # ]: 0 : implDetermineType();
70 : 0 : }
71 : :
72 : : //------------------------------------------------------------------------------
73 : 0 : SQLExceptionInfo::SQLExceptionInfo( const ::rtl::OUString& _rSimpleErrorMessage )
74 : : {
75 [ # # ]: 0 : SQLException aError;
76 : 0 : aError.Message = _rSimpleErrorMessage;
77 [ # # ]: 0 : m_aContent <<= aError;
78 [ # # ][ # # ]: 0 : implDetermineType();
79 : 0 : }
80 : :
81 : : //------------------------------------------------------------------------------
82 : 0 : SQLExceptionInfo::SQLExceptionInfo(const SQLExceptionInfo& _rCopySource)
83 : : :m_aContent(_rCopySource.m_aContent)
84 : 0 : ,m_eType(_rCopySource.m_eType)
85 : : {
86 : 0 : }
87 : :
88 : : //------------------------------------------------------------------------------
89 : 0 : const SQLExceptionInfo& SQLExceptionInfo::operator=(const ::com::sun::star::sdbc::SQLException& _rError)
90 : : {
91 : 0 : m_aContent <<= _rError;
92 : 0 : implDetermineType();
93 : 0 : return *this;
94 : : }
95 : :
96 : : //------------------------------------------------------------------------------
97 : 0 : const SQLExceptionInfo& SQLExceptionInfo::operator=(const ::com::sun::star::sdbc::SQLWarning& _rError)
98 : : {
99 : 0 : m_aContent <<= _rError;
100 : 0 : implDetermineType();
101 : 0 : return *this;
102 : : }
103 : :
104 : : //------------------------------------------------------------------------------
105 : 0 : const SQLExceptionInfo& SQLExceptionInfo::operator=(const ::com::sun::star::sdb::SQLContext& _rError)
106 : : {
107 : 0 : m_aContent <<= _rError;
108 : 0 : implDetermineType();
109 : 0 : return *this;
110 : : }
111 : :
112 : : //------------------------------------------------------------------------------
113 : 0 : const SQLExceptionInfo& SQLExceptionInfo::operator=(const ::com::sun::star::sdb::SQLErrorEvent& _rErrorEvent)
114 : : {
115 : 0 : m_aContent = _rErrorEvent.Reason;
116 : 0 : implDetermineType();
117 : 0 : return *this;
118 : : }
119 : :
120 : : //------------------------------------------------------------------------------
121 : 0 : const SQLExceptionInfo& SQLExceptionInfo::operator=(const ::com::sun::star::uno::Any& _rCaughtSQLException)
122 : : {
123 : 0 : m_aContent = _rCaughtSQLException;
124 : 0 : implDetermineType();
125 : 0 : return *this;
126 : : }
127 : :
128 : : //------------------------------------------------------------------------------
129 : 6 : SQLExceptionInfo::SQLExceptionInfo(const staruno::Any& _rError)
130 : : {
131 [ + - ]: 6 : const staruno::Type& aSQLExceptionType = ::getCppuType(static_cast< ::com::sun::star::sdbc::SQLException*>(0));
132 [ + - ]: 6 : sal_Bool bValid = isAssignableFrom(aSQLExceptionType, _rError.getValueType());
133 [ - + ]: 6 : if (bValid)
134 : 0 : m_aContent = _rError;
135 : : // no assertion here : if used with the NextException member of an SQLException bValid==sal_False is allowed.
136 : :
137 [ + - ]: 6 : implDetermineType();
138 : 6 : }
139 : :
140 : : //------------------------------------------------------------------------------
141 : 6 : void SQLExceptionInfo::implDetermineType()
142 : : {
143 : 6 : staruno::Type aContentType = m_aContent.getValueType();
144 : :
145 [ + - ]: 6 : const Type& aSQLExceptionType = ::getCppuType( static_cast< SQLException* >( 0 ) );
146 [ + - ]: 6 : const Type& aSQLWarningType = ::getCppuType( static_cast< SQLWarning* >( 0 ) );
147 [ + - ]: 6 : const Type& aSQLContextType = ::getCppuType( static_cast< SQLContext* >( 0 ) );
148 : :
149 [ + - ][ - + ]: 6 : if ( isAssignableFrom( aSQLContextType, m_aContent.getValueType() ) )
150 : 0 : m_eType = SQL_CONTEXT;
151 [ + - ][ - + ]: 6 : else if ( isAssignableFrom( aSQLWarningType, m_aContent.getValueType() ) )
152 : 0 : m_eType = SQL_WARNING;
153 [ + - ][ - + ]: 6 : else if ( isAssignableFrom( aSQLExceptionType, m_aContent.getValueType() ) )
154 : 0 : m_eType = SQL_EXCEPTION;
155 : : else
156 : : {
157 : 6 : m_eType = UNDEFINED;
158 : 6 : m_aContent.clear();
159 : 6 : }
160 : 6 : }
161 : :
162 : : //------------------------------------------------------------------------------
163 : 0 : sal_Bool SQLExceptionInfo::isKindOf(TYPE _eType) const
164 : : {
165 [ # # # # : 0 : switch (_eType)
# ]
166 : : {
167 : : case SQL_CONTEXT:
168 : 0 : return (m_eType == SQL_CONTEXT);
169 : : case SQL_WARNING:
170 [ # # ][ # # ]: 0 : return (m_eType == SQL_CONTEXT) || (m_eType == SQL_WARNING);
171 : : case SQL_EXCEPTION:
172 [ # # ][ # # ]: 0 : return (m_eType == SQL_CONTEXT) || (m_eType == SQL_WARNING) || (m_eType == SQL_EXCEPTION);
[ # # ]
173 : : case UNDEFINED:
174 : 0 : return (m_eType == UNDEFINED);
175 : : }
176 : 0 : return sal_False;
177 : : }
178 : :
179 : : //------------------------------------------------------------------------------
180 : 0 : SQLExceptionInfo::operator const ::com::sun::star::sdbc::SQLException*() const
181 : : {
182 : : OSL_ENSURE(isKindOf(SQL_EXCEPTION), "SQLExceptionInfo::operator SQLException* : invalid call !");
183 : 0 : return reinterpret_cast<const ::com::sun::star::sdbc::SQLException*>(m_aContent.getValue());
184 : : }
185 : :
186 : : //------------------------------------------------------------------------------
187 : 0 : SQLExceptionInfo::operator const ::com::sun::star::sdbc::SQLWarning*() const
188 : : {
189 : : OSL_ENSURE(isKindOf(SQL_WARNING), "SQLExceptionInfo::operator SQLException* : invalid call !");
190 : 0 : return reinterpret_cast<const ::com::sun::star::sdbc::SQLWarning*>(m_aContent.getValue());
191 : : }
192 : :
193 : : //------------------------------------------------------------------------------
194 : 0 : SQLExceptionInfo::operator const ::com::sun::star::sdb::SQLContext*() const
195 : : {
196 : : OSL_ENSURE(isKindOf(SQL_CONTEXT), "SQLExceptionInfo::operator SQLException* : invalid call !");
197 : 0 : return reinterpret_cast<const ::com::sun::star::sdb::SQLContext*>(m_aContent.getValue());
198 : : }
199 : :
200 : : //------------------------------------------------------------------------------
201 : 0 : void SQLExceptionInfo::prepend( const ::rtl::OUString& _rErrorMessage, const sal_Char* _pAsciiSQLState, const sal_Int32 _nErrorCode )
202 : : {
203 [ # # ]: 0 : SQLException aException;
204 : 0 : aException.Message = _rErrorMessage;
205 : 0 : aException.ErrorCode = _nErrorCode;
206 [ # # ][ # # ]: 0 : aException.SQLState = _pAsciiSQLState ? ::rtl::OUString::createFromAscii( _pAsciiSQLState ) : ::rtl::OUString("S1000" );
207 : 0 : aException.NextException = m_aContent;
208 [ # # ]: 0 : m_aContent <<= aException;
209 : :
210 [ # # ]: 0 : m_eType = SQL_EXCEPTION;
211 : 0 : }
212 : :
213 : : //------------------------------------------------------------------------------
214 : 0 : void SQLExceptionInfo::append( TYPE _eType, const ::rtl::OUString& _rErrorMessage, const sal_Char* _pAsciiSQLState, const sal_Int32 _nErrorCode )
215 : : {
216 : : // create the to-be-appended exception
217 : 0 : Any aAppend;
218 [ # # # # ]: 0 : switch ( _eType )
219 : : {
220 [ # # ][ # # ]: 0 : case SQL_EXCEPTION: aAppend <<= SQLException(); break;
[ # # ]
221 [ # # ][ # # ]: 0 : case SQL_WARNING: aAppend <<= SQLWarning(); break;
[ # # ]
222 [ # # ][ # # ]: 0 : case SQL_CONTEXT: aAppend <<= SQLContext(); break;
[ # # ]
223 : : default:
224 : : OSL_FAIL( "SQLExceptionInfo::append: invalid exception type: this will crash!" );
225 : 0 : break;
226 : : }
227 : :
228 : 0 : SQLException* pAppendException( static_cast< SQLException* >( const_cast< void* >( aAppend.getValue() ) ) );
229 : 0 : pAppendException->Message = _rErrorMessage;
230 : 0 : pAppendException->SQLState = ::rtl::OUString::createFromAscii( _pAsciiSQLState );
231 : 0 : pAppendException->ErrorCode = _nErrorCode;
232 : :
233 : : // find the end of the current chain
234 : 0 : Any* pChainIterator = &m_aContent;
235 : 0 : SQLException* pLastException = NULL;
236 : 0 : const Type& aSQLExceptionType( ::getCppuType< SQLException >() );
237 [ # # ]: 0 : while ( pChainIterator )
238 : : {
239 [ # # ]: 0 : if ( !pChainIterator->hasValue() )
240 : 0 : break;
241 : :
242 [ # # ][ # # ]: 0 : if ( !isAssignableFrom( aSQLExceptionType, pChainIterator->getValueType() ) )
243 : 0 : break;
244 : :
245 : 0 : pLastException = static_cast< SQLException* >( const_cast< void* >( pChainIterator->getValue() ) );
246 : 0 : pChainIterator = &pLastException->NextException;
247 : : }
248 : :
249 : : // append
250 [ # # ]: 0 : if ( pLastException )
251 : 0 : pLastException->NextException = aAppend;
252 : : else
253 : : {
254 : 0 : m_aContent = aAppend;
255 : 0 : m_eType = _eType;
256 : 0 : }
257 : 0 : }
258 : :
259 : : //------------------------------------------------------------------------------
260 : 0 : void SQLExceptionInfo::doThrow()
261 : : {
262 [ # # ]: 0 : if ( m_aContent.getValueTypeClass() == TypeClass_EXCEPTION )
263 : 0 : ::cppu::throwException( m_aContent );
264 [ # # ]: 0 : throw RuntimeException();
265 : : }
266 : :
267 : : //==============================================================================
268 : : //= SQLExceptionIteratorHelper
269 : : //==============================================================================
270 : :
271 : : //------------------------------------------------------------------------------
272 : 0 : SQLExceptionIteratorHelper::SQLExceptionIteratorHelper( const SQLExceptionInfo& _rChainStart )
273 : : :m_pCurrent( NULL )
274 : 0 : ,m_eCurrentType( SQLExceptionInfo::UNDEFINED )
275 : : {
276 [ # # ]: 0 : if ( _rChainStart.isValid() )
277 : : {
278 : 0 : m_pCurrent = (const SQLException*)_rChainStart;
279 : 0 : m_eCurrentType = _rChainStart.getType();
280 : : }
281 : 0 : }
282 : :
283 : : //------------------------------------------------------------------------------
284 : 0 : SQLExceptionIteratorHelper::SQLExceptionIteratorHelper( const ::com::sun::star::sdbc::SQLException& _rChainStart )
285 : : :m_pCurrent( &_rChainStart )
286 : 0 : ,m_eCurrentType( SQLExceptionInfo::SQL_EXCEPTION )
287 : : {
288 : 0 : }
289 : :
290 : : //------------------------------------------------------------------------------
291 : 0 : void SQLExceptionIteratorHelper::current( SQLExceptionInfo& _out_rInfo ) const
292 : : {
293 [ # # # # ]: 0 : switch ( m_eCurrentType )
294 : : {
295 : : case SQLExceptionInfo::SQL_EXCEPTION:
296 : 0 : _out_rInfo = *m_pCurrent;
297 : 0 : break;
298 : :
299 : : case SQLExceptionInfo::SQL_WARNING:
300 : 0 : _out_rInfo = *static_cast< const SQLWarning* >( m_pCurrent );
301 : 0 : break;
302 : :
303 : : case SQLExceptionInfo::SQL_CONTEXT:
304 : 0 : _out_rInfo = *static_cast< const SQLContext* >( m_pCurrent );
305 : 0 : break;
306 : :
307 : : default:
308 [ # # ]: 0 : _out_rInfo = Any();
309 : 0 : break;
310 : : }
311 : 0 : }
312 : :
313 : : //------------------------------------------------------------------------------
314 : 0 : const ::com::sun::star::sdbc::SQLException* SQLExceptionIteratorHelper::next()
315 : : {
316 : : OSL_ENSURE( hasMoreElements(), "SQLExceptionIteratorHelper::next : invalid call (please use hasMoreElements)!" );
317 : :
318 : 0 : const ::com::sun::star::sdbc::SQLException* pReturn = current();
319 [ # # ]: 0 : if ( !m_pCurrent )
320 : 0 : return pReturn;
321 : :
322 : : // check for the next element within the chain
323 : 0 : const Type aTypeException( ::cppu::UnoType< SQLException >::get() );
324 : :
325 : 0 : Type aNextElementType = m_pCurrent->NextException.getValueType();
326 [ # # ][ # # ]: 0 : if ( !isAssignableFrom( aTypeException, aNextElementType ) )
327 : : {
328 : : // no SQLException at all in the next chain element
329 : 0 : m_pCurrent = NULL;
330 : 0 : m_eCurrentType = SQLExceptionInfo::UNDEFINED;
331 : 0 : return pReturn;
332 : : }
333 : :
334 : 0 : m_pCurrent = static_cast< const SQLException* >( m_pCurrent->NextException.getValue() );
335 : :
336 : : // no finally determine the proper type of the exception
337 : 0 : const Type aTypeContext( ::cppu::UnoType< SQLContext >::get() );
338 [ # # ][ # # ]: 0 : if ( isAssignableFrom( aTypeContext, aNextElementType ) )
339 : : {
340 : 0 : m_eCurrentType = SQLExceptionInfo::SQL_CONTEXT;
341 : 0 : return pReturn;
342 : : }
343 : :
344 : 0 : const Type aTypeWarning( ::cppu::UnoType< SQLWarning >::get() );
345 [ # # ][ # # ]: 0 : if ( isAssignableFrom( aTypeWarning, aNextElementType ) )
346 : : {
347 : 0 : m_eCurrentType = SQLExceptionInfo::SQL_WARNING;
348 : 0 : return pReturn;
349 : : }
350 : :
351 : : // a simple SQLException
352 : 0 : m_eCurrentType = SQLExceptionInfo::SQL_EXCEPTION;
353 : 0 : return pReturn;
354 : : }
355 : :
356 : : //------------------------------------------------------------------------------
357 : 0 : void SQLExceptionIteratorHelper::next( SQLExceptionInfo& _out_rInfo )
358 : : {
359 : 0 : current( _out_rInfo );
360 : 0 : next();
361 : 0 : }
362 : :
363 : : //------------------------------------------------------------
364 : 2 : void throwFunctionSequenceException(const Reference< XInterface >& _Context, const Any& _Next) throw ( ::com::sun::star::sdbc::SQLException )
365 : : {
366 [ + - ]: 2 : ::connectivity::SharedResources aResources;
367 : : throw SQLException(
368 : : aResources.getResourceString(STR_ERRORMSG_SEQUENCE),
369 : : _Context,
370 : : getStandardSQLState( SQL_FUNCTION_SEQUENCE_ERROR ),
371 : : 0,
372 : : _Next
373 [ + - ][ + - ]: 2 : );
[ + - ]
374 : : }
375 : : // -----------------------------------------------------------------------------
376 : 0 : void throwInvalidIndexException(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _Context,
377 : : const ::com::sun::star::uno::Any& _Next) throw ( ::com::sun::star::sdbc::SQLException )
378 : : {
379 [ # # ]: 0 : ::connectivity::SharedResources aResources;
380 : : throw SQLException(
381 : : aResources.getResourceString(STR_INVALID_INDEX),
382 : : _Context,
383 : : getStandardSQLState( SQL_INVALID_DESCRIPTOR_INDEX ),
384 : : 0,
385 : : _Next
386 [ # # ][ # # ]: 0 : );
[ # # ]
387 : : }
388 : : // -----------------------------------------------------------------------------
389 : 0 : void throwFunctionNotSupportedException(const ::rtl::OUString& _rMsg,
390 : : const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _Context,
391 : : const ::com::sun::star::uno::Any& _Next) throw ( ::com::sun::star::sdbc::SQLException )
392 : : {
393 : : throw SQLException(
394 : : _rMsg,
395 : : _Context,
396 : : getStandardSQLState( SQL_FUNCTION_NOT_SUPPORTED ),
397 : : 0,
398 : : _Next
399 [ # # ][ # # ]: 0 : );
400 : : }
401 : : // -----------------------------------------------------------------------------
402 : 0 : void throwFunctionNotSupportedException( const sal_Char* _pAsciiFunctionName, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext,
403 : : const ::com::sun::star::uno::Any* _pNextException ) throw ( ::com::sun::star::sdbc::SQLException )
404 : : {
405 [ # # ]: 0 : ::connectivity::SharedResources aResources;
406 : : const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution(
407 : : STR_UNSUPPORTED_FUNCTION,
408 : : "$functionname$", ::rtl::OUString::createFromAscii( _pAsciiFunctionName )
409 [ # # ]: 0 : ) );
410 : : throwFunctionNotSupportedException(
411 : : sError,
412 : : _rxContext,
413 : : _pNextException ? *_pNextException : Any()
414 [ # # ][ # # ]: 0 : );
[ # # ]
415 : 0 : }
416 : : // -----------------------------------------------------------------------------
417 : 66 : void throwGenericSQLException(const ::rtl::OUString& _rMsg, const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxSource)
418 : : throw (::com::sun::star::sdbc::SQLException)
419 : : {
420 [ - + ]: 66 : throwGenericSQLException(_rMsg, _rxSource, Any());
421 : 0 : }
422 : :
423 : : // -----------------------------------------------------------------------------
424 : 66 : void throwGenericSQLException(const ::rtl::OUString& _rMsg, const Reference< XInterface >& _rxSource, const Any& _rNextException)
425 : : throw (SQLException)
426 : : {
427 [ + - ][ + - ]: 66 : throw SQLException( _rMsg, _rxSource, getStandardSQLState( SQL_GENERAL_ERROR ), 0, _rNextException);
428 : : }
429 : :
430 : : // -----------------------------------------------------------------------------
431 : 0 : void throwFeatureNotImplementedException( const sal_Char* _pAsciiFeatureName, const Reference< XInterface >& _rxContext, const Any* _pNextException )
432 : : throw (SQLException)
433 : : {
434 [ # # ]: 0 : ::connectivity::SharedResources aResources;
435 : : const ::rtl::OUString sError( aResources.getResourceStringWithSubstitution(
436 : : STR_UNSUPPORTED_FEATURE,
437 : : "$featurename$", ::rtl::OUString::createFromAscii( _pAsciiFeatureName )
438 [ # # ]: 0 : ) );
439 : :
440 : : throw SQLException(
441 : : sError,
442 : : _rxContext,
443 : : getStandardSQLState( SQL_FEATURE_NOT_IMPLEMENTED ),
444 : : 0,
445 : : _pNextException ? *_pNextException : Any()
446 [ # # ][ # # ]: 0 : );
[ # # ]
447 : : }
448 : :
449 : : // -----------------------------------------------------------------------------
450 : 0 : void throwSQLException( const sal_Char* _pAsciiMessage, const sal_Char* _pAsciiState,
451 : : const Reference< XInterface >& _rxContext, const sal_Int32 _nErrorCode, const Any* _pNextException ) throw (SQLException)
452 : : {
453 : : throw SQLException(
454 : : ::rtl::OUString::createFromAscii( _pAsciiMessage ),
455 : : _rxContext,
456 : : ::rtl::OUString::createFromAscii( _pAsciiState ),
457 : : _nErrorCode,
458 : : _pNextException ? *_pNextException : Any()
459 [ # # ][ # # ]: 0 : );
460 : : }
461 : :
462 : : // -----------------------------------------------------------------------------
463 : 0 : void throwSQLException( const sal_Char* _pAsciiMessage, StandardSQLState _eSQLState,
464 : : const Reference< XInterface >& _rxContext, const sal_Int32 _nErrorCode,
465 : : const Any* _pNextException ) throw (SQLException)
466 : : {
467 : 0 : throwSQLException( _pAsciiMessage, getStandardSQLStateAscii( _eSQLState ), _rxContext, _nErrorCode, _pNextException );
468 : 0 : }
469 : :
470 : : // -----------------------------------------------------------------------------
471 : 0 : void throwSQLException( const ::rtl::OUString& _rMessage, StandardSQLState _eSQLState,
472 : : const Reference< XInterface >& _rxContext, const sal_Int32 _nErrorCode,
473 : : const Any* _pNextException ) throw (SQLException)
474 : : {
475 : : throw SQLException(
476 : : _rMessage,
477 : : _rxContext,
478 : : getStandardSQLState( _eSQLState ),
479 : : _nErrorCode,
480 : : _pNextException ? *_pNextException : Any()
481 [ # # ][ # # ]: 0 : );
[ # # ]
482 : : }
483 : :
484 : : // -----------------------------------------------------------------------------
485 : 158 : const sal_Char* getStandardSQLStateAscii( StandardSQLState _eState )
486 : : {
487 : 158 : const sal_Char* pAsciiState = NULL;
488 [ - - - - : 158 : switch ( _eState )
- - - - -
- - - + -
- + - - -
- - - ]
489 : : {
490 : 0 : case SQL_WRONG_PARAMETER_NUMBER: pAsciiState = "07001"; break;
491 : 0 : case SQL_INVALID_DESCRIPTOR_INDEX: pAsciiState = "07009"; break;
492 : 0 : case SQL_UNABLE_TO_CONNECT: pAsciiState = "08001"; break;
493 : 0 : case SQL_NUMERIC_OUT_OF_RANGE: pAsciiState = "22003"; break;
494 : 0 : case SQL_INVALID_DATE_TIME: pAsciiState = "22007"; break;
495 : 0 : case SQL_INVALID_CURSOR_STATE: pAsciiState = "24000"; break;
496 : 0 : case SQL_TABLE_OR_VIEW_EXISTS: pAsciiState = "42S01"; break;
497 : 0 : case SQL_TABLE_OR_VIEW_NOT_FOUND: pAsciiState = "42S02"; break;
498 : 0 : case SQL_INDEX_ESISTS: pAsciiState = "42S11"; break;
499 : 0 : case SQL_INDEX_NOT_FOUND: pAsciiState = "42S12"; break;
500 : 0 : case SQL_COLUMN_EXISTS: pAsciiState = "42S21"; break;
501 : 0 : case SQL_COLUMN_NOT_FOUND: pAsciiState = "42S22"; break;
502 : 156 : case SQL_GENERAL_ERROR: pAsciiState = "HY000"; break;
503 : 0 : case SQL_INVALID_SQL_DATA_TYPE: pAsciiState = "HY004"; break;
504 : 0 : case SQL_OPERATION_CANCELED: pAsciiState = "HY008"; break;
505 : 2 : case SQL_FUNCTION_SEQUENCE_ERROR: pAsciiState = "HY010"; break;
506 : 0 : case SQL_INVALID_CURSOR_POSITION: pAsciiState = "HY109"; break;
507 : 0 : case SQL_INVALID_BOOKMARK_VALUE: pAsciiState = "HY111"; break;
508 : 0 : case SQL_FEATURE_NOT_IMPLEMENTED: pAsciiState = "HYC00"; break;
509 : 0 : case SQL_FUNCTION_NOT_SUPPORTED: pAsciiState = "IM001"; break;
510 : 0 : case SQL_CONNECTION_DOES_NOT_EXIST: pAsciiState = "08003"; break;
511 : :
512 : : default:
513 : 0 : break;
514 : : }
515 [ - + ]: 158 : if ( !pAsciiState )
516 [ # # ]: 0 : throw RuntimeException();
517 : 158 : return pAsciiState;
518 : : }
519 : :
520 : : // -----------------------------------------------------------------------------
521 : 158 : ::rtl::OUString getStandardSQLState( StandardSQLState _eState )
522 : : {
523 : 158 : return ::rtl::OUString::createFromAscii( getStandardSQLStateAscii( _eState ) );
524 : : }
525 : :
526 : : // -----------------------------------------------------------------------------
527 : : //.........................................................................
528 : : } // namespace dbtools
529 : : //.........................................................................
530 : :
531 : :
532 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|