Age Owner TLA Line data Source code
1 : /* src/interfaces/ecpg/ecpglib/error.c */
2 :
3 : #define POSTGRES_ECPG_INTERNAL
4 : #include "postgres_fe.h"
5 :
6 : #include "ecpgerrno.h"
7 : #include "ecpglib.h"
8 : #include "ecpglib_extern.h"
9 : #include "ecpgtype.h"
10 : #include "sqlca.h"
11 :
12 : void
5667 meskes 13 CBC 43 : ecpg_raise(int line, int code, const char *sqlstate, const char *str)
14 : {
7238 bruce 15 43 : struct sqlca_t *sqlca = ECPGget_sqlca();
16 :
2855 meskes 17 43 : if (sqlca == NULL)
18 : {
2855 meskes 19 UBC 0 : ecpg_log("out of memory");
20 0 : ECPGfree_auto_mem();
21 0 : return;
22 : }
23 :
7238 bruce 24 CBC 43 : sqlca->sqlcode = code;
7191 peter_e 25 43 : strncpy(sqlca->sqlstate, sqlstate, sizeof(sqlca->sqlstate));
26 :
7329 meskes 27 43 : switch (code)
28 : {
29 24 : case ECPG_NOT_FOUND:
7238 bruce 30 24 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
31 : /*------
32 : translator: this string will be truncated at 149 characters expanded. */
5441 peter_e 33 24 : ecpg_gettext("no data found on line %d"), line);
7329 meskes 34 24 : break;
35 :
7329 meskes 36 UBC 0 : case ECPG_OUT_OF_MEMORY:
7238 bruce 37 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
38 : /*------
39 : translator: this string will be truncated at 149 characters expanded. */
5441 peter_e 40 0 : ecpg_gettext("out of memory on line %d"), line);
7329 meskes 41 0 : break;
42 :
43 0 : case ECPG_UNSUPPORTED:
7238 bruce 44 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
45 : /*------
46 : translator: this string will be truncated at 149 characters expanded. */
2118 tgl 47 0 : ecpg_gettext("unsupported type \"%s\" on line %d"), str, line);
7329 meskes 48 0 : break;
49 :
50 0 : case ECPG_TOO_MANY_ARGUMENTS:
7238 bruce 51 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
52 : /*------
53 : translator: this string will be truncated at 149 characters expanded. */
5441 peter_e 54 0 : ecpg_gettext("too many arguments on line %d"), line);
7329 meskes 55 0 : break;
56 :
57 0 : case ECPG_TOO_FEW_ARGUMENTS:
7238 bruce 58 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
59 : /*------
60 : translator: this string will be truncated at 149 characters expanded. */
5441 peter_e 61 0 : ecpg_gettext("too few arguments on line %d"), line);
7329 meskes 62 0 : break;
63 :
64 0 : case ECPG_INT_FORMAT:
7238 bruce 65 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
66 : /*------
67 : translator: this string will be truncated at 149 characters expanded. */
5197 peter_e 68 0 : ecpg_gettext("invalid input syntax for type int: \"%s\", on line %d"), str, line);
7329 meskes 69 0 : break;
70 :
71 0 : case ECPG_UINT_FORMAT:
7238 bruce 72 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
73 : /*------
74 : translator: this string will be truncated at 149 characters expanded. */
5197 peter_e 75 0 : ecpg_gettext("invalid input syntax for type unsigned int: \"%s\", on line %d"), str, line);
7329 meskes 76 0 : break;
77 :
78 0 : case ECPG_FLOAT_FORMAT:
7238 bruce 79 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
80 : /*------
81 : translator: this string will be truncated at 149 characters expanded. */
5197 peter_e 82 0 : ecpg_gettext("invalid input syntax for floating-point type: \"%s\", on line %d"), str, line);
7329 meskes 83 0 : break;
84 :
85 0 : case ECPG_CONVERT_BOOL:
5197 peter_e 86 0 : if (str)
87 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
88 : /*------
89 : translator: this string will be truncated at 149 characters expanded. */
90 0 : ecpg_gettext("invalid syntax for type boolean: \"%s\", on line %d"), str, line);
91 : else
92 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
93 : /*------
94 : translator: this string will be truncated at 149 characters expanded. */
95 0 : ecpg_gettext("could not convert boolean value: size mismatch, on line %d"), line);
7329 meskes 96 0 : break;
97 :
98 0 : case ECPG_EMPTY:
7238 bruce 99 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
100 : /*------
101 : translator: this string will be truncated at 149 characters expanded. */
5441 peter_e 102 0 : ecpg_gettext("empty query on line %d"), line);
7329 meskes 103 0 : break;
104 :
7329 meskes 105 CBC 2 : case ECPG_MISSING_INDICATOR:
7238 bruce 106 2 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
107 : /*------
108 : translator: this string will be truncated at 149 characters expanded. */
2118 tgl 109 2 : ecpg_gettext("null value without indicator on line %d"), line);
7329 meskes 110 2 : break;
111 :
7329 meskes 112 UBC 0 : case ECPG_NO_ARRAY:
7238 bruce 113 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
114 : /*------
115 : translator: this string will be truncated at 149 characters expanded. */
5196 peter_e 116 0 : ecpg_gettext("variable does not have an array type on line %d"), line);
7329 meskes 117 0 : break;
118 :
119 0 : case ECPG_DATA_NOT_ARRAY:
7238 bruce 120 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
121 : /*------
122 : translator: this string will be truncated at 149 characters expanded. */
5197 peter_e 123 0 : ecpg_gettext("data read from server is not an array on line %d"), line);
7329 meskes 124 0 : break;
125 :
126 0 : case ECPG_ARRAY_INSERT:
7238 bruce 127 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
128 : /*------
129 : translator: this string will be truncated at 149 characters expanded. */
5050 130 0 : ecpg_gettext("inserting an array of variables is not supported on line %d"), line);
7329 meskes 131 0 : break;
132 :
7329 meskes 133 CBC 14 : case ECPG_NO_CONN:
7238 bruce 134 14 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
135 : /*------
136 : translator: this string will be truncated at 149 characters expanded. */
5050 137 14 : ecpg_gettext("connection \"%s\" does not exist on line %d"), str, line);
7329 meskes 138 14 : break;
139 :
7329 meskes 140 UBC 0 : case ECPG_NOT_CONN:
7238 bruce 141 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
142 : /*------
143 : translator: this string will be truncated at 149 characters expanded. */
5050 144 0 : ecpg_gettext("not connected to connection \"%s\" on line %d"), str, line);
7329 meskes 145 0 : break;
146 :
7329 meskes 147 CBC 1 : case ECPG_INVALID_STMT:
7238 bruce 148 1 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
149 : /*------
150 : translator: this string will be truncated at 149 characters expanded. */
5050 151 1 : ecpg_gettext("invalid statement name \"%s\" on line %d"), str, line);
7329 meskes 152 1 : break;
153 :
7329 meskes 154 UBC 0 : case ECPG_UNKNOWN_DESCRIPTOR:
7238 bruce 155 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
156 : /*------
157 : translator: this string will be truncated at 149 characters expanded. */
5050 158 0 : ecpg_gettext("descriptor \"%s\" not found on line %d"), str, line);
7329 meskes 159 0 : break;
160 :
161 0 : case ECPG_INVALID_DESCRIPTOR_INDEX:
7238 bruce 162 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
163 : /*------
164 : translator: this string will be truncated at 149 characters expanded. */
2118 tgl 165 0 : ecpg_gettext("descriptor index out of range on line %d"), line);
7329 meskes 166 0 : break;
167 :
168 0 : case ECPG_UNKNOWN_DESCRIPTOR_ITEM:
7238 bruce 169 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
170 : /*------
171 : translator: this string will be truncated at 149 characters expanded. */
5050 172 0 : ecpg_gettext("unrecognized descriptor item \"%s\" on line %d"), str, line);
7329 meskes 173 0 : break;
174 :
175 0 : case ECPG_VAR_NOT_NUMERIC:
7238 bruce 176 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
177 : /*------
178 : translator: this string will be truncated at 149 characters expanded. */
5050 179 0 : ecpg_gettext("variable does not have a numeric type on line %d"), line);
7329 meskes 180 0 : break;
181 :
182 0 : case ECPG_VAR_NOT_CHAR:
7238 bruce 183 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
184 : /*------
185 : translator: this string will be truncated at 149 characters expanded. */
5050 186 0 : ecpg_gettext("variable does not have a character type on line %d"), line);
7329 meskes 187 0 : break;
188 :
189 0 : case ECPG_TRANS:
7238 bruce 190 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
191 : /*------
192 : translator: this string will be truncated at 149 characters expanded. */
2118 tgl 193 0 : ecpg_gettext("error in transaction processing on line %d"), line);
7329 meskes 194 0 : break;
195 :
7329 meskes 196 CBC 2 : case ECPG_CONNECT:
7238 bruce 197 2 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
198 : /*------
199 : translator: this string will be truncated at 149 characters expanded. */
5050 200 2 : ecpg_gettext("could not connect to database \"%s\" on line %d"), str, line);
7329 meskes 201 2 : break;
202 :
7329 meskes 203 UBC 0 : default:
7238 bruce 204 0 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc),
205 : /*------
206 : translator: this string will be truncated at 149 characters expanded. */
5050 207 0 : ecpg_gettext("SQL error %d on line %d"), code, line);
7329 meskes 208 0 : break;
209 : }
210 :
7238 bruce 211 CBC 43 : sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);
5441 peter_e 212 43 : ecpg_log("raising sqlcode %d on line %d: %s\n", code, line, sqlca->sqlerrm.sqlerrmc);
213 :
214 : /* free all memory we have allocated for the user */
7329 meskes 215 43 : ECPGfree_auto_mem();
216 : }
217 :
218 : void
5667 219 9 : ecpg_raise_backend(int line, PGresult *result, PGconn *conn, int compat)
220 : {
7191 peter_e 221 9 : struct sqlca_t *sqlca = ECPGget_sqlca();
222 : char *sqlstate;
223 : char *message;
224 :
2855 meskes 225 9 : if (sqlca == NULL)
226 : {
2855 meskes 227 UBC 0 : ecpg_log("out of memory");
228 0 : ECPGfree_auto_mem();
229 0 : return;
230 : }
231 :
232 : /*
233 : * PQresultErrorField will return NULL if "result" is NULL, or if there is
234 : * no such field, which will happen for libpq-generated errors. Fall back
235 : * to PQerrorMessage in such cases.
236 : */
307 tgl 237 CBC 9 : sqlstate = PQresultErrorField(result, PG_DIAG_SQLSTATE);
238 9 : if (sqlstate == NULL)
7184 peter_e 239 UBC 0 : sqlstate = ECPG_SQLSTATE_ECPG_INTERNAL_ERROR;
307 tgl 240 CBC 9 : message = PQresultErrorField(result, PG_DIAG_MESSAGE_PRIMARY);
241 9 : if (message == NULL)
7184 peter_e 242 UBC 0 : message = PQerrorMessage(conn);
243 :
4780 meskes 244 CBC 9 : if (strcmp(sqlstate, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR) == 0)
245 : {
246 : /*
247 : * we might get here if the connection breaks down, so let's check for
248 : * this instead of giving just the generic internal error
249 : */
4783 meskes 250 UBC 0 : if (PQstatus(conn) == CONNECTION_BAD)
251 : {
252 0 : sqlstate = "57P02";
253 0 : message = ecpg_gettext("the connection to the server was lost");
254 : }
255 : }
256 :
257 : /* copy error message */
5441 peter_e 258 CBC 9 : snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc), "%s on line %d", message, line);
7191 259 9 : sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);
260 :
261 : /* copy SQLSTATE */
7184 262 9 : strncpy(sqlca->sqlstate, sqlstate, sizeof(sqlca->sqlstate));
263 :
264 : /* assign SQLCODE for backward compatibility */
7188 bruce 265 9 : if (strncmp(sqlca->sqlstate, "23505", sizeof(sqlca->sqlstate)) == 0)
7191 peter_e 266 1 : sqlca->sqlcode = INFORMIX_MODE(compat) ? ECPG_INFORMIX_DUPLICATE_KEY : ECPG_DUPLICATE_KEY;
6232 meskes 267 8 : else if (strncmp(sqlca->sqlstate, "21000", sizeof(sqlca->sqlstate)) == 0)
7191 peter_e 268 1 : sqlca->sqlcode = INFORMIX_MODE(compat) ? ECPG_INFORMIX_SUBSELECT_NOT_ONE : ECPG_SUBSELECT_NOT_ONE;
269 : else
270 7 : sqlca->sqlcode = ECPG_PGSQL;
271 :
4229 272 9 : ecpg_log("raising sqlstate %.*s (sqlcode %ld): %s\n",
4228 273 9 : (int) sizeof(sqlca->sqlstate), sqlca->sqlstate, sqlca->sqlcode, sqlca->sqlerrm.sqlerrmc);
274 :
275 : /* free all memory we have allocated for the user */
7191 276 9 : ECPGfree_auto_mem();
277 : }
278 :
279 : /* filter out all error codes */
280 : bool
5624 bruce 281 4578 : ecpg_check_PQresult(PGresult *results, int lineno, PGconn *connection, enum COMPAT_MODE compat)
282 : {
5717 meskes 283 4578 : if (results == NULL)
284 : {
4783 meskes 285 UBC 0 : ecpg_log("ecpg_check_PQresult on line %d: no result - %s", lineno, PQerrorMessage(connection));
5667 286 0 : ecpg_raise_backend(lineno, NULL, connection, compat);
2061 peter_e 287 0 : return false;
288 : }
289 :
5717 meskes 290 CBC 4578 : switch (PQresultStatus(results))
291 : {
292 :
293 1033 : case PGRES_TUPLES_OK:
2061 peter_e 294 1033 : return true;
295 : break;
5717 meskes 296 UBC 0 : case PGRES_EMPTY_QUERY:
297 : /* do nothing */
5667 298 0 : ecpg_raise(lineno, ECPG_EMPTY, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, NULL);
5717 299 0 : PQclear(results);
2061 peter_e 300 0 : return false;
301 : break;
5717 meskes 302 CBC 3535 : case PGRES_COMMAND_OK:
2061 peter_e 303 3535 : return true;
304 : break;
5717 meskes 305 9 : case PGRES_NONFATAL_ERROR:
306 : case PGRES_FATAL_ERROR:
307 : case PGRES_BAD_RESPONSE:
4783 308 9 : ecpg_log("ecpg_check_PQresult on line %d: bad response - %s", lineno, PQresultErrorMessage(results));
5667 309 9 : ecpg_raise_backend(lineno, results, connection, compat);
5717 310 9 : PQclear(results);
2061 peter_e 311 9 : return false;
312 : break;
5717 meskes 313 1 : case PGRES_COPY_OUT:
2061 peter_e 314 1 : return true;
315 : break;
5717 meskes 316 UBC 0 : case PGRES_COPY_IN:
5441 peter_e 317 0 : ecpg_log("ecpg_check_PQresult on line %d: COPY IN data transfer in progress\n", lineno);
5717 meskes 318 0 : PQendcopy(connection);
319 0 : PQclear(results);
2061 peter_e 320 0 : return false;
321 : break;
5717 meskes 322 0 : default:
5441 peter_e 323 0 : ecpg_log("ecpg_check_PQresult on line %d: unknown execution status type\n",
324 : lineno);
5667 meskes 325 0 : ecpg_raise_backend(lineno, results, connection, compat);
5717 326 0 : PQclear(results);
2061 peter_e 327 0 : return false;
328 : break;
329 : }
330 : }
331 :
332 : /* print out an error message */
333 : void
7329 meskes 334 CBC 6 : sqlprint(void)
335 : {
7238 bruce 336 6 : struct sqlca_t *sqlca = ECPGget_sqlca();
337 :
2855 meskes 338 6 : if (sqlca == NULL)
339 : {
2855 meskes 340 UBC 0 : ecpg_log("out of memory");
341 0 : return;
342 : }
343 :
7238 bruce 344 CBC 6 : sqlca->sqlerrm.sqlerrmc[sqlca->sqlerrm.sqlerrml] = '\0';
5197 peter_e 345 6 : fprintf(stderr, ecpg_gettext("SQL error: %s\n"), sqlca->sqlerrm.sqlerrmc);
346 : }
|