1 | /* |
2 | +----------------------------------------------------------------------+ |
3 | | PHP Version 5 | |
4 | +----------------------------------------------------------------------+ |
5 | | Copyright (c) 1997-2015 The PHP Group | |
6 | +----------------------------------------------------------------------+ |
7 | | This source file is subject to version 3.01 of the PHP license, | |
8 | | that is bundled with this package in the file LICENSE, and is | |
9 | | available through the world-wide-web at the following url: | |
10 | | http://www.php.net/license/3_01.txt | |
11 | | If you did not receive a copy of the PHP license and are unable to | |
12 | | obtain it through the world-wide-web, please send a note to | |
13 | | license@php.net so we can mail you a copy immediately. | |
14 | +----------------------------------------------------------------------+ |
15 | | Author: Wez Furlong <wez@php.net> | |
16 | +----------------------------------------------------------------------+ |
17 | */ |
18 | |
19 | /* $Id$ */ |
20 | |
21 | #ifdef HAVE_CONFIG_H |
22 | #include "config.h" |
23 | #endif |
24 | |
25 | #include "php.h" |
26 | #include "php_ini.h" |
27 | #include "ext/standard/info.h" |
28 | #include "php_pdo.h" |
29 | #include "php_pdo_driver.h" |
30 | |
31 | struct pdo_sqlstate_info { |
32 | const char state[5]; |
33 | const char *desc; |
34 | }; |
35 | |
36 | static HashTable err_hash; |
37 | |
38 | static const struct pdo_sqlstate_info err_initializer[] = { |
39 | { "00000" , "No error" }, |
40 | { "01000" , "Warning" }, |
41 | { "01001" , "Cursor operation conflict" }, |
42 | { "01002" , "Disconnect error" }, |
43 | { "01003" , "NULL value eliminated in set function" }, |
44 | { "01004" , "String data, right truncated" }, |
45 | { "01006" , "Privilege not revoked" }, |
46 | { "01007" , "Privilege not granted" }, |
47 | { "01008" , "Implicit zero bit padding" }, |
48 | { "0100C" , "Dynamic result sets returned" }, |
49 | { "01P01" , "Deprecated feature" }, |
50 | { "01S00" , "Invalid connection string attribute" }, |
51 | { "01S01" , "Error in row" }, |
52 | { "01S02" , "Option value changed" }, |
53 | { "01S06" , "Attempt to fetch before the result set returned the first rowset" }, |
54 | { "01S07" , "Fractional truncation" }, |
55 | { "01S08" , "Error saving File DSN" }, |
56 | { "01S09" , "Invalid keyword" }, |
57 | { "02000" , "No data" }, |
58 | { "02001" , "No additional dynamic result sets returned" }, |
59 | { "03000" , "Sql statement not yet complete" }, |
60 | { "07002" , "COUNT field incorrect" }, |
61 | { "07005" , "Prepared statement not a cursor-specification" }, |
62 | { "07006" , "Restricted data type attribute violation" }, |
63 | { "07009" , "Invalid descriptor index" }, |
64 | { "07S01" , "Invalid use of default parameter" }, |
65 | { "08000" , "Connection exception" }, |
66 | { "08001" , "Client unable to establish connection" }, |
67 | { "08002" , "Connection name in use" }, |
68 | { "08003" , "Connection does not exist" }, |
69 | { "08004" , "Server rejected the connection" }, |
70 | { "08006" , "Connection failure" }, |
71 | { "08007" , "Connection failure during transaction" }, |
72 | { "08S01" , "Communication link failure" }, |
73 | { "09000" , "Triggered action exception" }, |
74 | { "0A000" , "Feature not supported" }, |
75 | { "0B000" , "Invalid transaction initiation" }, |
76 | { "0F000" , "Locator exception" }, |
77 | { "0F001" , "Invalid locator specification" }, |
78 | { "0L000" , "Invalid grantor" }, |
79 | { "0LP01" , "Invalid grant operation" }, |
80 | { "0P000" , "Invalid role specification" }, |
81 | { "21000" , "Cardinality violation" }, |
82 | { "21S01" , "Insert value list does not match column list" }, |
83 | { "21S02" , "Degree of derived table does not match column list" }, |
84 | { "22000" , "Data exception" }, |
85 | { "22001" , "String data, right truncated" }, |
86 | { "22002" , "Indicator variable required but not supplied" }, |
87 | { "22003" , "Numeric value out of range" }, |
88 | { "22004" , "Null value not allowed" }, |
89 | { "22005" , "Error in assignment" }, |
90 | { "22007" , "Invalid datetime format" }, |
91 | { "22008" , "Datetime field overflow" }, |
92 | { "22009" , "Invalid time zone displacement value" }, |
93 | { "2200B" , "Escape character conflict" }, |
94 | { "2200C" , "Invalid use of escape character" }, |
95 | { "2200D" , "Invalid escape octet" }, |
96 | { "2200F" , "Zero length character string" }, |
97 | { "2200G" , "Most specific type mismatch" }, |
98 | { "22010" , "Invalid indicator parameter value" }, |
99 | { "22011" , "Substring error" }, |
100 | { "22012" , "Division by zero" }, |
101 | { "22015" , "Interval field overflow" }, |
102 | { "22018" , "Invalid character value for cast specification" }, |
103 | { "22019" , "Invalid escape character" }, |
104 | { "2201B" , "Invalid regular expression" }, |
105 | { "2201E" , "Invalid argument for logarithm" }, |
106 | { "2201F" , "Invalid argument for power function" }, |
107 | { "2201G" , "Invalid argument for width bucket function" }, |
108 | { "22020" , "Invalid limit value" }, |
109 | { "22021" , "Character not in repertoire" }, |
110 | { "22022" , "Indicator overflow" }, |
111 | { "22023" , "Invalid parameter value" }, |
112 | { "22024" , "Unterminated c string" }, |
113 | { "22025" , "Invalid escape sequence" }, |
114 | { "22026" , "String data, length mismatch" }, |
115 | { "22027" , "Trim error" }, |
116 | { "2202E" , "Array subscript error" }, |
117 | { "22P01" , "Floating point exception" }, |
118 | { "22P02" , "Invalid text representation" }, |
119 | { "22P03" , "Invalid binary representation" }, |
120 | { "22P04" , "Bad copy file format" }, |
121 | { "22P05" , "Untranslatable character" }, |
122 | { "23000" , "Integrity constraint violation" }, |
123 | { "23001" , "Restrict violation" }, |
124 | { "23502" , "Not null violation" }, |
125 | { "23503" , "Foreign key violation" }, |
126 | { "23505" , "Unique violation" }, |
127 | { "23514" , "Check violation" }, |
128 | { "24000" , "Invalid cursor state" }, |
129 | { "25000" , "Invalid transaction state" }, |
130 | { "25001" , "Active sql transaction" }, |
131 | { "25002" , "Branch transaction already active" }, |
132 | { "25003" , "Inappropriate access mode for branch transaction" }, |
133 | { "25004" , "Inappropriate isolation level for branch transaction" }, |
134 | { "25005" , "No active sql transaction for branch transaction" }, |
135 | { "25006" , "Read only sql transaction" }, |
136 | { "25007" , "Schema and data statement mixing not supported" }, |
137 | { "25008" , "Held cursor requires same isolation level" }, |
138 | { "25P01" , "No active sql transaction" }, |
139 | { "25P02" , "In failed sql transaction" }, |
140 | { "25S01" , "Transaction state" }, |
141 | { "25S02" , "Transaction is still active" }, |
142 | { "25S03" , "Transaction is rolled back" }, |
143 | { "26000" , "Invalid sql statement name" }, |
144 | { "27000" , "Triggered data change violation" }, |
145 | { "28000" , "Invalid authorization specification" }, |
146 | { "2B000" , "Dependent privilege descriptors still exist" }, |
147 | { "2BP01" , "Dependent objects still exist" }, |
148 | { "2D000" , "Invalid transaction termination" }, |
149 | { "2F000" , "Sql routine exception" }, |
150 | { "2F002" , "Modifying sql data not permitted" }, |
151 | { "2F003" , "Prohibited sql statement attempted" }, |
152 | { "2F004" , "Reading sql data not permitted" }, |
153 | { "2F005" , "Function executed no return statement" }, |
154 | { "34000" , "Invalid cursor name" }, |
155 | { "38000" , "External routine exception" }, |
156 | { "38001" , "Containing sql not permitted" }, |
157 | { "38002" , "Modifying sql data not permitted" }, |
158 | { "38003" , "Prohibited sql statement attempted" }, |
159 | { "38004" , "Reading sql data not permitted" }, |
160 | { "39000" , "External routine invocation exception" }, |
161 | { "39001" , "Invalid sqlstate returned" }, |
162 | { "39004" , "Null value not allowed" }, |
163 | { "39P01" , "Trigger protocol violated" }, |
164 | { "39P02" , "Srf protocol violated" }, |
165 | { "3B000" , "Savepoint exception" }, |
166 | { "3B001" , "Invalid savepoint specification" }, |
167 | { "3C000" , "Duplicate cursor name" }, |
168 | { "3D000" , "Invalid catalog name" }, |
169 | { "3F000" , "Invalid schema name" }, |
170 | { "40000" , "Transaction rollback" }, |
171 | { "40001" , "Serialization failure" }, |
172 | { "40002" , "Transaction integrity constraint violation" }, |
173 | { "40003" , "Statement completion unknown" }, |
174 | { "40P01" , "Deadlock detected" }, |
175 | { "42000" , "Syntax error or access violation" }, |
176 | { "42501" , "Insufficient privilege" }, |
177 | { "42601" , "Syntax error" }, |
178 | { "42602" , "Invalid name" }, |
179 | { "42611" , "Invalid column definition" }, |
180 | { "42622" , "Name too long" }, |
181 | { "42701" , "Duplicate column" }, |
182 | { "42702" , "Ambiguous column" }, |
183 | { "42703" , "Undefined column" }, |
184 | { "42704" , "Undefined object" }, |
185 | { "42710" , "Duplicate object" }, |
186 | { "42712" , "Duplicate alias" }, |
187 | { "42723" , "Duplicate function" }, |
188 | { "42725" , "Ambiguous function" }, |
189 | { "42803" , "Grouping error" }, |
190 | { "42804" , "Datatype mismatch" }, |
191 | { "42809" , "Wrong object type" }, |
192 | { "42830" , "Invalid foreign key" }, |
193 | { "42846" , "Cannot coerce" }, |
194 | { "42883" , "Undefined function" }, |
195 | { "42939" , "Reserved name" }, |
196 | { "42P01" , "Undefined table" }, |
197 | { "42P02" , "Undefined parameter" }, |
198 | { "42P03" , "Duplicate cursor" }, |
199 | { "42P04" , "Duplicate database" }, |
200 | { "42P05" , "Duplicate prepared statement" }, |
201 | { "42P06" , "Duplicate schema" }, |
202 | { "42P07" , "Duplicate table" }, |
203 | { "42P08" , "Ambiguous parameter" }, |
204 | { "42P09" , "Ambiguous alias" }, |
205 | { "42P10" , "Invalid column reference" }, |
206 | { "42P11" , "Invalid cursor definition" }, |
207 | { "42P12" , "Invalid database definition" }, |
208 | { "42P13" , "Invalid function definition" }, |
209 | { "42P14" , "Invalid prepared statement definition" }, |
210 | { "42P15" , "Invalid schema definition" }, |
211 | { "42P16" , "Invalid table definition" }, |
212 | { "42P17" , "Invalid object definition" }, |
213 | { "42P18" , "Indeterminate datatype" }, |
214 | { "42S01" , "Base table or view already exists" }, |
215 | { "42S02" , "Base table or view not found" }, |
216 | { "42S11" , "Index already exists" }, |
217 | { "42S12" , "Index not found" }, |
218 | { "42S21" , "Column already exists" }, |
219 | { "42S22" , "Column not found" }, |
220 | { "44000" , "WITH CHECK OPTION violation" }, |
221 | { "53000" , "Insufficient resources" }, |
222 | { "53100" , "Disk full" }, |
223 | { "53200" , "Out of memory" }, |
224 | { "53300" , "Too many connections" }, |
225 | { "54000" , "Program limit exceeded" }, |
226 | { "54001" , "Statement too complex" }, |
227 | { "54011" , "Too many columns" }, |
228 | { "54023" , "Too many arguments" }, |
229 | { "55000" , "Object not in prerequisite state" }, |
230 | { "55006" , "Object in use" }, |
231 | { "55P02" , "Cant change runtime param" }, |
232 | { "55P03" , "Lock not available" }, |
233 | { "57000" , "Operator intervention" }, |
234 | { "57014" , "Query canceled" }, |
235 | { "57P01" , "Admin shutdown" }, |
236 | { "57P02" , "Crash shutdown" }, |
237 | { "57P03" , "Cannot connect now" }, |
238 | { "58030" , "Io error" }, |
239 | { "58P01" , "Undefined file" }, |
240 | { "58P02" , "Duplicate file" }, |
241 | { "F0000" , "Config file error" }, |
242 | { "F0001" , "Lock file exists" }, |
243 | { "HY000" , "General error" }, |
244 | { "HY001" , "Memory allocation error" }, |
245 | { "HY003" , "Invalid application buffer type" }, |
246 | { "HY004" , "Invalid SQL data type" }, |
247 | { "HY007" , "Associated statement is not prepared" }, |
248 | { "HY008" , "Operation canceled" }, |
249 | { "HY009" , "Invalid use of null pointer" }, |
250 | { "HY010" , "Function sequence error" }, |
251 | { "HY011" , "Attribute cannot be set now" }, |
252 | { "HY012" , "Invalid transaction operation code" }, |
253 | { "HY013" , "Memory management error" }, |
254 | { "HY014" , "Limit on the number of handles exceeded" }, |
255 | { "HY015" , "No cursor name available" }, |
256 | { "HY016" , "Cannot modify an implementation row descriptor" }, |
257 | { "HY017" , "Invalid use of an automatically allocated descriptor handle" }, |
258 | { "HY018" , "Server declined cancel request" }, |
259 | { "HY019" , "Non-character and non-binary data sent in pieces" }, |
260 | { "HY020" , "Attempt to concatenate a null value" }, |
261 | { "HY021" , "Inconsistent descriptor information" }, |
262 | { "HY024" , "Invalid attribute value" }, |
263 | { "HY090" , "Invalid string or buffer length" }, |
264 | { "HY091" , "Invalid descriptor field identifier" }, |
265 | { "HY092" , "Invalid attribute/option identifier" }, |
266 | { "HY093" , "Invalid parameter number" }, |
267 | { "HY095" , "Function type out of range" }, |
268 | { "HY096" , "Invalid information type" }, |
269 | { "HY097" , "Column type out of range" }, |
270 | { "HY098" , "Scope type out of range" }, |
271 | { "HY099" , "Nullable type out of range" }, |
272 | { "HY100" , "Uniqueness option type out of range" }, |
273 | { "HY101" , "Accuracy option type out of range" }, |
274 | { "HY103" , "Invalid retrieval code" }, |
275 | { "HY104" , "Invalid precision or scale value" }, |
276 | { "HY105" , "Invalid parameter type" }, |
277 | { "HY106" , "Fetch type out of range" }, |
278 | { "HY107" , "Row value out of range" }, |
279 | { "HY109" , "Invalid cursor position" }, |
280 | { "HY110" , "Invalid driver completion" }, |
281 | { "HY111" , "Invalid bookmark value" }, |
282 | { "HYC00" , "Optional feature not implemented" }, |
283 | { "HYT00" , "Timeout expired" }, |
284 | { "HYT01" , "Connection timeout expired" }, |
285 | { "IM001" , "Driver does not support this function" }, |
286 | { "IM002" , "Data source name not found and no default driver specified" }, |
287 | { "IM003" , "Specified driver could not be loaded" }, |
288 | { "IM004" , "Driver's SQLAllocHandle on SQL_HANDLE_ENV failed" }, |
289 | { "IM005" , "Driver's SQLAllocHandle on SQL_HANDLE_DBC failed" }, |
290 | { "IM006" , "Driver's SQLSetConnectAttr failed" }, |
291 | { "IM007" , "No data source or driver specified; dialog prohibited" }, |
292 | { "IM008" , "Dialog failed" }, |
293 | { "IM009" , "Unable to load translation DLL" }, |
294 | { "IM010" , "Data source name too long" }, |
295 | { "IM011" , "Driver name too long" }, |
296 | { "IM012" , "DRIVER keyword syntax error" }, |
297 | { "IM013" , "Trace file error" }, |
298 | { "IM014" , "Invalid name of File DSN" }, |
299 | { "IM015" , "Corrupt file data source" }, |
300 | { "P0000" , "Plpgsql error" }, |
301 | { "P0001" , "Raise exception" }, |
302 | { "XX000" , "Internal error" }, |
303 | { "XX001" , "Data corrupted" }, |
304 | { "XX002" , "Index corrupted" } |
305 | }; |
306 | |
307 | void pdo_sqlstate_fini_error_table(void) |
308 | { |
309 | zend_hash_destroy(&err_hash); |
310 | } |
311 | |
312 | int pdo_sqlstate_init_error_table(void) |
313 | { |
314 | int i; |
315 | const struct pdo_sqlstate_info *info; |
316 | |
317 | if (FAILURE == zend_hash_init(&err_hash, |
318 | sizeof(err_initializer)/sizeof(err_initializer[0]), NULL, NULL, 1)) { |
319 | return FAILURE; |
320 | } |
321 | |
322 | for (i = 0; i < sizeof(err_initializer)/sizeof(err_initializer[0]); i++) { |
323 | info = &err_initializer[i]; |
324 | |
325 | zend_hash_add(&err_hash, info->state, sizeof(info->state), &info, sizeof(info), NULL); |
326 | } |
327 | |
328 | return SUCCESS; |
329 | } |
330 | |
331 | const char *pdo_sqlstate_state_to_description(char *state) |
332 | { |
333 | const struct pdo_sqlstate_info **info; |
334 | if (SUCCESS == zend_hash_find(&err_hash, state, sizeof(err_initializer[0].state), |
335 | (void**)&info)) { |
336 | return (*info)->desc; |
337 | } |
338 | return NULL; |
339 | } |
340 | |
341 | |