Skip to content

Commit 000963c

Browse files
committed
make sure we return error message and sql state in Encoding.default_internal if set
1 parent 271ea5e commit 000963c

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

lib/mysql2/error.rb

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ def initialize(msg, server_version=nil)
1717
super(clean_message(msg))
1818
end
1919

20+
if "".respond_to? :encode
21+
def sql_state=(state)
22+
@sql_state = state.encode
23+
end
24+
end
25+
2026
private
2127

2228
# In MySQL 5.5+ error messages are always constructed server-side as UTF-8
@@ -50,10 +56,10 @@ def clean_message(message)
5056
return message if !message.respond_to?(:encoding)
5157

5258
if @server_version && @server_version > 50500
53-
message
59+
message.encode
5460
else
5561
if message.respond_to? :scrub
56-
message.scrub
62+
message.scrub.encode
5763
else
5864
# This is ugly as hell but Ruby 1.9 doesn't provide a way to clean a string
5965
# and retain it's valid UTF-8 characters, that I know of.
@@ -66,7 +72,7 @@ def clean_message(message)
6672
new_message << REPLACEMENT_CHAR
6773
end
6874
end
69-
new_message
75+
new_message.encode
7076
end
7177
end
7278
end

spec/mysql2/error_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,18 @@
6767
error.sql_state.encoding.should eql(Encoding::US_ASCII)
6868
error.sql_state.valid_encoding?
6969
end
70+
71+
it "returns error messages and sql state in Encoding.default_internal if set" do
72+
interal_before = Encoding.default_internal
73+
Encoding.default_internal = 'UTF-16'
74+
75+
error.message.encoding.should eql(Encoding.default_internal)
76+
error.message.valid_encoding?
77+
78+
bad_err.message.encoding.should eql(Encoding.default_internal)
79+
bad_err.message.valid_encoding?
80+
81+
Encoding.default_internal = interal_before
82+
end
7083
end
7184
end

0 commit comments

Comments
 (0)