89
91
strcpy(szSqlState, EN_is_odbc3(env) ? ver3str : ver2str);
92
#define DRVMNGRDIV 511
93
/* Returns the next SQL error information. */
95
PGAPI_StmtError( HSTMT hstmt,
97
UCHAR FAR * szSqlState,
98
SDWORD FAR * pfNativeError,
99
UCHAR FAR * szErrorMsg,
101
SWORD FAR * pcbErrorMsg,
94
PG_ErrorInfo *ER_Constructor(SDWORD errnumber, const char *msg)
99
if (DESC_OK == errnumber)
103
errsize = strlen(msg);
111
error = (PG_ErrorInfo *) malloc(sizeof(PG_ErrorInfo) + aladd);
114
memset(error, 0, sizeof(PG_ErrorInfo));
115
error->status = errnumber;
116
error->errorsize = errsize;
118
memcpy(error->__error_message, msg, errsize);
119
error->__error_message[aladd] = '\0';
125
ER_Destructor(PG_ErrorInfo *self)
127
if (self->__error_message)
128
free(self->__error_message);
132
#define DRVMNGRDIV 511
133
/* Returns the next SQL error information. */
135
ER_ReturnError(PG_ErrorInfo *error,
137
UCHAR FAR * szSqlState,
138
SDWORD FAR * pfNativeError,
139
UCHAR FAR * szErrorMsg,
141
SWORD FAR * pcbErrorMsg,
144
/* CC: return an error of a hstmt */
145
BOOL partial_ok = ((flag & PODBC_ALLOW_PARTIAL_EXTRACT) != 0),
146
clear_str = ((flag & PODBC_ERROR_CLEAR) != 0);
148
SWORD msglen, stapos, wrtlen, pcblen;
151
return SQL_NO_DATA_FOUND;
152
msg = error->__error_message;
153
mylog("ER_GetError: status = %d, msg = #%s#\n", error->status, msg);
154
msglen = (SWORD) strlen(msg);
156
* Even though an application specifies a larger error message
157
* buffer, the driver manager changes it silently.
158
* Therefore we divide the error message into ...
160
if (error->recsize < 0)
162
if (cbErrorMsgMax > 0)
163
error->recsize = cbErrorMsgMax - 1; /* apply the first request */
165
error->recsize = DRVMNGRDIV;
169
if (0 == error->errorpos)
172
RecNumber = 2 + (error->errorpos - 1) / error->recsize;
174
stapos = (RecNumber - 1) * error->recsize;
176
return SQL_NO_DATA_FOUND;
177
pcblen = wrtlen = msglen - stapos;
178
if (pcblen > error->recsize)
179
pcblen = error->recsize;
180
if (0 == cbErrorMsgMax)
182
else if (wrtlen >= cbErrorMsgMax)
185
wrtlen = cbErrorMsgMax - 1;
186
else if (cbErrorMsgMax <= error->recsize)
189
wrtlen = error->recsize;
193
if (NULL != pcbErrorMsg)
194
*pcbErrorMsg = pcblen;
196
if ((NULL != szErrorMsg) && (cbErrorMsgMax > 0))
198
memcpy(szErrorMsg, msg + stapos, wrtlen);
199
szErrorMsg[wrtlen] = '\0';
202
if (NULL != pfNativeError)
203
*pfNativeError = error->status;
205
if (NULL != szSqlState)
206
strncpy(szSqlState, error->sqlstate, 6);
208
mylog(" szSqlState = '%s',len=%d, szError='%s'\n", szSqlState, pcblen, szErrorMsg);
211
error->errorpos = stapos + wrtlen;
212
if (error->errorpos >= msglen)
213
ER_Destructor(error);
216
return SQL_SUCCESS_WITH_INFO;
221
#define DRVMNGRDIV 511
222
/* Returns the next SQL error information. */
224
PGAPI_StmtError( HSTMT hstmt,
227
SQLINTEGER *pfNativeError,
229
SQLSMALLINT cbErrorMsgMax,
230
SQLSMALLINT *pcbErrorMsg,
104
233
/* CC: return an error of a hstmt */
183
312
if (NULL != szSqlState)
187
/* now determine the SQLSTATE to be returned */
188
case STMT_ROW_VERSION_CHANGED:
189
pg_sqlstate_set(env, szSqlState, "01001", "01001");
193
pg_sqlstate_set(env, szSqlState, "01004", "01004");
197
pg_sqlstate_set(env, szSqlState, "00000", "0000");
198
/* just information that is returned, no error */
201
pg_sqlstate_set(env, szSqlState, "08S01", "08S01");
202
/* communication link failure */
204
case STMT_CREATE_TABLE_ERROR:
205
pg_sqlstate_set(env, szSqlState, "42S01", "S0001");
206
/* table already exists */
208
case STMT_STATUS_ERROR:
209
case STMT_SEQUENCE_ERROR:
210
pg_sqlstate_set(env, szSqlState, "HY010", "S1010");
211
/* Function sequence error */
213
case STMT_NO_MEMORY_ERROR:
214
pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
215
/* memory allocation failure */
217
case STMT_COLNUM_ERROR:
218
pg_sqlstate_set(env, szSqlState, "07009", "S1002");
219
/* invalid column number */
221
case STMT_NO_STMTSTRING:
222
pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
223
/* having no stmtstring is also a malloc problem */
225
case STMT_ERROR_TAKEN_FROM_BACKEND:
226
pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
229
case STMT_INTERNAL_ERROR:
230
pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
233
case STMT_FETCH_OUT_OF_RANGE:
234
pg_sqlstate_set(env, szSqlState, "HY106", "S1106");
237
case STMT_ROW_OUT_OF_RANGE:
238
pg_sqlstate_set(env, szSqlState, "HY107", "S1107");
241
case STMT_OPERATION_CANCELLED:
242
pg_sqlstate_set(env, szSqlState, "HY008", "S1008");
245
case STMT_NOT_IMPLEMENTED_ERROR:
246
pg_sqlstate_set(env, szSqlState, "HYC00", "S1C00"); /* == 'driver not
249
case STMT_OPTION_OUT_OF_RANGE_ERROR:
250
pg_sqlstate_set(env, szSqlState, "HY092", "S1092");
252
case STMT_BAD_PARAMETER_NUMBER_ERROR:
253
pg_sqlstate_set(env, szSqlState, "07009", "S1093");
255
case STMT_INVALID_COLUMN_NUMBER_ERROR:
256
pg_sqlstate_set(env, szSqlState, "07009", "S1002");
258
case STMT_RESTRICTED_DATA_TYPE_ERROR:
259
pg_sqlstate_set(env, szSqlState, "07006", "07006");
261
case STMT_INVALID_CURSOR_STATE_ERROR:
262
pg_sqlstate_set(env, szSqlState, "07005", "24000");
264
case STMT_ERROR_IN_ROW:
265
pg_sqlstate_set(env, szSqlState, "01S01", "01S01");
267
case STMT_OPTION_VALUE_CHANGED:
268
pg_sqlstate_set(env, szSqlState, "01S02", "01S02");
270
case STMT_POS_BEFORE_RECORDSET:
271
pg_sqlstate_set(env, szSqlState, "01S06", "01S06");
273
case STMT_INVALID_CURSOR_NAME:
274
pg_sqlstate_set(env, szSqlState, "34000", "34000");
276
case STMT_NO_CURSOR_NAME:
277
pg_sqlstate_set(env, szSqlState, "S1015", "S1015");
279
case STMT_INVALID_ARGUMENT_NO:
280
pg_sqlstate_set(env, szSqlState, "HY024", "S1009");
281
/* invalid argument value */
283
case STMT_INVALID_CURSOR_POSITION:
284
pg_sqlstate_set(env, szSqlState, "HY109", "S1109");
286
case STMT_RETURN_NULL_WITHOUT_INDICATOR:
287
pg_sqlstate_set(env, szSqlState, "22002", "22002");
289
case STMT_VALUE_OUT_OF_RANGE:
290
pg_sqlstate_set(env, szSqlState, "HY019", "22003");
292
case STMT_OPERATION_INVALID:
293
pg_sqlstate_set(env, szSqlState, "HY011", "S1011");
295
case STMT_INVALID_DESCRIPTOR_IDENTIFIER:
296
pg_sqlstate_set(env, szSqlState, "HY091", "HY091");
298
case STMT_INVALID_OPTION_IDENTIFIER:
299
pg_sqlstate_set(env, szSqlState, "HY092", "HY092");
301
case STMT_OPTION_NOT_FOR_THE_DRIVER:
302
pg_sqlstate_set(env, szSqlState, "HYC00", "HYC00");
304
case STMT_COUNT_FIELD_INCORRECT:
305
pg_sqlstate_set(env, szSqlState, "07002", "07002");
307
case STMT_EXEC_ERROR:
309
pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
310
/* also a general error */
314
if ((stmt->__sqlstate != NULL) && (stmt->__sqlstate[0] != '\0'))
315
pg_sqlstate_set(env, szSqlState, stmt->__sqlstate, stmt->__sqlstate);
319
/* now determine the SQLSTATE to be returned */
320
case STMT_ROW_VERSION_CHANGED:
321
pg_sqlstate_set(env, szSqlState, "01001", "01001");
325
pg_sqlstate_set(env, szSqlState, "01004", "01004");
329
pg_sqlstate_set(env, szSqlState, "00000", "0000");
330
/* just information that is returned, no error */
333
pg_sqlstate_set(env, szSqlState, "08S01", "08S01");
334
/* communication link failure */
336
case STMT_CREATE_TABLE_ERROR:
337
pg_sqlstate_set(env, szSqlState, "42S01", "S0001");
338
/* table already exists */
340
case STMT_STATUS_ERROR:
341
case STMT_SEQUENCE_ERROR:
342
pg_sqlstate_set(env, szSqlState, "HY010", "S1010");
343
/* Function sequence error */
345
case STMT_NO_MEMORY_ERROR:
346
pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
347
/* memory allocation failure */
349
case STMT_COLNUM_ERROR:
350
pg_sqlstate_set(env, szSqlState, "07009", "S1002");
351
/* invalid column number */
353
case STMT_NO_STMTSTRING:
354
pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
355
/* having no stmtstring is also a malloc problem */
357
case STMT_ERROR_TAKEN_FROM_BACKEND:
358
pg_sqlstate_set(env, szSqlState, SC_get_sqlstate(stmt), "S1000");
359
/* Use the ODBC 3 sqlstate reported by the backend. */
361
case STMT_INTERNAL_ERROR:
362
pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
365
case STMT_FETCH_OUT_OF_RANGE:
366
pg_sqlstate_set(env, szSqlState, "HY106", "S1106");
368
case STMT_ROW_OUT_OF_RANGE:
369
pg_sqlstate_set(env, szSqlState, "HY107", "S1107");
371
case STMT_OPERATION_CANCELLED:
372
pg_sqlstate_set(env, szSqlState, "HY008", "S1008");
374
case STMT_NOT_IMPLEMENTED_ERROR:
375
pg_sqlstate_set(env, szSqlState, "HYC00", "S1C00"); /* == 'driver not
378
case STMT_OPTION_OUT_OF_RANGE_ERROR:
379
pg_sqlstate_set(env, szSqlState, "HY092", "S1092");
381
case STMT_BAD_PARAMETER_NUMBER_ERROR:
382
pg_sqlstate_set(env, szSqlState, "07009", "S1093");
384
case STMT_INVALID_COLUMN_NUMBER_ERROR:
385
pg_sqlstate_set(env, szSqlState, "07009", "S1002");
387
case STMT_RESTRICTED_DATA_TYPE_ERROR:
388
pg_sqlstate_set(env, szSqlState, "07006", "07006");
390
case STMT_INVALID_CURSOR_STATE_ERROR:
391
pg_sqlstate_set(env, szSqlState, "07005", "24000");
393
case STMT_ERROR_IN_ROW:
394
pg_sqlstate_set(env, szSqlState, "01S01", "01S01");
396
case STMT_OPTION_VALUE_CHANGED:
397
pg_sqlstate_set(env, szSqlState, "01S02", "01S02");
399
case STMT_POS_BEFORE_RECORDSET:
400
pg_sqlstate_set(env, szSqlState, "01S06", "01S06");
402
case STMT_INVALID_CURSOR_NAME:
403
pg_sqlstate_set(env, szSqlState, "34000", "34000");
405
case STMT_NO_CURSOR_NAME:
406
pg_sqlstate_set(env, szSqlState, "S1015", "S1015");
408
case STMT_INVALID_ARGUMENT_NO:
409
pg_sqlstate_set(env, szSqlState, "HY024", "S1009");
410
/* invalid argument value */
412
case STMT_INVALID_CURSOR_POSITION:
413
pg_sqlstate_set(env, szSqlState, "HY109", "S1109");
415
case STMT_RETURN_NULL_WITHOUT_INDICATOR:
416
pg_sqlstate_set(env, szSqlState, "22002", "22002");
418
case STMT_VALUE_OUT_OF_RANGE:
419
pg_sqlstate_set(env, szSqlState, "HY019", "22003");
421
case STMT_OPERATION_INVALID:
422
pg_sqlstate_set(env, szSqlState, "HY011", "S1011");
424
case STMT_INVALID_DESCRIPTOR_IDENTIFIER:
425
pg_sqlstate_set(env, szSqlState, "HY091", "HY091");
427
case STMT_INVALID_OPTION_IDENTIFIER:
428
pg_sqlstate_set(env, szSqlState, "HY092", "HY092");
430
case STMT_OPTION_NOT_FOR_THE_DRIVER:
431
pg_sqlstate_set(env, szSqlState, "HYC00", "HYC00");
433
case STMT_COUNT_FIELD_INCORRECT:
434
pg_sqlstate_set(env, szSqlState, "07002", "07002");
436
case STMT_EXEC_ERROR:
438
pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
439
/* also a general error */
313
442
mylog(" szSqlState = '%s',len=%d, szError='%s'\n", szSqlState, pcblen, szErrorMsg);
374
503
*pfNativeError = status;
376
505
if (NULL != szSqlState)
379
case STMT_OPTION_VALUE_CHANGED:
380
case CONN_OPTION_VALUE_CHANGED:
381
pg_sqlstate_set(env, szSqlState, "01S02", "01S02");
385
pg_sqlstate_set(env, szSqlState, "01004", "01004");
388
case CONN_INIREAD_ERROR:
389
pg_sqlstate_set(env, szSqlState, "IM002", "IM002");
390
/* data source not found */
392
case CONNECTION_SERVER_NOT_REACHED:
393
case CONN_OPENDB_ERROR:
394
pg_sqlstate_set(env, szSqlState, "08001", "08001");
395
/* unable to connect to data source */
397
case CONN_INVALID_AUTHENTICATION:
398
case CONN_AUTH_TYPE_UNSUPPORTED:
399
pg_sqlstate_set(env, szSqlState, "28000", "28000");
401
case CONN_STMT_ALLOC_ERROR:
402
pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
403
/* memory allocation failure */
406
pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
409
case CONN_UNSUPPORTED_OPTION:
410
pg_sqlstate_set(env, szSqlState, "IM001", "IM001");
411
/* driver does not support this function */
412
case CONN_INVALID_ARGUMENT_NO:
413
pg_sqlstate_set(env, szSqlState, "HY009", "S1009");
414
/* invalid argument value */
416
case CONN_TRANSACT_IN_PROGRES:
417
pg_sqlstate_set(env, szSqlState, "HY010", "S1010");
420
* when the user tries to switch commit mode in a
423
/* -> function sequence error */
425
case CONN_NO_MEMORY_ERROR:
426
pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
428
case CONN_NOT_IMPLEMENTED_ERROR:
429
case STMT_NOT_IMPLEMENTED_ERROR:
430
pg_sqlstate_set(env, szSqlState, "HYC00", "S1C00");
432
case STMT_RETURN_NULL_WITHOUT_INDICATOR:
433
pg_sqlstate_set(env, szSqlState, "22002", "22002");
435
case CONN_VALUE_OUT_OF_RANGE:
436
case STMT_VALUE_OUT_OF_RANGE:
437
pg_sqlstate_set(env, szSqlState, "HY019", "22003");
439
case CONNECTION_COULD_NOT_SEND:
440
case CONNECTION_COULD_NOT_RECEIVE:
441
pg_sqlstate_set(env, szSqlState, "08S01", "08S01");
444
pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
506
if ((conn->__sqlstate != NULL) && (conn->__sqlstate[0] != '\0'))
507
pg_sqlstate_set(env, szSqlState, conn->__sqlstate, conn->__sqlstate);
511
case STMT_OPTION_VALUE_CHANGED:
512
case CONN_OPTION_VALUE_CHANGED:
513
pg_sqlstate_set(env, szSqlState, "01S02", "01S02");
517
pg_sqlstate_set(env, szSqlState, "01004", "01004");
520
case CONN_INIREAD_ERROR:
521
pg_sqlstate_set(env, szSqlState, "IM002", "IM002");
522
/* data source not found */
524
case CONNECTION_SERVER_NOT_REACHED:
525
case CONN_OPENDB_ERROR:
526
pg_sqlstate_set(env, szSqlState, "08001", "08001");
527
/* unable to connect to data source */
529
case CONN_INVALID_AUTHENTICATION:
530
case CONN_AUTH_TYPE_UNSUPPORTED:
531
pg_sqlstate_set(env, szSqlState, "28000", "28000");
533
case CONN_STMT_ALLOC_ERROR:
534
pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
535
/* memory allocation failure */
538
pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
541
case CONN_UNSUPPORTED_OPTION:
542
pg_sqlstate_set(env, szSqlState, "IM001", "IM001");
543
/* driver does not support this function */
544
case CONN_INVALID_ARGUMENT_NO:
545
pg_sqlstate_set(env, szSqlState, "HY009", "S1009");
546
/* invalid argument value */
548
case CONN_TRANSACT_IN_PROGRES:
549
pg_sqlstate_set(env, szSqlState, "HY010", "S1010");
551
* when the user tries to switch commit mode in a
554
/* -> function sequence error */
556
case CONN_NO_MEMORY_ERROR:
557
pg_sqlstate_set(env, szSqlState, "HY001", "S1001");
559
case CONN_NOT_IMPLEMENTED_ERROR:
560
case STMT_NOT_IMPLEMENTED_ERROR:
561
pg_sqlstate_set(env, szSqlState, "HYC00", "S1C00");
563
case STMT_RETURN_NULL_WITHOUT_INDICATOR:
564
pg_sqlstate_set(env, szSqlState, "22002", "22002");
566
case CONN_VALUE_OUT_OF_RANGE:
567
case STMT_VALUE_OUT_OF_RANGE:
568
pg_sqlstate_set(env, szSqlState, "HY019", "22003");
570
case CONNECTION_COULD_NOT_SEND:
571
case CONNECTION_COULD_NOT_RECEIVE:
572
pg_sqlstate_set(env, szSqlState, "08S01", "08S01");
575
pg_sqlstate_set(env, szSqlState, "HY000", "S1000");
449
580
mylog(" szSqlState = '%s',len=%d, szError='%s'\n", szSqlState, msglen, szErrorMsg);