mysql2 0.2.24 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/CHANGELOG.md +148 -0
- data/Gemfile +3 -0
- data/README.rdoc +257 -0
- data/Rakefile +5 -0
- data/benchmark/active_record.rb +51 -0
- data/benchmark/active_record_threaded.rb +42 -0
- data/benchmark/allocations.rb +33 -0
- data/benchmark/escape.rb +36 -0
- data/benchmark/query_with_mysql_casting.rb +80 -0
- data/benchmark/query_without_mysql_casting.rb +47 -0
- data/benchmark/sequel.rb +37 -0
- data/benchmark/setup_db.rb +119 -0
- data/benchmark/threaded.rb +44 -0
- data/ext/mysql2/client.c +272 -849
- data/ext/mysql2/client.h +12 -27
- data/ext/mysql2/extconf.rb +14 -72
- data/ext/mysql2/mysql2_ext.h +4 -7
- data/ext/mysql2/result.c +123 -319
- data/ext/mysql2/result.h +1 -4
- data/lib/active_record/connection_adapters/em_mysql2_adapter.rb +64 -0
- data/lib/active_record/fiber_patches.rb +104 -0
- data/lib/mysql2.rb +5 -20
- data/lib/mysql2/client.rb +200 -50
- data/lib/mysql2/em.rb +3 -13
- data/lib/mysql2/em_fiber.rb +31 -0
- data/lib/mysql2/error.rb +6 -71
- data/lib/mysql2/version.rb +2 -2
- data/mysql2.gemspec +32 -0
- data/spec/em/em_fiber_spec.rb +22 -0
- data/spec/em/em_spec.rb +9 -74
- data/spec/mysql2/client_spec.rb +126 -593
- data/spec/mysql2/error_spec.rb +44 -58
- data/spec/mysql2/result_spec.rb +85 -257
- data/spec/spec_helper.rb +3 -24
- data/tasks/benchmarks.rake +20 -0
- data/tasks/compile.rake +71 -0
- data/tasks/rspec.rake +16 -0
- data/tasks/vendor_mysql.rake +40 -0
- metadata +179 -92
- checksums.yaml +0 -7
- data/README.md +0 -524
- data/ext/mysql2/infile.c +0 -122
- data/ext/mysql2/infile.h +0 -1
- data/ext/mysql2/mysql_enc_name_to_ruby.h +0 -168
- data/ext/mysql2/mysql_enc_to_ruby.h +0 -246
- data/ext/mysql2/wait_for_single_fd.h +0 -36
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +0 -635
- data/lib/arel/engines/sql/compilers/mysql2_compiler.rb +0 -11
- data/lib/mysql2/console.rb +0 -5
- data/spec/configuration.yml.example +0 -17
- data/spec/my.cnf.example +0 -9
- data/spec/test_data +0 -1
- data/support/mysql_enc_to_ruby.rb +0 -82
- data/support/ruby_enc_to_mysql.rb +0 -61
data/spec/mysql2/error_spec.rb
CHANGED
@@ -1,82 +1,68 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
|
3
2
|
require 'spec_helper'
|
4
3
|
|
5
4
|
describe Mysql2::Error do
|
6
|
-
|
7
|
-
|
8
|
-
let :error do
|
5
|
+
before(:each) do
|
6
|
+
@client = Mysql2::Client.new :encoding => "utf8"
|
9
7
|
begin
|
10
|
-
client.query("HAHAHA")
|
8
|
+
@client.query("HAHAHA")
|
11
9
|
rescue Mysql2::Error => e
|
12
|
-
error = e
|
13
|
-
ensure
|
14
|
-
client.close
|
10
|
+
@error = e
|
15
11
|
end
|
16
12
|
|
17
|
-
|
13
|
+
@client2 = Mysql2::Client.new :encoding => "big5"
|
14
|
+
begin
|
15
|
+
@client2.query("HAHAHA")
|
16
|
+
rescue Mysql2::Error => e
|
17
|
+
@error2 = e
|
18
|
+
end
|
18
19
|
end
|
19
20
|
|
20
|
-
it "
|
21
|
-
error.should respond_to(:error_number)
|
22
|
-
|
21
|
+
it "should respond to #error_number" do
|
22
|
+
@error.should respond_to(:error_number)
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
error.should respond_to(:
|
26
|
-
error.should respond_to(:error)
|
25
|
+
it "should respond to #sql_state" do
|
26
|
+
@error.should respond_to(:sql_state)
|
27
27
|
end
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
client.query("\xE9\x80\xA0\xE5\xAD\x97")
|
34
|
-
rescue Mysql2::Error => e
|
35
|
-
error = e
|
36
|
-
ensure
|
37
|
-
client.close
|
38
|
-
end
|
29
|
+
# Mysql gem compatibility
|
30
|
+
it "should alias #error_number to #errno" do
|
31
|
+
@error.should respond_to(:errno)
|
32
|
+
end
|
39
33
|
|
40
|
-
|
41
|
-
|
34
|
+
it "should alias #message to #error" do
|
35
|
+
@error.should respond_to(:error)
|
36
|
+
end
|
42
37
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
client.
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
38
|
+
if RUBY_VERSION =~ /1.9/
|
39
|
+
it "#message encoding should match the connection's encoding, or Encoding.default_internal if set" do
|
40
|
+
if Encoding.default_internal.nil?
|
41
|
+
@error.message.encoding.should eql(@client.encoding)
|
42
|
+
@error2.message.encoding.should eql(@client2.encoding)
|
43
|
+
else
|
44
|
+
@error.message.encoding.should eql(Encoding.default_internal)
|
45
|
+
@error2.message.encoding.should eql(Encoding.default_internal)
|
51
46
|
end
|
52
|
-
|
53
|
-
error
|
54
47
|
end
|
55
48
|
|
56
|
-
it "
|
57
|
-
|
58
|
-
error.
|
59
|
-
error.
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
bad_err.message.should include("??}\u001F")
|
49
|
+
it "#error encoding should match the connection's encoding, or Encoding.default_internal if set" do
|
50
|
+
if Encoding.default_internal.nil?
|
51
|
+
@error.error.encoding.should eql(@client.encoding)
|
52
|
+
@error2.error.encoding.should eql(@client2.encoding)
|
53
|
+
else
|
54
|
+
@error.error.encoding.should eql(Encoding.default_internal)
|
55
|
+
@error2.error.encoding.should eql(Encoding.default_internal)
|
65
56
|
end
|
66
57
|
end
|
67
58
|
|
68
|
-
it "
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
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?
|
59
|
+
it "#sql_state encoding should match the connection's encoding, or Encoding.default_internal if set" do
|
60
|
+
if Encoding.default_internal.nil?
|
61
|
+
@error.sql_state.encoding.should eql(@client.encoding)
|
62
|
+
@error2.sql_state.encoding.should eql(@client2.encoding)
|
63
|
+
else
|
64
|
+
@error.sql_state.encoding.should eql(Encoding.default_internal)
|
65
|
+
@error2.sql_state.encoding.should eql(Encoding.default_internal)
|
80
66
|
end
|
81
67
|
end
|
82
68
|
end
|
data/spec/mysql2/result_spec.rb
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Mysql2::Result do
|
5
|
+
before(:each) do
|
6
|
+
@client = Mysql2::Client.new :host => "localhost", :username => "root", :database => 'test'
|
7
|
+
end
|
8
|
+
|
5
9
|
before(:each) do
|
6
10
|
@result = @client.query "SELECT 1"
|
7
11
|
end
|
@@ -24,24 +28,6 @@ describe Mysql2::Result do
|
|
24
28
|
}.should_not raise_error(Mysql2::Error)
|
25
29
|
end
|
26
30
|
|
27
|
-
it "should respond to #count, which is aliased as #size" do
|
28
|
-
r = @client.query "SELECT 1"
|
29
|
-
r.should respond_to :count
|
30
|
-
r.should respond_to :size
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should be able to return the number of rows in the result set" do
|
34
|
-
r = @client.query "SELECT 1"
|
35
|
-
r.count.should eql(1)
|
36
|
-
r.size.should eql(1)
|
37
|
-
end
|
38
|
-
|
39
|
-
context "metadata queries" do
|
40
|
-
it "should show tables" do
|
41
|
-
@result = @client.query "SHOW TABLES"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
31
|
context "#each" do
|
46
32
|
it "should yield rows as hash's" do
|
47
33
|
@result.each do |row|
|
@@ -69,29 +55,11 @@ describe Mysql2::Result do
|
|
69
55
|
result = @client.query "SELECT 1", :cache_rows => false
|
70
56
|
result.first.object_id.should_not eql(result.first.object_id)
|
71
57
|
end
|
72
|
-
|
73
|
-
it "should yield different value for #first if streaming" do
|
74
|
-
result = @client.query "SELECT 1 UNION SELECT 2", :stream => true, :cache_rows => false
|
75
|
-
result.first.should_not eql(result.first)
|
76
|
-
end
|
77
|
-
|
78
|
-
it "should yield the same value for #first if streaming is disabled" do
|
79
|
-
result = @client.query "SELECT 1 UNION SELECT 2", :stream => false
|
80
|
-
result.first.should eql(result.first)
|
81
|
-
end
|
82
|
-
|
83
|
-
it "should throw an exception if we try to iterate twice when streaming is enabled" do
|
84
|
-
result = @client.query "SELECT 1 UNION SELECT 2", :stream => true, :cache_rows => false
|
85
|
-
|
86
|
-
expect {
|
87
|
-
result.each.to_a
|
88
|
-
result.each.to_a
|
89
|
-
}.to raise_exception(Mysql2::Error)
|
90
|
-
end
|
91
58
|
end
|
92
59
|
|
93
60
|
context "#fields" do
|
94
61
|
before(:each) do
|
62
|
+
@client.query "USE test"
|
95
63
|
@test_result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1")
|
96
64
|
end
|
97
65
|
|
@@ -105,87 +73,22 @@ describe Mysql2::Result do
|
|
105
73
|
end
|
106
74
|
end
|
107
75
|
|
108
|
-
context "streaming" do
|
109
|
-
it "should maintain a count while streaming" do
|
110
|
-
result = @client.query('SELECT 1')
|
111
|
-
|
112
|
-
result.count.should eql(1)
|
113
|
-
result.each.to_a
|
114
|
-
result.count.should eql(1)
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should set the actual count of rows after streaming" do
|
118
|
-
result = @client.query("SELECT * FROM mysql2_test", :stream => true, :cache_rows => false)
|
119
|
-
result.count.should eql(0)
|
120
|
-
result.each {|r| }
|
121
|
-
result.count.should eql(1)
|
122
|
-
end
|
123
|
-
|
124
|
-
it "should not yield nil at the end of streaming" do
|
125
|
-
result = @client.query('SELECT * FROM mysql2_test', :stream => true, :cache_rows => false)
|
126
|
-
result.each { |r| r.should_not be_nil}
|
127
|
-
end
|
128
|
-
|
129
|
-
it "#count should be zero for rows after streaming when there were no results" do
|
130
|
-
result = @client.query("SELECT * FROM mysql2_test WHERE null_test IS NOT NULL", :stream => true, :cache_rows => false)
|
131
|
-
result.count.should eql(0)
|
132
|
-
result.each.to_a
|
133
|
-
result.count.should eql(0)
|
134
|
-
end
|
135
|
-
|
136
|
-
it "should raise an exception if streaming ended due to a timeout" do
|
137
|
-
# Create an extra client instance, since we're going to time it out
|
138
|
-
client = Mysql2::Client.new DatabaseCredentials['root']
|
139
|
-
client.query "CREATE TEMPORARY TABLE streamingTest (val BINARY(255))"
|
140
|
-
|
141
|
-
# Insert enough records to force the result set into multiple reads
|
142
|
-
# (the BINARY type is used simply because it forces full width results)
|
143
|
-
10000.times do |i|
|
144
|
-
client.query "INSERT INTO streamingTest (val) VALUES ('Foo #{i}')"
|
145
|
-
end
|
146
|
-
|
147
|
-
client.query "SET net_write_timeout = 1"
|
148
|
-
res = client.query "SELECT * FROM streamingTest", :stream => true, :cache_rows => false
|
149
|
-
|
150
|
-
lambda {
|
151
|
-
res.each_with_index do |row, i|
|
152
|
-
# Exhaust the first result packet then trigger a timeout
|
153
|
-
sleep 2 if i > 0 && i % 1000 == 0
|
154
|
-
end
|
155
|
-
}.should raise_error(Mysql2::Error, /Lost connection/)
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
76
|
context "row data type mapping" do
|
160
77
|
before(:each) do
|
78
|
+
@client.query "USE test"
|
161
79
|
@test_result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
162
80
|
end
|
163
81
|
|
164
|
-
it "should return nil values for NULL and strings for everything else when :cast is false" do
|
165
|
-
result = @client.query('SELECT null_test, tiny_int_test, bool_cast_test, int_test, date_test, enum_test FROM mysql2_test WHERE bool_cast_test = 1 LIMIT 1', :cast => false).first
|
166
|
-
result["null_test"].should be_nil
|
167
|
-
result["tiny_int_test"].should eql("1")
|
168
|
-
result["bool_cast_test"].should eql("1")
|
169
|
-
result["int_test"].should eql("10")
|
170
|
-
result["date_test"].should eql("2010-04-04")
|
171
|
-
result["enum_test"].should eql("val1")
|
172
|
-
end
|
173
|
-
|
174
82
|
it "should return nil for a NULL value" do
|
175
83
|
@test_result['null_test'].class.should eql(NilClass)
|
176
84
|
@test_result['null_test'].should eql(nil)
|
177
85
|
end
|
178
86
|
|
179
|
-
it "should return
|
87
|
+
it "should return Fixnum for a BIT value" do
|
180
88
|
@test_result['bit_test'].class.should eql(String)
|
181
89
|
@test_result['bit_test'].should eql("\000\000\000\000\000\000\000\005")
|
182
90
|
end
|
183
91
|
|
184
|
-
it "should return String for a BIT(1) value" do
|
185
|
-
@test_result['single_bit_test'].class.should eql(String)
|
186
|
-
@test_result['single_bit_test'].should eql("\001")
|
187
|
-
end
|
188
|
-
|
189
92
|
it "should return Fixnum for a TINYINT value" do
|
190
93
|
[Fixnum, Bignum].should include(@test_result['tiny_int_test'].class)
|
191
94
|
@test_result['tiny_int_test'].should eql(1)
|
@@ -196,29 +99,11 @@ describe Mysql2::Result do
|
|
196
99
|
id1 = @client.last_id
|
197
100
|
@client.query 'INSERT INTO mysql2_test (bool_cast_test) VALUES (0)'
|
198
101
|
id2 = @client.last_id
|
199
|
-
@client.query 'INSERT INTO mysql2_test (bool_cast_test) VALUES (-1)'
|
200
|
-
id3 = @client.last_id
|
201
102
|
|
202
103
|
result1 = @client.query 'SELECT bool_cast_test FROM mysql2_test WHERE bool_cast_test = 1 LIMIT 1', :cast_booleans => true
|
203
104
|
result2 = @client.query 'SELECT bool_cast_test FROM mysql2_test WHERE bool_cast_test = 0 LIMIT 1', :cast_booleans => true
|
204
|
-
result3 = @client.query 'SELECT bool_cast_test FROM mysql2_test WHERE bool_cast_test = -1 LIMIT 1', :cast_booleans => true
|
205
105
|
result1.first['bool_cast_test'].should be_true
|
206
106
|
result2.first['bool_cast_test'].should be_false
|
207
|
-
result3.first['bool_cast_test'].should be_true
|
208
|
-
|
209
|
-
@client.query "DELETE from mysql2_test WHERE id IN(#{id1},#{id2},#{id3})"
|
210
|
-
end
|
211
|
-
|
212
|
-
it "should return TrueClass or FalseClass for a BIT(1) value if :cast_booleans is enabled" do
|
213
|
-
@client.query 'INSERT INTO mysql2_test (single_bit_test) VALUES (1)'
|
214
|
-
id1 = @client.last_id
|
215
|
-
@client.query 'INSERT INTO mysql2_test (single_bit_test) VALUES (0)'
|
216
|
-
id2 = @client.last_id
|
217
|
-
|
218
|
-
result1 = @client.query "SELECT single_bit_test FROM mysql2_test WHERE id = #{id1}", :cast_booleans => true
|
219
|
-
result2 = @client.query "SELECT single_bit_test FROM mysql2_test WHERE id = #{id2}", :cast_booleans => true
|
220
|
-
result1.first['single_bit_test'].should be_true
|
221
|
-
result2.first['single_bit_test'].should be_false
|
222
107
|
|
223
108
|
@client.query "DELETE from mysql2_test WHERE id IN(#{id1},#{id2})"
|
224
109
|
end
|
@@ -265,69 +150,42 @@ describe Mysql2::Result do
|
|
265
150
|
|
266
151
|
it "should return Time for a DATETIME value when within the supported range" do
|
267
152
|
@test_result['date_time_test'].class.should eql(Time)
|
268
|
-
@test_result['date_time_test'].strftime("%
|
153
|
+
@test_result['date_time_test'].strftime("%F %T").should eql('2010-04-04 11:44:00')
|
269
154
|
end
|
270
155
|
|
271
|
-
|
272
|
-
|
273
|
-
|
156
|
+
it "should return DateTime for a DATETIME value when outside the supported range, Time if otherwise" do
|
157
|
+
if RUBY_PLATFORM =~ /mswin/
|
158
|
+
inside_year = 1970
|
159
|
+
outside_year = inside_year-1
|
274
160
|
else
|
275
|
-
|
161
|
+
inside_year = 1902
|
162
|
+
outside_year = inside_year-1
|
276
163
|
end
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
r = @client.query("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test")
|
281
|
-
r.first['test'].class.should eql(klass)
|
282
|
-
end
|
283
|
-
|
284
|
-
it "should return DateTime when timestamp is > 2038-01-19T03:14:07" do
|
285
|
-
# 2038-01-19T03:14:07 is the max for 32bit Ruby 1.8
|
286
|
-
r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
|
287
|
-
r.first['test'].class.should eql(klass)
|
288
|
-
end
|
289
|
-
elsif 1.size == 8 # 64bit
|
290
|
-
unless RUBY_VERSION =~ /1.8/
|
291
|
-
it "should return Time when timestamp is < 1901-12-13 20:45:52" do
|
292
|
-
r = @client.query("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test")
|
293
|
-
r.first['test'].class.should eql(Time)
|
294
|
-
end
|
295
|
-
|
296
|
-
it "should return Time when timestamp is > 2038-01-19T03:14:07" do
|
297
|
-
r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
|
298
|
-
r.first['test'].class.should eql(Time)
|
299
|
-
end
|
164
|
+
r = @client.query("SELECT CAST('#{inside_year}-1-1 01:01:01' AS DATETIME) as test")
|
165
|
+
if defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /rbx/
|
166
|
+
klass = DateTime
|
300
167
|
else
|
301
|
-
|
302
|
-
r = @client.query("SELECT CAST('0139-1-1 00:00:00' AS DATETIME) as test")
|
303
|
-
r.first['test'].class.should eql(Time)
|
304
|
-
end
|
305
|
-
|
306
|
-
it "should return DateTime when timestamp is < 0139-1-1T00:00:00" do
|
307
|
-
r = @client.query("SELECT CAST('0138-12-31 11:59:59' AS DATETIME) as test")
|
308
|
-
r.first['test'].class.should eql(DateTime)
|
309
|
-
end
|
310
|
-
|
311
|
-
it "should return Time when timestamp is > 2038-01-19T03:14:07" do
|
312
|
-
r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
|
313
|
-
r.first['test'].class.should eql(Time)
|
314
|
-
end
|
168
|
+
klass = Time
|
315
169
|
end
|
170
|
+
r.first['test'].class.should eql(klass)
|
171
|
+
|
172
|
+
r = @client.query("SELECT CAST('#{outside_year}-1-1 01:01:01' AS DATETIME) as test")
|
173
|
+
r.first['test'].class.should eql(DateTime)
|
316
174
|
end
|
317
175
|
|
318
176
|
it "should return Time for a TIMESTAMP value when within the supported range" do
|
319
177
|
@test_result['timestamp_test'].class.should eql(Time)
|
320
|
-
@test_result['timestamp_test'].strftime("%
|
178
|
+
@test_result['timestamp_test'].strftime("%F %T").should eql('2010-04-04 11:44:00')
|
321
179
|
end
|
322
180
|
|
323
181
|
it "should return Time for a TIME value" do
|
324
182
|
@test_result['time_test'].class.should eql(Time)
|
325
|
-
@test_result['time_test'].strftime("%
|
183
|
+
@test_result['time_test'].strftime("%F %T").should eql('2000-01-01 11:44:00')
|
326
184
|
end
|
327
185
|
|
328
186
|
it "should return Date for a DATE value" do
|
329
187
|
@test_result['date_test'].class.should eql(Date)
|
330
|
-
@test_result['date_test'].strftime("%
|
188
|
+
@test_result['date_test'].strftime("%F").should eql('2010-04-04')
|
331
189
|
end
|
332
190
|
|
333
191
|
it "should return String for an ENUM value" do
|
@@ -335,40 +193,26 @@ describe Mysql2::Result do
|
|
335
193
|
@test_result['enum_test'].should eql('val1')
|
336
194
|
end
|
337
195
|
|
338
|
-
it "should raise an error given an invalid DATETIME" do
|
339
|
-
begin
|
340
|
-
@client.query("SELECT CAST('1972-00-27 00:00:00' AS DATETIME) as bad_datetime").each
|
341
|
-
rescue Mysql2::Error => e
|
342
|
-
error = e
|
343
|
-
end
|
344
|
-
|
345
|
-
error.message.should eql("Invalid date in field 'bad_datetime': 1972-00-27 00:00:00")
|
346
|
-
end
|
347
|
-
|
348
196
|
if defined? Encoding
|
349
197
|
context "string encoding for ENUM values" do
|
350
198
|
it "should default to the connection's encoding if Encoding.default_internal is nil" do
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
end
|
199
|
+
Encoding.default_internal = nil
|
200
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
201
|
+
result['enum_test'].encoding.should eql(Encoding.find('utf-8'))
|
202
|
+
|
203
|
+
client2 = Mysql2::Client.new :encoding => 'ascii'
|
204
|
+
client2.query "USE test"
|
205
|
+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
206
|
+
result['enum_test'].encoding.should eql(Encoding.find('us-ascii'))
|
360
207
|
end
|
361
208
|
|
362
209
|
it "should use Encoding.default_internal" do
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
370
|
-
result['enum_test'].encoding.should eql(Encoding.default_internal)
|
371
|
-
end
|
210
|
+
Encoding.default_internal = Encoding.find('utf-8')
|
211
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
212
|
+
result['enum_test'].encoding.should eql(Encoding.default_internal)
|
213
|
+
Encoding.default_internal = Encoding.find('us-ascii')
|
214
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
215
|
+
result['enum_test'].encoding.should eql(Encoding.default_internal)
|
372
216
|
end
|
373
217
|
end
|
374
218
|
end
|
@@ -381,27 +225,23 @@ describe Mysql2::Result do
|
|
381
225
|
if defined? Encoding
|
382
226
|
context "string encoding for SET values" do
|
383
227
|
it "should default to the connection's encoding if Encoding.default_internal is nil" do
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
end
|
228
|
+
Encoding.default_internal = nil
|
229
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
230
|
+
result['set_test'].encoding.should eql(Encoding.find('utf-8'))
|
231
|
+
|
232
|
+
client2 = Mysql2::Client.new :encoding => 'ascii'
|
233
|
+
client2.query "USE test"
|
234
|
+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
235
|
+
result['set_test'].encoding.should eql(Encoding.find('us-ascii'))
|
393
236
|
end
|
394
237
|
|
395
238
|
it "should use Encoding.default_internal" do
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
403
|
-
result['set_test'].encoding.should eql(Encoding.default_internal)
|
404
|
-
end
|
239
|
+
Encoding.default_internal = Encoding.find('utf-8')
|
240
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
241
|
+
result['set_test'].encoding.should eql(Encoding.default_internal)
|
242
|
+
Encoding.default_internal = Encoding.find('us-ascii')
|
243
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
244
|
+
result['set_test'].encoding.should eql(Encoding.default_internal)
|
405
245
|
end
|
406
246
|
end
|
407
247
|
end
|
@@ -414,22 +254,18 @@ describe Mysql2::Result do
|
|
414
254
|
if defined? Encoding
|
415
255
|
context "string encoding for BINARY values" do
|
416
256
|
it "should default to binary if Encoding.default_internal is nil" do
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
end
|
257
|
+
Encoding.default_internal = nil
|
258
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
259
|
+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
421
260
|
end
|
422
261
|
|
423
262
|
it "should not use Encoding.default_internal" do
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
431
|
-
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
432
|
-
end
|
263
|
+
Encoding.default_internal = Encoding.find('utf-8')
|
264
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
265
|
+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
266
|
+
Encoding.default_internal = Encoding.find('us-ascii')
|
267
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
268
|
+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
433
269
|
end
|
434
270
|
end
|
435
271
|
end
|
@@ -456,46 +292,38 @@ describe Mysql2::Result do
|
|
456
292
|
context "string encoding for #{type} values" do
|
457
293
|
if ['VARBINARY', 'TINYBLOB', 'BLOB', 'MEDIUMBLOB', 'LONGBLOB'].include?(type)
|
458
294
|
it "should default to binary if Encoding.default_internal is nil" do
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
end
|
295
|
+
Encoding.default_internal = nil
|
296
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
297
|
+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
463
298
|
end
|
464
299
|
|
465
300
|
it "should not use Encoding.default_internal" do
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
473
|
-
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
474
|
-
end
|
301
|
+
Encoding.default_internal = Encoding.find('utf-8')
|
302
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
303
|
+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
304
|
+
Encoding.default_internal = Encoding.find('us-ascii')
|
305
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
306
|
+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
475
307
|
end
|
476
308
|
else
|
477
309
|
it "should default to utf-8 if Encoding.default_internal is nil" do
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
end
|
310
|
+
Encoding.default_internal = nil
|
311
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
312
|
+
result[field].encoding.should eql(Encoding.find('utf-8'))
|
313
|
+
|
314
|
+
client2 = Mysql2::Client.new :encoding => 'ascii'
|
315
|
+
client2.query "USE test"
|
316
|
+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
317
|
+
result[field].encoding.should eql(Encoding.find('us-ascii'))
|
487
318
|
end
|
488
319
|
|
489
320
|
it "should use Encoding.default_internal" do
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
497
|
-
result[field].encoding.should eql(Encoding.default_internal)
|
498
|
-
end
|
321
|
+
Encoding.default_internal = Encoding.find('utf-8')
|
322
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
323
|
+
result[field].encoding.should eql(Encoding.default_internal)
|
324
|
+
Encoding.default_internal = Encoding.find('us-ascii')
|
325
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
326
|
+
result[field].encoding.should eql(Encoding.default_internal)
|
499
327
|
end
|
500
328
|
end
|
501
329
|
end
|