mysql2 0.2.21 → 0.2.22
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +65 -25
- data/ext/mysql2/client.c +20 -15
- data/ext/mysql2/client.h +4 -2
- data/ext/mysql2/infile.c +119 -0
- data/ext/mysql2/infile.h +1 -0
- data/ext/mysql2/mysql2_ext.h +1 -0
- data/ext/mysql2/result.c +14 -13
- data/lib/mysql2/error.rb +72 -6
- data/lib/mysql2/version.rb +1 -1
- data/spec/mysql2/client_spec.rb +114 -20
- data/spec/mysql2/error_spec.rb +57 -47
- data/spec/mysql2/result_spec.rb +131 -94
- data/spec/spec_helper.rb +9 -0
- data/spec/test_data +1 -0
- metadata +6 -2
data/spec/mysql2/result_spec.rb
CHANGED
@@ -6,35 +6,6 @@ describe Mysql2::Result do
|
|
6
6
|
@result = @client.query "SELECT 1"
|
7
7
|
end
|
8
8
|
|
9
|
-
it "should maintain a count while streaming" do
|
10
|
-
result = @client.query('SELECT 1')
|
11
|
-
|
12
|
-
result.count.should eql(1)
|
13
|
-
result.each.to_a
|
14
|
-
result.count.should eql(1)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should set the actual count of rows after streaming" do
|
18
|
-
@client.query "USE test"
|
19
|
-
result = @client.query("SELECT * FROM mysql2_test", :stream => true, :cache_rows => false)
|
20
|
-
result.count.should eql(0)
|
21
|
-
result.each {|r| }
|
22
|
-
result.count.should eql(1)
|
23
|
-
end
|
24
|
-
|
25
|
-
it "should not yield nil at the end of streaming" do
|
26
|
-
result = @client.query('SELECT * FROM mysql2_test', :stream => true)
|
27
|
-
result.each { |r| r.should_not be_nil}
|
28
|
-
end
|
29
|
-
|
30
|
-
it "#count should be zero for rows after streaming when there were no results " do
|
31
|
-
@client.query "USE test"
|
32
|
-
result = @client.query("SELECT * FROM mysql2_test WHERE null_test IS NOT NULL", :stream => true, :cache_rows => false)
|
33
|
-
result.count.should eql(0)
|
34
|
-
result.each.to_a
|
35
|
-
result.count.should eql(0)
|
36
|
-
end
|
37
|
-
|
38
9
|
it "should have included Enumerable" do
|
39
10
|
Mysql2::Result.ancestors.include?(Enumerable).should be_true
|
40
11
|
end
|
@@ -121,7 +92,6 @@ describe Mysql2::Result do
|
|
121
92
|
|
122
93
|
context "#fields" do
|
123
94
|
before(:each) do
|
124
|
-
@client.query "USE test"
|
125
95
|
@test_result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1")
|
126
96
|
end
|
127
97
|
|
@@ -135,9 +105,59 @@ describe Mysql2::Result do
|
|
135
105
|
end
|
136
106
|
end
|
137
107
|
|
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
|
+
|
138
159
|
context "row data type mapping" do
|
139
160
|
before(:each) do
|
140
|
-
@client.query "USE test"
|
141
161
|
@test_result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
142
162
|
end
|
143
163
|
|
@@ -318,24 +338,27 @@ describe Mysql2::Result do
|
|
318
338
|
if defined? Encoding
|
319
339
|
context "string encoding for ENUM values" do
|
320
340
|
it "should default to the connection's encoding if Encoding.default_internal is nil" do
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
341
|
+
with_internal_encoding nil do
|
342
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
343
|
+
result['enum_test'].encoding.should eql(Encoding.find('utf-8'))
|
344
|
+
|
345
|
+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
|
346
|
+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
347
|
+
result['enum_test'].encoding.should eql(Encoding.find('us-ascii'))
|
348
|
+
client2.close
|
349
|
+
end
|
330
350
|
end
|
331
351
|
|
332
352
|
it "should use Encoding.default_internal" do
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
353
|
+
with_internal_encoding 'utf-8' do
|
354
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
355
|
+
result['enum_test'].encoding.should eql(Encoding.default_internal)
|
356
|
+
end
|
357
|
+
|
358
|
+
with_internal_encoding 'us-ascii' do
|
359
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
360
|
+
result['enum_test'].encoding.should eql(Encoding.default_internal)
|
361
|
+
end
|
339
362
|
end
|
340
363
|
end
|
341
364
|
end
|
@@ -348,24 +371,27 @@ describe Mysql2::Result do
|
|
348
371
|
if defined? Encoding
|
349
372
|
context "string encoding for SET values" do
|
350
373
|
it "should default to the connection's encoding if Encoding.default_internal is nil" do
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
374
|
+
with_internal_encoding nil do
|
375
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
376
|
+
result['set_test'].encoding.should eql(Encoding.find('utf-8'))
|
377
|
+
|
378
|
+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
|
379
|
+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
380
|
+
result['set_test'].encoding.should eql(Encoding.find('us-ascii'))
|
381
|
+
client2.close
|
382
|
+
end
|
360
383
|
end
|
361
384
|
|
362
385
|
it "should use Encoding.default_internal" do
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
386
|
+
with_internal_encoding 'utf-8' do
|
387
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
388
|
+
result['set_test'].encoding.should eql(Encoding.default_internal)
|
389
|
+
end
|
390
|
+
|
391
|
+
with_internal_encoding 'us-ascii' do
|
392
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
393
|
+
result['set_test'].encoding.should eql(Encoding.default_internal)
|
394
|
+
end
|
369
395
|
end
|
370
396
|
end
|
371
397
|
end
|
@@ -378,18 +404,22 @@ describe Mysql2::Result do
|
|
378
404
|
if defined? Encoding
|
379
405
|
context "string encoding for BINARY values" do
|
380
406
|
it "should default to binary if Encoding.default_internal is nil" do
|
381
|
-
|
382
|
-
|
383
|
-
|
407
|
+
with_internal_encoding nil do
|
408
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
409
|
+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
410
|
+
end
|
384
411
|
end
|
385
412
|
|
386
413
|
it "should not use Encoding.default_internal" do
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
414
|
+
with_internal_encoding 'utf-8' do
|
415
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
416
|
+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
417
|
+
end
|
418
|
+
|
419
|
+
with_internal_encoding 'us-ascii' do
|
420
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
421
|
+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
422
|
+
end
|
393
423
|
end
|
394
424
|
end
|
395
425
|
end
|
@@ -416,39 +446,46 @@ describe Mysql2::Result do
|
|
416
446
|
context "string encoding for #{type} values" do
|
417
447
|
if ['VARBINARY', 'TINYBLOB', 'BLOB', 'MEDIUMBLOB', 'LONGBLOB'].include?(type)
|
418
448
|
it "should default to binary if Encoding.default_internal is nil" do
|
419
|
-
|
420
|
-
|
421
|
-
|
449
|
+
with_internal_encoding nil do
|
450
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
451
|
+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
452
|
+
end
|
422
453
|
end
|
423
454
|
|
424
455
|
it "should not use Encoding.default_internal" do
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
456
|
+
with_internal_encoding 'utf-8' do
|
457
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
458
|
+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
459
|
+
end
|
460
|
+
|
461
|
+
with_internal_encoding 'us-ascii' do
|
462
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
463
|
+
result['binary_test'].encoding.should eql(Encoding.find('binary'))
|
464
|
+
end
|
431
465
|
end
|
432
466
|
else
|
433
467
|
it "should default to utf-8 if Encoding.default_internal is nil" do
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
468
|
+
with_internal_encoding nil do
|
469
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
470
|
+
result[field].encoding.should eql(Encoding.find('utf-8'))
|
471
|
+
|
472
|
+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
|
473
|
+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
474
|
+
result[field].encoding.should eql(Encoding.find('us-ascii'))
|
475
|
+
client2.close
|
476
|
+
end
|
443
477
|
end
|
444
478
|
|
445
479
|
it "should use Encoding.default_internal" do
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
480
|
+
with_internal_encoding 'utf-8' do
|
481
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
482
|
+
result[field].encoding.should eql(Encoding.default_internal)
|
483
|
+
end
|
484
|
+
|
485
|
+
with_internal_encoding 'us-ascii' do
|
486
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
487
|
+
result[field].encoding.should eql(Encoding.default_internal)
|
488
|
+
end
|
452
489
|
end
|
453
490
|
end
|
454
491
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -7,6 +7,15 @@ require 'yaml'
|
|
7
7
|
DatabaseCredentials = YAML.load_file('spec/configuration.yml')
|
8
8
|
|
9
9
|
RSpec.configure do |config|
|
10
|
+
def with_internal_encoding(encoding)
|
11
|
+
old_enc = Encoding.default_internal
|
12
|
+
Encoding.default_internal = encoding
|
13
|
+
|
14
|
+
yield
|
15
|
+
ensure
|
16
|
+
Encoding.default_internal = old_enc
|
17
|
+
end
|
18
|
+
|
10
19
|
config.before :each do
|
11
20
|
@client = Mysql2::Client.new DatabaseCredentials['root']
|
12
21
|
end
|
data/spec/test_data
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
\N Hello World
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mysql2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.22
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Lopez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: eventmachine
|
@@ -78,6 +78,8 @@ files:
|
|
78
78
|
- ext/mysql2/client.c
|
79
79
|
- ext/mysql2/client.h
|
80
80
|
- ext/mysql2/extconf.rb
|
81
|
+
- ext/mysql2/infile.c
|
82
|
+
- ext/mysql2/infile.h
|
81
83
|
- ext/mysql2/mysql2_ext.c
|
82
84
|
- ext/mysql2/mysql2_ext.h
|
83
85
|
- ext/mysql2/mysql_enc_name_to_ruby.h
|
@@ -106,6 +108,7 @@ files:
|
|
106
108
|
- spec/mysql2/result_spec.rb
|
107
109
|
- spec/rcov.opts
|
108
110
|
- spec/spec_helper.rb
|
111
|
+
- spec/test_data
|
109
112
|
homepage: http://github.com/brianmario/mysql2
|
110
113
|
licenses:
|
111
114
|
- MIT
|
@@ -142,3 +145,4 @@ test_files:
|
|
142
145
|
- spec/mysql2/result_spec.rb
|
143
146
|
- spec/rcov.opts
|
144
147
|
- spec/spec_helper.rb
|
148
|
+
- spec/test_data
|