mysql2 0.3.20-x86-mingw32 → 0.3.21-x86-mingw32
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.
- checksums.yaml +4 -4
- data/ext/mysql2/client.c +9 -22
- data/ext/mysql2/result.c +8 -2
- data/lib/mysql2.rb +18 -0
- data/lib/mysql2/1.8/mysql2.so +0 -0
- data/lib/mysql2/1.9/mysql2.so +0 -0
- data/lib/mysql2/2.0/mysql2.so +0 -0
- data/lib/mysql2/2.1/mysql2.so +0 -0
- data/lib/mysql2/2.2/mysql2.so +0 -0
- data/lib/mysql2/2.3/mysql2.so +0 -0
- data/lib/mysql2/client.rb +12 -0
- data/lib/mysql2/version.rb +1 -1
- data/spec/mysql2/client_spec.rb +22 -42
- data/spec/mysql2/result_spec.rb +5 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae64d5e007d57f74de6533a6c86be267b1be09b7
|
4
|
+
data.tar.gz: 72d52433435c44a60e885a4611602b64e3274faa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6065d0a259b9e25e40dc2a71612ce5f1fbfa01c7309c6950694a46a88a9ff6859010425a5ad9018535241d0d0199480c12d1e43a0c13a6b49b961ae1e814e7b8
|
7
|
+
data.tar.gz: 8fd8fb25eab7a1ad6c6c31c14f4f14b243aad4430dace50b81905b6040a61d8645378e184dd9e3de7773133feb0d65164620985e11943553a8520fa4a7cd6d62
|
data/ext/mysql2/client.c
CHANGED
@@ -642,40 +642,27 @@ static VALUE rb_mysql_client_abandon_results(VALUE self) {
|
|
642
642
|
* Query the database with +sql+, with optional +options+. For the possible
|
643
643
|
* options, see @@default_query_options on the Mysql2::Client class.
|
644
644
|
*/
|
645
|
-
static VALUE
|
645
|
+
static VALUE rb_query(VALUE self, VALUE sql, VALUE current) {
|
646
646
|
#ifndef _WIN32
|
647
647
|
struct async_query_args async_args;
|
648
648
|
#endif
|
649
649
|
struct nogvl_send_query_args args;
|
650
|
-
int async = 0;
|
651
|
-
VALUE opts, current;
|
652
650
|
VALUE thread_current = rb_thread_current();
|
653
|
-
#ifdef HAVE_RUBY_ENCODING_H
|
654
|
-
rb_encoding *conn_enc;
|
655
|
-
#endif
|
656
651
|
GET_CLIENT(self);
|
657
652
|
|
658
653
|
REQUIRE_CONNECTED(wrapper);
|
659
654
|
args.mysql = wrapper->client;
|
660
655
|
|
661
|
-
current = rb_hash_dup(rb_iv_get(self, "@query_options"));
|
662
656
|
RB_GC_GUARD(current);
|
663
657
|
Check_Type(current, T_HASH);
|
664
658
|
rb_iv_set(self, "@current_query_options", current);
|
665
659
|
|
666
|
-
|
667
|
-
rb_funcall(current, intern_merge_bang, 1, opts);
|
668
|
-
|
669
|
-
if (rb_hash_aref(current, sym_async) == Qtrue) {
|
670
|
-
async = 1;
|
671
|
-
}
|
672
|
-
}
|
673
|
-
|
674
|
-
Check_Type(args.sql, T_STRING);
|
660
|
+
Check_Type(sql, T_STRING);
|
675
661
|
#ifdef HAVE_RUBY_ENCODING_H
|
676
|
-
conn_enc = rb_to_encoding(wrapper->encoding);
|
677
662
|
/* ensure the string is in the encoding the connection is expecting */
|
678
|
-
args.sql = rb_str_export_to_enc(
|
663
|
+
args.sql = rb_str_export_to_enc(sql, rb_to_encoding(wrapper->encoding));
|
664
|
+
#else
|
665
|
+
args.sql = sql;
|
679
666
|
#endif
|
680
667
|
args.sql_ptr = RSTRING_PTR(args.sql);
|
681
668
|
args.sql_len = RSTRING_LEN(args.sql);
|
@@ -699,15 +686,15 @@ static VALUE rb_mysql_client_query(int argc, VALUE * argv, VALUE self) {
|
|
699
686
|
#ifndef _WIN32
|
700
687
|
rb_rescue2(do_send_query, (VALUE)&args, disconnect_and_raise, self, rb_eException, (VALUE)0);
|
701
688
|
|
702
|
-
if (
|
689
|
+
if (rb_hash_aref(current, sym_async) == Qtrue) {
|
690
|
+
return Qnil;
|
691
|
+
} else {
|
703
692
|
async_args.fd = wrapper->client->net.fd;
|
704
693
|
async_args.self = self;
|
705
694
|
|
706
695
|
rb_rescue2(do_query, (VALUE)&async_args, disconnect_and_raise, self, rb_eException, (VALUE)0);
|
707
696
|
|
708
697
|
return rb_mysql_client_async_result(self);
|
709
|
-
} else {
|
710
|
-
return Qnil;
|
711
698
|
}
|
712
699
|
#else
|
713
700
|
do_send_query(&args);
|
@@ -1259,7 +1246,6 @@ void init_mysql2_client() {
|
|
1259
1246
|
rb_define_singleton_method(cMysql2Client, "info", rb_mysql_client_info, 0);
|
1260
1247
|
|
1261
1248
|
rb_define_method(cMysql2Client, "close", rb_mysql_client_close, 0);
|
1262
|
-
rb_define_method(cMysql2Client, "query", rb_mysql_client_query, -1);
|
1263
1249
|
rb_define_method(cMysql2Client, "abandon_results!", rb_mysql_client_abandon_results, 0);
|
1264
1250
|
rb_define_method(cMysql2Client, "escape", rb_mysql_client_real_escape, 1);
|
1265
1251
|
rb_define_method(cMysql2Client, "server_info", rb_mysql_client_server_info, 0);
|
@@ -1292,6 +1278,7 @@ void init_mysql2_client() {
|
|
1292
1278
|
rb_define_private_method(cMysql2Client, "ssl_set", set_ssl_options, 5);
|
1293
1279
|
rb_define_private_method(cMysql2Client, "initialize_ext", initialize_ext, 0);
|
1294
1280
|
rb_define_private_method(cMysql2Client, "connect", rb_connect, 7);
|
1281
|
+
rb_define_private_method(cMysql2Client, "_query", rb_query, 2);
|
1295
1282
|
|
1296
1283
|
sym_id = ID2SYM(rb_intern("id"));
|
1297
1284
|
sym_version = ID2SYM(rb_intern("version"));
|
data/ext/mysql2/result.c
CHANGED
@@ -531,6 +531,10 @@ static VALUE rb_mysql_result_each(int argc, VALUE * argv, VALUE self) {
|
|
531
531
|
return wrapper->rows;
|
532
532
|
}
|
533
533
|
wrapper->rows = rb_ary_new2(wrapper->numberOfRows);
|
534
|
+
} else if (!cacheRows && wrapper->lastRowProcessed == wrapper->numberOfRows) {
|
535
|
+
mysql_data_seek(wrapper->result, 0);
|
536
|
+
wrapper->lastRowProcessed = 0;
|
537
|
+
wrapper->rows = rb_ary_new2(wrapper->numberOfRows);
|
534
538
|
}
|
535
539
|
|
536
540
|
if (cacheRows && wrapper->lastRowProcessed == wrapper->numberOfRows) {
|
@@ -558,7 +562,9 @@ static VALUE rb_mysql_result_each(int argc, VALUE * argv, VALUE self) {
|
|
558
562
|
|
559
563
|
if (row == Qnil) {
|
560
564
|
/* we don't need the mysql C dataset around anymore, peace it */
|
561
|
-
|
565
|
+
if (cacheRows) {
|
566
|
+
rb_mysql_result_free_result(wrapper);
|
567
|
+
}
|
562
568
|
return Qnil;
|
563
569
|
}
|
564
570
|
|
@@ -566,7 +572,7 @@ static VALUE rb_mysql_result_each(int argc, VALUE * argv, VALUE self) {
|
|
566
572
|
rb_yield(row);
|
567
573
|
}
|
568
574
|
}
|
569
|
-
if (wrapper->lastRowProcessed == wrapper->numberOfRows) {
|
575
|
+
if (wrapper->lastRowProcessed == wrapper->numberOfRows && cacheRows) {
|
570
576
|
/* we don't need the mysql C dataset around anymore, peace it */
|
571
577
|
rb_mysql_result_free_result(wrapper);
|
572
578
|
}
|
data/lib/mysql2.rb
CHANGED
@@ -61,4 +61,22 @@ module Mysql2::Util
|
|
61
61
|
Hash[hash.map { |k,v| [k.to_sym, v] }]
|
62
62
|
end
|
63
63
|
|
64
|
+
#
|
65
|
+
# In Mysql2::Client#query and Mysql2::Statement#execute,
|
66
|
+
# Thread#handle_interrupt is used to prevent Timeout#timeout
|
67
|
+
# from interrupting query execution.
|
68
|
+
#
|
69
|
+
# Timeout::ExitException was removed in Ruby 2.3.0, 2.2.3, and 2.1.8,
|
70
|
+
# but is present in earlier 2.1.x and 2.2.x, so we provide a shim.
|
71
|
+
#
|
72
|
+
if Thread.respond_to?(:handle_interrupt)
|
73
|
+
require 'timeout'
|
74
|
+
# rubocop:disable Style/ConstantName
|
75
|
+
TimeoutError = if defined?(::Timeout::ExitException)
|
76
|
+
::Timeout::ExitException
|
77
|
+
else
|
78
|
+
::Timeout::Error
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
64
82
|
end
|
data/lib/mysql2/1.8/mysql2.so
CHANGED
Binary file
|
data/lib/mysql2/1.9/mysql2.so
CHANGED
Binary file
|
data/lib/mysql2/2.0/mysql2.so
CHANGED
Binary file
|
data/lib/mysql2/2.1/mysql2.so
CHANGED
Binary file
|
data/lib/mysql2/2.2/mysql2.so
CHANGED
Binary file
|
Binary file
|
data/lib/mysql2/client.rb
CHANGED
@@ -74,6 +74,18 @@ module Mysql2
|
|
74
74
|
@@default_query_options
|
75
75
|
end
|
76
76
|
|
77
|
+
if Thread.respond_to?(:handle_interrupt)
|
78
|
+
def query(sql, options = {})
|
79
|
+
Thread.handle_interrupt(::Mysql2::Util::TimeoutError => :never) do
|
80
|
+
_query(sql, @query_options.merge(options))
|
81
|
+
end
|
82
|
+
end
|
83
|
+
else
|
84
|
+
def query(sql, options = {})
|
85
|
+
_query(sql, @query_options.merge(options))
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
77
89
|
def query_info
|
78
90
|
info = query_info_string
|
79
91
|
return {} unless info
|
data/lib/mysql2/version.rb
CHANGED
data/spec/mysql2/client_spec.rb
CHANGED
@@ -462,59 +462,39 @@ describe Mysql2::Client do
|
|
462
462
|
}.should raise_error(Mysql2::Error)
|
463
463
|
end
|
464
464
|
|
465
|
-
it
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
end
|
470
|
-
rescue Timeout::Error
|
471
|
-
end
|
465
|
+
it 'should be impervious to connection-corrupting timeouts in #query' do
|
466
|
+
pending('`Thread.handle_interrupt` is not defined') unless Thread.respond_to?(:handle_interrupt)
|
467
|
+
# attempt to break the connection
|
468
|
+
expect { Timeout.timeout(0.1) { @client.query('SELECT SLEEP(1)') } }.to raise_error(Timeout::Error)
|
472
469
|
|
473
|
-
|
474
|
-
|
475
|
-
}.should raise_error(Mysql2::Error, 'closed MySQL connection')
|
470
|
+
# expect the connection to not be broken
|
471
|
+
expect { @client.query('SELECT 1') }.to_not raise_error
|
476
472
|
end
|
477
473
|
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
client.query("SELECT sleep(2)")
|
483
|
-
end
|
484
|
-
rescue Timeout::Error
|
474
|
+
context 'when a non-standard exception class is raised' do
|
475
|
+
it "should close the connection when an exception is raised" do
|
476
|
+
expect { Timeout.timeout(0.1, ArgumentError) { @client.query('SELECT SLEEP(1)') } }.to raise_error(ArgumentError)
|
477
|
+
expect { @client.query('SELECT 1') }.to raise_error(Mysql2::Error, 'closed MySQL connection')
|
485
478
|
end
|
486
479
|
|
487
|
-
|
488
|
-
client.
|
489
|
-
}.should_not raise_error(Mysql2::Error)
|
490
|
-
end
|
480
|
+
it "should handle Timeouts without leaving the connection hanging if reconnect is true" do
|
481
|
+
client = Mysql2::Client.new(DatabaseCredentials['root'].merge(:reconnect => true))
|
491
482
|
|
492
|
-
|
493
|
-
|
494
|
-
begin
|
495
|
-
Timeout.timeout(1, Timeout::Error) do
|
496
|
-
client.query("SELECT sleep(2)")
|
497
|
-
end
|
498
|
-
rescue Timeout::Error
|
483
|
+
expect { Timeout.timeout(0.1, ArgumentError) { client.query('SELECT SLEEP(1)') } }.to raise_error(ArgumentError)
|
484
|
+
expect { client.query('SELECT 1') }.to_not raise_error
|
499
485
|
end
|
500
486
|
|
501
|
-
|
502
|
-
client.
|
503
|
-
}.should raise_error(Mysql2::Error)
|
487
|
+
it "should handle Timeouts without leaving the connection hanging if reconnect is set to true after construction true" do
|
488
|
+
client = Mysql2::Client.new(DatabaseCredentials['root'])
|
504
489
|
|
505
|
-
|
490
|
+
expect { Timeout.timeout(0.1, ArgumentError) { client.query('SELECT SLEEP(1)') } }.to raise_error(ArgumentError)
|
491
|
+
expect { client.query('SELECT 1') }.to raise_error(Mysql2::Error)
|
506
492
|
|
507
|
-
|
508
|
-
Timeout.timeout(1, Timeout::Error) do
|
509
|
-
client.query("SELECT sleep(2)")
|
510
|
-
end
|
511
|
-
rescue Timeout::Error
|
512
|
-
end
|
513
|
-
|
514
|
-
lambda {
|
515
|
-
client.query("SELECT 1")
|
516
|
-
}.should_not raise_error(Mysql2::Error)
|
493
|
+
client.reconnect = true
|
517
494
|
|
495
|
+
expect { Timeout.timeout(0.1, ArgumentError) { client.query('SELECT SLEEP(1)') } }.to raise_error(ArgumentError)
|
496
|
+
expect { client.query('SELECT 1') }.to_not raise_error
|
497
|
+
end
|
518
498
|
end
|
519
499
|
|
520
500
|
it "threaded queries should be supported" do
|
data/spec/mysql2/result_spec.rb
CHANGED
@@ -78,6 +78,11 @@ describe Mysql2::Result do
|
|
78
78
|
result.first.object_id.should_not eql(result.first.object_id)
|
79
79
|
end
|
80
80
|
|
81
|
+
it "should be able to iterate a second time even if cache_rows is disabled" do
|
82
|
+
result = @client.query "SELECT 1 UNION SELECT 2", :cache_rows => false
|
83
|
+
result.to_a.should eql(result.to_a)
|
84
|
+
end
|
85
|
+
|
81
86
|
it "should yield different value for #first if streaming" do
|
82
87
|
result = @client.query "SELECT 1 UNION SELECT 2", :stream => true, :cache_rows => false
|
83
88
|
result.first.should_not eql(result.first)
|
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.3.
|
4
|
+
version: 0.3.21
|
5
5
|
platform: x86-mingw32
|
6
6
|
authors:
|
7
7
|
- Brian Lopez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- lib/mysql2/2.0/mysql2.so
|
81
81
|
- lib/mysql2/2.1/mysql2.so
|
82
82
|
- lib/mysql2/2.2/mysql2.so
|
83
|
+
- lib/mysql2/2.3/mysql2.so
|
83
84
|
- lib/mysql2/client.rb
|
84
85
|
- lib/mysql2/console.rb
|
85
86
|
- lib/mysql2/em.rb
|
@@ -136,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
137
|
version: '0'
|
137
138
|
requirements: []
|
138
139
|
rubyforge_project:
|
139
|
-
rubygems_version: 2.
|
140
|
+
rubygems_version: 2.5.1
|
140
141
|
signing_key:
|
141
142
|
specification_version: 4
|
142
143
|
summary: A simple, fast Mysql library for Ruby, binding to libmysql
|