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