mysql2 0.3.18 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -0
  3. data/LICENSE +21 -0
  4. data/README.md +68 -16
  5. data/examples/eventmachine.rb +1 -1
  6. data/examples/threaded.rb +4 -6
  7. data/ext/mysql2/client.c +230 -179
  8. data/ext/mysql2/client.h +18 -1
  9. data/ext/mysql2/extconf.rb +95 -35
  10. data/ext/mysql2/infile.c +2 -2
  11. data/ext/mysql2/mysql2_ext.c +1 -0
  12. data/ext/mysql2/mysql2_ext.h +5 -6
  13. data/ext/mysql2/mysql_enc_name_to_ruby.h +2 -2
  14. data/ext/mysql2/mysql_enc_to_ruby.h +25 -22
  15. data/ext/mysql2/result.c +501 -132
  16. data/ext/mysql2/result.h +12 -6
  17. data/ext/mysql2/statement.c +504 -0
  18. data/ext/mysql2/statement.h +19 -0
  19. data/lib/mysql2/client.rb +71 -25
  20. data/lib/mysql2/console.rb +1 -1
  21. data/lib/mysql2/em.rb +5 -6
  22. data/lib/mysql2/error.rb +18 -27
  23. data/lib/mysql2/field.rb +3 -0
  24. data/lib/mysql2/statement.rb +17 -0
  25. data/lib/mysql2/version.rb +1 -1
  26. data/lib/mysql2.rb +38 -18
  27. data/spec/em/em_spec.rb +21 -21
  28. data/spec/mysql2/client_spec.rb +453 -359
  29. data/spec/mysql2/error_spec.rb +37 -36
  30. data/spec/mysql2/result_spec.rb +217 -208
  31. data/spec/mysql2/statement_spec.rb +695 -0
  32. data/spec/spec_helper.rb +7 -0
  33. data/spec/ssl/ca-cert.pem +17 -0
  34. data/spec/ssl/ca-key.pem +27 -0
  35. data/spec/ssl/ca.cnf +22 -0
  36. data/spec/ssl/cert.cnf +22 -0
  37. data/spec/ssl/client-cert.pem +17 -0
  38. data/spec/ssl/client-key.pem +27 -0
  39. data/spec/ssl/client-req.pem +15 -0
  40. data/spec/ssl/gen_certs.sh +48 -0
  41. data/spec/ssl/pkcs8-client-key.pem +28 -0
  42. data/spec/ssl/pkcs8-server-key.pem +28 -0
  43. data/spec/ssl/server-cert.pem +17 -0
  44. data/spec/ssl/server-key.pem +27 -0
  45. data/spec/ssl/server-req.pem +15 -0
  46. data/support/mysql_enc_to_ruby.rb +7 -8
  47. data/support/ruby_enc_to_mysql.rb +1 -1
  48. metadata +41 -46
@@ -1,39 +1,51 @@
1
1
  # encoding: UTF-8
2
2
  require 'spec_helper'
3
3
 
4
- describe Mysql2::Result do
4
+ RSpec.describe Mysql2::Result do
5
5
  before(:each) do
6
6
  @result = @client.query "SELECT 1"
7
7
  end
8
8
 
9
+ it "should raise a TypeError exception when it doesn't wrap a result set" do
10
+ r = Mysql2::Result.new
11
+ expect { r.count }.to raise_error(TypeError)
12
+ expect { r.fields }.to raise_error(TypeError)
13
+ expect { r.size }.to raise_error(TypeError)
14
+ expect { r.each }.to raise_error(TypeError)
15
+ end
16
+
9
17
  it "should have included Enumerable" do
10
- Mysql2::Result.ancestors.include?(Enumerable).should be_true
18
+ expect(Mysql2::Result.ancestors.include?(Enumerable)).to be true
11
19
  end
12
20
 
13
21
  it "should respond to #each" do
14
- @result.should respond_to(:each)
22
+ expect(@result).to respond_to(:each)
23
+ end
24
+
25
+ it "should respond to #free" do
26
+ expect(@result).to respond_to(:free)
15
27
  end
16
28
 
17
29
  it "should raise a Mysql2::Error exception upon a bad query" do
18
- lambda {
30
+ expect {
19
31
  @client.query "bad sql"
20
- }.should raise_error(Mysql2::Error)
32
+ }.to raise_error(Mysql2::Error)
21
33
 
22
- lambda {
34
+ expect {
23
35
  @client.query "SELECT 1"
24
- }.should_not raise_error(Mysql2::Error)
36
+ }.not_to raise_error
25
37
  end
26
38
 
27
39
  it "should respond to #count, which is aliased as #size" do
28
40
  r = @client.query "SELECT 1"
29
- r.should respond_to :count
30
- r.should respond_to :size
41
+ expect(r).to respond_to :count
42
+ expect(r).to respond_to :size
31
43
  end
32
44
 
33
45
  it "should be able to return the number of rows in the result set" do
34
46
  r = @client.query "SELECT 1"
35
- r.count.should eql(1)
36
- r.size.should eql(1)
47
+ expect(r.count).to eql(1)
48
+ expect(r.size).to eql(1)
37
49
  end
38
50
 
39
51
  context "metadata queries" do
@@ -45,39 +57,39 @@ describe Mysql2::Result do
45
57
  context "#each" do
46
58
  it "should yield rows as hash's" do
47
59
  @result.each do |row|
48
- row.class.should eql(Hash)
60
+ expect(row).to be_an_instance_of(Hash)
49
61
  end
50
62
  end
51
63
 
52
64
  it "should yield rows as hash's with symbol keys if :symbolize_keys was set to true" do
53
65
  @result.each(:symbolize_keys => true) do |row|
54
- row.keys.first.class.should eql(Symbol)
66
+ expect(row.keys.first).to be_an_instance_of(Symbol)
55
67
  end
56
68
  end
57
69
 
58
70
  it "should be able to return results as an array" do
59
71
  @result.each(:as => :array) do |row|
60
- row.class.should eql(Array)
72
+ expect(row).to be_an_instance_of(Array)
61
73
  end
62
74
  end
63
75
 
64
76
  it "should cache previously yielded results by default" do
65
- @result.first.object_id.should eql(@result.first.object_id)
77
+ expect(@result.first.object_id).to eql(@result.first.object_id)
66
78
  end
67
79
 
68
80
  it "should not cache previously yielded results if cache_rows is disabled" do
69
81
  result = @client.query "SELECT 1", :cache_rows => false
70
- result.first.object_id.should_not eql(result.first.object_id)
82
+ expect(result.first.object_id).not_to eql(result.first.object_id)
71
83
  end
72
84
 
73
85
  it "should yield different value for #first if streaming" do
74
86
  result = @client.query "SELECT 1 UNION SELECT 2", :stream => true, :cache_rows => false
75
- result.first.should_not eql(result.first)
87
+ expect(result.first).not_to eql(result.first)
76
88
  end
77
89
 
78
90
  it "should yield the same value for #first if streaming is disabled" do
79
91
  result = @client.query "SELECT 1 UNION SELECT 2", :stream => false
80
- result.first.should eql(result.first)
92
+ expect(result.first).to eql(result.first)
81
93
  end
82
94
 
83
95
  it "should throw an exception if we try to iterate twice when streaming is enabled" do
@@ -96,41 +108,43 @@ describe Mysql2::Result do
96
108
  end
97
109
 
98
110
  it "method should exist" do
99
- @test_result.should respond_to(:fields)
111
+ expect(@test_result).to respond_to(:fields)
100
112
  end
101
113
 
102
114
  it "should return an array of field names in proper order" do
103
115
  result = @client.query "SELECT 'a', 'b', 'c'"
104
- result.fields.should eql(['a', 'b', 'c'])
116
+ expect(result.fields).to eql(%w(a b c))
105
117
  end
106
118
  end
107
119
 
108
120
  context "streaming" do
109
121
  it "should maintain a count while streaming" do
110
- result = @client.query('SELECT 1')
111
-
112
- result.count.should eql(1)
122
+ result = @client.query('SELECT 1', :stream => true, :cache_rows => false)
123
+ expect(result.count).to eql(0)
113
124
  result.each.to_a
114
- result.count.should eql(1)
125
+ expect(result.count).to eql(1)
115
126
  end
116
127
 
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)
128
+ it "should retain the count when mixing first and each" do
129
+ result = @client.query("SELECT 1 UNION SELECT 2", :stream => true, :cache_rows => false)
130
+ expect(result.count).to eql(0)
131
+ result.first
132
+ expect(result.count).to eql(1)
133
+ result.each.to_a
134
+ expect(result.count).to eql(2)
122
135
  end
123
136
 
124
137
  it "should not yield nil at the end of streaming" do
125
138
  result = @client.query('SELECT * FROM mysql2_test', :stream => true, :cache_rows => false)
126
- result.each { |r| r.should_not be_nil}
139
+ result.each { |r| expect(r).not_to be_nil }
127
140
  end
128
141
 
129
142
  it "#count should be zero for rows after streaming when there were no results" do
143
+ @client.query "USE test"
130
144
  result = @client.query("SELECT * FROM mysql2_test WHERE null_test IS NOT NULL", :stream => true, :cache_rows => false)
131
- result.count.should eql(0)
145
+ expect(result.count).to eql(0)
132
146
  result.each.to_a
133
- result.count.should eql(0)
147
+ expect(result.count).to eql(0)
134
148
  end
135
149
 
136
150
  it "should raise an exception if streaming ended due to a timeout" do
@@ -147,12 +161,12 @@ describe Mysql2::Result do
147
161
  client.query "SET net_write_timeout = 1"
148
162
  res = client.query "SELECT * FROM streamingTest", :stream => true, :cache_rows => false
149
163
 
150
- lambda {
151
- res.each_with_index do |row, i|
164
+ expect {
165
+ res.each_with_index do |_, i|
152
166
  # Exhaust the first result packet then trigger a timeout
153
167
  sleep 2 if i > 0 && i % 1000 == 0
154
168
  end
155
- }.should raise_error(Mysql2::Error, /Lost connection/)
169
+ }.to raise_error(Mysql2::Error, /Lost connection/)
156
170
  end
157
171
  end
158
172
 
@@ -163,32 +177,32 @@ describe Mysql2::Result do
163
177
 
164
178
  it "should return nil values for NULL and strings for everything else when :cast is false" do
165
179
  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")
180
+ expect(result["null_test"]).to be_nil
181
+ expect(result["tiny_int_test"]).to eql("1")
182
+ expect(result["bool_cast_test"]).to eql("1")
183
+ expect(result["int_test"]).to eql("10")
184
+ expect(result["date_test"]).to eql("2010-04-04")
185
+ expect(result["enum_test"]).to eql("val1")
172
186
  end
173
187
 
174
188
  it "should return nil for a NULL value" do
175
- @test_result['null_test'].class.should eql(NilClass)
176
- @test_result['null_test'].should eql(nil)
189
+ expect(@test_result['null_test']).to be_an_instance_of(NilClass)
190
+ expect(@test_result['null_test']).to eql(nil)
177
191
  end
178
192
 
179
193
  it "should return String for a BIT(64) value" do
180
- @test_result['bit_test'].class.should eql(String)
181
- @test_result['bit_test'].should eql("\000\000\000\000\000\000\000\005")
194
+ expect(@test_result['bit_test']).to be_an_instance_of(String)
195
+ expect(@test_result['bit_test']).to eql("\000\000\000\000\000\000\000\005")
182
196
  end
183
197
 
184
198
  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")
199
+ expect(@test_result['single_bit_test']).to be_an_instance_of(String)
200
+ expect(@test_result['single_bit_test']).to eql("\001")
187
201
  end
188
202
 
189
203
  it "should return Fixnum for a TINYINT value" do
190
- [Fixnum, Bignum].should include(@test_result['tiny_int_test'].class)
191
- @test_result['tiny_int_test'].should eql(1)
204
+ expect([Fixnum, Bignum]).to include(@test_result['tiny_int_test'].class)
205
+ expect(@test_result['tiny_int_test']).to eql(1)
192
206
  end
193
207
 
194
208
  it "should return TrueClass or FalseClass for a TINYINT value if :cast_booleans is enabled" do
@@ -202,9 +216,9 @@ describe Mysql2::Result do
202
216
  result1 = @client.query 'SELECT bool_cast_test FROM mysql2_test WHERE bool_cast_test = 1 LIMIT 1', :cast_booleans => true
203
217
  result2 = @client.query 'SELECT bool_cast_test FROM mysql2_test WHERE bool_cast_test = 0 LIMIT 1', :cast_booleans => true
204
218
  result3 = @client.query 'SELECT bool_cast_test FROM mysql2_test WHERE bool_cast_test = -1 LIMIT 1', :cast_booleans => true
205
- result1.first['bool_cast_test'].should be_true
206
- result2.first['bool_cast_test'].should be_false
207
- result3.first['bool_cast_test'].should be_true
219
+ expect(result1.first['bool_cast_test']).to be true
220
+ expect(result2.first['bool_cast_test']).to be false
221
+ expect(result3.first['bool_cast_test']).to be true
208
222
 
209
223
  @client.query "DELETE from mysql2_test WHERE id IN(#{id1},#{id2},#{id3})"
210
224
  end
@@ -217,219 +231,214 @@ describe Mysql2::Result do
217
231
 
218
232
  result1 = @client.query "SELECT single_bit_test FROM mysql2_test WHERE id = #{id1}", :cast_booleans => true
219
233
  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
234
+ expect(result1.first['single_bit_test']).to be true
235
+ expect(result2.first['single_bit_test']).to be false
222
236
 
223
237
  @client.query "DELETE from mysql2_test WHERE id IN(#{id1},#{id2})"
224
238
  end
225
239
 
226
240
  it "should return Fixnum for a SMALLINT value" do
227
- [Fixnum, Bignum].should include(@test_result['small_int_test'].class)
228
- @test_result['small_int_test'].should eql(10)
241
+ expect([Fixnum, Bignum]).to include(@test_result['small_int_test'].class)
242
+ expect(@test_result['small_int_test']).to eql(10)
229
243
  end
230
244
 
231
245
  it "should return Fixnum for a MEDIUMINT value" do
232
- [Fixnum, Bignum].should include(@test_result['medium_int_test'].class)
233
- @test_result['medium_int_test'].should eql(10)
246
+ expect([Fixnum, Bignum]).to include(@test_result['medium_int_test'].class)
247
+ expect(@test_result['medium_int_test']).to eql(10)
234
248
  end
235
249
 
236
250
  it "should return Fixnum for an INT value" do
237
- [Fixnum, Bignum].should include(@test_result['int_test'].class)
238
- @test_result['int_test'].should eql(10)
251
+ expect([Fixnum, Bignum]).to include(@test_result['int_test'].class)
252
+ expect(@test_result['int_test']).to eql(10)
239
253
  end
240
254
 
241
255
  it "should return Fixnum for a BIGINT value" do
242
- [Fixnum, Bignum].should include(@test_result['big_int_test'].class)
243
- @test_result['big_int_test'].should eql(10)
256
+ expect([Fixnum, Bignum]).to include(@test_result['big_int_test'].class)
257
+ expect(@test_result['big_int_test']).to eql(10)
244
258
  end
245
259
 
246
260
  it "should return Fixnum for a YEAR value" do
247
- [Fixnum, Bignum].should include(@test_result['year_test'].class)
248
- @test_result['year_test'].should eql(2009)
261
+ expect([Fixnum, Bignum]).to include(@test_result['year_test'].class)
262
+ expect(@test_result['year_test']).to eql(2009)
249
263
  end
250
264
 
251
265
  it "should return BigDecimal for a DECIMAL value" do
252
- @test_result['decimal_test'].class.should eql(BigDecimal)
253
- @test_result['decimal_test'].should eql(10.3)
266
+ expect(@test_result['decimal_test']).to be_an_instance_of(BigDecimal)
267
+ expect(@test_result['decimal_test']).to eql(10.3)
254
268
  end
255
269
 
256
270
  it "should return Float for a FLOAT value" do
257
- @test_result['float_test'].class.should eql(Float)
258
- @test_result['float_test'].should eql(10.3)
271
+ expect(@test_result['float_test']).to be_an_instance_of(Float)
272
+ expect(@test_result['float_test']).to eql(10.3)
259
273
  end
260
274
 
261
275
  it "should return Float for a DOUBLE value" do
262
- @test_result['double_test'].class.should eql(Float)
263
- @test_result['double_test'].should eql(10.3)
276
+ expect(@test_result['double_test']).to be_an_instance_of(Float)
277
+ expect(@test_result['double_test']).to eql(10.3)
264
278
  end
265
279
 
266
280
  it "should return Time for a DATETIME value when within the supported range" do
267
- @test_result['date_time_test'].class.should eql(Time)
268
- @test_result['date_time_test'].strftime("%Y-%m-%d %H:%M:%S").should eql('2010-04-04 11:44:00')
281
+ expect(@test_result['date_time_test']).to be_an_instance_of(Time)
282
+ expect(@test_result['date_time_test'].strftime("%Y-%m-%d %H:%M:%S")).to eql('2010-04-04 11:44:00')
269
283
  end
270
284
 
271
285
  if 1.size == 4 # 32bit
272
- unless RUBY_VERSION =~ /1.8/
273
- klass = Time
286
+ klass = if RUBY_VERSION =~ /1.8/
287
+ DateTime
274
288
  else
275
- klass = DateTime
289
+ Time
276
290
  end
277
291
 
278
292
  it "should return DateTime when timestamp is < 1901-12-13 20:45:52" do
279
- # 1901-12-13T20:45:52 is the min for 32bit Ruby 1.8
293
+ # 1901-12-13T20:45:52 is the min for 32bit Ruby 1.8
280
294
  r = @client.query("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test")
281
- r.first['test'].class.should eql(klass)
295
+ expect(r.first['test']).to be_an_instance_of(klass)
282
296
  end
283
297
 
284
298
  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
299
+ # 2038-01-19T03:14:07 is the max for 32bit Ruby 1.8
286
300
  r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
287
- r.first['test'].class.should eql(klass)
301
+ expect(r.first['test']).to be_an_instance_of(klass)
288
302
  end
289
303
  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
300
- else
304
+ if RUBY_VERSION =~ /1.8/
301
305
  it "should return Time when timestamp is > 0138-12-31 11:59:59" do
302
306
  r = @client.query("SELECT CAST('0139-1-1 00:00:00' AS DATETIME) as test")
303
- r.first['test'].class.should eql(Time)
307
+ expect(r.first['test']).to be_an_instance_of(Time)
304
308
  end
305
309
 
306
310
  it "should return DateTime when timestamp is < 0139-1-1T00:00:00" do
307
311
  r = @client.query("SELECT CAST('0138-12-31 11:59:59' AS DATETIME) as test")
308
- r.first['test'].class.should eql(DateTime)
312
+ expect(r.first['test']).to be_an_instance_of(DateTime)
313
+ end
314
+
315
+ it "should return Time when timestamp is > 2038-01-19T03:14:07" do
316
+ r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
317
+ expect(r.first['test']).to be_an_instance_of(Time)
318
+ end
319
+ else
320
+ it "should return Time when timestamp is < 1901-12-13 20:45:52" do
321
+ r = @client.query("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test")
322
+ expect(r.first['test']).to be_an_instance_of(Time)
309
323
  end
310
324
 
311
325
  it "should return Time when timestamp is > 2038-01-19T03:14:07" do
312
326
  r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
313
- r.first['test'].class.should eql(Time)
327
+ expect(r.first['test']).to be_an_instance_of(Time)
314
328
  end
315
329
  end
316
330
  end
317
331
 
318
332
  it "should return Time for a TIMESTAMP value when within the supported range" do
319
- @test_result['timestamp_test'].class.should eql(Time)
320
- @test_result['timestamp_test'].strftime("%Y-%m-%d %H:%M:%S").should eql('2010-04-04 11:44:00')
333
+ expect(@test_result['timestamp_test']).to be_an_instance_of(Time)
334
+ expect(@test_result['timestamp_test'].strftime("%Y-%m-%d %H:%M:%S")).to eql('2010-04-04 11:44:00')
321
335
  end
322
336
 
323
337
  it "should return Time for a TIME value" do
324
- @test_result['time_test'].class.should eql(Time)
325
- @test_result['time_test'].strftime("%Y-%m-%d %H:%M:%S").should eql('2000-01-01 11:44:00')
338
+ expect(@test_result['time_test']).to be_an_instance_of(Time)
339
+ expect(@test_result['time_test'].strftime("%Y-%m-%d %H:%M:%S")).to eql('2000-01-01 11:44:00')
326
340
  end
327
341
 
328
342
  it "should return Date for a DATE value" do
329
- @test_result['date_test'].class.should eql(Date)
330
- @test_result['date_test'].strftime("%Y-%m-%d").should eql('2010-04-04')
343
+ expect(@test_result['date_test']).to be_an_instance_of(Date)
344
+ expect(@test_result['date_test'].strftime("%Y-%m-%d")).to eql('2010-04-04')
331
345
  end
332
346
 
333
347
  it "should return String for an ENUM value" do
334
- @test_result['enum_test'].class.should eql(String)
335
- @test_result['enum_test'].should eql('val1')
348
+ expect(@test_result['enum_test']).to be_an_instance_of(String)
349
+ expect(@test_result['enum_test']).to eql('val1')
336
350
  end
337
351
 
338
352
  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")
353
+ expect { @client.query("SELECT CAST('1972-00-27 00:00:00' AS DATETIME) as bad_datetime").each }.to \
354
+ raise_error(Mysql2::Error, "Invalid date in field 'bad_datetime': 1972-00-27 00:00:00")
346
355
  end
347
356
 
348
- if defined? Encoding
349
- context "string encoding for ENUM values" do
350
- it "should default to the connection's encoding if Encoding.default_internal is nil" do
351
- with_internal_encoding nil do
352
- result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
353
- result['enum_test'].encoding.should eql(Encoding.find('utf-8'))
357
+ context "string encoding for ENUM values" do
358
+ before { pending('Encoding is undefined') unless defined?(Encoding) }
354
359
 
355
- client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
356
- result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
357
- result['enum_test'].encoding.should eql(Encoding.find('us-ascii'))
358
- client2.close
359
- end
360
+ it "should default to the connection's encoding if Encoding.default_internal is nil" do
361
+ with_internal_encoding nil do
362
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
363
+ expect(result['enum_test'].encoding).to eql(Encoding::UTF_8)
364
+
365
+ client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
366
+ result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
367
+ expect(result['enum_test'].encoding).to eql(Encoding::ASCII)
368
+ client2.close
360
369
  end
370
+ end
361
371
 
362
- it "should use Encoding.default_internal" do
363
- with_internal_encoding 'utf-8' do
364
- result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
365
- result['enum_test'].encoding.should eql(Encoding.default_internal)
366
- end
372
+ it "should use Encoding.default_internal" do
373
+ with_internal_encoding Encoding::UTF_8 do
374
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
375
+ expect(result['enum_test'].encoding).to eql(Encoding.default_internal)
376
+ end
367
377
 
368
- with_internal_encoding 'us-ascii' do
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
378
+ with_internal_encoding Encoding::ASCII do
379
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
380
+ expect(result['enum_test'].encoding).to eql(Encoding.default_internal)
372
381
  end
373
382
  end
374
383
  end
375
384
 
376
385
  it "should return String for a SET value" do
377
- @test_result['set_test'].class.should eql(String)
378
- @test_result['set_test'].should eql('val1,val2')
386
+ expect(@test_result['set_test']).to be_an_instance_of(String)
387
+ expect(@test_result['set_test']).to eql('val1,val2')
379
388
  end
380
389
 
381
- if defined? Encoding
382
- context "string encoding for SET values" do
383
- it "should default to the connection's encoding if Encoding.default_internal is nil" do
384
- with_internal_encoding nil do
385
- result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
386
- result['set_test'].encoding.should eql(Encoding.find('utf-8'))
390
+ context "string encoding for SET values" do
391
+ before { pending('Encoding is undefined') unless defined?(Encoding) }
387
392
 
388
- client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
389
- result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
390
- result['set_test'].encoding.should eql(Encoding.find('us-ascii'))
391
- client2.close
392
- end
393
+ it "should default to the connection's encoding if Encoding.default_internal is nil" do
394
+ with_internal_encoding nil do
395
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
396
+ expect(result['set_test'].encoding).to eql(Encoding::UTF_8)
397
+
398
+ client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
399
+ result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
400
+ expect(result['set_test'].encoding).to eql(Encoding::ASCII)
401
+ client2.close
393
402
  end
403
+ end
394
404
 
395
- it "should use Encoding.default_internal" do
396
- with_internal_encoding 'utf-8' do
397
- result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
398
- result['set_test'].encoding.should eql(Encoding.default_internal)
399
- end
405
+ it "should use Encoding.default_internal" do
406
+ with_internal_encoding Encoding::UTF_8 do
407
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
408
+ expect(result['set_test'].encoding).to eql(Encoding.default_internal)
409
+ end
400
410
 
401
- with_internal_encoding 'us-ascii' do
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
411
+ with_internal_encoding Encoding::ASCII do
412
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
413
+ expect(result['set_test'].encoding).to eql(Encoding.default_internal)
405
414
  end
406
415
  end
407
416
  end
408
417
 
409
418
  it "should return String for a BINARY value" do
410
- @test_result['binary_test'].class.should eql(String)
411
- @test_result['binary_test'].should eql("test#{"\000"*6}")
419
+ expect(@test_result['binary_test']).to be_an_instance_of(String)
420
+ expect(@test_result['binary_test']).to eql("test#{"\000" * 6}")
412
421
  end
413
422
 
414
- if defined? Encoding
415
- context "string encoding for BINARY values" do
416
- it "should default to binary if Encoding.default_internal is nil" do
417
- with_internal_encoding nil do
418
- result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
419
- result['binary_test'].encoding.should eql(Encoding.find('binary'))
420
- end
423
+ context "string encoding for BINARY values" do
424
+ before { pending('Encoding is undefined') unless defined?(Encoding) }
425
+
426
+ it "should default to binary if Encoding.default_internal is nil" do
427
+ with_internal_encoding nil do
428
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
429
+ expect(result['binary_test'].encoding).to eql(Encoding::BINARY)
421
430
  end
431
+ end
422
432
 
423
- it "should not use Encoding.default_internal" do
424
- with_internal_encoding 'utf-8' do
425
- result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
426
- result['binary_test'].encoding.should eql(Encoding.find('binary'))
427
- end
433
+ it "should not use Encoding.default_internal" do
434
+ with_internal_encoding Encoding::UTF_8 do
435
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
436
+ expect(result['binary_test'].encoding).to eql(Encoding::BINARY)
437
+ end
428
438
 
429
- with_internal_encoding 'us-ascii' do
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
439
+ with_internal_encoding Encoding::ASCII do
440
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
441
+ expect(result['binary_test'].encoding).to eql(Encoding::BINARY)
433
442
  end
434
443
  end
435
444
  end
@@ -445,57 +454,57 @@ describe Mysql2::Result do
445
454
  'medium_blob_test' => 'MEDIUMBLOB',
446
455
  'medium_text_test' => 'MEDIUMTEXT',
447
456
  'long_blob_test' => 'LONGBLOB',
448
- 'long_text_test' => 'LONGTEXT'
457
+ 'long_text_test' => 'LONGTEXT',
449
458
  }.each do |field, type|
450
459
  it "should return a String for #{type}" do
451
- @test_result[field].class.should eql(String)
452
- @test_result[field].should eql("test")
460
+ expect(@test_result[field]).to be_an_instance_of(String)
461
+ expect(@test_result[field]).to eql("test")
453
462
  end
454
463
 
455
- if defined? Encoding
456
- context "string encoding for #{type} values" do
457
- if ['VARBINARY', 'TINYBLOB', 'BLOB', 'MEDIUMBLOB', 'LONGBLOB'].include?(type)
458
- it "should default to binary if Encoding.default_internal is nil" do
459
- with_internal_encoding nil do
460
- result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
461
- result['binary_test'].encoding.should eql(Encoding.find('binary'))
462
- end
464
+ context "string encoding for #{type} values" do
465
+ before { pending('Encoding is undefined') unless defined?(Encoding) }
466
+
467
+ if %w(VARBINARY TINYBLOB BLOB MEDIUMBLOB LONGBLOB).include?(type)
468
+ it "should default to binary if Encoding.default_internal is nil" do
469
+ with_internal_encoding nil do
470
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
471
+ expect(result['binary_test'].encoding).to eql(Encoding::BINARY)
463
472
  end
473
+ end
464
474
 
465
- it "should not use Encoding.default_internal" do
466
- with_internal_encoding 'utf-8' do
467
- result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
468
- result['binary_test'].encoding.should eql(Encoding.find('binary'))
469
- end
475
+ it "should not use Encoding.default_internal" do
476
+ with_internal_encoding Encoding::UTF_8 do
477
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
478
+ expect(result['binary_test'].encoding).to eql(Encoding::BINARY)
479
+ end
470
480
 
471
- with_internal_encoding 'us-ascii' do
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
481
+ with_internal_encoding Encoding::ASCII do
482
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
483
+ expect(result['binary_test'].encoding).to eql(Encoding::BINARY)
475
484
  end
476
- else
477
- it "should default to utf-8 if Encoding.default_internal is nil" do
478
- with_internal_encoding nil do
479
- result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
480
- result[field].encoding.should eql(Encoding.find('utf-8'))
481
-
482
- client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
483
- result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
484
- result[field].encoding.should eql(Encoding.find('us-ascii'))
485
- client2.close
486
- end
485
+ end
486
+ else
487
+ it "should default to utf-8 if Encoding.default_internal is nil" do
488
+ with_internal_encoding nil do
489
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
490
+ expect(result[field].encoding).to eql(Encoding::UTF_8)
491
+
492
+ client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
493
+ result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
494
+ expect(result[field].encoding).to eql(Encoding::ASCII)
495
+ client2.close
487
496
  end
497
+ end
488
498
 
489
- it "should use Encoding.default_internal" do
490
- with_internal_encoding 'utf-8' do
491
- result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
492
- result[field].encoding.should eql(Encoding.default_internal)
493
- end
499
+ it "should use Encoding.default_internal" do
500
+ with_internal_encoding Encoding::UTF_8 do
501
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
502
+ expect(result[field].encoding).to eql(Encoding.default_internal)
503
+ end
494
504
 
495
- with_internal_encoding 'us-ascii' do
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
505
+ with_internal_encoding Encoding::ASCII do
506
+ result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
507
+ expect(result[field].encoding).to eql(Encoding.default_internal)
499
508
  end
500
509
  end
501
510
  end