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