]>
git.saurik.com Git - wxWidgets.git/blob - src/iodbc/herr.c
1 /** Error stack management functions
3 Copyright (C) 1995 by Ke Jin <kejin@empress.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
16 #include <../iodbc/iodbc.h>
18 #include <../iodbc/isql.h>
19 #include <../iodbc/isqlext.h>
21 #include <../iodbc/dlproc.h>
23 #include <../iodbc/herr.h>
24 #include <../iodbc/henv.h>
25 #include <../iodbc/hdbc.h>
26 #include <../iodbc/hstmt.h>
28 #include <../iodbc/itrace.h>
30 #include "../iodbc/herr.ci"
32 static HERR
_iodbcdm_popsqlerr( HERR herr
)
34 sqlerr_t
* list
= (sqlerr_t
*)herr
;
37 if( herr
== SQL_NULL_HERR
)
49 void _iodbcdm_freesqlerrlist( HERR herrlist
)
53 for(list
= herrlist
; list
!= 0; )
55 list
= _iodbcdm_popsqlerr(list
);
59 HERR
_iodbcdm_pushsqlerr (
65 sqlerr_t
* perr
= (sqlerr_t
*)herr
;
68 if(herr
!= SQL_NULL_HERR
)
74 /* over wirte the top entry to prevent error stack blow out */
82 ebuf
= (sqlerr_t
*)MEM_ALLOC (sizeof(sqlerr_t
));
92 ebuf
->next
= (sqlerr_t
*)herr
;
97 static char FAR
* _iodbcdm_getsqlstate (
101 sqlerr_t
* perr
= (sqlerr_t
*)herr
;
104 if( herr
== SQL_NULL_HERR
|| tab
== NULL
)
106 return (char FAR
*)NULL
;
110 ptr
->code
!= en_sqlstat_total
;
113 if(ptr
->code
== perr
->code
)
115 return (char FAR
*)(ptr
->stat
);
119 return (char FAR
*)NULL
;
122 static char FAR
* _iodbcdm_getsqlerrmsg(
126 sqlerr_t
* perr
= (sqlerr_t
*)herr
;
129 if( herr
== SQL_NULL_HERR
)
134 if( perr
->msg
== NULL
&& errtab
== NULL
)
139 if( perr
->msg
!= NULL
)
144 for( ptr
= (sqlerrmsg_t
*)errtab
;
145 ptr
->code
!= en_sqlstat_total
;
148 if( ptr
->code
== perr
->code
)
150 return (char FAR
*)ptr
->msg
;
154 return (char FAR
*)NULL
;
157 RETCODE SQL_API
SQLError (
161 UCHAR FAR
* szSqlstate
,
162 SDWORD FAR
* pfNativeError
,
163 UCHAR FAR
* szErrorMsg
,
165 SWORD FAR
* pcbErrorMsg
)
167 GENV_t FAR
* genv
= (GENV_t FAR
*) henv
;
168 DBC_t FAR
* pdbc
= (DBC_t FAR
*) hdbc
;
169 STMT_t FAR
* pstmt
= (STMT_t FAR
*)hstmt
;
172 HENV dhenv
= SQL_NULL_HENV
;
173 HDBC dhdbc
= SQL_NULL_HDBC
;
174 HSTMT dhstmt
= SQL_NULL_HSTMT
;
176 HERR herr
= SQL_NULL_HERR
;
177 HPROC hproc
= SQL_NULL_HPROC
;
179 char FAR
* errmsg
= NULL
;
180 char FAR
* ststr
= NULL
;
183 RETCODE retcode
= SQL_SUCCESS
;
185 if( hstmt
!= SQL_NULL_HSTMT
) /* retrive stmt err */
190 if( thdbc
== SQL_NULL_HDBC
)
192 return SQL_INVALID_HANDLE
;
194 hproc
= _iodbcdm_getproc( thdbc
, en_Error
);
195 dhstmt
= pstmt
->dhstmt
;
198 else if( hdbc
!= SQL_NULL_HDBC
) /* retrive dbc err */
202 if( thdbc
== SQL_NULL_HDBC
)
204 return SQL_INVALID_HANDLE
;
206 hproc
= _iodbcdm_getproc( thdbc
, en_Error
);
210 if( herr
== SQL_NULL_HERR
211 && pdbc
->henv
== SQL_NULL_HENV
)
213 return SQL_NO_DATA_FOUND
;
216 else if( henv
!= SQL_NULL_HENV
) /* retrive env err */
220 /* Drivers shouldn't push error message
221 * on envoriment handle */
223 if( herr
== SQL_NULL_HERR
)
225 return SQL_NO_DATA_FOUND
;
232 return SQL_INVALID_HANDLE
;
235 if( szErrorMsg
!= NULL
)
237 if( cbErrorMsgMax
< 0
238 || cbErrorMsgMax
> SQL_MAX_MESSAGE_LENGTH
- 1 )
241 /* SQLError() doesn't post error for itself */
245 if( herr
== SQL_NULL_HERR
) /* no err on drv mng */
248 if( hproc
== SQL_NULL_HPROC
)
250 PUSHSQLERR ( herr
, en_IM001
);
255 CALL_DRIVER ( thdbc
, retcode
, hproc
, en_Error
, (
256 dhenv
, dhdbc
, dhstmt
,
257 szSqlstate
, pfNativeError
,
258 szErrorMsg
, cbErrorMsgMax
, pcbErrorMsg
) )
261 retcode
= hproc(dhenv
, dhdbc
, dhstmt
,
262 szSqlstate
, pfNativeError
,
263 szErrorMsg
, cbErrorMsgMax
, pcbErrorMsg
);
269 if( szSqlstate
!= NULL
)
273 /* get sql state string */
274 ststr
= (char FAR
*)_iodbcdm_getsqlstate( herr
,
275 (void FAR
*)sqlerrmsg_tab
);
283 len
= (int)STRLEN(ststr
);
286 STRNCPY ( szSqlstate
, ststr
, len
);
288 /* buffer size of szSqlstate is not checked. Applications
289 * suppose provide enough ( not less than 6 bytes ) buffer
294 if( pfNativeError
!= NULL
)
296 /* native error code is specific to data source */
297 *pfNativeError
= (SDWORD
)0L;
300 if( szErrorMsg
== NULL
|| cbErrorMsgMax
== 0 )
302 if( pcbErrorMsg
!= NULL
)
304 *pcbErrorMsg
= (SWORD
)0;
310 char msgbuf
[256] = { '\0' };
312 /* get sql state message */
313 errmsg
= _iodbcdm_getsqlerrmsg(herr
,
314 (void FAR
*)sqlerrmsg_tab
);
318 errmsg
= (char FAR
*)"";
321 sprintf(msgbuf
, "%s%s", sqlerrhd
, errmsg
);
323 len
= STRLEN( msgbuf
);
325 if( len
< cbErrorMsgMax
- 1 )
327 retcode
= SQL_SUCCESS
;
331 len
= cbErrorMsgMax
- 1;
332 retcode
= SQL_SUCCESS_WITH_INFO
;
333 /* and not posts error for itself */
336 STRNCPY((char*)szErrorMsg
, msgbuf
, len
);
339 if( pcbErrorMsg
!= NULL
)
341 *pcbErrorMsg
= (SWORD
)len
;
345 switch(handle
) /* free this err */
348 genv
->herr
= _iodbcdm_popsqlerr(genv
->herr
);
352 pdbc
->herr
= _iodbcdm_popsqlerr(pdbc
->herr
);
356 pstmt
->herr
= _iodbcdm_popsqlerr(pstmt
->herr
);