@@ -6,25 +6,60 @@ class Error < StandardError
66 replace : '?' . freeze ,
77 } . freeze
88
9+ ConnectionError = Class . new ( Error )
10+ TimeoutError = Class . new ( Error )
11+
12+ CODES = {
13+ 1205 => TimeoutError , # ER_LOCK_WAIT_TIMEOUT
14+
15+ 1044 => ConnectionError , # ER_DBACCESS_DENIED_ERROR
16+ 1045 => ConnectionError , # ER_ACCESS_DENIED_ERROR
17+ 1152 => ConnectionError , # ER_ABORTING_CONNECTION
18+ 1153 => ConnectionError , # ER_NET_PACKET_TOO_LARGE
19+ 1154 => ConnectionError , # ER_NET_READ_ERROR_FROM_PIPE
20+ 1155 => ConnectionError , # ER_NET_FCNTL_ERROR
21+ 1156 => ConnectionError , # ER_NET_PACKETS_OUT_OF_ORDER
22+ 1157 => ConnectionError , # ER_NET_UNCOMPRESS_ERROR
23+ 1158 => ConnectionError , # ER_NET_READ_ERROR
24+ 1159 => ConnectionError , # ER_NET_READ_INTERRUPTED
25+ 1160 => ConnectionError , # ER_NET_ERROR_ON_WRITE
26+ 1161 => ConnectionError , # ER_NET_WRITE_INTERRUPTED
27+
28+ 2001 => ConnectionError , # CR_SOCKET_CREATE_ERROR
29+ 2002 => ConnectionError , # CR_CONNECTION_ERROR
30+ 2003 => ConnectionError , # CR_CONN_HOST_ERROR
31+ 2004 => ConnectionError , # CR_IPSOCK_ERROR
32+ 2005 => ConnectionError , # CR_UNKNOWN_HOST
33+ 2006 => ConnectionError , # CR_SERVER_GONE_ERROR
34+ 2007 => ConnectionError , # CR_VERSION_ERROR
35+ 2009 => ConnectionError , # CR_WRONG_HOST_INFO
36+ 2012 => ConnectionError , # CR_SERVER_HANDSHAKE_ERR
37+ 2013 => ConnectionError , # CR_SERVER_LOST
38+ 2020 => ConnectionError , # CR_NET_PACKET_TOO_LARGE
39+ 2026 => ConnectionError , # CR_SSL_CONNECTION_ERROR
40+ 2027 => ConnectionError , # CR_MALFORMED_PACKET
41+ 2047 => ConnectionError , # CR_CONN_UNKNOW_PROTOCOL
42+ 2048 => ConnectionError , # CR_INVALID_CONN_HANDLE
43+ 2049 => ConnectionError , # CR_UNUSED_1
44+ } . freeze
45+
946 attr_reader :error_number , :sql_state
1047
1148 # Mysql gem compatibility
1249 alias errno error_number
1350 alias error message
1451
15- def initialize ( msg )
16- @server_version ||= nil
52+ def initialize ( msg , server_version = nil , error_number = nil , sql_state = nil )
53+ @server_version = server_version
54+ @error_number = error_number
55+ @sql_state = sql_state ? sql_state . encode ( ENCODE_OPTS ) : nil
1756
1857 super ( clean_message ( msg ) )
1958 end
2059
2160 def self . new_with_args ( msg , server_version , error_number , sql_state )
22- err = allocate
23- err . instance_variable_set ( '@server_version' , server_version )
24- err . instance_variable_set ( '@error_number' , error_number )
25- err . instance_variable_set ( '@sql_state' , sql_state . encode ( ENCODE_OPTS ) )
26- err . send ( :initialize , msg )
27- err
61+ error_class = CODES . fetch ( error_number , self )
62+ error_class . new ( msg , server_version , error_number , sql_state )
2863 end
2964
3065 private
0 commit comments