Skip to content

Commit a94eac1

Browse files
committed
There _is_ a good way to do this in 1.9
1 parent ae4a591 commit a94eac1

File tree

1 file changed

+8
-20
lines changed

1 file changed

+8
-20
lines changed

lib/mysql2/error.rb

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
module Mysql2
44
class Error < StandardError
5-
REPLACEMENT_CHAR = '?'
6-
ENCODE_OPTS = {:undef => :replace, :invalid => :replace, :replace => REPLACEMENT_CHAR}
5+
ENCODE_OPTS = {
6+
:undef => :replace,
7+
:invalid => :replace,
8+
:replace => '?'.freeze,
9+
}.freeze
710

811
attr_accessor :error_number
912
attr_reader :sql_state
@@ -20,7 +23,7 @@ def initialize(msg, server_version=nil)
2023
end
2124

2225
def sql_state=(state)
23-
@sql_state = ''.respond_to?(:encode) ? state.encode(ENCODE_OPTS) : state
26+
@sql_state = state.respond_to?(:encode) ? state.encode(ENCODE_OPTS) : state
2427
end
2528

2629
private
@@ -53,27 +56,12 @@ def sql_state=(state)
5356
#
5457
# Returns a valid UTF-8 string in Ruby 1.9+, the original string on Ruby 1.8
5558
def clean_message(message)
56-
return message if !message.respond_to?(:encoding)
59+
return message unless message.respond_to?(:encode)
5760

5861
if @server_version && @server_version > 50500
5962
message.encode(ENCODE_OPTS)
6063
else
61-
if message.respond_to? :scrub
62-
message.scrub(REPLACEMENT_CHAR).encode(ENCODE_OPTS)
63-
else
64-
# This is ugly as hell but Ruby 1.9 doesn't provide a way to clean a string
65-
# and retain it's valid UTF-8 characters, that I know of.
66-
67-
new_message = "".force_encoding(Encoding::UTF_8)
68-
message.chars.each do |char|
69-
if char.valid_encoding?
70-
new_message << char
71-
else
72-
new_message << REPLACEMENT_CHAR
73-
end
74-
end
75-
new_message.encode(ENCODE_OPTS)
76-
end
64+
message.encode(Encoding::UTF_8, ENCODE_OPTS)
7765
end
7866
end
7967
end

0 commit comments

Comments
 (0)