mysql2 0.4.6 → 0.4.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +54 -42
- data/ext/mysql2/client.c +71 -24
- data/ext/mysql2/client.h +1 -2
- data/ext/mysql2/extconf.rb +8 -4
- data/ext/mysql2/mysql2_ext.h +0 -4
- data/ext/mysql2/result.c +7 -1
- data/ext/mysql2/statement.c +23 -2
- data/lib/mysql2/client.rb +5 -5
- data/lib/mysql2/version.rb +1 -1
- data/spec/em/em_spec.rb +1 -0
- data/spec/mysql2/client_spec.rb +130 -78
- data/spec/mysql2/error_spec.rb +3 -5
- data/spec/mysql2/result_spec.rb +62 -36
- data/spec/mysql2/statement_spec.rb +65 -48
- data/spec/spec_helper.rb +73 -59
- data/support/5072E1F5.asc +432 -0
- metadata +12 -11
data/spec/mysql2/error_spec.rb
CHANGED
@@ -3,11 +3,9 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
RSpec.describe Mysql2::Error do
|
6
|
-
let(:client) { Mysql2::Client.new(DatabaseCredentials['root']) }
|
7
|
-
|
8
6
|
let(:error) do
|
9
7
|
begin
|
10
|
-
client.query("HAHAHA")
|
8
|
+
@client.query("HAHAHA")
|
11
9
|
rescue Mysql2::Error => e
|
12
10
|
error = e
|
13
11
|
end
|
@@ -28,7 +26,7 @@ RSpec.describe Mysql2::Error do
|
|
28
26
|
let(:valid_utf8) { '造字' }
|
29
27
|
let(:error) do
|
30
28
|
begin
|
31
|
-
client.query(valid_utf8)
|
29
|
+
@client.query(valid_utf8)
|
32
30
|
rescue Mysql2::Error => e
|
33
31
|
e
|
34
32
|
end
|
@@ -37,7 +35,7 @@ RSpec.describe Mysql2::Error do
|
|
37
35
|
let(:invalid_utf8) { ["e5c67d1f"].pack('H*').force_encoding(Encoding::UTF_8) }
|
38
36
|
let(:bad_err) do
|
39
37
|
begin
|
40
|
-
client.query(invalid_utf8)
|
38
|
+
@client.query(invalid_utf8)
|
41
39
|
rescue Mysql2::Error => e
|
42
40
|
e
|
43
41
|
end
|
data/spec/mysql2/result_spec.rb
CHANGED
@@ -153,18 +153,16 @@ RSpec.describe Mysql2::Result do
|
|
153
153
|
end
|
154
154
|
|
155
155
|
it "should raise an exception if streaming ended due to a timeout" do
|
156
|
-
|
157
|
-
client = Mysql2::Client.new DatabaseCredentials['root']
|
158
|
-
client.query "CREATE TEMPORARY TABLE streamingTest (val BINARY(255)) ENGINE=MEMORY"
|
156
|
+
@client.query "CREATE TEMPORARY TABLE streamingTest (val BINARY(255)) ENGINE=MEMORY"
|
159
157
|
|
160
158
|
# Insert enough records to force the result set into multiple reads
|
161
159
|
# (the BINARY type is used simply because it forces full width results)
|
162
160
|
10000.times do |i|
|
163
|
-
client.query "INSERT INTO streamingTest (val) VALUES ('Foo #{i}')"
|
161
|
+
@client.query "INSERT INTO streamingTest (val) VALUES ('Foo #{i}')"
|
164
162
|
end
|
165
163
|
|
166
|
-
client.query "SET net_write_timeout = 1"
|
167
|
-
res = client.query "SELECT * FROM streamingTest", :stream => true, :cache_rows => false
|
164
|
+
@client.query "SET net_write_timeout = 1"
|
165
|
+
res = @client.query "SELECT * FROM streamingTest", :stream => true, :cache_rows => false
|
168
166
|
|
169
167
|
expect {
|
170
168
|
res.each_with_index do |_, i|
|
@@ -210,36 +208,43 @@ RSpec.describe Mysql2::Result do
|
|
210
208
|
expect(@test_result['tiny_int_test']).to eql(1)
|
211
209
|
end
|
212
210
|
|
213
|
-
|
214
|
-
|
215
|
-
id1
|
216
|
-
@client.query 'INSERT INTO mysql2_test (bool_cast_test) VALUES (0)'
|
217
|
-
|
218
|
-
|
219
|
-
id3 = @client.last_id
|
211
|
+
context "cast booleans for TINYINT if :cast_booleans is enabled" do
|
212
|
+
# rubocop:disable Style/Semicolon
|
213
|
+
let(:id1) { @client.query 'INSERT INTO mysql2_test (bool_cast_test) VALUES ( 1)'; @client.last_id }
|
214
|
+
let(:id2) { @client.query 'INSERT INTO mysql2_test (bool_cast_test) VALUES ( 0)'; @client.last_id }
|
215
|
+
let(:id3) { @client.query 'INSERT INTO mysql2_test (bool_cast_test) VALUES (-1)'; @client.last_id }
|
216
|
+
# rubocop:enable Style/Semicolon
|
220
217
|
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
expect(result1.first['bool_cast_test']).to be true
|
225
|
-
expect(result2.first['bool_cast_test']).to be false
|
226
|
-
expect(result3.first['bool_cast_test']).to be true
|
218
|
+
after do
|
219
|
+
@client.query "DELETE from mysql2_test WHERE id IN(#{id1},#{id2},#{id3})"
|
220
|
+
end
|
227
221
|
|
228
|
-
|
222
|
+
it "should return TrueClass or FalseClass for a TINYINT value if :cast_booleans is enabled" do
|
223
|
+
result1 = @client.query "SELECT bool_cast_test FROM mysql2_test WHERE id = #{id1} LIMIT 1", :cast_booleans => true
|
224
|
+
result2 = @client.query "SELECT bool_cast_test FROM mysql2_test WHERE id = #{id2} LIMIT 1", :cast_booleans => true
|
225
|
+
result3 = @client.query "SELECT bool_cast_test FROM mysql2_test WHERE id = #{id3} LIMIT 1", :cast_booleans => true
|
226
|
+
expect(result1.first['bool_cast_test']).to be true
|
227
|
+
expect(result2.first['bool_cast_test']).to be false
|
228
|
+
expect(result3.first['bool_cast_test']).to be true
|
229
|
+
end
|
229
230
|
end
|
230
231
|
|
231
|
-
|
232
|
-
|
233
|
-
id1
|
234
|
-
@client.query 'INSERT INTO mysql2_test (single_bit_test) VALUES (0)'
|
235
|
-
|
232
|
+
context "cast booleans for BIT(1) if :cast_booleans is enabled" do
|
233
|
+
# rubocop:disable Style/Semicolon
|
234
|
+
let(:id1) { @client.query 'INSERT INTO mysql2_test (single_bit_test) VALUES (1)'; @client.last_id }
|
235
|
+
let(:id2) { @client.query 'INSERT INTO mysql2_test (single_bit_test) VALUES (0)'; @client.last_id }
|
236
|
+
# rubocop:enable Style/Semicolon
|
236
237
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
expect(result2.first['single_bit_test']).to be false
|
238
|
+
after do
|
239
|
+
@client.query "DELETE from mysql2_test WHERE id IN(#{id1},#{id2})"
|
240
|
+
end
|
241
241
|
|
242
|
-
|
242
|
+
it "should return TrueClass or FalseClass for a BIT(1) value if :cast_booleans is enabled" do
|
243
|
+
result1 = @client.query "SELECT single_bit_test FROM mysql2_test WHERE id = #{id1}", :cast_booleans => true
|
244
|
+
result2 = @client.query "SELECT single_bit_test FROM mysql2_test WHERE id = #{id2}", :cast_booleans => true
|
245
|
+
expect(result1.first['single_bit_test']).to be true
|
246
|
+
expect(result2.first['single_bit_test']).to be false
|
247
|
+
end
|
243
248
|
end
|
244
249
|
|
245
250
|
it "should return Fixnum for a SMALLINT value" do
|
@@ -287,6 +292,30 @@ RSpec.describe Mysql2::Result do
|
|
287
292
|
expect(@test_result['date_time_test'].strftime("%Y-%m-%d %H:%M:%S")).to eql('2010-04-04 11:44:00')
|
288
293
|
end
|
289
294
|
|
295
|
+
it "should return Time values with microseconds" do
|
296
|
+
now = Time.now
|
297
|
+
if RUBY_VERSION =~ /1.8/ || @client.server_info[:id] / 100 < 506
|
298
|
+
result = @client.query("SELECT CAST('#{now.strftime('%F %T %z')}' AS DATETIME) AS a")
|
299
|
+
expect(result.first['a'].strftime('%F %T %z')).to eql(now.strftime('%F %T %z'))
|
300
|
+
else
|
301
|
+
result = @client.query("SELECT CAST('#{now.strftime('%F %T.%6N %z')}' AS DATETIME(6)) AS a")
|
302
|
+
# microseconds is 6 digits after the decimal, but only test on 5 significant figures
|
303
|
+
expect(result.first['a'].strftime('%F %T.%5N %z')).to eql(now.strftime('%F %T.%5N %z'))
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
it "should return DateTime values with microseconds" do
|
308
|
+
now = DateTime.now
|
309
|
+
if RUBY_VERSION =~ /1.8/ || @client.server_info[:id] / 100 < 506
|
310
|
+
result = @client.query("SELECT CAST('#{now.strftime('%F %T %z')}' AS DATETIME) AS a")
|
311
|
+
expect(result.first['a'].strftime('%F %T %z')).to eql(now.strftime('%F %T %z'))
|
312
|
+
else
|
313
|
+
result = @client.query("SELECT CAST('#{now.strftime('%F %T.%6N %z')}' AS DATETIME(6)) AS a")
|
314
|
+
# microseconds is 6 digits after the decimal, but only test on 5 significant figures
|
315
|
+
expect(result.first['a'].strftime('%F %T.%5N %z')).to eql(now.strftime('%F %T.%5N %z'))
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
290
319
|
if 1.size == 4 # 32bit
|
291
320
|
klass = if RUBY_VERSION =~ /1.8/
|
292
321
|
DateTime
|
@@ -367,10 +396,9 @@ RSpec.describe Mysql2::Result do
|
|
367
396
|
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
368
397
|
expect(result['enum_test'].encoding).to eql(Encoding::UTF_8)
|
369
398
|
|
370
|
-
client2 =
|
399
|
+
client2 = new_client(:encoding => 'ascii')
|
371
400
|
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
372
401
|
expect(result['enum_test'].encoding).to eql(Encoding::ASCII)
|
373
|
-
client2.close
|
374
402
|
end
|
375
403
|
end
|
376
404
|
|
@@ -400,10 +428,9 @@ RSpec.describe Mysql2::Result do
|
|
400
428
|
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
401
429
|
expect(result['set_test'].encoding).to eql(Encoding::UTF_8)
|
402
430
|
|
403
|
-
client2 =
|
431
|
+
client2 = new_client(:encoding => 'ascii')
|
404
432
|
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
405
433
|
expect(result['set_test'].encoding).to eql(Encoding::ASCII)
|
406
|
-
client2.close
|
407
434
|
end
|
408
435
|
end
|
409
436
|
|
@@ -494,10 +521,9 @@ RSpec.describe Mysql2::Result do
|
|
494
521
|
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
495
522
|
expect(result[field].encoding).to eql(Encoding::UTF_8)
|
496
523
|
|
497
|
-
client2 =
|
524
|
+
client2 = new_client(:encoding => 'ascii')
|
498
525
|
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
499
526
|
expect(result[field].encoding).to eql(Encoding::ASCII)
|
500
|
-
client2.close
|
501
527
|
end
|
502
528
|
end
|
503
529
|
|
@@ -3,7 +3,7 @@ require './spec/spec_helper.rb'
|
|
3
3
|
|
4
4
|
RSpec.describe Mysql2::Statement do
|
5
5
|
before :each do
|
6
|
-
@client =
|
6
|
+
@client = new_client(:encoding => "utf8")
|
7
7
|
end
|
8
8
|
|
9
9
|
def stmt_count
|
@@ -61,6 +61,12 @@ RSpec.describe Mysql2::Statement do
|
|
61
61
|
expect(rows).to eq([{ "1" => 1 }])
|
62
62
|
end
|
63
63
|
|
64
|
+
it "should handle booleans" do
|
65
|
+
stmt = @client.prepare('SELECT ? AS `true`, ? AS `false`')
|
66
|
+
result = stmt.execute(true, false)
|
67
|
+
expect(result.to_a).to eq(['true' => 1, 'false' => 0])
|
68
|
+
end
|
69
|
+
|
64
70
|
it "should handle bignum but in int64_t" do
|
65
71
|
stmt = @client.prepare('SELECT ? AS max, ? AS min')
|
66
72
|
int64_max = (1 << 63) - 1
|
@@ -144,7 +150,8 @@ RSpec.describe Mysql2::Statement do
|
|
144
150
|
if RUBY_VERSION =~ /1.8/
|
145
151
|
expect(result.first['a'].strftime('%F %T %z')).to eql(now.strftime('%F %T %z'))
|
146
152
|
else
|
147
|
-
|
153
|
+
# microseconds is six digits after the decimal, but only test on 5 significant figures
|
154
|
+
expect(result.first['a'].strftime('%F %T.%5N %z')).to eql(now.strftime('%F %T.%5N %z'))
|
148
155
|
end
|
149
156
|
end
|
150
157
|
|
@@ -155,7 +162,8 @@ RSpec.describe Mysql2::Statement do
|
|
155
162
|
if RUBY_VERSION =~ /1.8/
|
156
163
|
expect(result.first['a'].strftime('%F %T %z')).to eql(now.strftime('%F %T %z'))
|
157
164
|
else
|
158
|
-
|
165
|
+
# microseconds is six digits after the decimal, but only test on 5 significant figures
|
166
|
+
expect(result.first['a'].strftime('%F %T.%5N %z')).to eql(now.strftime('%F %T.%5N %z'))
|
159
167
|
end
|
160
168
|
end
|
161
169
|
|
@@ -326,18 +334,19 @@ RSpec.describe Mysql2::Statement do
|
|
326
334
|
end
|
327
335
|
|
328
336
|
context "#fields" do
|
329
|
-
before(:each) do
|
330
|
-
@client.query "USE test"
|
331
|
-
@test_result = @client.prepare("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").execute
|
332
|
-
end
|
333
|
-
|
334
337
|
it "method should exist" do
|
335
|
-
|
338
|
+
stmt = @client.prepare("SELECT 1")
|
339
|
+
expect(stmt).to respond_to(:fields)
|
336
340
|
end
|
337
341
|
|
338
342
|
it "should return an array of field names in proper order" do
|
339
|
-
|
340
|
-
expect(
|
343
|
+
stmt = @client.prepare("SELECT 'a', 'b', 'c'")
|
344
|
+
expect(stmt.fields).to eql(%w(a b c))
|
345
|
+
end
|
346
|
+
|
347
|
+
it "should return nil for statement with no result fields" do
|
348
|
+
stmt = @client.prepare("INSERT INTO mysql2_test () VALUES ()")
|
349
|
+
expect(stmt.fields).to eql(nil)
|
341
350
|
end
|
342
351
|
end
|
343
352
|
|
@@ -367,36 +376,47 @@ RSpec.describe Mysql2::Statement do
|
|
367
376
|
expect(@test_result['tiny_int_test']).to eql(1)
|
368
377
|
end
|
369
378
|
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
id2
|
375
|
-
|
376
|
-
|
379
|
+
context "cast booleans for TINYINT if :cast_booleans is enabled" do
|
380
|
+
# rubocop:disable Style/Semicolon
|
381
|
+
let(:client) { new_client(:cast_booleans => true) }
|
382
|
+
let(:id1) { client.query 'INSERT INTO mysql2_test (bool_cast_test) VALUES ( 1)'; client.last_id }
|
383
|
+
let(:id2) { client.query 'INSERT INTO mysql2_test (bool_cast_test) VALUES ( 0)'; client.last_id }
|
384
|
+
let(:id3) { client.query 'INSERT INTO mysql2_test (bool_cast_test) VALUES (-1)'; client.last_id }
|
385
|
+
# rubocop:enable Style/Semicolon
|
377
386
|
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
expect(result1.first['bool_cast_test']).to be true
|
382
|
-
expect(result2.first['bool_cast_test']).to be false
|
383
|
-
expect(result3.first['bool_cast_test']).to be true
|
387
|
+
after do
|
388
|
+
client.query "DELETE from mysql2_test WHERE id IN(#{id1},#{id2},#{id3})"
|
389
|
+
end
|
384
390
|
|
385
|
-
|
391
|
+
it "should return TrueClass or FalseClass for a TINYINT value if :cast_booleans is enabled" do
|
392
|
+
query = client.prepare 'SELECT bool_cast_test FROM mysql2_test WHERE id = ?'
|
393
|
+
result1 = query.execute id1
|
394
|
+
result2 = query.execute id2
|
395
|
+
result3 = query.execute id3
|
396
|
+
expect(result1.first['bool_cast_test']).to be true
|
397
|
+
expect(result2.first['bool_cast_test']).to be false
|
398
|
+
expect(result3.first['bool_cast_test']).to be true
|
399
|
+
end
|
386
400
|
end
|
387
401
|
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
id2
|
402
|
+
context "cast booleans for BIT(1) if :cast_booleans is enabled" do
|
403
|
+
# rubocop:disable Style/Semicolon
|
404
|
+
let(:client) { new_client(:cast_booleans => true) }
|
405
|
+
let(:id1) { client.query 'INSERT INTO mysql2_test (single_bit_test) VALUES (1)'; client.last_id }
|
406
|
+
let(:id2) { client.query 'INSERT INTO mysql2_test (single_bit_test) VALUES (0)'; client.last_id }
|
407
|
+
# rubocop:enable Style/Semicolon
|
393
408
|
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
expect(result2.first['single_bit_test']).to be false
|
409
|
+
after do
|
410
|
+
client.query "DELETE from mysql2_test WHERE id IN(#{id1},#{id2})"
|
411
|
+
end
|
398
412
|
|
399
|
-
|
413
|
+
it "should return TrueClass or FalseClass for a BIT(1) value if :cast_booleans is enabled" do
|
414
|
+
query = client.prepare 'SELECT single_bit_test FROM mysql2_test WHERE id = ?'
|
415
|
+
result1 = query.execute id1
|
416
|
+
result2 = query.execute id2
|
417
|
+
expect(result1.first['single_bit_test']).to be true
|
418
|
+
expect(result2.first['single_bit_test']).to be false
|
419
|
+
end
|
400
420
|
end
|
401
421
|
|
402
422
|
it "should return Fixnum for a SMALLINT value" do
|
@@ -453,39 +473,39 @@ RSpec.describe Mysql2::Statement do
|
|
453
473
|
|
454
474
|
it "should return DateTime when timestamp is < 1901-12-13 20:45:52" do
|
455
475
|
# 1901-12-13T20:45:52 is the min for 32bit Ruby 1.8
|
456
|
-
r = @client.
|
476
|
+
r = @client.prepare("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test").execute
|
457
477
|
expect(r.first['test']).to be_an_instance_of(klass)
|
458
478
|
end
|
459
479
|
|
460
480
|
it "should return DateTime when timestamp is > 2038-01-19T03:14:07" do
|
461
481
|
# 2038-01-19T03:14:07 is the max for 32bit Ruby 1.8
|
462
|
-
r = @client.
|
482
|
+
r = @client.prepare("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test").execute
|
463
483
|
expect(r.first['test']).to be_an_instance_of(klass)
|
464
484
|
end
|
465
485
|
elsif 1.size == 8 # 64bit
|
466
486
|
if RUBY_VERSION =~ /1.8/
|
467
487
|
it "should return Time when timestamp is > 0138-12-31 11:59:59" do
|
468
|
-
r = @client.
|
488
|
+
r = @client.prepare("SELECT CAST('0139-1-1 00:00:00' AS DATETIME) as test").execute
|
469
489
|
expect(r.first['test']).to be_an_instance_of(Time)
|
470
490
|
end
|
471
491
|
|
472
492
|
it "should return DateTime when timestamp is < 0139-1-1T00:00:00" do
|
473
|
-
r = @client.
|
493
|
+
r = @client.prepare("SELECT CAST('0138-12-31 11:59:59' AS DATETIME) as test").execute
|
474
494
|
expect(r.first['test']).to be_an_instance_of(DateTime)
|
475
495
|
end
|
476
496
|
|
477
497
|
it "should return Time when timestamp is > 2038-01-19T03:14:07" do
|
478
|
-
r = @client.
|
498
|
+
r = @client.prepare("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test").execute
|
479
499
|
expect(r.first['test']).to be_an_instance_of(Time)
|
480
500
|
end
|
481
501
|
else
|
482
502
|
it "should return Time when timestamp is < 1901-12-13 20:45:52" do
|
483
|
-
r = @client.
|
503
|
+
r = @client.prepare("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test").execute
|
484
504
|
expect(r.first['test']).to be_an_instance_of(Time)
|
485
505
|
end
|
486
506
|
|
487
507
|
it "should return Time when timestamp is > 2038-01-19T03:14:07" do
|
488
|
-
r = @client.
|
508
|
+
r = @client.prepare("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test").execute
|
489
509
|
expect(r.first['test']).to be_an_instance_of(Time)
|
490
510
|
end
|
491
511
|
end
|
@@ -524,10 +544,9 @@ RSpec.describe Mysql2::Statement do
|
|
524
544
|
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
525
545
|
expect(result['enum_test'].encoding).to eql(Encoding::UTF_8)
|
526
546
|
|
527
|
-
client2 =
|
547
|
+
client2 = new_client(:encoding => 'ascii')
|
528
548
|
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
529
549
|
expect(result['enum_test'].encoding).to eql(Encoding::US_ASCII)
|
530
|
-
client2.close
|
531
550
|
end
|
532
551
|
end
|
533
552
|
|
@@ -557,10 +576,9 @@ RSpec.describe Mysql2::Statement do
|
|
557
576
|
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
558
577
|
expect(result['set_test'].encoding).to eql(Encoding::UTF_8)
|
559
578
|
|
560
|
-
client2 =
|
579
|
+
client2 = new_client(:encoding => 'ascii')
|
561
580
|
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
562
581
|
expect(result['set_test'].encoding).to eql(Encoding::US_ASCII)
|
563
|
-
client2.close
|
564
582
|
end
|
565
583
|
end
|
566
584
|
|
@@ -651,10 +669,9 @@ RSpec.describe Mysql2::Statement do
|
|
651
669
|
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
652
670
|
expect(result[field].encoding).to eql(Encoding::UTF_8)
|
653
671
|
|
654
|
-
client2 =
|
672
|
+
client2 = new_client(:encoding => 'ascii')
|
655
673
|
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
656
674
|
expect(result[field].encoding).to eql(Encoding::US_ASCII)
|
657
|
-
client2.close
|
658
675
|
end
|
659
676
|
end
|
660
677
|
|
data/spec/spec_helper.rb
CHANGED
@@ -23,72 +23,86 @@ RSpec.configure do |config|
|
|
23
23
|
$VERBOSE = old_verbose
|
24
24
|
end
|
25
25
|
|
26
|
+
def new_client(option_overrides = {})
|
27
|
+
client = Mysql2::Client.new(DatabaseCredentials['root'].merge(option_overrides))
|
28
|
+
@clients ||= []
|
29
|
+
@clients << client
|
30
|
+
return client unless block_given?
|
31
|
+
begin
|
32
|
+
yield client
|
33
|
+
ensure
|
34
|
+
client.close
|
35
|
+
@clients.delete(client)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
26
39
|
config.before :each do
|
27
|
-
@client =
|
40
|
+
@client = new_client
|
28
41
|
end
|
29
42
|
|
30
43
|
config.after :each do
|
31
|
-
@
|
44
|
+
@clients.each(&:close)
|
32
45
|
end
|
33
46
|
|
34
47
|
config.before(:all) do
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
48
|
+
new_client do |client|
|
49
|
+
client.query %[
|
50
|
+
CREATE TABLE IF NOT EXISTS mysql2_test (
|
51
|
+
id MEDIUMINT NOT NULL AUTO_INCREMENT,
|
52
|
+
null_test VARCHAR(10),
|
53
|
+
bit_test BIT(64),
|
54
|
+
single_bit_test BIT(1),
|
55
|
+
tiny_int_test TINYINT,
|
56
|
+
bool_cast_test TINYINT(1),
|
57
|
+
small_int_test SMALLINT,
|
58
|
+
medium_int_test MEDIUMINT,
|
59
|
+
int_test INT,
|
60
|
+
big_int_test BIGINT,
|
61
|
+
float_test FLOAT(10,3),
|
62
|
+
float_zero_test FLOAT(10,3),
|
63
|
+
double_test DOUBLE(10,3),
|
64
|
+
decimal_test DECIMAL(10,3),
|
65
|
+
decimal_zero_test DECIMAL(10,3),
|
66
|
+
date_test DATE,
|
67
|
+
date_time_test DATETIME,
|
68
|
+
timestamp_test TIMESTAMP,
|
69
|
+
time_test TIME,
|
70
|
+
year_test YEAR(4),
|
71
|
+
char_test CHAR(10),
|
72
|
+
varchar_test VARCHAR(10),
|
73
|
+
binary_test BINARY(10),
|
74
|
+
varbinary_test VARBINARY(10),
|
75
|
+
tiny_blob_test TINYBLOB,
|
76
|
+
tiny_text_test TINYTEXT,
|
77
|
+
blob_test BLOB,
|
78
|
+
text_test TEXT,
|
79
|
+
medium_blob_test MEDIUMBLOB,
|
80
|
+
medium_text_test MEDIUMTEXT,
|
81
|
+
long_blob_test LONGBLOB,
|
82
|
+
long_text_test LONGTEXT,
|
83
|
+
enum_test ENUM('val1', 'val2'),
|
84
|
+
set_test SET('val1', 'val2'),
|
85
|
+
PRIMARY KEY (id)
|
86
|
+
)
|
87
|
+
]
|
88
|
+
client.query "DELETE FROM mysql2_test;"
|
89
|
+
client.query %[
|
90
|
+
INSERT INTO mysql2_test (
|
91
|
+
null_test, bit_test, single_bit_test, tiny_int_test, bool_cast_test, small_int_test, medium_int_test, int_test, big_int_test,
|
92
|
+
float_test, float_zero_test, double_test, decimal_test, decimal_zero_test, date_test, date_time_test, timestamp_test, time_test,
|
93
|
+
year_test, char_test, varchar_test, binary_test, varbinary_test, tiny_blob_test,
|
94
|
+
tiny_text_test, blob_test, text_test, medium_blob_test, medium_text_test,
|
95
|
+
long_blob_test, long_text_test, enum_test, set_test
|
96
|
+
)
|
84
97
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
98
|
+
VALUES (
|
99
|
+
NULL, b'101', b'1', 1, 1, 10, 10, 10, 10,
|
100
|
+
10.3, 0, 10.3, 10.3, 0, '2010-4-4', '2010-4-4 11:44:00', '2010-4-4 11:44:00', '11:44:00',
|
101
|
+
2009, "test", "test", "test", "test", "test",
|
102
|
+
"test", "test", "test", "test", "test",
|
103
|
+
"test", "test", 'val1', 'val1,val2'
|
104
|
+
)
|
105
|
+
]
|
106
|
+
end
|
93
107
|
end
|
94
108
|
end
|