~maxb/connectorj/5.0

« back to all changes in this revision

Viewing changes to connector-j/src/com/mysql/jdbc/SQLError.java

  • Committer: mmatthews
  • Date: 2007-10-11 20:04:05 UTC
  • Revision ID: svn-v3-trunk0:bce1ec22-edf6-0310-a851-a6aae2aa6c29:branches%2Fbranch_5_0:6637
Changed layout

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 Copyright (C) 2002-2004 MySQL AB
3
 
 
4
 
 This program is free software; you can redistribute it and/or modify
5
 
 it under the terms of version 2 of the GNU General Public License as 
6
 
 published by the Free Software Foundation.
7
 
 
8
 
 There are special exceptions to the terms and conditions of the GPL 
9
 
 as it is applied to this software. View the full text of the 
10
 
 exception in file EXCEPTIONS-CONNECTOR-J in the directory of this 
11
 
 software distribution.
12
 
 
13
 
 This program is distributed in the hope that it will be useful,
14
 
 but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 
 GNU General Public License for more details.
17
 
 
18
 
 You should have received a copy of the GNU General Public License
19
 
 along with this program; if not, write to the Free Software
20
 
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21
 
 
22
 
 
23
 
 
24
 
 */
25
 
package com.mysql.jdbc;
26
 
 
27
 
import java.sql.DataTruncation;
28
 
import java.sql.SQLException;
29
 
import java.sql.SQLWarning;
30
 
 
31
 
import java.util.HashMap;
32
 
import java.util.Hashtable;
33
 
import java.util.Iterator;
34
 
import java.util.Map;
35
 
import java.util.TreeMap;
36
 
 
37
 
import com.mysql.jdbc.exceptions.MySQLDataException;
38
 
import com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException;
39
 
import com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException;
40
 
import com.mysql.jdbc.exceptions.MySQLSyntaxErrorException;
41
 
import com.mysql.jdbc.exceptions.MySQLTransactionRollbackException;
42
 
 
43
 
/**
44
 
 * SQLError is a utility class that maps MySQL error codes to X/Open error codes
45
 
 * as is required by the JDBC spec.
46
 
 * 
47
 
 * @author Mark Matthews <mmatthew_at_worldserver.com>
48
 
 * @version $Id$
49
 
 */
50
 
public class SQLError {
51
 
        static final int ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196;
52
 
 
53
 
        private static Map mysqlToSql99State;
54
 
 
55
 
        private static Map mysqlToSqlState;
56
 
 
57
 
        public static final String SQL_STATE_BASE_TABLE_NOT_FOUND = "S0002"; //$NON-NLS-1$
58
 
 
59
 
        public static final String SQL_STATE_BASE_TABLE_OR_VIEW_ALREADY_EXISTS = "S0001"; //$NON-NLS-1$
60
 
 
61
 
        public static final String SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND = "42S02"; //$NON-NLS-1$
62
 
 
63
 
        public static final String SQL_STATE_COLUMN_ALREADY_EXISTS = "S0021"; //$NON-NLS-1$
64
 
 
65
 
        public static final String SQL_STATE_COLUMN_NOT_FOUND = "S0022"; //$NON-NLS-1$
66
 
 
67
 
        public static final String SQL_STATE_COMMUNICATION_LINK_FAILURE = "08S01"; //$NON-NLS-1$
68
 
 
69
 
        public static final String SQL_STATE_CONNECTION_FAIL_DURING_TX = "08007"; //$NON-NLS-1$
70
 
 
71
 
        public static final String SQL_STATE_CONNECTION_IN_USE = "08002"; //$NON-NLS-1$
72
 
 
73
 
        public static final String SQL_STATE_CONNECTION_NOT_OPEN = "08003"; //$NON-NLS-1$
74
 
 
75
 
        public static final String SQL_STATE_CONNECTION_REJECTED = "08004"; //$NON-NLS-1$
76
 
 
77
 
        public static final String SQL_STATE_DATE_TRUNCATED = "01004"; //$NON-NLS-1$
78
 
 
79
 
        public static final String SQL_STATE_DATETIME_FIELD_OVERFLOW = "22008"; //$NON-NLS-1$
80
 
 
81
 
        public static final String SQL_STATE_DEADLOCK = "41000"; //$NON-NLS-1$
82
 
 
83
 
        public static final String SQL_STATE_DISCONNECT_ERROR = "01002"; //$NON-NLS-1$
84
 
 
85
 
        public static final String SQL_STATE_DIVISION_BY_ZERO = "22012"; //$NON-NLS-1$
86
 
 
87
 
        public static final String SQL_STATE_DRIVER_NOT_CAPABLE = "S1C00"; //$NON-NLS-1$
88
 
 
89
 
        public static final String SQL_STATE_ERROR_IN_ROW = "01S01"; //$NON-NLS-1$
90
 
 
91
 
        public static final String SQL_STATE_GENERAL_ERROR = "S1000"; //$NON-NLS-1$
92
 
 
93
 
        public static final String SQL_STATE_ILLEGAL_ARGUMENT = "S1009"; //$NON-NLS-1$
94
 
 
95
 
        public static final String SQL_STATE_INDEX_ALREADY_EXISTS = "S0011"; //$NON-NLS-1$
96
 
 
97
 
        public static final String SQL_STATE_INDEX_NOT_FOUND = "S0012"; //$NON-NLS-1$
98
 
 
99
 
        public static final String SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST = "21S01"; //$NON-NLS-1$
100
 
 
101
 
        public static final String SQL_STATE_INVALID_AUTH_SPEC = "28000"; //$NON-NLS-1$
102
 
 
103
 
        public static final String SQL_STATE_INVALID_CHARACTER_VALUE_FOR_CAST = "22018"; // $NON_NLS-1$
104
 
 
105
 
        public static final String SQL_STATE_INVALID_COLUMN_NUMBER = "S1002"; //$NON-NLS-1$
106
 
 
107
 
        public static final String SQL_STATE_INVALID_CONNECTION_ATTRIBUTE = "01S00"; //$NON-NLS-1$
108
 
 
109
 
        public static final String SQL_STATE_MEMORY_ALLOCATION_FAILURE = "S1001"; //$NON-NLS-1$
110
 
 
111
 
        public static final String SQL_STATE_MORE_THAN_ONE_ROW_UPDATED_OR_DELETED = "01S04"; //$NON-NLS-1$
112
 
 
113
 
        public static final String SQL_STATE_NO_DEFAULT_FOR_COLUMN = "S0023"; //$NON-NLS-1$
114
 
 
115
 
        public static final String SQL_STATE_NO_ROWS_UPDATED_OR_DELETED = "01S03"; //$NON-NLS-1$
116
 
 
117
 
        public static final String SQL_STATE_NUMERIC_VALUE_OUT_OF_RANGE = "22003"; //$NON-NLS-1$
118
 
 
119
 
        public static final String SQL_STATE_PRIVILEGE_NOT_REVOKED = "01006"; //$NON-NLS-1$
120
 
 
121
 
        public static final String SQL_STATE_SYNTAX_ERROR = "42000"; //$NON-NLS-1$
122
 
 
123
 
        public static final String SQL_STATE_TIMEOUT_EXPIRED = "S1T00"; //$NON-NLS-1$
124
 
 
125
 
        public static final String SQL_STATE_TRANSACTION_RESOLUTION_UNKNOWN = "08007"; // $NON_NLS-1$
126
 
 
127
 
        public static final String SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE = "08001"; //$NON-NLS-1$
128
 
 
129
 
        public static final String SQL_STATE_WRONG_NO_OF_PARAMETERS = "07001"; //$NON-NLS-1$
130
 
        
131
 
        public static final String SQL_STATE_INVALID_TRANSACTION_TERMINATION = "2D000"; //$NON_NLS-1$
132
 
 
133
 
        private static Map sqlStateMessages;
134
 
 
135
 
        static {
136
 
                sqlStateMessages = new HashMap();
137
 
                sqlStateMessages.put(SQL_STATE_DISCONNECT_ERROR, Messages
138
 
                                .getString("SQLError.35")); //$NON-NLS-1$
139
 
                sqlStateMessages.put(SQL_STATE_DATE_TRUNCATED, Messages
140
 
                                .getString("SQLError.36")); //$NON-NLS-1$
141
 
                sqlStateMessages.put(SQL_STATE_PRIVILEGE_NOT_REVOKED, Messages
142
 
                                .getString("SQLError.37")); //$NON-NLS-1$
143
 
                sqlStateMessages.put(SQL_STATE_INVALID_CONNECTION_ATTRIBUTE, Messages
144
 
                                .getString("SQLError.38")); //$NON-NLS-1$
145
 
                sqlStateMessages.put(SQL_STATE_ERROR_IN_ROW, Messages
146
 
                                .getString("SQLError.39")); //$NON-NLS-1$
147
 
                sqlStateMessages.put(SQL_STATE_NO_ROWS_UPDATED_OR_DELETED, Messages
148
 
                                .getString("SQLError.40")); //$NON-NLS-1$
149
 
                sqlStateMessages.put(SQL_STATE_MORE_THAN_ONE_ROW_UPDATED_OR_DELETED,
150
 
                                Messages.getString("SQLError.41")); //$NON-NLS-1$
151
 
                sqlStateMessages.put(SQL_STATE_WRONG_NO_OF_PARAMETERS, Messages
152
 
                                .getString("SQLError.42")); //$NON-NLS-1$
153
 
                sqlStateMessages.put(SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE,
154
 
                                Messages.getString("SQLError.43")); //$NON-NLS-1$
155
 
                sqlStateMessages.put(SQL_STATE_CONNECTION_IN_USE, Messages
156
 
                                .getString("SQLError.44")); //$NON-NLS-1$
157
 
                sqlStateMessages.put(SQL_STATE_CONNECTION_NOT_OPEN, Messages
158
 
                                .getString("SQLError.45")); //$NON-NLS-1$
159
 
                sqlStateMessages.put(SQL_STATE_CONNECTION_REJECTED, Messages
160
 
                                .getString("SQLError.46")); //$NON-NLS-1$
161
 
                sqlStateMessages.put(SQL_STATE_CONNECTION_FAIL_DURING_TX, Messages
162
 
                                .getString("SQLError.47")); //$NON-NLS-1$
163
 
                sqlStateMessages.put(SQL_STATE_COMMUNICATION_LINK_FAILURE, Messages
164
 
                                .getString("SQLError.48")); //$NON-NLS-1$
165
 
                sqlStateMessages.put(SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST,
166
 
                                Messages.getString("SQLError.49")); //$NON-NLS-1$
167
 
                sqlStateMessages.put(SQL_STATE_NUMERIC_VALUE_OUT_OF_RANGE, Messages
168
 
                                .getString("SQLError.50")); //$NON-NLS-1$
169
 
                sqlStateMessages.put(SQL_STATE_DATETIME_FIELD_OVERFLOW, Messages
170
 
                                .getString("SQLError.51")); //$NON-NLS-1$
171
 
                sqlStateMessages.put(SQL_STATE_DIVISION_BY_ZERO, Messages
172
 
                                .getString("SQLError.52")); //$NON-NLS-1$
173
 
                sqlStateMessages.put(SQL_STATE_DEADLOCK, Messages
174
 
                                .getString("SQLError.53")); //$NON-NLS-1$
175
 
                sqlStateMessages.put(SQL_STATE_INVALID_AUTH_SPEC, Messages
176
 
                                .getString("SQLError.54")); //$NON-NLS-1$
177
 
                sqlStateMessages.put(SQL_STATE_SYNTAX_ERROR, Messages
178
 
                                .getString("SQLError.55")); //$NON-NLS-1$
179
 
                sqlStateMessages.put(SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND, Messages
180
 
                                .getString("SQLError.56")); //$NON-NLS-1$
181
 
                sqlStateMessages.put(SQL_STATE_BASE_TABLE_OR_VIEW_ALREADY_EXISTS,
182
 
                                Messages.getString("SQLError.57")); //$NON-NLS-1$
183
 
                sqlStateMessages.put(SQL_STATE_BASE_TABLE_NOT_FOUND, Messages
184
 
                                .getString("SQLError.58")); //$NON-NLS-1$
185
 
                sqlStateMessages.put(SQL_STATE_INDEX_ALREADY_EXISTS, Messages
186
 
                                .getString("SQLError.59")); //$NON-NLS-1$
187
 
                sqlStateMessages.put(SQL_STATE_INDEX_NOT_FOUND, Messages
188
 
                                .getString("SQLError.60")); //$NON-NLS-1$
189
 
                sqlStateMessages.put(SQL_STATE_COLUMN_ALREADY_EXISTS, Messages
190
 
                                .getString("SQLError.61")); //$NON-NLS-1$
191
 
                sqlStateMessages.put(SQL_STATE_COLUMN_NOT_FOUND, Messages
192
 
                                .getString("SQLError.62")); //$NON-NLS-1$
193
 
                sqlStateMessages.put(SQL_STATE_NO_DEFAULT_FOR_COLUMN, Messages
194
 
                                .getString("SQLError.63")); //$NON-NLS-1$
195
 
                sqlStateMessages.put(SQL_STATE_GENERAL_ERROR, Messages
196
 
                                .getString("SQLError.64")); //$NON-NLS-1$
197
 
                sqlStateMessages.put(SQL_STATE_MEMORY_ALLOCATION_FAILURE, Messages
198
 
                                .getString("SQLError.65")); //$NON-NLS-1$
199
 
                sqlStateMessages.put(SQL_STATE_INVALID_COLUMN_NUMBER, Messages
200
 
                                .getString("SQLError.66")); //$NON-NLS-1$
201
 
                sqlStateMessages.put(SQL_STATE_ILLEGAL_ARGUMENT, Messages
202
 
                                .getString("SQLError.67")); //$NON-NLS-1$
203
 
                sqlStateMessages.put(SQL_STATE_DRIVER_NOT_CAPABLE, Messages
204
 
                                .getString("SQLError.68")); //$NON-NLS-1$
205
 
                sqlStateMessages.put(SQL_STATE_TIMEOUT_EXPIRED, Messages
206
 
                                .getString("SQLError.69")); //$NON-NLS-1$
207
 
 
208
 
                mysqlToSqlState = new Hashtable();
209
 
 
210
 
                //
211
 
                // Communications Errors
212
 
                //
213
 
                // ER_CON_COUNT_ERROR 1040
214
 
                // ER_BAD_HOST_ERROR 1042
215
 
                // ER_HANDSHAKE_ERROR 1043
216
 
                // ER_UNKNOWN_COM_ERROR 1047
217
 
                // ER_IPSOCK_ERROR 1081
218
 
                //
219
 
                mysqlToSqlState.put(new Integer(1040), SQL_STATE_CONNECTION_REJECTED);
220
 
                mysqlToSqlState.put(new Integer(1042), SQL_STATE_CONNECTION_REJECTED);
221
 
                mysqlToSqlState.put(new Integer(1043), SQL_STATE_CONNECTION_REJECTED);
222
 
                mysqlToSqlState.put(new Integer(1047),
223
 
                                SQL_STATE_COMMUNICATION_LINK_FAILURE);
224
 
                mysqlToSqlState.put(new Integer(1081),
225
 
                                SQL_STATE_COMMUNICATION_LINK_FAILURE);
226
 
 
227
 
                // ER_HOST_IS_BLOCKED 1129
228
 
                // ER_HOST_NOT_PRIVILEGED 1130
229
 
                mysqlToSqlState.put(new Integer(1129), SQL_STATE_CONNECTION_REJECTED);
230
 
                mysqlToSqlState.put(new Integer(1130), SQL_STATE_CONNECTION_REJECTED);
231
 
 
232
 
                //
233
 
                // Authentication Errors
234
 
                //
235
 
                // ER_ACCESS_DENIED_ERROR 1045
236
 
                //
237
 
                mysqlToSqlState.put(new Integer(1045), SQL_STATE_INVALID_AUTH_SPEC);
238
 
 
239
 
                //
240
 
                // Resource errors
241
 
                //
242
 
                // ER_CANT_CREATE_FILE 1004
243
 
                // ER_CANT_CREATE_TABLE 1005
244
 
                // ER_CANT_LOCK 1015
245
 
                // ER_DISK_FULL 1021
246
 
                // ER_CON_COUNT_ERROR 1040
247
 
                // ER_OUT_OF_RESOURCES 1041
248
 
                //
249
 
                // Out-of-memory errors
250
 
                //
251
 
                // ER_OUTOFMEMORY 1037
252
 
                // ER_OUT_OF_SORTMEMORY 1038
253
 
                //
254
 
                mysqlToSqlState.put(new Integer(1037),
255
 
                                SQL_STATE_MEMORY_ALLOCATION_FAILURE);
256
 
                mysqlToSqlState.put(new Integer(1038),
257
 
                                SQL_STATE_MEMORY_ALLOCATION_FAILURE);
258
 
 
259
 
                //
260
 
                // Syntax Errors
261
 
                //
262
 
                // ER_PARSE_ERROR 1064
263
 
                // ER_EMPTY_QUERY 1065
264
 
                //
265
 
                mysqlToSqlState.put(new Integer(1064), SQL_STATE_SYNTAX_ERROR);
266
 
                mysqlToSqlState.put(new Integer(1065), SQL_STATE_SYNTAX_ERROR);
267
 
 
268
 
                //
269
 
                // Invalid argument errors
270
 
                //
271
 
                // ER_WRONG_FIELD_WITH_GROUP 1055
272
 
                // ER_WRONG_GROUP_FIELD 1056
273
 
                // ER_WRONG_SUM_SELECT 1057
274
 
                // ER_TOO_LONG_IDENT 1059
275
 
                // ER_DUP_FIELDNAME 1060
276
 
                // ER_DUP_KEYNAME 1061
277
 
                // ER_DUP_ENTRY 1062
278
 
                // ER_WRONG_FIELD_SPEC 1063
279
 
                // ER_NONUNIQ_TABLE 1066
280
 
                // ER_INVALID_DEFAULT 1067
281
 
                // ER_MULTIPLE_PRI_KEY 1068
282
 
                // ER_TOO_MANY_KEYS 1069
283
 
                // ER_TOO_MANY_KEY_PARTS 1070
284
 
                // ER_TOO_LONG_KEY 1071
285
 
                // ER_KEY_COLUMN_DOES_NOT_EXIST 1072
286
 
                // ER_BLOB_USED_AS_KEY 1073
287
 
                // ER_TOO_BIG_FIELDLENGTH 1074
288
 
                // ER_WRONG_AUTO_KEY 1075
289
 
                // ER_NO_SUCH_INDEX 1082
290
 
                // ER_WRONG_FIELD_TERMINATORS 1083
291
 
                // ER_BLOBS_AND_NO_TERMINATED 1084
292
 
                //
293
 
                mysqlToSqlState.put(new Integer(1055), SQL_STATE_ILLEGAL_ARGUMENT);
294
 
                mysqlToSqlState.put(new Integer(1056), SQL_STATE_ILLEGAL_ARGUMENT);
295
 
                mysqlToSqlState.put(new Integer(1057), SQL_STATE_ILLEGAL_ARGUMENT);
296
 
                mysqlToSqlState.put(new Integer(1059), SQL_STATE_ILLEGAL_ARGUMENT);
297
 
                mysqlToSqlState.put(new Integer(1060), SQL_STATE_ILLEGAL_ARGUMENT);
298
 
                mysqlToSqlState.put(new Integer(1061), SQL_STATE_ILLEGAL_ARGUMENT);
299
 
                mysqlToSqlState.put(new Integer(1062), SQL_STATE_ILLEGAL_ARGUMENT);
300
 
                mysqlToSqlState.put(new Integer(1063), SQL_STATE_ILLEGAL_ARGUMENT);
301
 
                mysqlToSqlState.put(new Integer(1066), SQL_STATE_ILLEGAL_ARGUMENT);
302
 
                mysqlToSqlState.put(new Integer(1067), SQL_STATE_ILLEGAL_ARGUMENT);
303
 
                mysqlToSqlState.put(new Integer(1068), SQL_STATE_ILLEGAL_ARGUMENT);
304
 
                mysqlToSqlState.put(new Integer(1069), SQL_STATE_ILLEGAL_ARGUMENT);
305
 
                mysqlToSqlState.put(new Integer(1070), SQL_STATE_ILLEGAL_ARGUMENT);
306
 
                mysqlToSqlState.put(new Integer(1071), SQL_STATE_ILLEGAL_ARGUMENT);
307
 
                mysqlToSqlState.put(new Integer(1072), SQL_STATE_ILLEGAL_ARGUMENT);
308
 
                mysqlToSqlState.put(new Integer(1073), SQL_STATE_ILLEGAL_ARGUMENT);
309
 
                mysqlToSqlState.put(new Integer(1074), SQL_STATE_ILLEGAL_ARGUMENT);
310
 
                mysqlToSqlState.put(new Integer(1075), SQL_STATE_ILLEGAL_ARGUMENT);
311
 
                mysqlToSqlState.put(new Integer(1082), SQL_STATE_ILLEGAL_ARGUMENT);
312
 
                mysqlToSqlState.put(new Integer(1083), SQL_STATE_ILLEGAL_ARGUMENT);
313
 
                mysqlToSqlState.put(new Integer(1084), SQL_STATE_ILLEGAL_ARGUMENT);
314
 
 
315
 
                //
316
 
                // ER_WRONG_VALUE_COUNT 1058
317
 
                //
318
 
                mysqlToSqlState.put(new Integer(1058),
319
 
                                SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST);
320
 
 
321
 
                // ER_CANT_CREATE_DB 1006
322
 
                // ER_DB_CREATE_EXISTS 1007
323
 
                // ER_DB_DROP_EXISTS 1008
324
 
                // ER_DB_DROP_DELETE 1009
325
 
                // ER_DB_DROP_RMDIR 1010
326
 
                // ER_CANT_DELETE_FILE 1011
327
 
                // ER_CANT_FIND_SYSTEM_REC 1012
328
 
                // ER_CANT_GET_STAT 1013
329
 
                // ER_CANT_GET_WD 1014
330
 
                // ER_UNEXPECTED_EOF 1039
331
 
                // ER_CANT_OPEN_FILE 1016
332
 
                // ER_FILE_NOT_FOUND 1017
333
 
                // ER_CANT_READ_DIR 1018
334
 
                // ER_CANT_SET_WD 1019
335
 
                // ER_CHECKREAD 1020
336
 
                // ER_DUP_KEY 1022
337
 
                // ER_ERROR_ON_CLOSE 1023
338
 
                // ER_ERROR_ON_READ 1024
339
 
                // ER_ERROR_ON_RENAME 1025
340
 
                // ER_ERROR_ON_WRITE 1026
341
 
                // ER_FILE_USED 1027
342
 
                // ER_FILSORT_ABORT 1028
343
 
                // ER_FORM_NOT_FOUND 1029
344
 
                // ER_GET_ERRNO 1030
345
 
                // ER_ILLEGAL_HA 1031
346
 
                // ER_KEY_NOT_FOUND 1032
347
 
                // ER_NOT_FORM_FILE 1033
348
 
                // ER_DBACCESS_DENIED_ERROR 1044
349
 
                // ER_NO_DB_ERROR 1046
350
 
                // ER_BAD_NULL_ERROR 1048
351
 
                // ER_BAD_DB_ERROR 1049
352
 
                // ER_TABLE_EXISTS_ERROR 1050
353
 
                // ER_BAD_TABLE_ERROR 1051
354
 
                mysqlToSqlState.put(new Integer(1051),
355
 
                                SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND);
356
 
 
357
 
                // ER_NON_UNIQ_ERROR 1052
358
 
                // ER_BAD_FIELD_ERROR 1054
359
 
                mysqlToSqlState.put(new Integer(1054), SQL_STATE_COLUMN_NOT_FOUND);
360
 
 
361
 
                // ER_TEXTFILE_NOT_READABLE 1085
362
 
                // ER_FILE_EXISTS_ERROR 1086
363
 
                // ER_LOAD_INFO 1087
364
 
                // ER_ALTER_INFO 1088
365
 
                // ER_WRONG_SUB_KEY 1089
366
 
                // ER_CANT_REMOVE_ALL_FIELDS 1090
367
 
                // ER_CANT_DROP_FIELD_OR_KEY 1091
368
 
                // ER_INSERT_INFO 1092
369
 
                // ER_INSERT_TABLE_USED 1093
370
 
                // ER_LOCK_DEADLOCK 1213
371
 
                mysqlToSqlState.put(new Integer(1205), SQL_STATE_DEADLOCK);
372
 
                mysqlToSqlState.put(new Integer(1213), SQL_STATE_DEADLOCK);
373
 
 
374
 
                mysqlToSql99State = new HashMap();
375
 
 
376
 
                mysqlToSql99State.put(new Integer(1205), SQL_STATE_DEADLOCK);
377
 
                mysqlToSql99State.put(new Integer(1213), SQL_STATE_DEADLOCK);
378
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_DUP_KEY),
379
 
                                "23000");
380
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_OUTOFMEMORY),
381
 
                                "HY001");
382
 
                mysqlToSql99State.put(new Integer(
383
 
                                MysqlErrorNumbers.ER_OUT_OF_SORTMEMORY), "HY001");
384
 
                mysqlToSql99State.put(
385
 
                                new Integer(MysqlErrorNumbers.ER_CON_COUNT_ERROR), "08004");
386
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_BAD_HOST_ERROR),
387
 
                                "08S01");
388
 
                mysqlToSql99State.put(
389
 
                                new Integer(MysqlErrorNumbers.ER_HANDSHAKE_ERROR), "08S01");
390
 
                mysqlToSql99State.put(new Integer(
391
 
                                MysqlErrorNumbers.ER_DBACCESS_DENIED_ERROR), "42000");
392
 
                mysqlToSql99State.put(new Integer(
393
 
                                MysqlErrorNumbers.ER_ACCESS_DENIED_ERROR), "28000");
394
 
                mysqlToSql99State.put(new Integer(
395
 
                                MysqlErrorNumbers.ER_TABLE_EXISTS_ERROR), "42S01");
396
 
                mysqlToSql99State.put(
397
 
                                new Integer(MysqlErrorNumbers.ER_BAD_TABLE_ERROR), "42S02");
398
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_NON_UNIQ_ERROR),
399
 
                                "23000");
400
 
                mysqlToSql99State.put(
401
 
                                new Integer(MysqlErrorNumbers.ER_SERVER_SHUTDOWN), "08S01");
402
 
                mysqlToSql99State.put(
403
 
                                new Integer(MysqlErrorNumbers.ER_BAD_FIELD_ERROR), "42S22");
404
 
                mysqlToSql99State.put(new Integer(
405
 
                                MysqlErrorNumbers.ER_WRONG_FIELD_WITH_GROUP), "42000");
406
 
                mysqlToSql99State.put(new Integer(
407
 
                                MysqlErrorNumbers.ER_WRONG_GROUP_FIELD), "42000");
408
 
                mysqlToSql99State.put(
409
 
                                new Integer(MysqlErrorNumbers.ER_WRONG_SUM_SELECT), "42000");
410
 
                mysqlToSql99State.put(new Integer(
411
 
                                MysqlErrorNumbers.ER_WRONG_VALUE_COUNT), "21S01");
412
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_TOO_LONG_IDENT),
413
 
                                "42000");
414
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_DUP_FIELDNAME),
415
 
                                "42S21");
416
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_DUP_KEYNAME),
417
 
                                "42000");
418
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_DUP_ENTRY),
419
 
                                "23000");
420
 
                mysqlToSql99State.put(
421
 
                                new Integer(MysqlErrorNumbers.ER_WRONG_FIELD_SPEC), "42000");
422
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_PARSE_ERROR),
423
 
                                "42000");
424
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_EMPTY_QUERY),
425
 
                                "42000");
426
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_NONUNIQ_TABLE),
427
 
                                "42000");
428
 
                mysqlToSql99State.put(
429
 
                                new Integer(MysqlErrorNumbers.ER_INVALID_DEFAULT), "42000");
430
 
                mysqlToSql99State.put(
431
 
                                new Integer(MysqlErrorNumbers.ER_MULTIPLE_PRI_KEY), "42000");
432
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_TOO_MANY_KEYS),
433
 
                                "42000");
434
 
                mysqlToSql99State.put(new Integer(
435
 
                                MysqlErrorNumbers.ER_TOO_MANY_KEY_PARTS), "42000");
436
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_TOO_LONG_KEY),
437
 
                                "42000");
438
 
                mysqlToSql99State.put(new Integer(
439
 
                                MysqlErrorNumbers.ER_KEY_COLUMN_DOES_NOT_EXITS), "42000");
440
 
                mysqlToSql99State.put(
441
 
                                new Integer(MysqlErrorNumbers.ER_BLOB_USED_AS_KEY), "42000");
442
 
                mysqlToSql99State.put(new Integer(
443
 
                                MysqlErrorNumbers.ER_TOO_BIG_FIELDLENGTH), "42000");
444
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_WRONG_AUTO_KEY),
445
 
                                "42000");
446
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_FORCING_CLOSE),
447
 
                                "08S01");
448
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_IPSOCK_ERROR),
449
 
                                "08S01");
450
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_NO_SUCH_INDEX),
451
 
                                "42S12");
452
 
                mysqlToSql99State.put(new Integer(
453
 
                                MysqlErrorNumbers.ER_WRONG_FIELD_TERMINATORS), "42000");
454
 
                mysqlToSql99State.put(new Integer(
455
 
                                MysqlErrorNumbers.ER_BLOBS_AND_NO_TERMINATED), "42000");
456
 
                mysqlToSql99State.put(new Integer(
457
 
                                MysqlErrorNumbers.ER_CANT_REMOVE_ALL_FIELDS), "42000");
458
 
                mysqlToSql99State.put(new Integer(
459
 
                                MysqlErrorNumbers.ER_CANT_DROP_FIELD_OR_KEY), "42000");
460
 
                mysqlToSql99State.put(new Integer(
461
 
                                MysqlErrorNumbers.ER_BLOB_CANT_HAVE_DEFAULT), "42000");
462
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_WRONG_DB_NAME),
463
 
                                "42000");
464
 
                mysqlToSql99State.put(
465
 
                                new Integer(MysqlErrorNumbers.ER_WRONG_TABLE_NAME), "42000");
466
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_TOO_BIG_SELECT),
467
 
                                "42000");
468
 
                mysqlToSql99State.put(new Integer(
469
 
                                MysqlErrorNumbers.ER_UNKNOWN_PROCEDURE), "42000");
470
 
                mysqlToSql99State.put(new Integer(
471
 
                                MysqlErrorNumbers.ER_WRONG_PARAMCOUNT_TO_PROCEDURE), "42000");
472
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_UNKNOWN_TABLE),
473
 
                                "42S02");
474
 
                mysqlToSql99State.put(new Integer(
475
 
                                MysqlErrorNumbers.ER_FIELD_SPECIFIED_TWICE), "42000");
476
 
                mysqlToSql99State.put(new Integer(
477
 
                                MysqlErrorNumbers.ER_UNSUPPORTED_EXTENSION), "42000");
478
 
                mysqlToSql99State.put(new Integer(
479
 
                                MysqlErrorNumbers.ER_TABLE_MUST_HAVE_COLUMNS), "42000");
480
 
                mysqlToSql99State.put(new Integer(
481
 
                                MysqlErrorNumbers.ER_UNKNOWN_CHARACTER_SET), "42000");
482
 
                mysqlToSql99State.put(
483
 
                                new Integer(MysqlErrorNumbers.ER_TOO_BIG_ROWSIZE), "42000");
484
 
                mysqlToSql99State.put(
485
 
                                new Integer(MysqlErrorNumbers.ER_WRONG_OUTER_JOIN), "42000");
486
 
                mysqlToSql99State.put(new Integer(
487
 
                                MysqlErrorNumbers.ER_NULL_COLUMN_IN_INDEX), "42000");
488
 
                mysqlToSql99State.put(new Integer(
489
 
                                MysqlErrorNumbers.ER_PASSWORD_ANONYMOUS_USER), "42000");
490
 
                mysqlToSql99State.put(new Integer(
491
 
                                MysqlErrorNumbers.ER_PASSWORD_NOT_ALLOWED), "42000");
492
 
                mysqlToSql99State.put(new Integer(
493
 
                                MysqlErrorNumbers.ER_PASSWORD_NO_MATCH), "42000");
494
 
                mysqlToSql99State.put(new Integer(
495
 
                                MysqlErrorNumbers.ER_WRONG_VALUE_COUNT_ON_ROW), "21S01");
496
 
                mysqlToSql99State.put(new Integer(
497
 
                                MysqlErrorNumbers.ER_INVALID_USE_OF_NULL), "42000");
498
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_REGEXP_ERROR),
499
 
                                "42000");
500
 
                mysqlToSql99State.put(new Integer(
501
 
                                MysqlErrorNumbers.ER_MIX_OF_GROUP_FUNC_AND_FIELDS), "42000");
502
 
                mysqlToSql99State.put(new Integer(
503
 
                                MysqlErrorNumbers.ER_NONEXISTING_GRANT), "42000");
504
 
                mysqlToSql99State.put(new Integer(
505
 
                                MysqlErrorNumbers.ER_TABLEACCESS_DENIED_ERROR), "42000");
506
 
                mysqlToSql99State.put(new Integer(
507
 
                                MysqlErrorNumbers.ER_COLUMNACCESS_DENIED_ERROR), "42000");
508
 
                mysqlToSql99State.put(new Integer(
509
 
                                MysqlErrorNumbers.ER_ILLEGAL_GRANT_FOR_TABLE), "42000");
510
 
                mysqlToSql99State.put(new Integer(
511
 
                                MysqlErrorNumbers.ER_GRANT_WRONG_HOST_OR_USER), "42000");
512
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_NO_SUCH_TABLE),
513
 
                                "42S02");
514
 
                mysqlToSql99State.put(new Integer(
515
 
                                MysqlErrorNumbers.ER_NONEXISTING_TABLE_GRANT), "42000");
516
 
                mysqlToSql99State.put(new Integer(
517
 
                                MysqlErrorNumbers.ER_NOT_ALLOWED_COMMAND), "42000");
518
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_SYNTAX_ERROR),
519
 
                                "42000");
520
 
                mysqlToSql99State.put(new Integer(
521
 
                                MysqlErrorNumbers.ER_ABORTING_CONNECTION), "08S01");
522
 
                mysqlToSql99State.put(new Integer(
523
 
                                MysqlErrorNumbers.ER_NET_PACKET_TOO_LARGE), "08S01");
524
 
                mysqlToSql99State.put(new Integer(
525
 
                                MysqlErrorNumbers.ER_NET_READ_ERROR_FROM_PIPE), "08S01");
526
 
                mysqlToSql99State.put(
527
 
                                new Integer(MysqlErrorNumbers.ER_NET_FCNTL_ERROR), "08S01");
528
 
                mysqlToSql99State.put(new Integer(
529
 
                                MysqlErrorNumbers.ER_NET_PACKETS_OUT_OF_ORDER), "08S01");
530
 
                mysqlToSql99State.put(new Integer(
531
 
                                MysqlErrorNumbers.ER_NET_UNCOMPRESS_ERROR), "08S01");
532
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_NET_READ_ERROR),
533
 
                                "08S01");
534
 
                mysqlToSql99State.put(new Integer(
535
 
                                MysqlErrorNumbers.ER_NET_READ_INTERRUPTED), "08S01");
536
 
                mysqlToSql99State.put(new Integer(
537
 
                                MysqlErrorNumbers.ER_NET_ERROR_ON_WRITE), "08S01");
538
 
                mysqlToSql99State.put(new Integer(
539
 
                                MysqlErrorNumbers.ER_NET_WRITE_INTERRUPTED), "08S01");
540
 
                mysqlToSql99State.put(
541
 
                                new Integer(MysqlErrorNumbers.ER_TOO_LONG_STRING), "42000");
542
 
                mysqlToSql99State.put(new Integer(
543
 
                                MysqlErrorNumbers.ER_TABLE_CANT_HANDLE_BLOB), "42000");
544
 
                mysqlToSql99State
545
 
                                .put(new Integer(
546
 
                                                MysqlErrorNumbers.ER_TABLE_CANT_HANDLE_AUTO_INCREMENT),
547
 
                                                "42000");
548
 
                mysqlToSql99State.put(new Integer(
549
 
                                MysqlErrorNumbers.ER_WRONG_COLUMN_NAME), "42000");
550
 
                mysqlToSql99State.put(
551
 
                                new Integer(MysqlErrorNumbers.ER_WRONG_KEY_COLUMN), "42000");
552
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_DUP_UNIQUE),
553
 
                                "23000");
554
 
                mysqlToSql99State.put(new Integer(
555
 
                                MysqlErrorNumbers.ER_BLOB_KEY_WITHOUT_LENGTH), "42000");
556
 
                mysqlToSql99State.put(new Integer(
557
 
                                MysqlErrorNumbers.ER_PRIMARY_CANT_HAVE_NULL), "42000");
558
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_TOO_MANY_ROWS),
559
 
                                "42000");
560
 
                mysqlToSql99State.put(new Integer(
561
 
                                MysqlErrorNumbers.ER_REQUIRES_PRIMARY_KEY), "42000");
562
 
                mysqlToSql99State.put(new Integer(
563
 
                                MysqlErrorNumbers.ER_CHECK_NO_SUCH_TABLE), "42000");
564
 
                mysqlToSql99State.put(new Integer(
565
 
                                MysqlErrorNumbers.ER_CHECK_NOT_IMPLEMENTED), "42000");
566
 
                mysqlToSql99State.put(new Integer(
567
 
                                MysqlErrorNumbers.ER_CANT_DO_THIS_DURING_AN_TRANSACTION),
568
 
                                "25000");
569
 
                mysqlToSql99State.put(new Integer(
570
 
                                MysqlErrorNumbers.ER_NEW_ABORTING_CONNECTION), "08S01");
571
 
                mysqlToSql99State.put(
572
 
                                new Integer(MysqlErrorNumbers.ER_MASTER_NET_READ), "08S01");
573
 
                mysqlToSql99State.put(
574
 
                                new Integer(MysqlErrorNumbers.ER_MASTER_NET_WRITE), "08S01");
575
 
                mysqlToSql99State.put(new Integer(
576
 
                                MysqlErrorNumbers.ER_TOO_MANY_USER_CONNECTIONS), "42000");
577
 
                mysqlToSql99State.put(new Integer(
578
 
                                MysqlErrorNumbers.ER_READ_ONLY_TRANSACTION), "25000");
579
 
                mysqlToSql99State.put(new Integer(
580
 
                                MysqlErrorNumbers.ER_NO_PERMISSION_TO_CREATE_USER), "42000");
581
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_LOCK_DEADLOCK),
582
 
                                "40001");
583
 
                mysqlToSql99State.put(new Integer(
584
 
                                MysqlErrorNumbers.ER_NO_REFERENCED_ROW), "23000");
585
 
                mysqlToSql99State.put(new Integer(
586
 
                                MysqlErrorNumbers.ER_ROW_IS_REFERENCED), "23000");
587
 
                mysqlToSql99State.put(new Integer(
588
 
                                MysqlErrorNumbers.ER_CONNECT_TO_MASTER), "08S01");
589
 
                mysqlToSql99State.put(new Integer(
590
 
                                MysqlErrorNumbers.ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT),
591
 
                                "21000");
592
 
                mysqlToSql99State.put(new Integer(
593
 
                                MysqlErrorNumbers.ER_USER_LIMIT_REACHED), "42000");
594
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_NO_DEFAULT),
595
 
                                "42000");
596
 
                mysqlToSql99State.put(new Integer(
597
 
                                MysqlErrorNumbers.ER_WRONG_VALUE_FOR_VAR), "42000");
598
 
                mysqlToSql99State.put(new Integer(
599
 
                                MysqlErrorNumbers.ER_WRONG_TYPE_FOR_VAR), "42000");
600
 
                mysqlToSql99State.put(new Integer(
601
 
                                MysqlErrorNumbers.ER_CANT_USE_OPTION_HERE), "42000");
602
 
                mysqlToSql99State.put(new Integer(
603
 
                                MysqlErrorNumbers.ER_NOT_SUPPORTED_YET), "42000");
604
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_WRONG_FK_DEF),
605
 
                                "42000");
606
 
                mysqlToSql99State.put(
607
 
                                new Integer(MysqlErrorNumbers.ER_OPERAND_COLUMNS), "21000");
608
 
                mysqlToSql99State.put(new Integer(
609
 
                                MysqlErrorNumbers.ER_SUBQUERY_NO_1_ROW), "21000");
610
 
                mysqlToSql99State.put(new Integer(
611
 
                                MysqlErrorNumbers.ER_ILLEGAL_REFERENCE), "42S22");
612
 
                mysqlToSql99State.put(new Integer(
613
 
                                MysqlErrorNumbers.ER_DERIVED_MUST_HAVE_ALIAS), "42000");
614
 
                mysqlToSql99State.put(new Integer(MysqlErrorNumbers.ER_SELECT_REDUCED),
615
 
                                "01000");
616
 
                mysqlToSql99State.put(new Integer(
617
 
                                MysqlErrorNumbers.ER_TABLENAME_NOT_ALLOWED_HERE), "42000");
618
 
                mysqlToSql99State.put(new Integer(
619
 
                                MysqlErrorNumbers.ER_NOT_SUPPORTED_AUTH_MODE), "08004");
620
 
                mysqlToSql99State.put(new Integer(
621
 
                                MysqlErrorNumbers.ER_SPATIAL_CANT_HAVE_NULL), "42000");
622
 
                mysqlToSql99State.put(new Integer(
623
 
                                MysqlErrorNumbers.ER_COLLATION_CHARSET_MISMATCH), "42000");
624
 
                mysqlToSql99State.put(new Integer(
625
 
                                MysqlErrorNumbers.ER_WARN_TOO_FEW_RECORDS), "01000");
626
 
                mysqlToSql99State.put(new Integer(
627
 
                                MysqlErrorNumbers.ER_WARN_TOO_MANY_RECORDS), "01000");
628
 
                mysqlToSql99State.put(new Integer(
629
 
                                MysqlErrorNumbers.ER_WARN_NULL_TO_NOTNULL), "01000");
630
 
                mysqlToSql99State.put(new Integer(
631
 
                                MysqlErrorNumbers.ER_WARN_DATA_OUT_OF_RANGE), "01000");
632
 
                mysqlToSql99State.put(new Integer(
633
 
                                MysqlErrorNumbers.ER_WARN_DATA_TRUNCATED), "01000");
634
 
                mysqlToSql99State.put(new Integer(
635
 
                                MysqlErrorNumbers.ER_WRONG_NAME_FOR_INDEX), "42000");
636
 
                mysqlToSql99State.put(new Integer(
637
 
                                MysqlErrorNumbers.ER_WRONG_NAME_FOR_CATALOG), "42000");
638
 
                mysqlToSql99State.put(new Integer(
639
 
                                MysqlErrorNumbers.ER_UNKNOWN_STORAGE_ENGINE), "42000");
640
 
        }
641
 
 
642
 
        /**
643
 
         * Turns output of 'SHOW WARNINGS' into JDBC SQLWarning instances.
644
 
         * 
645
 
         * If 'forTruncationOnly' is true, only looks for truncation warnings, and
646
 
         * actually throws DataTruncation as an exception.
647
 
         * 
648
 
         * @param connection
649
 
         *            the connection to use for getting warnings.
650
 
         * 
651
 
         * @return the SQLWarning chain (or null if no warnings)
652
 
         * 
653
 
         * @throws SQLException
654
 
         *             if the warnings could not be retrieved
655
 
         */
656
 
        static SQLWarning convertShowWarningsToSQLWarnings(Connection connection)
657
 
                        throws SQLException {
658
 
                return convertShowWarningsToSQLWarnings(connection, 0, false);
659
 
        }
660
 
 
661
 
        /**
662
 
         * Turns output of 'SHOW WARNINGS' into JDBC SQLWarning instances.
663
 
         * 
664
 
         * If 'forTruncationOnly' is true, only looks for truncation warnings, and
665
 
         * actually throws DataTruncation as an exception.
666
 
         * 
667
 
         * @param connection
668
 
         *            the connection to use for getting warnings.
669
 
         * @param warningCountIfKnown
670
 
         *            the warning count (if known), otherwise set it to 0.
671
 
         * @param forTruncationOnly
672
 
         *            if this method should only scan for data truncation warnings
673
 
         * 
674
 
         * @return the SQLWarning chain (or null if no warnings)
675
 
         * 
676
 
         * @throws SQLException
677
 
         *             if the warnings could not be retrieved, or if data truncation
678
 
         *             is being scanned for and truncations were found.
679
 
         */
680
 
        static SQLWarning convertShowWarningsToSQLWarnings(Connection connection,
681
 
                        int warningCountIfKnown, boolean forTruncationOnly)
682
 
                        throws SQLException {
683
 
                java.sql.Statement stmt = null;
684
 
                java.sql.ResultSet warnRs = null;
685
 
 
686
 
                SQLWarning currentWarning = null;
687
 
 
688
 
                try {
689
 
                        if (warningCountIfKnown < 100) {
690
 
                                stmt = connection.createStatement();
691
 
 
692
 
                                if (stmt.getMaxRows() != 0) {
693
 
                                        stmt.setMaxRows(0);
694
 
                                }
695
 
                        } else {
696
 
                                // stream large warning counts
697
 
                                stmt = connection.createStatement(
698
 
                                                java.sql.ResultSet.TYPE_FORWARD_ONLY,
699
 
                                                java.sql.ResultSet.CONCUR_READ_ONLY);
700
 
                                stmt.setFetchSize(Integer.MIN_VALUE);
701
 
                        }
702
 
 
703
 
                        /*
704
 
                         * +---------+------+---------------------------------------------+ |
705
 
                         * Level | Code | Message |
706
 
                         * +---------+------+---------------------------------------------+ |
707
 
                         * Warning | 1265 | Data truncated for column 'field1' at row 1 |
708
 
                         * +---------+------+---------------------------------------------+
709
 
                         */
710
 
                        warnRs = stmt.executeQuery("SHOW WARNINGS"); //$NON-NLS-1$
711
 
 
712
 
                        while (warnRs.next()) {
713
 
                                int code = warnRs.getInt("Code"); //$NON-NLS-1$
714
 
 
715
 
                                if (forTruncationOnly) {
716
 
                                        if (code == 1265 || code == 1264) {
717
 
                                                DataTruncation newTruncation = new MysqlDataTruncation(
718
 
                                                                warnRs.getString("Message"), 0, false, false, 0, 0); //$NON-NLS-1$
719
 
 
720
 
                                                if (currentWarning == null) {
721
 
                                                        currentWarning = newTruncation;
722
 
                                                } else {
723
 
                                                        currentWarning.setNextWarning(newTruncation);
724
 
                                                }
725
 
                                        }
726
 
                                } else {
727
 
                                        String level = warnRs.getString("Level"); //$NON-NLS-1$
728
 
                                        String message = warnRs.getString("Message"); //$NON-NLS-1$
729
 
 
730
 
                                        SQLWarning newWarning = new SQLWarning(message, SQLError
731
 
                                                        .mysqlToSqlState(code, connection
732
 
                                                                        .getUseSqlStateCodes()), code);
733
 
 
734
 
                                        if (currentWarning == null) {
735
 
                                                currentWarning = newWarning;
736
 
                                        } else {
737
 
                                                currentWarning.setNextWarning(newWarning);
738
 
                                        }
739
 
                                }
740
 
                        }
741
 
 
742
 
                        if (forTruncationOnly && (currentWarning != null)) {
743
 
                                throw currentWarning;
744
 
                        }
745
 
 
746
 
                        return currentWarning;
747
 
                } finally {
748
 
                        SQLException reThrow = null;
749
 
 
750
 
                        if (warnRs != null) {
751
 
                                try {
752
 
                                        warnRs.close();
753
 
                                } catch (SQLException sqlEx) {
754
 
                                        reThrow = sqlEx;
755
 
                                }
756
 
                        }
757
 
 
758
 
                        if (stmt != null) {
759
 
                                try {
760
 
                                        stmt.close();
761
 
                                } catch (SQLException sqlEx) {
762
 
                                        // ideally, we'd use chained exceptions here,
763
 
                                        // but we still support JDK-1.2.x with this driver
764
 
                                        // which doesn't have them....
765
 
                                        reThrow = sqlEx;
766
 
                                }
767
 
                        }
768
 
 
769
 
                        if (reThrow != null) {
770
 
                                throw reThrow;
771
 
                        }
772
 
                }
773
 
        }
774
 
 
775
 
        public static void dumpSqlStatesMappingsAsXml() throws Exception {
776
 
                TreeMap allErrorNumbers = new TreeMap();
777
 
                Map mysqlErrorNumbersToNames = new HashMap();
778
 
 
779
 
                Integer errorNumber = null;
780
 
 
781
 
                // 
782
 
                // First create a list of all 'known' error numbers that
783
 
                // are mapped.
784
 
                //
785
 
                for (Iterator mysqlErrorNumbers = mysqlToSql99State.keySet().iterator(); mysqlErrorNumbers
786
 
                                .hasNext();) {
787
 
                        errorNumber = (Integer) mysqlErrorNumbers.next();
788
 
                        allErrorNumbers.put(errorNumber, errorNumber);
789
 
                }
790
 
 
791
 
                for (Iterator mysqlErrorNumbers = mysqlToSqlState.keySet().iterator(); mysqlErrorNumbers
792
 
                                .hasNext();) {
793
 
                        errorNumber = (Integer) mysqlErrorNumbers.next();
794
 
                        allErrorNumbers.put(errorNumber, errorNumber);
795
 
                }
796
 
 
797
 
                //
798
 
                // Now create a list of the actual MySQL error numbers we know about
799
 
                //
800
 
                java.lang.reflect.Field[] possibleFields = MysqlErrorNumbers.class
801
 
                                .getDeclaredFields();
802
 
 
803
 
                for (int i = 0; i < possibleFields.length; i++) {
804
 
                        String fieldName = possibleFields[i].getName();
805
 
 
806
 
                        if (fieldName.startsWith("ER_")) {
807
 
                                mysqlErrorNumbersToNames.put(possibleFields[i].get(null),
808
 
                                                fieldName);
809
 
                        }
810
 
                }
811
 
 
812
 
                System.out.println("<ErrorMappings>");
813
 
 
814
 
                for (Iterator allErrorNumbersIter = allErrorNumbers.keySet().iterator(); allErrorNumbersIter
815
 
                                .hasNext();) {
816
 
                        errorNumber = (Integer) allErrorNumbersIter.next();
817
 
 
818
 
                        String sql92State = mysqlToSql99(errorNumber.intValue());
819
 
                        String oldSqlState = mysqlToXOpen(errorNumber.intValue());
820
 
 
821
 
                        System.out.println("   <ErrorMapping mysqlErrorNumber=\""
822
 
                                        + errorNumber + "\" mysqlErrorName=\""
823
 
                                        + mysqlErrorNumbersToNames.get(errorNumber)
824
 
                                        + "\" legacySqlState=\""
825
 
                                        + ((oldSqlState == null) ? "" : oldSqlState)
826
 
                                        + "\" sql92SqlState=\""
827
 
                                        + ((sql92State == null) ? "" : sql92State) + "\"/>");
828
 
                }
829
 
 
830
 
                System.out.println("</ErrorMappings>");
831
 
        }
832
 
 
833
 
        static String get(String stateCode) {
834
 
                return (String) sqlStateMessages.get(stateCode);
835
 
        }
836
 
 
837
 
        private static String mysqlToSql99(int errno) {
838
 
                Integer err = new Integer(errno);
839
 
 
840
 
                if (mysqlToSql99State.containsKey(err)) {
841
 
                        return (String) mysqlToSql99State.get(err);
842
 
                }
843
 
 
844
 
                return "HY000";
845
 
        }
846
 
 
847
 
        /**
848
 
         * Map MySQL error codes to X/Open or SQL-92 error codes
849
 
         * 
850
 
         * @param errno
851
 
         *            the MySQL error code
852
 
         * 
853
 
         * @return the corresponding X/Open or SQL-92 error code
854
 
         */
855
 
        static String mysqlToSqlState(int errno, boolean useSql92States) {
856
 
                if (useSql92States) {
857
 
                        return mysqlToSql99(errno);
858
 
                }
859
 
 
860
 
                return mysqlToXOpen(errno);
861
 
        }
862
 
 
863
 
        private static String mysqlToXOpen(int errno) {
864
 
                Integer err = new Integer(errno);
865
 
 
866
 
                if (mysqlToSqlState.containsKey(err)) {
867
 
                        return (String) mysqlToSqlState.get(err);
868
 
                }
869
 
 
870
 
                return SQL_STATE_GENERAL_ERROR;
871
 
        }
872
 
 
873
 
        /*
874
 
         * SQL State Class SQLNonTransientException Subclass 08
875
 
         * SQLNonTransientConnectionException 22 SQLDataException 23
876
 
         * SQLIntegrityConstraintViolationException N/A
877
 
         * SQLInvalidAuthorizationException 42 SQLSyntaxErrorException
878
 
         * 
879
 
         * SQL State Class SQLTransientException Subclass 08
880
 
         * SQLTransientConnectionException 40 SQLTransactionRollbackException N/A
881
 
         * SQLTimeoutException
882
 
         */
883
 
 
884
 
        public static SQLException createSQLException(String message,
885
 
                        String sqlState) {
886
 
                if (sqlState != null) {
887
 
                        if (sqlState.startsWith("08")) {
888
 
                                return new MySQLNonTransientConnectionException(message,
889
 
                                                sqlState);
890
 
                        }
891
 
 
892
 
                        if (sqlState.startsWith("22")) {
893
 
                                return new MySQLDataException(message, sqlState);
894
 
                        }
895
 
 
896
 
                        if (sqlState.startsWith("23")) {
897
 
                                return new MySQLIntegrityConstraintViolationException(message,
898
 
                                                sqlState);
899
 
                        }
900
 
 
901
 
                        if (sqlState.startsWith("42")) {
902
 
                                return new MySQLSyntaxErrorException(message, sqlState);
903
 
                        }
904
 
 
905
 
                        if (sqlState.startsWith("40")) {
906
 
                                return new MySQLTransactionRollbackException(message, sqlState);
907
 
                        }
908
 
                }
909
 
 
910
 
                return new SQLException(message, sqlState);
911
 
        }
912
 
 
913
 
        public static SQLException createSQLException(String message) {
914
 
                return new SQLException(message);
915
 
        }
916
 
 
917
 
        public static SQLException createSQLException(String message,
918
 
                        String sqlState, int vendorErrorCode) {
919
 
                if (sqlState != null) {
920
 
                        if (sqlState.startsWith("08")) {
921
 
                                return new MySQLNonTransientConnectionException(message,
922
 
                                                sqlState, vendorErrorCode);
923
 
                        }
924
 
 
925
 
                        if (sqlState.startsWith("22")) {
926
 
                                return new MySQLDataException(message, sqlState,
927
 
                                                vendorErrorCode);
928
 
                        }
929
 
 
930
 
                        if (sqlState.startsWith("23")) {
931
 
                                return new MySQLIntegrityConstraintViolationException(message,
932
 
                                                sqlState, vendorErrorCode);
933
 
                        }
934
 
 
935
 
                        if (sqlState.startsWith("42")) {
936
 
                                return new MySQLSyntaxErrorException(message, sqlState,
937
 
                                                vendorErrorCode);
938
 
                        }
939
 
 
940
 
                        if (sqlState.startsWith("40")) {
941
 
                                return new MySQLTransactionRollbackException(message, sqlState,
942
 
                                                vendorErrorCode);
943
 
                        }
944
 
                }
945
 
 
946
 
                return new SQLException(message, sqlState, vendorErrorCode);
947
 
        }
948
 
}