]> granicus.if.org Git - postgresql/blob - src/interfaces/ecpg/lib/error.c
fc34377f94c45d3f8253e9a35770e9a23de25c14
[postgresql] / src / interfaces / ecpg / lib / error.c
1 /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/lib/Attic/error.c,v 1.18 2003/02/13 18:13:22 tgl Exp $ */
2
3 #include "postgres_fe.h"
4
5 #include <stdio.h>
6
7 #include "ecpgerrno.h"
8 #include "ecpgtype.h"
9 #include "ecpglib.h"
10 #include "extern.h"
11 #include "sqlca.h"
12
13 /* This should hold the back-end error message from 
14  * the last back-end operation. */
15 static char *ECPGerr;
16
17
18 void
19 ECPGraise(int line, int code, const char *str)
20 {
21         sqlca.sqlcode = code;
22
23         switch (code)
24         {
25                 case ECPG_NOT_FOUND:
26                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
27                                          "No data found in line %d.", line);
28                         break;
29
30                 case ECPG_OUT_OF_MEMORY:
31                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
32                                          "Out of memory in line %d.", line);
33                         break;
34
35                 case ECPG_UNSUPPORTED:
36                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
37                                          "Unsupported type %s in line %d.", str, line);
38                         break;
39
40                 case ECPG_TOO_MANY_ARGUMENTS:
41                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
42                                          "Too many arguments in line %d.", line);
43                         break;
44
45                 case ECPG_TOO_FEW_ARGUMENTS:
46                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
47                                          "Too few arguments in line %d.", line);
48                         break;
49
50                 case ECPG_INT_FORMAT:
51                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
52                          "Not correctly formatted int type: %s line %d.", str, line);
53                         break;
54
55                 case ECPG_UINT_FORMAT:
56                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
57                                          "Not correctly formatted unsigned type: %s in line %d.", str, line);
58                         break;
59
60                 case ECPG_FLOAT_FORMAT:
61                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
62                                          "Not correctly formatted floating-point type: %s in line %d.", str, line);
63                         break;
64
65                 case ECPG_CONVERT_BOOL:
66                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
67                                   "Unable to convert %s to bool on line %d.", str, line);
68                         break;
69
70                 case ECPG_EMPTY:
71                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
72                                          "Empty query in line %d.", line);
73                         break;
74
75                 case ECPG_MISSING_INDICATOR:
76                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
77                                          "NULL value without indicator in line %d.", line);
78                         break;
79
80                 case ECPG_NO_ARRAY:
81                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
82                                          "Variable is not an array in line %d.", line);
83                         break;
84
85                 case ECPG_DATA_NOT_ARRAY:
86                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
87                          "Data read from backend is not an array in line %d.", line);
88                         break;
89
90                 case ECPG_ARRAY_INSERT:
91                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
92                          "Trying to insert an array of variables in line %d.", line);
93                         break;
94
95                 case ECPG_NO_CONN:
96                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
97                                          "No such connection %s in line %d.", str, line);
98                         break;
99
100                 case ECPG_NOT_CONN:
101                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
102                                          "Not connected to '%s' in line %d.", str, line);
103                         break;
104
105                 case ECPG_INVALID_STMT:
106                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
107                                          "Invalid statement name %s in line %d.", str, line);
108                         break;
109
110                 case ECPG_UNKNOWN_DESCRIPTOR:
111                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
112                                          "Descriptor %s not found in line %d.", str, line);
113                         break;
114
115                 case ECPG_INVALID_DESCRIPTOR_INDEX:
116                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
117                                          "Descriptor index out of range in line %d.", line);
118                         break;
119
120                 case ECPG_UNKNOWN_DESCRIPTOR_ITEM:
121                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
122                                          "Unknown descriptor item %s in line %d.", str, line);
123                         break;
124
125                 case ECPG_VAR_NOT_NUMERIC:
126                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
127                                          "Variable is not a numeric type in line %d.", line);
128                         break;
129
130                 case ECPG_VAR_NOT_CHAR:
131                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
132                                    "Variable is not a character type in line %d.", line);
133                         break;
134
135                 case ECPG_PGSQL:
136                         {
137                                 int                     slen = strlen(str);
138
139                                 /* strip trailing newline */
140                                 if (slen > 0 && str[slen - 1] == '\n')
141                                         slen--;
142                                 snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
143                                                  "'%.*s' in line %d.", slen, str, line);
144                                 break;
145                         }
146
147                 case ECPG_TRANS:
148                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
149                                          "Error in transaction processing in line %d.", line);
150                         break;
151
152                 case ECPG_CONNECT:
153                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
154                           "Could not connect to database %s in line %d.", str, line);
155                         break;
156
157                 default:
158                         snprintf(sqlca.sqlerrm.sqlerrmc, sizeof(sqlca.sqlerrm.sqlerrmc),
159                                          "SQL error #%d in line %d.", code, line);
160                         break;
161         }
162
163         sqlca.sqlerrm.sqlerrml = strlen(sqlca.sqlerrm.sqlerrmc);
164         ECPGlog("raising sqlcode %d in line %d, '%s'.\n", code, line, sqlca.sqlerrm.sqlerrmc);
165
166         /* free all memory we have allocated for the user */
167         ECPGfree_auto_mem();
168 }
169
170 /* Set the error message string from the backend */
171 void
172 set_backend_err(const char *err, int lineno)
173 {
174         if (ECPGerr)
175                 ECPGfree(ECPGerr);
176
177         if (!err)
178         {
179                 ECPGerr = NULL;
180                 return;
181         }
182
183         ECPGerr = ECPGstrdup(err, lineno);
184 }
185
186 /* Retrieve the error message from the backend. */
187 char *
188 ECPGerrmsg(void)
189 {
190         return ECPGerr;
191 }
192         
193 /* print out an error message */
194 void
195 sqlprint(void)
196 {
197         sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml] = '\0';
198         fprintf(stderr, "sql error %s\n", sqlca.sqlerrm.sqlerrmc);
199 }