ruby-mysql 3.0.0 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/lib/mysql/protocol.rb +5 -2
- data/lib/mysql.rb +1 -1
- data/test/test_mysql.rb +39 -2
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37cc4956fc000b612b24fe104acf96abf27e0a7016cbd05c2c5e7b4ae5e0bade
|
4
|
+
data.tar.gz: b2c4ded73325a5c4aadce1d81af507e2a7d4144764150fde183f0e541e25e8b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c81163849e312cb8cb861a1c5add93fba0973d1fbf01b9296513914931134230dbf7d2d6437e72097c8426d24daab316c2756621d3302d5ee91efb72ab951cc3
|
7
|
+
data.tar.gz: c4e13cea550e4659db986772663b04364c8c18f51abc9442516058cbe5ebc420dd19a95e324e149ae0966edefa1259fff9274677295849834029f827667547c2
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## [3.0.1] - 2022-06-18
|
2
|
+
|
3
|
+
- LICENSE: correct author
|
4
|
+
- FIX: correct LOAD DATA LOCAL INFILE result information.
|
5
|
+
- FIX: reset SERVER_MORE_RESULTS_EXISTS when error packet is received.
|
6
|
+
- FIX: close the socket when the connection is disconnected.
|
7
|
+
- FIX: allow multiple results by default.
|
8
|
+
|
1
9
|
## [3.0.0] - 2021-11-16
|
2
10
|
|
3
11
|
- `Mysql.new` no longer connect. use `Mysql.connect` or `Mysql#connect`.
|
data/lib/mysql/protocol.rb
CHANGED
@@ -175,7 +175,7 @@ class Mysql
|
|
175
175
|
@server_version = init_packet.server_version.split(/\D/)[0,3].inject{|a,b|a.to_i*100+b.to_i}
|
176
176
|
@server_capabilities = init_packet.server_capabilities
|
177
177
|
@thread_id = init_packet.thread_id
|
178
|
-
@client_flags = CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_TRANSACTIONS | CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION | CLIENT_PLUGIN_AUTH
|
178
|
+
@client_flags = CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_TRANSACTIONS | CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION | CLIENT_MULTI_RESULTS | CLIENT_PS_MULTI_RESULTS | CLIENT_PLUGIN_AUTH
|
179
179
|
@client_flags |= CLIENT_LOCAL_FILES if @opts[:local_infile] || @opts[:load_data_local_dir]
|
180
180
|
@client_flags |= CLIENT_CONNECT_WITH_DB if @opts[:database]
|
181
181
|
@client_flags |= @opts[:flags]
|
@@ -252,6 +252,7 @@ class Mysql
|
|
252
252
|
end
|
253
253
|
if res_packet.field_count.nil? # LOAD DATA LOCAL INFILE
|
254
254
|
send_local_file(res_packet.message)
|
255
|
+
res_packet = ResultPacket.parse read
|
255
256
|
end
|
256
257
|
@affected_rows, @insert_id, @server_status, @warning_count, @message =
|
257
258
|
res_packet.affected_rows, res_packet.insert_id, res_packet.server_status, res_packet.warning_count, res_packet.message
|
@@ -273,7 +274,6 @@ class Mysql
|
|
273
274
|
end
|
274
275
|
ensure
|
275
276
|
write nil # EOF mark
|
276
|
-
read
|
277
277
|
end
|
278
278
|
|
279
279
|
# Retrieve n fields
|
@@ -460,6 +460,7 @@ class Mysql
|
|
460
460
|
raise EOFError unless ret && ret.length == len
|
461
461
|
data.concat ret
|
462
462
|
rescue EOFError
|
463
|
+
@socket.close rescue nil
|
463
464
|
raise ClientError::ServerGoneError, 'MySQL server has gone away'
|
464
465
|
rescue Errno::ETIMEDOUT
|
465
466
|
raise ClientError, "read timeout"
|
@@ -474,6 +475,7 @@ class Mysql
|
|
474
475
|
_, errno, message = data.unpack("Cva*") # Version 4.0 Error
|
475
476
|
@sqlstate = ""
|
476
477
|
end
|
478
|
+
@server_status &= ~SERVER_MORE_RESULTS_EXISTS
|
477
479
|
message.force_encoding(@charset.encoding)
|
478
480
|
if Mysql::ServerError::ERROR_MAP.key? errno
|
479
481
|
raise Mysql::ServerError::ERROR_MAP[errno].new(message, @sqlstate)
|
@@ -523,6 +525,7 @@ class Mysql
|
|
523
525
|
@socket.sync = true
|
524
526
|
@socket.flush
|
525
527
|
rescue Errno::EPIPE
|
528
|
+
@socket.close rescue nil
|
526
529
|
raise ClientError::ServerGoneError, 'MySQL server has gone away'
|
527
530
|
rescue Errno::ETIMEDOUT
|
528
531
|
raise ClientError, "write timeout"
|
data/lib/mysql.rb
CHANGED
@@ -19,7 +19,7 @@ class Mysql
|
|
19
19
|
require_relative "mysql/protocol"
|
20
20
|
require_relative "mysql/packet.rb"
|
21
21
|
|
22
|
-
VERSION = '3.0.
|
22
|
+
VERSION = '3.0.1' # Version number of this library
|
23
23
|
MYSQL_UNIX_PORT = "/tmp/mysql.sock" # UNIX domain socket filename
|
24
24
|
MYSQL_TCP_PORT = 3306 # TCP socket port number
|
25
25
|
|
data/test/test_mysql.rb
CHANGED
@@ -20,7 +20,7 @@ MYSQL_SOCKET = ENV['MYSQL_SOCKET']
|
|
20
20
|
class TestMysql < Test::Unit::TestCase
|
21
21
|
sub_test_case 'Mysql::VERSION' do
|
22
22
|
test 'returns client version' do
|
23
|
-
assert{ Mysql::VERSION == '3.0.
|
23
|
+
assert{ Mysql::VERSION == '3.0.1' }
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -174,8 +174,12 @@ class TestMysql < Test::Unit::TestCase
|
|
174
174
|
tmpf.close
|
175
175
|
@m.local_infile = true
|
176
176
|
@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
177
|
+
if @m.query('select @@local_infile').fetch[0] == '0'
|
178
|
+
omit 'skip because local_infile variable is false'
|
179
|
+
end
|
177
180
|
@m.query('create temporary table t (i int, c char(10))')
|
178
181
|
@m.query("load data local infile '#{tmpf.path}' into table t")
|
182
|
+
assert{ @m.info == 'Records: 1 Deleted: 0 Skipped: 0 Warnings: 0' }
|
179
183
|
assert{ @m.query('select * from t').fetch_row == ['123','abc'] }
|
180
184
|
end
|
181
185
|
test 'load_data_local_dir: client can execute LOAD DATA LOCAL INFILE query with specified directory' do
|
@@ -185,6 +189,9 @@ class TestMysql < Test::Unit::TestCase
|
|
185
189
|
tmpf.close
|
186
190
|
@m.load_data_local_dir = File.dirname(tmpf.path)
|
187
191
|
@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
192
|
+
if @m.query('select @@local_infile').fetch[0] == '0'
|
193
|
+
omit 'skip because local_infile variable is false'
|
194
|
+
end
|
188
195
|
@m.query('create temporary table t (i int, c char(10))')
|
189
196
|
@m.query("load data local infile '#{tmpf.path}' into table t")
|
190
197
|
assert{ @m.query('select * from t').fetch_row == ['123','abc'] }
|
@@ -196,6 +203,9 @@ class TestMysql < Test::Unit::TestCase
|
|
196
203
|
tmpf.close
|
197
204
|
@m.load_data_local_dir = '/hoge'
|
198
205
|
@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
206
|
+
if @m.query('select @@local_infile').fetch[0] == '0'
|
207
|
+
omit 'skip because local_infile variable is false'
|
208
|
+
end
|
199
209
|
@m.query('create temporary table t (i int, c char(10))')
|
200
210
|
assert_raise Mysql::ClientError::LoadDataLocalInfileRejected, 'LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.' do
|
201
211
|
@m.query("load data local infile '#{tmpf.path}' into table t")
|
@@ -207,6 +217,9 @@ class TestMysql < Test::Unit::TestCase
|
|
207
217
|
tmpf.puts "123\tabc\n"
|
208
218
|
tmpf.close
|
209
219
|
@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
220
|
+
if @m.query('select @@local_infile').fetch[0] == '0'
|
221
|
+
omit 'skip because local_infile variable is false'
|
222
|
+
end
|
210
223
|
@m.query('create temporary table t (i int, c char(10))')
|
211
224
|
if @m.server_version >= 80000
|
212
225
|
assert_raise Mysql::ServerError, 'Loading local data is disabled; this must be enabled on both the client and server sides' do
|
@@ -550,6 +563,30 @@ class TestMysql < Test::Unit::TestCase
|
|
550
563
|
end
|
551
564
|
end
|
552
565
|
|
566
|
+
test 'multiple statement error' do
|
567
|
+
m = Mysql.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
568
|
+
m.set_server_option(Mysql::OPTION_MULTI_STATEMENTS_ON)
|
569
|
+
res = m.query 'select 1; select hoge; select 2'
|
570
|
+
assert{ res.entries == [['1']] }
|
571
|
+
assert{ m.more_results? == true }
|
572
|
+
assert_raise(Mysql::ServerError::BadFieldError){ m.next_result }
|
573
|
+
assert{ m.more_results? == false }
|
574
|
+
end
|
575
|
+
|
576
|
+
test 'procedure returns multiple results' do
|
577
|
+
m = Mysql.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
578
|
+
m.query 'drop procedure if exists test_proc'
|
579
|
+
m.query 'create procedure test_proc() begin select 1 as a; select 2 as b; end'
|
580
|
+
res = m.query 'call test_proc()'
|
581
|
+
assert{ res.entries == [['1']] }
|
582
|
+
assert{ m.more_results? == true }
|
583
|
+
assert{ m.next_result == true }
|
584
|
+
assert{ m.store_result.entries == [['2']] }
|
585
|
+
assert{ m.more_results? == true }
|
586
|
+
assert{ m.next_result == true }
|
587
|
+
assert{ m.more_results? == false }
|
588
|
+
end
|
589
|
+
|
553
590
|
sub_test_case 'Mysql::Result' do
|
554
591
|
setup do
|
555
592
|
@m = Mysql.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
@@ -828,7 +865,7 @@ class TestMysql < Test::Unit::TestCase
|
|
828
865
|
|
829
866
|
teardown do
|
830
867
|
@s.close if @s rescue nil
|
831
|
-
@m.close if @m
|
868
|
+
@m.close if @m rescue nil
|
832
869
|
end
|
833
870
|
|
834
871
|
test '#affected_rows returns number of affected records' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-mysql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomita Masahiro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-06-18 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: This is MySQL connector. pure Ruby version
|
14
14
|
email: tommy@tmtm.org
|
@@ -35,7 +35,7 @@ licenses:
|
|
35
35
|
- Ruby
|
36
36
|
metadata:
|
37
37
|
homepage_uri: http://github.com/tmtm/ruby-mysql
|
38
|
-
documentation_uri: https://www.rubydoc.info/
|
38
|
+
documentation_uri: https://www.rubydoc.info/gems/ruby-mysql
|
39
39
|
source_code_uri: http://github.com/tmtm/ruby-mysql
|
40
40
|
post_install_message:
|
41
41
|
rdoc_options: []
|
@@ -52,7 +52,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '0'
|
54
54
|
requirements: []
|
55
|
-
rubygems_version: 3.3.
|
55
|
+
rubygems_version: 3.3.7
|
56
56
|
signing_key:
|
57
57
|
specification_version: 4
|
58
58
|
summary: MySQL connector
|