Save This Page
Home » MySQL-JDBC-5.1.11 » com.mysql.jdbc » [javadoc | source]
    1   /*
    2    Copyright  2002-2007 MySQL AB, 2008 Sun Microsystems
    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.lang.reflect.Constructor;
   28   import java.lang.reflect.Method;
   29   import java.net.BindException;
   30   import java.sql.DataTruncation;
   31   import java.sql.SQLException;
   32   import java.sql.SQLWarning;
   33   import java.util.HashMap;
   34   import java.util.Hashtable;
   35   import java.util.Iterator;
   36   import java.util.Map;
   37   import java.util.TreeMap;
   38   
   39   import com.mysql.jdbc.exceptions.MySQLDataException;
   40   import com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException;
   41   import com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException;
   42   import com.mysql.jdbc.exceptions.MySQLSyntaxErrorException;
   43   import com.mysql.jdbc.exceptions.MySQLTransactionRollbackException;
   44   import com.mysql.jdbc.exceptions.MySQLTransientConnectionException;
   45   
   46   /**
   47    * SQLError is a utility class that maps MySQL error codes to X/Open error codes
   48    * as is required by the JDBC spec.
   49    * 
   50    * @author Mark Matthews <mmatthew_at_worldserver.com>
   51    * @version $Id: SQLError.java 5122 2006-04-03 15:37:11 +0000 (Mon, 03 Apr 2006)
   52    *          mmatthews $
   53    */
   54   public class SQLError {
   55   	static final int ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196;
   56   
   57   	private static Map mysqlToSql99State;
   58   
   59   	private static Map mysqlToSqlState;
   60   
   61   	public static final String SQL_STATE_BASE_TABLE_NOT_FOUND = "S0002"; //$NON-NLS-1$
   62   
   63   	public static final String SQL_STATE_BASE_TABLE_OR_VIEW_ALREADY_EXISTS = "S0001"; //$NON-NLS-1$
   64   
   65   	public static final String SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND = "42S02"; //$NON-NLS-1$
   66   
   67   	public static final String SQL_STATE_COLUMN_ALREADY_EXISTS = "S0021"; //$NON-NLS-1$
   68   
   69   	public static final String SQL_STATE_COLUMN_NOT_FOUND = "S0022"; //$NON-NLS-1$
   70   
   71   	public static final String SQL_STATE_COMMUNICATION_LINK_FAILURE = "08S01"; //$NON-NLS-1$
   72   
   73   	public static final String SQL_STATE_CONNECTION_FAIL_DURING_TX = "08007"; //$NON-NLS-1$
   74   
   75   	public static final String SQL_STATE_CONNECTION_IN_USE = "08002"; //$NON-NLS-1$
   76   
   77   	public static final String SQL_STATE_CONNECTION_NOT_OPEN = "08003"; //$NON-NLS-1$
   78   
   79   	public static final String SQL_STATE_CONNECTION_REJECTED = "08004"; //$NON-NLS-1$
   80   
   81   	public static final String SQL_STATE_DATE_TRUNCATED = "01004"; //$NON-NLS-1$
   82   
   83   	public static final String SQL_STATE_DATETIME_FIELD_OVERFLOW = "22008"; //$NON-NLS-1$
   84   
   85   	public static final String SQL_STATE_DEADLOCK = "41000"; //$NON-NLS-1$
   86   
   87   	public static final String SQL_STATE_DISCONNECT_ERROR = "01002"; //$NON-NLS-1$
   88   
   89   	public static final String SQL_STATE_DIVISION_BY_ZERO = "22012"; //$NON-NLS-1$
   90   
   91   	public static final String SQL_STATE_DRIVER_NOT_CAPABLE = "S1C00"; //$NON-NLS-1$
   92   
   93   	public static final String SQL_STATE_ERROR_IN_ROW = "01S01"; //$NON-NLS-1$
   94   
   95   	public static final String SQL_STATE_GENERAL_ERROR = "S1000"; //$NON-NLS-1$
   96   
   97   	public static final String SQL_STATE_ILLEGAL_ARGUMENT = "S1009"; //$NON-NLS-1$
   98   
   99   	public static final String SQL_STATE_INDEX_ALREADY_EXISTS = "S0011"; //$NON-NLS-1$
  100   
  101   	public static final String SQL_STATE_INDEX_NOT_FOUND = "S0012"; //$NON-NLS-1$
  102   
  103   	public static final String SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST = "21S01"; //$NON-NLS-1$
  104   
  105   	public static final String SQL_STATE_INVALID_AUTH_SPEC = "28000"; //$NON-NLS-1$
  106   
  107   	public static final String SQL_STATE_INVALID_CHARACTER_VALUE_FOR_CAST = "22018"; // $NON_NLS-1$
  108   
  109   	public static final String SQL_STATE_INVALID_COLUMN_NUMBER = "S1002"; //$NON-NLS-1$
  110   
  111   	public static final String SQL_STATE_INVALID_CONNECTION_ATTRIBUTE = "01S00"; //$NON-NLS-1$
  112   
  113   	public static final String SQL_STATE_MEMORY_ALLOCATION_FAILURE = "S1001"; //$NON-NLS-1$
  114   
  115   	public static final String SQL_STATE_MORE_THAN_ONE_ROW_UPDATED_OR_DELETED = "01S04"; //$NON-NLS-1$
  116   
  117   	public static final String SQL_STATE_NO_DEFAULT_FOR_COLUMN = "S0023"; //$NON-NLS-1$
  118   
  119   	public static final String SQL_STATE_NO_ROWS_UPDATED_OR_DELETED = "01S03"; //$NON-NLS-1$
  120   
  121   	public static final String SQL_STATE_NUMERIC_VALUE_OUT_OF_RANGE = "22003"; //$NON-NLS-1$
  122   
  123   	public static final String SQL_STATE_PRIVILEGE_NOT_REVOKED = "01006"; //$NON-NLS-1$
  124   
  125   	public static final String SQL_STATE_SYNTAX_ERROR = "42000"; //$NON-NLS-1$
  126   
  127   	public static final String SQL_STATE_TIMEOUT_EXPIRED = "S1T00"; //$NON-NLS-1$
  128   
  129   	public static final String SQL_STATE_TRANSACTION_RESOLUTION_UNKNOWN = "08007"; // $NON_NLS-1$
  130   
  131   	public static final String SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE = "08001"; //$NON-NLS-1$
  132   
  133   	public static final String SQL_STATE_WRONG_NO_OF_PARAMETERS = "07001"; //$NON-NLS-1$
  134   
  135   	public static final String SQL_STATE_INVALID_TRANSACTION_TERMINATION = "2D000"; // $NON_NLS-1$
  136   
  137   	private static Map sqlStateMessages;
  138   
  139   	private static final long DEFAULT_WAIT_TIMEOUT_SECONDS = 28800;
  140   
  141   	private static final int DUE_TO_TIMEOUT_FALSE = 0;
  142   
  143   	private static final int DUE_TO_TIMEOUT_MAYBE = 2;
  144   
  145   	private static final int DUE_TO_TIMEOUT_TRUE = 1;
  146   	
  147   	private static final Constructor JDBC_4_COMMUNICATIONS_EXCEPTION_CTOR;
  148   	
  149   	private static Method THROWABLE_INIT_CAUSE_METHOD;
  150   	
  151   	static {
  152   		if (Util.isJdbc4()) {
  153   			try {
  154   				JDBC_4_COMMUNICATIONS_EXCEPTION_CTOR = Class.forName(
  155   						"com.mysql.jdbc.exceptions.jdbc4.CommunicationsException")
  156   						.getConstructor(
  157   								new Class[] { ConnectionImpl.class, Long.TYPE, Long.TYPE, Exception.class });
  158   			} catch (SecurityException e) {
  159   				throw new RuntimeException(e);
  160   			} catch (NoSuchMethodException e) {
  161   				throw new RuntimeException(e);
  162   			} catch (ClassNotFoundException e) {
  163   				throw new RuntimeException(e);
  164   			}
  165   		} else {
  166   			JDBC_4_COMMUNICATIONS_EXCEPTION_CTOR = null;
  167   		}
  168   		
  169   		try {
  170   			THROWABLE_INIT_CAUSE_METHOD = Throwable.class.getMethod("initCause", new Class[] {Throwable.class});
  171   		} catch (Throwable t) {
  172   			// we're not on a VM that has it
  173   			THROWABLE_INIT_CAUSE_METHOD = null;
  174   		}
  175   		
  176   		sqlStateMessages = new HashMap();
  177   		sqlStateMessages.put(SQL_STATE_DISCONNECT_ERROR, Messages
  178   				.getString("SQLError.35")); //$NON-NLS-1$
  179   		sqlStateMessages.put(SQL_STATE_DATE_TRUNCATED, Messages
  180   				.getString("SQLError.36")); //$NON-NLS-1$
  181   		sqlStateMessages.put(SQL_STATE_PRIVILEGE_NOT_REVOKED, Messages
  182   				.getString("SQLError.37")); //$NON-NLS-1$
  183   		sqlStateMessages.put(SQL_STATE_INVALID_CONNECTION_ATTRIBUTE, Messages
  184   				.getString("SQLError.38")); //$NON-NLS-1$
  185   		sqlStateMessages.put(SQL_STATE_ERROR_IN_ROW, Messages
  186   				.getString("SQLError.39")); //$NON-NLS-1$
  187   		sqlStateMessages.put(SQL_STATE_NO_ROWS_UPDATED_OR_DELETED, Messages
  188   				.getString("SQLError.40")); //$NON-NLS-1$
  189   		sqlStateMessages.put(SQL_STATE_MORE_THAN_ONE_ROW_UPDATED_OR_DELETED,
  190   				Messages.getString("SQLError.41")); //$NON-NLS-1$
  191   		sqlStateMessages.put(SQL_STATE_WRONG_NO_OF_PARAMETERS, Messages
  192   				.getString("SQLError.42")); //$NON-NLS-1$
  193   		sqlStateMessages.put(SQL_STATE_UNABLE_TO_CONNECT_TO_DATASOURCE,
  194   				Messages.getString("SQLError.43")); //$NON-NLS-1$
  195   		sqlStateMessages.put(SQL_STATE_CONNECTION_IN_USE, Messages
  196   				.getString("SQLError.44")); //$NON-NLS-1$
  197   		sqlStateMessages.put(SQL_STATE_CONNECTION_NOT_OPEN, Messages
  198   				.getString("SQLError.45")); //$NON-NLS-1$
  199   		sqlStateMessages.put(SQL_STATE_CONNECTION_REJECTED, Messages
  200   				.getString("SQLError.46")); //$NON-NLS-1$
  201   		sqlStateMessages.put(SQL_STATE_CONNECTION_FAIL_DURING_TX, Messages
  202   				.getString("SQLError.47")); //$NON-NLS-1$
  203   		sqlStateMessages.put(SQL_STATE_COMMUNICATION_LINK_FAILURE, Messages
  204   				.getString("SQLError.48")); //$NON-NLS-1$
  205   		sqlStateMessages.put(SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST,
  206   				Messages.getString("SQLError.49")); //$NON-NLS-1$
  207   		sqlStateMessages.put(SQL_STATE_NUMERIC_VALUE_OUT_OF_RANGE, Messages
  208   				.getString("SQLError.50")); //$NON-NLS-1$
  209   		sqlStateMessages.put(SQL_STATE_DATETIME_FIELD_OVERFLOW, Messages
  210   				.getString("SQLError.51")); //$NON-NLS-1$
  211   		sqlStateMessages.put(SQL_STATE_DIVISION_BY_ZERO, Messages
  212   				.getString("SQLError.52")); //$NON-NLS-1$
  213   		sqlStateMessages.put(SQL_STATE_DEADLOCK, Messages
  214   				.getString("SQLError.53")); //$NON-NLS-1$
  215   		sqlStateMessages.put(SQL_STATE_INVALID_AUTH_SPEC, Messages
  216   				.getString("SQLError.54")); //$NON-NLS-1$
  217   		sqlStateMessages.put(SQL_STATE_SYNTAX_ERROR, Messages
  218   				.getString("SQLError.55")); //$NON-NLS-1$
  219   		sqlStateMessages.put(SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND, Messages
  220   				.getString("SQLError.56")); //$NON-NLS-1$
  221   		sqlStateMessages.put(SQL_STATE_BASE_TABLE_OR_VIEW_ALREADY_EXISTS,
  222   				Messages.getString("SQLError.57")); //$NON-NLS-1$
  223   		sqlStateMessages.put(SQL_STATE_BASE_TABLE_NOT_FOUND, Messages
  224   				.getString("SQLError.58")); //$NON-NLS-1$
  225   		sqlStateMessages.put(SQL_STATE_INDEX_ALREADY_EXISTS, Messages
  226   				.getString("SQLError.59")); //$NON-NLS-1$
  227   		sqlStateMessages.put(SQL_STATE_INDEX_NOT_FOUND, Messages
  228   				.getString("SQLError.60")); //$NON-NLS-1$
  229   		sqlStateMessages.put(SQL_STATE_COLUMN_ALREADY_EXISTS, Messages
  230   				.getString("SQLError.61")); //$NON-NLS-1$
  231   		sqlStateMessages.put(SQL_STATE_COLUMN_NOT_FOUND, Messages
  232   				.getString("SQLError.62")); //$NON-NLS-1$
  233   		sqlStateMessages.put(SQL_STATE_NO_DEFAULT_FOR_COLUMN, Messages
  234   				.getString("SQLError.63")); //$NON-NLS-1$
  235   		sqlStateMessages.put(SQL_STATE_GENERAL_ERROR, Messages
  236   				.getString("SQLError.64")); //$NON-NLS-1$
  237   		sqlStateMessages.put(SQL_STATE_MEMORY_ALLOCATION_FAILURE, Messages
  238   				.getString("SQLError.65")); //$NON-NLS-1$
  239   		sqlStateMessages.put(SQL_STATE_INVALID_COLUMN_NUMBER, Messages
  240   				.getString("SQLError.66")); //$NON-NLS-1$
  241   		sqlStateMessages.put(SQL_STATE_ILLEGAL_ARGUMENT, Messages
  242   				.getString("SQLError.67")); //$NON-NLS-1$
  243   		sqlStateMessages.put(SQL_STATE_DRIVER_NOT_CAPABLE, Messages
  244   				.getString("SQLError.68")); //$NON-NLS-1$
  245   		sqlStateMessages.put(SQL_STATE_TIMEOUT_EXPIRED, Messages
  246   				.getString("SQLError.69")); //$NON-NLS-1$
  247   
  248   		mysqlToSqlState = new Hashtable();
  249   
  250   		//
  251   		// Communications Errors
  252   		//
  253   		// ER_CON_COUNT_ERROR 1040
  254   		// ER_BAD_HOST_ERROR 1042
  255   		// ER_HANDSHAKE_ERROR 1043
  256   		// ER_UNKNOWN_COM_ERROR 1047
  257   		// ER_IPSOCK_ERROR 1081
  258   		//
  259   		mysqlToSqlState.put(Constants.integerValueOf(1040), SQL_STATE_CONNECTION_REJECTED);
  260   		mysqlToSqlState.put(Constants.integerValueOf(1042), SQL_STATE_CONNECTION_REJECTED);
  261   		mysqlToSqlState.put(Constants.integerValueOf(1043), SQL_STATE_CONNECTION_REJECTED);
  262   		mysqlToSqlState.put(Constants.integerValueOf(1047),
  263   				SQL_STATE_COMMUNICATION_LINK_FAILURE);
  264   		mysqlToSqlState.put(Constants.integerValueOf(1081),
  265   				SQL_STATE_COMMUNICATION_LINK_FAILURE);
  266   
  267   		// ER_HOST_IS_BLOCKED 1129
  268   		// ER_HOST_NOT_PRIVILEGED 1130
  269   		mysqlToSqlState.put(Constants.integerValueOf(1129), SQL_STATE_CONNECTION_REJECTED);
  270   		mysqlToSqlState.put(Constants.integerValueOf(1130), SQL_STATE_CONNECTION_REJECTED);
  271   
  272   		//
  273   		// Authentication Errors
  274   		//
  275   		// ER_ACCESS_DENIED_ERROR 1045
  276   		//
  277   		mysqlToSqlState.put(Constants.integerValueOf(1045), SQL_STATE_INVALID_AUTH_SPEC);
  278   
  279   		//
  280   		// Resource errors
  281   		//
  282   		// ER_CANT_CREATE_FILE 1004
  283   		// ER_CANT_CREATE_TABLE 1005
  284   		// ER_CANT_LOCK 1015
  285   		// ER_DISK_FULL 1021
  286   		// ER_CON_COUNT_ERROR 1040
  287   		// ER_OUT_OF_RESOURCES 1041
  288   		//
  289   		// Out-of-memory errors
  290   		//
  291   		// ER_OUTOFMEMORY 1037
  292   		// ER_OUT_OF_SORTMEMORY 1038
  293   		//
  294   		mysqlToSqlState.put(Constants.integerValueOf(1037),
  295   				SQL_STATE_MEMORY_ALLOCATION_FAILURE);
  296   		mysqlToSqlState.put(Constants.integerValueOf(1038),
  297   				SQL_STATE_MEMORY_ALLOCATION_FAILURE);
  298   
  299   		//
  300   		// Syntax Errors
  301   		//
  302   		// ER_PARSE_ERROR 1064
  303   		// ER_EMPTY_QUERY 1065
  304   		//
  305   		mysqlToSqlState.put(Constants.integerValueOf(1064), SQL_STATE_SYNTAX_ERROR);
  306   		mysqlToSqlState.put(Constants.integerValueOf(1065), SQL_STATE_SYNTAX_ERROR);
  307   
  308   		//
  309   		// Invalid argument errors
  310   		//
  311   		// ER_WRONG_FIELD_WITH_GROUP 1055
  312   		// ER_WRONG_GROUP_FIELD 1056
  313   		// ER_WRONG_SUM_SELECT 1057
  314   		// ER_TOO_LONG_IDENT 1059
  315   		// ER_DUP_FIELDNAME 1060
  316   		// ER_DUP_KEYNAME 1061
  317   		// ER_DUP_ENTRY 1062
  318   		// ER_WRONG_FIELD_SPEC 1063
  319   		// ER_NONUNIQ_TABLE 1066
  320   		// ER_INVALID_DEFAULT 1067
  321   		// ER_MULTIPLE_PRI_KEY 1068
  322   		// ER_TOO_MANY_KEYS 1069
  323   		// ER_TOO_MANY_KEY_PARTS 1070
  324   		// ER_TOO_LONG_KEY 1071
  325   		// ER_KEY_COLUMN_DOES_NOT_EXIST 1072
  326   		// ER_BLOB_USED_AS_KEY 1073
  327   		// ER_TOO_BIG_FIELDLENGTH 1074
  328   		// ER_WRONG_AUTO_KEY 1075
  329   		// ER_NO_SUCH_INDEX 1082
  330   		// ER_WRONG_FIELD_TERMINATORS 1083
  331   		// ER_BLOBS_AND_NO_TERMINATED 1084
  332   		//
  333   		mysqlToSqlState.put(Constants.integerValueOf(1055), SQL_STATE_ILLEGAL_ARGUMENT);
  334   		mysqlToSqlState.put(Constants.integerValueOf(1056), SQL_STATE_ILLEGAL_ARGUMENT);
  335   		mysqlToSqlState.put(Constants.integerValueOf(1057), SQL_STATE_ILLEGAL_ARGUMENT);
  336   		mysqlToSqlState.put(Constants.integerValueOf(1059), SQL_STATE_ILLEGAL_ARGUMENT);
  337   		mysqlToSqlState.put(Constants.integerValueOf(1060), SQL_STATE_ILLEGAL_ARGUMENT);
  338   		mysqlToSqlState.put(Constants.integerValueOf(1061), SQL_STATE_ILLEGAL_ARGUMENT);
  339   		mysqlToSqlState.put(Constants.integerValueOf(1062), SQL_STATE_ILLEGAL_ARGUMENT);
  340   		mysqlToSqlState.put(Constants.integerValueOf(1063), SQL_STATE_ILLEGAL_ARGUMENT);
  341   		mysqlToSqlState.put(Constants.integerValueOf(1066), SQL_STATE_ILLEGAL_ARGUMENT);
  342   		mysqlToSqlState.put(Constants.integerValueOf(1067), SQL_STATE_ILLEGAL_ARGUMENT);
  343   		mysqlToSqlState.put(Constants.integerValueOf(1068), SQL_STATE_ILLEGAL_ARGUMENT);
  344   		mysqlToSqlState.put(Constants.integerValueOf(1069), SQL_STATE_ILLEGAL_ARGUMENT);
  345   		mysqlToSqlState.put(Constants.integerValueOf(1070), SQL_STATE_ILLEGAL_ARGUMENT);
  346   		mysqlToSqlState.put(Constants.integerValueOf(1071), SQL_STATE_ILLEGAL_ARGUMENT);
  347   		mysqlToSqlState.put(Constants.integerValueOf(1072), SQL_STATE_ILLEGAL_ARGUMENT);
  348   		mysqlToSqlState.put(Constants.integerValueOf(1073), SQL_STATE_ILLEGAL_ARGUMENT);
  349   		mysqlToSqlState.put(Constants.integerValueOf(1074), SQL_STATE_ILLEGAL_ARGUMENT);
  350   		mysqlToSqlState.put(Constants.integerValueOf(1075), SQL_STATE_ILLEGAL_ARGUMENT);
  351   		mysqlToSqlState.put(Constants.integerValueOf(1082), SQL_STATE_ILLEGAL_ARGUMENT);
  352   		mysqlToSqlState.put(Constants.integerValueOf(1083), SQL_STATE_ILLEGAL_ARGUMENT);
  353   		mysqlToSqlState.put(Constants.integerValueOf(1084), SQL_STATE_ILLEGAL_ARGUMENT);
  354   
  355   		//
  356   		// ER_WRONG_VALUE_COUNT 1058
  357   		//
  358   		mysqlToSqlState.put(Constants.integerValueOf(1058),
  359   				SQL_STATE_INSERT_VALUE_LIST_NO_MATCH_COL_LIST);
  360   
  361   		// ER_CANT_CREATE_DB 1006
  362   		// ER_DB_CREATE_EXISTS 1007
  363   		// ER_DB_DROP_EXISTS 1008
  364   		// ER_DB_DROP_DELETE 1009
  365   		// ER_DB_DROP_RMDIR 1010
  366   		// ER_CANT_DELETE_FILE 1011
  367   		// ER_CANT_FIND_SYSTEM_REC 1012
  368   		// ER_CANT_GET_STAT 1013
  369   		// ER_CANT_GET_WD 1014
  370   		// ER_UNEXPECTED_EOF 1039
  371   		// ER_CANT_OPEN_FILE 1016
  372   		// ER_FILE_NOT_FOUND 1017
  373   		// ER_CANT_READ_DIR 1018
  374   		// ER_CANT_SET_WD 1019
  375   		// ER_CHECKREAD 1020
  376   		// ER_DUP_KEY 1022
  377   		// ER_ERROR_ON_CLOSE 1023
  378   		// ER_ERROR_ON_READ 1024
  379   		// ER_ERROR_ON_RENAME 1025
  380   		// ER_ERROR_ON_WRITE 1026
  381   		// ER_FILE_USED 1027
  382   		// ER_FILSORT_ABORT 1028
  383   		// ER_FORM_NOT_FOUND 1029
  384   		// ER_GET_ERRNO 1030
  385   		// ER_ILLEGAL_HA 1031
  386   		// ER_KEY_NOT_FOUND 1032
  387   		// ER_NOT_FORM_FILE 1033
  388   		// ER_DBACCESS_DENIED_ERROR 1044
  389   		// ER_NO_DB_ERROR 1046
  390   		// ER_BAD_NULL_ERROR 1048
  391   		// ER_BAD_DB_ERROR 1049
  392   		// ER_TABLE_EXISTS_ERROR 1050
  393   		// ER_BAD_TABLE_ERROR 1051
  394   		mysqlToSqlState.put(Constants.integerValueOf(1051),
  395   				SQL_STATE_BASE_TABLE_OR_VIEW_NOT_FOUND);
  396   
  397   		// ER_NON_UNIQ_ERROR 1052
  398   		// ER_BAD_FIELD_ERROR 1054
  399   		mysqlToSqlState.put(Constants.integerValueOf(1054), SQL_STATE_COLUMN_NOT_FOUND);
  400   
  401   		// ER_TEXTFILE_NOT_READABLE 1085
  402   		// ER_FILE_EXISTS_ERROR 1086
  403   		// ER_LOAD_INFO 1087
  404   		// ER_ALTER_INFO 1088
  405   		// ER_WRONG_SUB_KEY 1089
  406   		// ER_CANT_REMOVE_ALL_FIELDS 1090
  407   		// ER_CANT_DROP_FIELD_OR_KEY 1091
  408   		// ER_INSERT_INFO 1092
  409   		// ER_INSERT_TABLE_USED 1093
  410   		// ER_LOCK_DEADLOCK 1213
  411   		mysqlToSqlState.put(Constants.integerValueOf(1205), SQL_STATE_DEADLOCK);
  412   		mysqlToSqlState.put(Constants.integerValueOf(1213), SQL_STATE_DEADLOCK);
  413   
  414   		mysqlToSql99State = new HashMap();
  415   
  416   		mysqlToSql99State.put(Constants.integerValueOf(1205), SQL_STATE_DEADLOCK);
  417   		mysqlToSql99State.put(Constants.integerValueOf(1213), SQL_STATE_DEADLOCK);
  418   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_DUP_KEY),
  419   				"23000");
  420   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_OUTOFMEMORY),
  421   				"HY001");
  422   		mysqlToSql99State.put(Constants.integerValueOf(
  423   				MysqlErrorNumbers.ER_OUT_OF_SORTMEMORY), "HY001");
  424   		mysqlToSql99State.put(
  425   				Constants.integerValueOf(MysqlErrorNumbers.ER_CON_COUNT_ERROR), "08004");
  426   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_BAD_HOST_ERROR),
  427   				"08S01");
  428   		mysqlToSql99State.put(
  429   				Constants.integerValueOf(MysqlErrorNumbers.ER_HANDSHAKE_ERROR), "08S01");
  430   		mysqlToSql99State.put(Constants.integerValueOf(
  431   				MysqlErrorNumbers.ER_DBACCESS_DENIED_ERROR), "42000");
  432   		mysqlToSql99State.put(Constants.integerValueOf(
  433   				MysqlErrorNumbers.ER_ACCESS_DENIED_ERROR), "28000");
  434   		mysqlToSql99State.put(Constants.integerValueOf(
  435   				MysqlErrorNumbers.ER_TABLE_EXISTS_ERROR), "42S01");
  436   		mysqlToSql99State.put(
  437   				Constants.integerValueOf(MysqlErrorNumbers.ER_BAD_TABLE_ERROR), "42S02");
  438   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_NON_UNIQ_ERROR),
  439   				"23000");
  440   		mysqlToSql99State.put(
  441   				Constants.integerValueOf(MysqlErrorNumbers.ER_SERVER_SHUTDOWN), "08S01");
  442   		mysqlToSql99State.put(
  443   				Constants.integerValueOf(MysqlErrorNumbers.ER_BAD_FIELD_ERROR), "42S22");
  444   		mysqlToSql99State.put(Constants.integerValueOf(
  445   				MysqlErrorNumbers.ER_WRONG_FIELD_WITH_GROUP), "42000");
  446   		mysqlToSql99State.put(Constants.integerValueOf(
  447   				MysqlErrorNumbers.ER_WRONG_GROUP_FIELD), "42000");
  448   		mysqlToSql99State.put(
  449   				Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_SUM_SELECT), "42000");
  450   		mysqlToSql99State.put(Constants.integerValueOf(
  451   				MysqlErrorNumbers.ER_WRONG_VALUE_COUNT), "21S01");
  452   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_LONG_IDENT),
  453   				"42000");
  454   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_DUP_FIELDNAME),
  455   				"42S21");
  456   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_DUP_KEYNAME),
  457   				"42000");
  458   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_DUP_ENTRY),
  459   				"23000");
  460   		mysqlToSql99State.put(
  461   				Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_FIELD_SPEC), "42000");
  462   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_PARSE_ERROR),
  463   				"42000");
  464   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_EMPTY_QUERY),
  465   				"42000");
  466   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_NONUNIQ_TABLE),
  467   				"42000");
  468   		mysqlToSql99State.put(
  469   				Constants.integerValueOf(MysqlErrorNumbers.ER_INVALID_DEFAULT), "42000");
  470   		mysqlToSql99State.put(
  471   				Constants.integerValueOf(MysqlErrorNumbers.ER_MULTIPLE_PRI_KEY), "42000");
  472   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_MANY_KEYS),
  473   				"42000");
  474   		mysqlToSql99State.put(Constants.integerValueOf(
  475   				MysqlErrorNumbers.ER_TOO_MANY_KEY_PARTS), "42000");
  476   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_LONG_KEY),
  477   				"42000");
  478   		mysqlToSql99State.put(Constants.integerValueOf(
  479   				MysqlErrorNumbers.ER_KEY_COLUMN_DOES_NOT_EXITS), "42000");
  480   		mysqlToSql99State.put(
  481   				Constants.integerValueOf(MysqlErrorNumbers.ER_BLOB_USED_AS_KEY), "42000");
  482   		mysqlToSql99State.put(Constants.integerValueOf(
  483   				MysqlErrorNumbers.ER_TOO_BIG_FIELDLENGTH), "42000");
  484   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_AUTO_KEY),
  485   				"42000");
  486   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_FORCING_CLOSE),
  487   				"08S01");
  488   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_IPSOCK_ERROR),
  489   				"08S01");
  490   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_NO_SUCH_INDEX),
  491   				"42S12");
  492   		mysqlToSql99State.put(Constants.integerValueOf(
  493   				MysqlErrorNumbers.ER_WRONG_FIELD_TERMINATORS), "42000");
  494   		mysqlToSql99State.put(Constants.integerValueOf(
  495   				MysqlErrorNumbers.ER_BLOBS_AND_NO_TERMINATED), "42000");
  496   		mysqlToSql99State.put(Constants.integerValueOf(
  497   				MysqlErrorNumbers.ER_CANT_REMOVE_ALL_FIELDS), "42000");
  498   		mysqlToSql99State.put(Constants.integerValueOf(
  499   				MysqlErrorNumbers.ER_CANT_DROP_FIELD_OR_KEY), "42000");
  500   		mysqlToSql99State.put(Constants.integerValueOf(
  501   				MysqlErrorNumbers.ER_BLOB_CANT_HAVE_DEFAULT), "42000");
  502   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_DB_NAME),
  503   				"42000");
  504   		mysqlToSql99State.put(
  505   				Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_TABLE_NAME), "42000");
  506   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_BIG_SELECT),
  507   				"42000");
  508   		mysqlToSql99State.put(Constants.integerValueOf(
  509   				MysqlErrorNumbers.ER_UNKNOWN_PROCEDURE), "42000");
  510   		mysqlToSql99State.put(Constants.integerValueOf(
  511   				MysqlErrorNumbers.ER_WRONG_PARAMCOUNT_TO_PROCEDURE), "42000");
  512   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_UNKNOWN_TABLE),
  513   				"42S02");
  514   		mysqlToSql99State.put(Constants.integerValueOf(
  515   				MysqlErrorNumbers.ER_FIELD_SPECIFIED_TWICE), "42000");
  516   		mysqlToSql99State.put(Constants.integerValueOf(
  517   				MysqlErrorNumbers.ER_UNSUPPORTED_EXTENSION), "42000");
  518   		mysqlToSql99State.put(Constants.integerValueOf(
  519   				MysqlErrorNumbers.ER_TABLE_MUST_HAVE_COLUMNS), "42000");
  520   		mysqlToSql99State.put(Constants.integerValueOf(
  521   				MysqlErrorNumbers.ER_UNKNOWN_CHARACTER_SET), "42000");
  522   		mysqlToSql99State.put(
  523   				Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_BIG_ROWSIZE), "42000");
  524   		mysqlToSql99State.put(
  525   				Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_OUTER_JOIN), "42000");
  526   		mysqlToSql99State.put(Constants.integerValueOf(
  527   				MysqlErrorNumbers.ER_NULL_COLUMN_IN_INDEX), "42000");
  528   		mysqlToSql99State.put(Constants.integerValueOf(
  529   				MysqlErrorNumbers.ER_PASSWORD_ANONYMOUS_USER), "42000");
  530   		mysqlToSql99State.put(Constants.integerValueOf(
  531   				MysqlErrorNumbers.ER_PASSWORD_NOT_ALLOWED), "42000");
  532   		mysqlToSql99State.put(Constants.integerValueOf(
  533   				MysqlErrorNumbers.ER_PASSWORD_NO_MATCH), "42000");
  534   		mysqlToSql99State.put(Constants.integerValueOf(
  535   				MysqlErrorNumbers.ER_WRONG_VALUE_COUNT_ON_ROW), "21S01");
  536   		mysqlToSql99State.put(Constants.integerValueOf(
  537   				MysqlErrorNumbers.ER_INVALID_USE_OF_NULL), "42000");
  538   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_REGEXP_ERROR),
  539   				"42000");
  540   		mysqlToSql99State.put(Constants.integerValueOf(
  541   				MysqlErrorNumbers.ER_MIX_OF_GROUP_FUNC_AND_FIELDS), "42000");
  542   		mysqlToSql99State.put(Constants.integerValueOf(
  543   				MysqlErrorNumbers.ER_NONEXISTING_GRANT), "42000");
  544   		mysqlToSql99State.put(Constants.integerValueOf(
  545   				MysqlErrorNumbers.ER_TABLEACCESS_DENIED_ERROR), "42000");
  546   		mysqlToSql99State.put(Constants.integerValueOf(
  547   				MysqlErrorNumbers.ER_COLUMNACCESS_DENIED_ERROR), "42000");
  548   		mysqlToSql99State.put(Constants.integerValueOf(
  549   				MysqlErrorNumbers.ER_ILLEGAL_GRANT_FOR_TABLE), "42000");
  550   		mysqlToSql99State.put(Constants.integerValueOf(
  551   				MysqlErrorNumbers.ER_GRANT_WRONG_HOST_OR_USER), "42000");
  552   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_NO_SUCH_TABLE),
  553   				"42S02");
  554   		mysqlToSql99State.put(Constants.integerValueOf(
  555   				MysqlErrorNumbers.ER_NONEXISTING_TABLE_GRANT), "42000");
  556   		mysqlToSql99State.put(Constants.integerValueOf(
  557   				MysqlErrorNumbers.ER_NOT_ALLOWED_COMMAND), "42000");
  558   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_SYNTAX_ERROR),
  559   				"42000");
  560   		mysqlToSql99State.put(Constants.integerValueOf(
  561   				MysqlErrorNumbers.ER_ABORTING_CONNECTION), "08S01");
  562   		mysqlToSql99State.put(Constants.integerValueOf(
  563   				MysqlErrorNumbers.ER_NET_PACKET_TOO_LARGE), "08S01");
  564   		mysqlToSql99State.put(Constants.integerValueOf(
  565   				MysqlErrorNumbers.ER_NET_READ_ERROR_FROM_PIPE), "08S01");
  566   		mysqlToSql99State.put(
  567   				Constants.integerValueOf(MysqlErrorNumbers.ER_NET_FCNTL_ERROR), "08S01");
  568   		mysqlToSql99State.put(Constants.integerValueOf(
  569   				MysqlErrorNumbers.ER_NET_PACKETS_OUT_OF_ORDER), "08S01");
  570   		mysqlToSql99State.put(Constants.integerValueOf(
  571   				MysqlErrorNumbers.ER_NET_UNCOMPRESS_ERROR), "08S01");
  572   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_NET_READ_ERROR),
  573   				"08S01");
  574   		mysqlToSql99State.put(Constants.integerValueOf(
  575   				MysqlErrorNumbers.ER_NET_READ_INTERRUPTED), "08S01");
  576   		mysqlToSql99State.put(Constants.integerValueOf(
  577   				MysqlErrorNumbers.ER_NET_ERROR_ON_WRITE), "08S01");
  578   		mysqlToSql99State.put(Constants.integerValueOf(
  579   				MysqlErrorNumbers.ER_NET_WRITE_INTERRUPTED), "08S01");
  580   		mysqlToSql99State.put(
  581   				Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_LONG_STRING), "42000");
  582   		mysqlToSql99State.put(Constants.integerValueOf(
  583   				MysqlErrorNumbers.ER_TABLE_CANT_HANDLE_BLOB), "42000");
  584   		mysqlToSql99State
  585   				.put(Constants.integerValueOf(
  586   						MysqlErrorNumbers.ER_TABLE_CANT_HANDLE_AUTO_INCREMENT),
  587   						"42000");
  588   		mysqlToSql99State.put(Constants.integerValueOf(
  589   				MysqlErrorNumbers.ER_WRONG_COLUMN_NAME), "42000");
  590   		mysqlToSql99State.put(
  591   				Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_KEY_COLUMN), "42000");
  592   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_DUP_UNIQUE),
  593   				"23000");
  594   		mysqlToSql99State.put(Constants.integerValueOf(
  595   				MysqlErrorNumbers.ER_BLOB_KEY_WITHOUT_LENGTH), "42000");
  596   		mysqlToSql99State.put(Constants.integerValueOf(
  597   				MysqlErrorNumbers.ER_PRIMARY_CANT_HAVE_NULL), "42000");
  598   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_TOO_MANY_ROWS),
  599   				"42000");
  600   		mysqlToSql99State.put(Constants.integerValueOf(
  601   				MysqlErrorNumbers.ER_REQUIRES_PRIMARY_KEY), "42000");
  602   		mysqlToSql99State.put(Constants.integerValueOf(
  603   				MysqlErrorNumbers.ER_CHECK_NO_SUCH_TABLE), "42000");
  604   		mysqlToSql99State.put(Constants.integerValueOf(
  605   				MysqlErrorNumbers.ER_CHECK_NOT_IMPLEMENTED), "42000");
  606   		mysqlToSql99State.put(Constants.integerValueOf(
  607   				MysqlErrorNumbers.ER_CANT_DO_THIS_DURING_AN_TRANSACTION),
  608   				"25000");
  609   		mysqlToSql99State.put(Constants.integerValueOf(
  610   				MysqlErrorNumbers.ER_NEW_ABORTING_CONNECTION), "08S01");
  611   		mysqlToSql99State.put(
  612   				Constants.integerValueOf(MysqlErrorNumbers.ER_MASTER_NET_READ), "08S01");
  613   		mysqlToSql99State.put(
  614   				Constants.integerValueOf(MysqlErrorNumbers.ER_MASTER_NET_WRITE), "08S01");
  615   		mysqlToSql99State.put(Constants.integerValueOf(
  616   				MysqlErrorNumbers.ER_TOO_MANY_USER_CONNECTIONS), "42000");
  617   		mysqlToSql99State.put(Constants.integerValueOf(
  618   				MysqlErrorNumbers.ER_READ_ONLY_TRANSACTION), "25000");
  619   		mysqlToSql99State.put(Constants.integerValueOf(
  620   				MysqlErrorNumbers.ER_NO_PERMISSION_TO_CREATE_USER), "42000");
  621   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_LOCK_DEADLOCK),
  622   				"40001");
  623   		mysqlToSql99State.put(Constants.integerValueOf(
  624   				MysqlErrorNumbers.ER_NO_REFERENCED_ROW), "23000");
  625   		mysqlToSql99State.put(Constants.integerValueOf(
  626   				MysqlErrorNumbers.ER_ROW_IS_REFERENCED), "23000");
  627   		mysqlToSql99State.put(Constants.integerValueOf(
  628   				MysqlErrorNumbers.ER_CONNECT_TO_MASTER), "08S01");
  629   		mysqlToSql99State.put(Constants.integerValueOf(
  630   				MysqlErrorNumbers.ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT),
  631   				"21000");
  632   		mysqlToSql99State.put(Constants.integerValueOf(
  633   				MysqlErrorNumbers.ER_USER_LIMIT_REACHED), "42000");
  634   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_NO_DEFAULT),
  635   				"42000");
  636   		mysqlToSql99State.put(Constants.integerValueOf(
  637   				MysqlErrorNumbers.ER_WRONG_VALUE_FOR_VAR), "42000");
  638   		mysqlToSql99State.put(Constants.integerValueOf(
  639   				MysqlErrorNumbers.ER_WRONG_TYPE_FOR_VAR), "42000");
  640   		mysqlToSql99State.put(Constants.integerValueOf(
  641   				MysqlErrorNumbers.ER_CANT_USE_OPTION_HERE), "42000");
  642   		mysqlToSql99State.put(Constants.integerValueOf(
  643   				MysqlErrorNumbers.ER_NOT_SUPPORTED_YET), "42000");
  644   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_WRONG_FK_DEF),
  645   				"42000");
  646   		mysqlToSql99State.put(
  647   				Constants.integerValueOf(MysqlErrorNumbers.ER_OPERAND_COLUMNS), "21000");
  648   		mysqlToSql99State.put(Constants.integerValueOf(
  649   				MysqlErrorNumbers.ER_SUBQUERY_NO_1_ROW), "21000");
  650   		mysqlToSql99State.put(Constants.integerValueOf(
  651   				MysqlErrorNumbers.ER_ILLEGAL_REFERENCE), "42S22");
  652   		mysqlToSql99State.put(Constants.integerValueOf(
  653   				MysqlErrorNumbers.ER_DERIVED_MUST_HAVE_ALIAS), "42000");
  654   		mysqlToSql99State.put(Constants.integerValueOf(MysqlErrorNumbers.ER_SELECT_REDUCED),
  655   				"01000");
  656   		mysqlToSql99State.put(Constants.integerValueOf(
  657   				MysqlErrorNumbers.ER_TABLENAME_NOT_ALLOWED_HERE), "42000");
  658   		mysqlToSql99State.put(Constants.integerValueOf(
  659   				MysqlErrorNumbers.ER_NOT_SUPPORTED_AUTH_MODE), "08004");
  660   		mysqlToSql99State.put(Constants.integerValueOf(
  661   				MysqlErrorNumbers.ER_SPATIAL_CANT_HAVE_NULL), "42000");
  662   		mysqlToSql99State.put(Constants.integerValueOf(
  663   				MysqlErrorNumbers.ER_COLLATION_CHARSET_MISMATCH), "42000");
  664   		mysqlToSql99State.put(Constants.integerValueOf(
  665   				MysqlErrorNumbers.ER_WARN_TOO_FEW_RECORDS), "01000");
  666   		mysqlToSql99State.put(Constants.integerValueOf(
  667   				MysqlErrorNumbers.ER_WARN_TOO_MANY_RECORDS), "01000");
  668   		mysqlToSql99State.put(Constants.integerValueOf(
  669   				MysqlErrorNumbers.ER_WARN_NULL_TO_NOTNULL), "01000");
  670   		mysqlToSql99State.put(Constants.integerValueOf(
  671   				MysqlErrorNumbers.ER_WARN_DATA_OUT_OF_RANGE), "01000");
  672   		mysqlToSql99State.put(Constants.integerValueOf(
  673   				MysqlErrorNumbers.ER_WARN_DATA_TRUNCATED), "01000");
  674   		mysqlToSql99State.put(Constants.integerValueOf(
  675   				MysqlErrorNumbers.ER_WRONG_NAME_FOR_INDEX), "42000");
  676   		mysqlToSql99State.put(Constants.integerValueOf(
  677   				MysqlErrorNumbers.ER_WRONG_NAME_FOR_CATALOG), "42000");
  678   		mysqlToSql99State.put(Constants.integerValueOf(
  679   				MysqlErrorNumbers.ER_UNKNOWN_STORAGE_ENGINE), "42000");
  680   	}
  681   
  682   	/**
  683   	 * Turns output of 'SHOW WARNINGS' into JDBC SQLWarning instances.
  684   	 * 
  685   	 * If 'forTruncationOnly' is true, only looks for truncation warnings, and
  686   	 * actually throws DataTruncation as an exception.
  687   	 * 
  688   	 * @param connection
  689   	 *            the connection to use for getting warnings.
  690   	 * 
  691   	 * @return the SQLWarning chain (or null if no warnings)
  692   	 * 
  693   	 * @throws SQLException
  694   	 *             if the warnings could not be retrieved
  695   	 */
  696   	static SQLWarning convertShowWarningsToSQLWarnings(Connection connection)
  697   			throws SQLException {
  698   		return convertShowWarningsToSQLWarnings(connection, 0, false);
  699   	}
  700   
  701   	/**
  702   	 * Turns output of 'SHOW WARNINGS' into JDBC SQLWarning instances.
  703   	 * 
  704   	 * If 'forTruncationOnly' is true, only looks for truncation warnings, and
  705   	 * actually throws DataTruncation as an exception.
  706   	 * 
  707   	 * @param connection
  708   	 *            the connection to use for getting warnings.
  709   	 * @param warningCountIfKnown
  710   	 *            the warning count (if known), otherwise set it to 0.
  711   	 * @param forTruncationOnly
  712   	 *            if this method should only scan for data truncation warnings
  713   	 * 
  714   	 * @return the SQLWarning chain (or null if no warnings)
  715   	 * 
  716   	 * @throws SQLException
  717   	 *             if the warnings could not be retrieved, or if data truncation
  718   	 *             is being scanned for and truncations were found.
  719   	 */
  720   	static SQLWarning convertShowWarningsToSQLWarnings(Connection connection,
  721   			int warningCountIfKnown, boolean forTruncationOnly)
  722   			throws SQLException {
  723   		java.sql.Statement stmt = null;
  724   		java.sql.ResultSet warnRs = null;
  725   
  726   		SQLWarning currentWarning = null;
  727   
  728   		try {
  729   			if (warningCountIfKnown < 100) {
  730   				stmt = connection.createStatement();
  731   
  732   				if (stmt.getMaxRows() != 0) {
  733   					stmt.setMaxRows(0);
  734   				}
  735   			} else {
  736   				// stream large warning counts
  737   				stmt = connection.createStatement(
  738   						java.sql.ResultSet.TYPE_FORWARD_ONLY,
  739   						java.sql.ResultSet.CONCUR_READ_ONLY);
  740   				stmt.setFetchSize(Integer.MIN_VALUE);
  741   			}
  742   
  743   			/*
  744   			 * +---------+------+---------------------------------------------+ |
  745   			 * Level | Code | Message |
  746   			 * +---------+------+---------------------------------------------+ |
  747   			 * Warning | 1265 | Data truncated for column 'field1' at row 1 |
  748   			 * +---------+------+---------------------------------------------+
  749   			 */
  750   			warnRs = stmt.executeQuery("SHOW WARNINGS"); //$NON-NLS-1$
  751   
  752   			while (warnRs.next()) {
  753   				int code = warnRs.getInt("Code"); //$NON-NLS-1$
  754   
  755   				if (forTruncationOnly) {
  756   					if (code == 1265 || code == 1264) {
  757   						DataTruncation newTruncation = new MysqlDataTruncation(
  758   								warnRs.getString("Message"), 0, false, false, 0, 0, code); //$NON-NLS-1$
  759   
  760   						if (currentWarning == null) {
  761   							currentWarning = newTruncation;
  762   						} else {
  763   							currentWarning.setNextWarning(newTruncation);
  764   						}
  765   					}
  766   				} else {
  767   					String level = warnRs.getString("Level"); //$NON-NLS-1$
  768   					String message = warnRs.getString("Message"); //$NON-NLS-1$
  769   
  770   					SQLWarning newWarning = new SQLWarning(message, SQLError
  771   							.mysqlToSqlState(code, connection
  772   									.getUseSqlStateCodes()), code);
  773   
  774   					if (currentWarning == null) {
  775   						currentWarning = newWarning;
  776   					} else {
  777   						currentWarning.setNextWarning(newWarning);
  778   					}
  779   				}
  780   			}
  781   
  782   			if (forTruncationOnly && (currentWarning != null)) {
  783   				throw currentWarning;
  784   			}
  785   
  786   			return currentWarning;
  787   		} finally {
  788   			SQLException reThrow = null;
  789   
  790   			if (warnRs != null) {
  791   				try {
  792   					warnRs.close();
  793   				} catch (SQLException sqlEx) {
  794   					reThrow = sqlEx;
  795   				}
  796   			}
  797   
  798   			if (stmt != null) {
  799   				try {
  800   					stmt.close();
  801   				} catch (SQLException sqlEx) {
  802   					// ideally, we'd use chained exceptions here,
  803   					// but we still support JDK-1.2.x with this driver
  804   					// which doesn't have them....
  805   					reThrow = sqlEx;
  806   				}
  807   			}
  808   
  809   			if (reThrow != null) {
  810   				throw reThrow;
  811   			}
  812   		}
  813   	}
  814   
  815   	public static void dumpSqlStatesMappingsAsXml() throws Exception {
  816   		TreeMap allErrorNumbers = new TreeMap();
  817   		Map mysqlErrorNumbersToNames = new HashMap();
  818   
  819   		Integer errorNumber = null;
  820   
  821   		// 
  822   		// First create a list of all 'known' error numbers that
  823   		// are mapped.
  824   		//
  825   		for (Iterator mysqlErrorNumbers = mysqlToSql99State.keySet().iterator(); mysqlErrorNumbers
  826   				.hasNext();) {
  827   			errorNumber = (Integer) mysqlErrorNumbers.next();
  828   			allErrorNumbers.put(errorNumber, errorNumber);
  829   		}
  830   
  831   		for (Iterator mysqlErrorNumbers = mysqlToSqlState.keySet().iterator(); mysqlErrorNumbers
  832   				.hasNext();) {
  833   			errorNumber = (Integer) mysqlErrorNumbers.next();
  834   			allErrorNumbers.put(errorNumber, errorNumber);
  835   		}
  836   
  837   		//
  838   		// Now create a list of the actual MySQL error numbers we know about
  839   		//
  840   		java.lang.reflect.Field[] possibleFields = MysqlErrorNumbers.class
  841   				.getDeclaredFields();
  842   
  843   		for (int i = 0; i < possibleFields.length; i++) {
  844   			String fieldName = possibleFields[i].getName();
  845   
  846   			if (fieldName.startsWith("ER_")) {
  847   				mysqlErrorNumbersToNames.put(possibleFields[i].get(null),
  848   						fieldName);
  849   			}
  850   		}
  851   
  852   		System.out.println("<ErrorMappings>");
  853   
  854   		for (Iterator allErrorNumbersIter = allErrorNumbers.keySet().iterator(); allErrorNumbersIter
  855   				.hasNext();) {
  856   			errorNumber = (Integer) allErrorNumbersIter.next();
  857   
  858   			String sql92State = mysqlToSql99(errorNumber.intValue());
  859   			String oldSqlState = mysqlToXOpen(errorNumber.intValue());
  860   
  861   			System.out.println("   <ErrorMapping mysqlErrorNumber=\""
  862   					+ errorNumber + "\" mysqlErrorName=\""
  863   					+ mysqlErrorNumbersToNames.get(errorNumber)
  864   					+ "\" legacySqlState=\""
  865   					+ ((oldSqlState == null) ? "" : oldSqlState)
  866   					+ "\" sql92SqlState=\""
  867   					+ ((sql92State == null) ? "" : sql92State) + "\"/>");
  868   		}
  869   
  870   		System.out.println("</ErrorMappings>");
  871   	}
  872   
  873   	static String get(String stateCode) {
  874   		return (String) sqlStateMessages.get(stateCode);
  875   	}
  876   
  877   	private static String mysqlToSql99(int errno) {
  878   		Integer err = Constants.integerValueOf(errno);
  879   
  880   		if (mysqlToSql99State.containsKey(err)) {
  881   			return (String) mysqlToSql99State.get(err);
  882   		}
  883   
  884   		return "HY000";
  885   	}
  886   
  887   	/**
  888   	 * Map MySQL error codes to X/Open or SQL-92 error codes
  889   	 * 
  890   	 * @param errno
  891   	 *            the MySQL error code
  892   	 * 
  893   	 * @return the corresponding X/Open or SQL-92 error code
  894   	 */
  895   	static String mysqlToSqlState(int errno, boolean useSql92States) {
  896   		if (useSql92States) {
  897   			return mysqlToSql99(errno);
  898   		}
  899   
  900   		return mysqlToXOpen(errno);
  901   	}
  902   
  903   	private static String mysqlToXOpen(int errno) {
  904   		Integer err = Constants.integerValueOf(errno);
  905   
  906   		if (mysqlToSqlState.containsKey(err)) {
  907   			return (String) mysqlToSqlState.get(err);
  908   		}
  909   
  910   		return SQL_STATE_GENERAL_ERROR;
  911   	}
  912   
  913   	/*
  914   	 * SQL State Class SQLNonTransientException Subclass 08
  915   	 * SQLNonTransientConnectionException 22 SQLDataException 23
  916   	 * SQLIntegrityConstraintViolationException N/A
  917   	 * SQLInvalidAuthorizationException 42 SQLSyntaxErrorException
  918   	 * 
  919   	 * SQL State Class SQLTransientException Subclass 08
  920   	 * SQLTransientConnectionException 40 SQLTransactionRollbackException N/A
  921   	 * SQLTimeoutException
  922   	 */
  923   
  924   	public static SQLException createSQLException(String message,
  925   			String sqlState, ExceptionInterceptor interceptor) {
  926   		return createSQLException(message, sqlState, 0, interceptor);
  927   	}
  928   
  929   	public static SQLException createSQLException(String message, ExceptionInterceptor interceptor) {
  930   		return createSQLException(message, interceptor, null);
  931   	}
  932   	public static SQLException createSQLException(String message, ExceptionInterceptor interceptor, Connection conn) {
  933   		SQLException sqlEx = new SQLException(message);
  934   		
  935   		if (interceptor != null) {
  936   			SQLException interceptedEx = interceptor.interceptException(sqlEx, conn);
  937   			
  938   			if (interceptedEx != null) {
  939   				return interceptedEx;
  940   			}
  941   		}
  942   		
  943   		return sqlEx;
  944   	}
  945   
  946   	public static SQLException createSQLException(String message, String sqlState, Throwable cause, ExceptionInterceptor interceptor) {
  947   		return createSQLException(message, sqlState, cause, interceptor, null);
  948   	}
  949   	public static SQLException createSQLException(String message, String sqlState, Throwable cause, ExceptionInterceptor interceptor,
  950   			Connection conn) {
  951   		if (THROWABLE_INIT_CAUSE_METHOD == null) {
  952   			if (cause != null) {
  953   				message = message + " due to " + cause.toString();
  954   			}
  955   		}
  956   		
  957   		SQLException sqlEx = createSQLException(message, sqlState, interceptor);
  958   		
  959   		if (cause != null && THROWABLE_INIT_CAUSE_METHOD != null) {
  960   			try {
  961   				THROWABLE_INIT_CAUSE_METHOD.invoke(sqlEx, new Object[] {cause});
  962   			} catch (Throwable t) {
  963   				// we're not going to muck with that here, since it's
  964   				// an error condition anyway!
  965   			}
  966   		}
  967   		
  968   		if (interceptor != null) {
  969   			SQLException interceptedEx = interceptor.interceptException(sqlEx, conn);
  970   			
  971   			if (interceptedEx != null) {
  972   				return interceptedEx;
  973   			}
  974   		}
  975   		
  976   		return sqlEx;
  977   	}
  978   	
  979   	public static SQLException createSQLException(String message,
  980   			String sqlState, int vendorErrorCode, ExceptionInterceptor interceptor) {
  981   		return createSQLException(message, sqlState, vendorErrorCode, false, interceptor);
  982   	}
  983   	
  984   	public static SQLException createSQLException(String message,
  985   			String sqlState, int vendorErrorCode, boolean isTransient, ExceptionInterceptor interceptor) {
  986   		return createSQLException(message, sqlState, vendorErrorCode, false, interceptor, null);
  987   	}
  988   	public static SQLException createSQLException(String message,
  989   			String sqlState, int vendorErrorCode, boolean isTransient, ExceptionInterceptor interceptor, Connection conn) {
  990   		try {
  991   			SQLException sqlEx = null;
  992   			
  993   			if (sqlState != null) {
  994   				if (sqlState.startsWith("08")) {
  995   					if (isTransient) {
  996   						if (!Util.isJdbc4()) {
  997   							sqlEx = new MySQLTransientConnectionException(
  998   									message, sqlState, vendorErrorCode);
  999   						} else {
 1000   							sqlEx = (SQLException) Util
 1001   								.getInstance(
 1002   										"com.mysql.jdbc.exceptions.jdbc4.MySQLTransientConnectionException",
 1003   										new Class[] { String.class,
 1004   												String.class, Integer.TYPE },
 1005   										new Object[] { message, sqlState,
 1006   												Constants.integerValueOf(vendorErrorCode) }, interceptor);
 1007   						}
 1008   					} else if (!Util.isJdbc4()) {
 1009   						sqlEx = new MySQLNonTransientConnectionException(
 1010   								message, sqlState, vendorErrorCode);
 1011   					} else {
 1012   						sqlEx = (SQLException) Util.getInstance(
 1013   									"com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException",
 1014   									new Class[] { String.class, String.class,
 1015   											Integer.TYPE  }, new Object[] {
 1016   											message, sqlState,
 1017   											Constants.integerValueOf(vendorErrorCode) }, interceptor);
 1018   					}
 1019   				} else if (sqlState.startsWith("22")) {
 1020   					if (!Util.isJdbc4()) {
 1021   						sqlEx = new MySQLDataException(message, sqlState,
 1022   								vendorErrorCode);
 1023   					} else {
 1024   						sqlEx = (SQLException) Util
 1025   							.getInstance(
 1026   									"com.mysql.jdbc.exceptions.jdbc4.MySQLDataException",
 1027   									new Class[] { String.class, String.class,
 1028   											Integer.TYPE  }, new Object[] {
 1029   											message, sqlState,
 1030   											Constants.integerValueOf(vendorErrorCode) }, interceptor);
 1031   					}
 1032   				} else if (sqlState.startsWith("23")) {
 1033   
 1034   					if (!Util.isJdbc4()) {
 1035   						sqlEx = new MySQLIntegrityConstraintViolationException(
 1036   								message, sqlState, vendorErrorCode);
 1037   					} else {
 1038   						sqlEx =  (SQLException) Util
 1039   							.getInstance(
 1040   									"com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException",
 1041   									new Class[] { String.class, String.class,
 1042   											Integer.TYPE  }, new Object[] {
 1043   											message, sqlState,
 1044   											Constants.integerValueOf(vendorErrorCode) }, interceptor);
 1045   					}
 1046   				} else if (sqlState.startsWith("42")) {
 1047   					if (!Util.isJdbc4()) {
 1048   						sqlEx = new MySQLSyntaxErrorException(message, sqlState,
 1049   								vendorErrorCode);
 1050   					} else {
 1051   						sqlEx = (SQLException) Util.getInstance(
 1052   									"com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException",
 1053   									new Class[] { String.class, String.class,
 1054   											Integer.TYPE  }, new Object[] {
 1055   											message, sqlState,
 1056   											Constants.integerValueOf(vendorErrorCode) }, interceptor);
 1057   					}
 1058   				} else if (sqlState.startsWith("40")) {
 1059   					if (!Util.isJdbc4()) {
 1060   						sqlEx = new MySQLTransactionRollbackException(message,
 1061   								sqlState, vendorErrorCode);
 1062   					} else {
 1063   						sqlEx = (SQLException) Util
 1064   							.getInstance(
 1065   									"com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException",
 1066   									new Class[] { String.class, String.class,
 1067   											Integer.TYPE  }, new Object[] {
 1068   											message, sqlState,
 1069   											Constants.integerValueOf(vendorErrorCode) }, interceptor);
 1070   					}
 1071   				} else {
 1072   					sqlEx = new SQLException(message, sqlState, vendorErrorCode);
 1073   				}
 1074   			} else {
 1075   				sqlEx = new SQLException(message, sqlState, vendorErrorCode);
 1076   			}
 1077   			
 1078   			if (interceptor != null) {
 1079   				SQLException interceptedEx = interceptor.interceptException(sqlEx, conn);
 1080   				
 1081   				if (interceptedEx != null) {
 1082   					return interceptedEx;
 1083   				}
 1084   			}
 1085   			
 1086   			if (sqlEx == null) {
 1087   				System.out.println("!");
 1088   			}
 1089   			
 1090   			return sqlEx;
 1091   		} catch (SQLException sqlEx) {
 1092   			SQLException unexpectedEx = new SQLException(
 1093   					"Unable to create correct SQLException class instance, error class/codes may be incorrect. Reason: "
 1094   							+ Util.stackTraceToString(sqlEx),
 1095   					SQL_STATE_GENERAL_ERROR);
 1096   			
 1097   			if (interceptor != null) {
 1098   				SQLException interceptedEx = interceptor.interceptException(unexpectedEx, conn);
 1099   				
 1100   				if (interceptedEx != null) {
 1101   					return interceptedEx;
 1102   				}
 1103   			}
 1104   			
 1105   			return unexpectedEx;
 1106   		}
 1107   	}
 1108   	
 1109   	public static SQLException createCommunicationsException(ConnectionImpl conn, long lastPacketSentTimeMs, 
 1110   			long lastPacketReceivedTimeMs,
 1111   			Exception underlyingException, ExceptionInterceptor interceptor) {
 1112   		SQLException exToReturn = null;
 1113   		
 1114   		if (!Util.isJdbc4()) {
 1115   			exToReturn = new CommunicationsException(conn, lastPacketSentTimeMs, lastPacketReceivedTimeMs, underlyingException);
 1116   		} else {
 1117   		
 1118   			try {
 1119   				exToReturn = (SQLException) Util.handleNewInstance(JDBC_4_COMMUNICATIONS_EXCEPTION_CTOR, new Object[] {
 1120   					conn, Constants.longValueOf(lastPacketSentTimeMs), Constants.longValueOf(lastPacketReceivedTimeMs), underlyingException}, interceptor);
 1121   			} catch (SQLException sqlEx) {
 1122   				// We should _never_ get this, but let's not swallow it either
 1123   				
 1124   				return sqlEx;
 1125   			}
 1126   		}
 1127   		
 1128   		if (THROWABLE_INIT_CAUSE_METHOD != null && underlyingException != null) {
 1129   			try {
 1130   				THROWABLE_INIT_CAUSE_METHOD.invoke(exToReturn, new Object[] {underlyingException});
 1131   			} catch (Throwable t) {
 1132   				// we're not going to muck with that here, since it's
 1133   				// an error condition anyway!
 1134   			}
 1135   		}
 1136   		
 1137   		if (interceptor != null) {
 1138   			SQLException interceptedEx = interceptor.interceptException(exToReturn, conn);
 1139   			
 1140   			if (interceptedEx != null) {
 1141   				return interceptedEx;
 1142   			}
 1143   		}
 1144   		
 1145   		return exToReturn;
 1146   	}
 1147   	
 1148   	/**
 1149   	 * Creates a communications link failure message to be used
 1150   	 * in CommunicationsException that (hopefully) has some better
 1151   	 * information and suggestions based on heuristics.
 1152   	 *  
 1153   	 * @param conn
 1154   	 * @param lastPacketSentTimeMs
 1155   	 * @param underlyingException
 1156   	 * @param streamingResultSetInPlay
 1157   	 * @return
 1158   	 */
 1159   	public static String createLinkFailureMessageBasedOnHeuristics(
 1160   			ConnectionImpl conn,
 1161   			long lastPacketSentTimeMs, 
 1162   			long lastPacketReceivedTimeMs,
 1163   			Exception underlyingException,
 1164   			boolean streamingResultSetInPlay) {
 1165   		long serverTimeoutSeconds = 0;
 1166   		boolean isInteractiveClient = false;
 1167   
 1168   		if (conn != null) {
 1169   			isInteractiveClient = conn.getInteractiveClient();
 1170   
 1171   			String serverTimeoutSecondsStr = null;
 1172   
 1173   			if (isInteractiveClient) {
 1174   				serverTimeoutSecondsStr = conn
 1175   						.getServerVariable("interactive_timeout"); //$NON-NLS-1$
 1176   			} else {
 1177   				serverTimeoutSecondsStr = conn
 1178   						.getServerVariable("wait_timeout"); //$NON-NLS-1$
 1179   			}
 1180   
 1181   			if (serverTimeoutSecondsStr != null) {
 1182   				try {
 1183   					serverTimeoutSeconds = Long
 1184   							.parseLong(serverTimeoutSecondsStr);
 1185   				} catch (NumberFormatException nfe) {
 1186   					serverTimeoutSeconds = 0;
 1187   				}
 1188   			}
 1189   		}
 1190   
 1191   		StringBuffer exceptionMessageBuf = new StringBuffer();
 1192   
 1193   		if (lastPacketSentTimeMs == 0) {
 1194   			lastPacketSentTimeMs = System.currentTimeMillis();
 1195   		}
 1196   
 1197   		long timeSinceLastPacket = (System.currentTimeMillis() - lastPacketSentTimeMs) / 1000;
 1198   		long timeSinceLastPacketMs = (System.currentTimeMillis() - lastPacketSentTimeMs);
 1199   		long timeSinceLastPacketReceivedMs = (System.currentTimeMillis() - lastPacketReceivedTimeMs);
 1200   		
 1201   		int dueToTimeout = DUE_TO_TIMEOUT_FALSE;
 1202   
 1203   		StringBuffer timeoutMessageBuf = null;
 1204   
 1205   		if (streamingResultSetInPlay) {
 1206   			exceptionMessageBuf.append(Messages
 1207   					.getString("CommunicationsException.ClientWasStreaming")); //$NON-NLS-1$
 1208   		} else {
 1209   			if (serverTimeoutSeconds != 0) {
 1210   				if (timeSinceLastPacket > serverTimeoutSeconds) {
 1211   					dueToTimeout = DUE_TO_TIMEOUT_TRUE;
 1212   
 1213   					timeoutMessageBuf = new StringBuffer();
 1214   
 1215   					timeoutMessageBuf.append(Messages
 1216   							.getString("CommunicationsException.2")); //$NON-NLS-1$
 1217   
 1218   					if (!isInteractiveClient) {
 1219   						timeoutMessageBuf.append(Messages
 1220   								.getString("CommunicationsException.3")); //$NON-NLS-1$
 1221   					} else {
 1222   						timeoutMessageBuf.append(Messages
 1223   								.getString("CommunicationsException.4")); //$NON-NLS-1$
 1224   					}
 1225   
 1226   				}
 1227   			} else if (timeSinceLastPacket > DEFAULT_WAIT_TIMEOUT_SECONDS) {
 1228   				dueToTimeout = DUE_TO_TIMEOUT_MAYBE;
 1229   
 1230   				timeoutMessageBuf = new StringBuffer();
 1231   
 1232   				timeoutMessageBuf.append(Messages
 1233   						.getString("CommunicationsException.5")); //$NON-NLS-1$
 1234   				timeoutMessageBuf.append(Messages
 1235   						.getString("CommunicationsException.6")); //$NON-NLS-1$
 1236   				timeoutMessageBuf.append(Messages
 1237   						.getString("CommunicationsException.7")); //$NON-NLS-1$
 1238   				timeoutMessageBuf.append(Messages
 1239   						.getString("CommunicationsException.8")); //$NON-NLS-1$
 1240   			}
 1241   
 1242   			if (dueToTimeout == DUE_TO_TIMEOUT_TRUE
 1243   					|| dueToTimeout == DUE_TO_TIMEOUT_MAYBE) {
 1244   
 1245   				if (lastPacketReceivedTimeMs != 0) {
 1246   					Object[] timingInfo = {
 1247   							new Long(timeSinceLastPacketReceivedMs),
 1248   							new Long(timeSinceLastPacketMs)
 1249   					};
 1250   					exceptionMessageBuf.append(Messages
 1251   							.getString("CommunicationsException.ServerPacketTimingInfo", //$NON-NLS-1$
 1252   									timingInfo));
 1253   				} else {
 1254   					exceptionMessageBuf.append(Messages
 1255   							.getString("CommunicationsException.ServerPacketTimingInfoNoRecv", //$NON-NLS-1$
 1256   									new Object[] { new Long(timeSinceLastPacketMs)}));
 1257   				}
 1258   
 1259   				if (timeoutMessageBuf != null) {
 1260   					exceptionMessageBuf.append(timeoutMessageBuf);
 1261   				}
 1262   
 1263   				exceptionMessageBuf.append(Messages
 1264   						.getString("CommunicationsException.11")); //$NON-NLS-1$
 1265   				exceptionMessageBuf.append(Messages
 1266   						.getString("CommunicationsException.12")); //$NON-NLS-1$
 1267   				exceptionMessageBuf.append(Messages
 1268   						.getString("CommunicationsException.13")); //$NON-NLS-1$
 1269   
 1270   			} else {
 1271   				//
 1272   				// Attempt to determine the reason for the underlying exception
 1273   				// (we can only make a best-guess here)
 1274   				//
 1275   
 1276   				if (underlyingException instanceof BindException) {
 1277   					if (conn.getLocalSocketAddress() != null
 1278   							&& !Util.interfaceExists(conn
 1279   									.getLocalSocketAddress())) {
 1280   						exceptionMessageBuf.append(Messages
 1281   								.getString("CommunicationsException.LocalSocketAddressNotAvailable")); //$NON-NLS-1$
 1282   					} else {
 1283   						// too many client connections???
 1284   						exceptionMessageBuf.append(Messages
 1285   								.getString("CommunicationsException.TooManyClientConnections")); //$NON-NLS-1$
 1286   					}
 1287   				}
 1288   			}
 1289   		}
 1290   
 1291   		if (exceptionMessageBuf.length() == 0) {
 1292   			// We haven't figured out a good reason, so copy it.
 1293   			exceptionMessageBuf.append(Messages
 1294   					.getString("CommunicationsException.20")); //$NON-NLS-1$
 1295   
 1296   			if (THROWABLE_INIT_CAUSE_METHOD == null && 
 1297   					underlyingException != null) {
 1298   				exceptionMessageBuf.append(Messages
 1299   						.getString("CommunicationsException.21")); //$NON-NLS-1$
 1300   				exceptionMessageBuf.append(Util
 1301   						.stackTraceToString(underlyingException));
 1302   			}
 1303   
 1304   			if (conn != null && conn.getMaintainTimeStats()
 1305   					&& !conn.getParanoid()) {
 1306   				exceptionMessageBuf.append("\n\n"); //$NON-NLS-1$
 1307   				if (lastPacketReceivedTimeMs != 0) {
 1308   					Object[] timingInfo = {
 1309   							new Long(timeSinceLastPacketReceivedMs),
 1310   							new Long(timeSinceLastPacketMs)
 1311   					};
 1312   					exceptionMessageBuf.append(Messages
 1313   							.getString("CommunicationsException.ServerPacketTimingInfo", //$NON-NLS-1$
 1314   									timingInfo));
 1315   				} else {
 1316   					exceptionMessageBuf.append(Messages
 1317   							.getString("CommunicationsException.ServerPacketTimingInfoNoRecv", //$NON-NLS-1$
 1318   									new Object[] { new Long(timeSinceLastPacketMs)}));
 1319   				}
 1320   			}
 1321   		}
 1322   		
 1323   		return exceptionMessageBuf.toString();
 1324   	}
 1325   	
 1326   	public static SQLException notImplemented() {
 1327   		if (Util.isJdbc4()) {
 1328   			try {
 1329   				return (SQLException) Class.forName(
 1330   						"java.sql.SQLFeatureNotSupportedException")
 1331   						.newInstance();
 1332   			} catch (Throwable t) {
 1333   				// proceed
 1334   			}
 1335   		}
 1336   
 1337   		return new NotImplemented();
 1338   	}
 1339   }

Save This Page
Home » MySQL-JDBC-5.1.11 » com.mysql.jdbc » [javadoc | source]