ruby-mysql 2.9.11 → 2.9.12
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.
Potentially problematic release.
This version of ruby-mysql might be problematic. Click here for more details.
- data/lib/mysql.rb +3 -3
- data/lib/mysql/protocol.rb +24 -40
- data/spec/mysql/packet_spec.rb +2 -0
- data/spec/mysql_spec.rb +19 -19
- metadata +9 -8
- checksums.yaml +0 -7
data/lib/mysql.rb
CHANGED
@@ -21,7 +21,7 @@ class Mysql
|
|
21
21
|
rescue LoadError
|
22
22
|
end
|
23
23
|
|
24
|
-
VERSION =
|
24
|
+
VERSION = 20912 # Version number of this library
|
25
25
|
MYSQL_UNIX_PORT = "/tmp/mysql.sock" # UNIX domain socket filename
|
26
26
|
MYSQL_TCP_PORT = 3306 # TCP socket port number
|
27
27
|
|
@@ -109,7 +109,7 @@ class Mysql
|
|
109
109
|
# @return self
|
110
110
|
def connect(host=nil, user=nil, passwd=nil, db=nil, port=nil, socket=nil, flag=0)
|
111
111
|
if flag & CLIENT_COMPRESS != 0
|
112
|
-
warn 'unsupported flag: CLIENT_COMPRESS'
|
112
|
+
warn 'unsupported flag: CLIENT_COMPRESS' if $VERBOSE
|
113
113
|
flag &= ~CLIENT_COMPRESS
|
114
114
|
end
|
115
115
|
@protocol = Protocol.new host, port, socket, @connect_timeout, @read_timeout, @write_timeout
|
@@ -179,7 +179,7 @@ class Mysql
|
|
179
179
|
@charset = Charset.by_name value.to_s
|
180
180
|
# when Mysql::SHARED_MEMORY_BASE_NAME
|
181
181
|
else
|
182
|
-
warn "option not implemented: #{opt}"
|
182
|
+
warn "option not implemented: #{opt}" if $VERBOSE
|
183
183
|
end
|
184
184
|
self
|
185
185
|
end
|
data/lib/mysql/protocol.rb
CHANGED
@@ -33,11 +33,11 @@ class Mysql
|
|
33
33
|
return unsigned ? v : v < 32768 ? v : v-65536
|
34
34
|
when Field::TYPE_INT24, Field::TYPE_LONG
|
35
35
|
v = pkt.ulong
|
36
|
-
return unsigned ? v : v <
|
36
|
+
return unsigned ? v : v < 0x8000_0000 ? v : v-0x10000_0000
|
37
37
|
when Field::TYPE_LONGLONG
|
38
38
|
n1, n2 = pkt.ulong, pkt.ulong
|
39
39
|
v = (n2 << 32) | n1
|
40
|
-
return unsigned ? v : v <
|
40
|
+
return unsigned ? v : v < 0x8000_0000_0000_0000 ? v : v-0x10000_0000_0000_0000
|
41
41
|
when Field::TYPE_FLOAT
|
42
42
|
return pkt.read(4).unpack('e').first
|
43
43
|
when Field::TYPE_DOUBLE
|
@@ -79,38 +79,17 @@ class Mysql
|
|
79
79
|
type = Field::TYPE_NULL
|
80
80
|
val = ""
|
81
81
|
when Integer
|
82
|
-
if v
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
val = [v].pack("V")
|
92
|
-
elsif v < 256**8
|
93
|
-
type = Field::TYPE_LONGLONG | 0x8000
|
94
|
-
val = [v&0xffffffff, v>>32].pack("VV")
|
95
|
-
else
|
96
|
-
raise ProtocolError, "value too large: #{v}"
|
97
|
-
end
|
82
|
+
if -0x8000_0000 <= v && v < 0x8000_0000
|
83
|
+
type = Field::TYPE_LONG
|
84
|
+
val = [v].pack('V')
|
85
|
+
elsif -0x8000_0000_0000_0000 <= v && v < 0x8000_0000_0000_0000
|
86
|
+
type = Field::TYPE_LONGLONG
|
87
|
+
val = [v&0xffffffff, v>>32].pack("VV")
|
88
|
+
elsif 0x8000_0000_0000_0000 <= v && v <= 0xffff_ffff_ffff_ffff
|
89
|
+
type = Field::TYPE_LONGLONG | 0x8000
|
90
|
+
val = [v&0xffffffff, v>>32].pack("VV")
|
98
91
|
else
|
99
|
-
|
100
|
-
type = Field::TYPE_TINY
|
101
|
-
val = [v].pack("C")
|
102
|
-
elsif -v <= 256**2/2
|
103
|
-
type = Field::TYPE_SHORT
|
104
|
-
val = [v].pack("v")
|
105
|
-
elsif -v <= 256**4/2
|
106
|
-
type = Field::TYPE_LONG
|
107
|
-
val = [v].pack("V")
|
108
|
-
elsif -v <= 256**8/2
|
109
|
-
type = Field::TYPE_LONGLONG
|
110
|
-
val = [v&0xffffffff, v>>32].pack("VV")
|
111
|
-
else
|
112
|
-
raise ProtocolError, "value too large: #{v}"
|
113
|
-
end
|
92
|
+
raise ProtocolError, "value too large: #{v}"
|
114
93
|
end
|
115
94
|
when Float
|
116
95
|
type = Field::TYPE_DOUBLE
|
@@ -118,9 +97,12 @@ class Mysql
|
|
118
97
|
when String
|
119
98
|
type = Field::TYPE_STRING
|
120
99
|
val = Packet.lcs(v)
|
121
|
-
when
|
100
|
+
when ::Time
|
101
|
+
type = Field::TYPE_DATETIME
|
102
|
+
val = [11, v.year, v.month, v.day, v.hour, v.min, v.sec, v.usec].pack("CvCCCCCV")
|
103
|
+
when Mysql::Time
|
122
104
|
type = Field::TYPE_DATETIME
|
123
|
-
val = [
|
105
|
+
val = [11, v.year, v.month, v.day, v.hour, v.min, v.sec, v.second_part].pack("CvCCCCCV")
|
124
106
|
else
|
125
107
|
raise ProtocolError, "class #{v.class} is not supported"
|
126
108
|
end
|
@@ -488,7 +470,7 @@ class Mysql
|
|
488
470
|
# === Exception
|
489
471
|
# [ProtocolError] invalid packet sequence number
|
490
472
|
def read
|
491
|
-
|
473
|
+
data = ''
|
492
474
|
len = nil
|
493
475
|
begin
|
494
476
|
Timeout.timeout @read_timeout do
|
@@ -500,6 +482,7 @@ class Mysql
|
|
500
482
|
@seq = (@seq + 1) % 256
|
501
483
|
ret = @sock.read(len)
|
502
484
|
raise EOFError unless ret && ret.length == len
|
485
|
+
data.concat ret
|
503
486
|
end
|
504
487
|
rescue EOFError
|
505
488
|
raise ClientError::ServerGoneError, 'MySQL server has gone away'
|
@@ -510,18 +493,19 @@ class Mysql
|
|
510
493
|
@sqlstate = "00000"
|
511
494
|
|
512
495
|
# Error packet
|
513
|
-
if
|
514
|
-
f, errno, marker, @sqlstate, message =
|
496
|
+
if data[0] == ?\xff
|
497
|
+
f, errno, marker, @sqlstate, message = data.unpack("Cvaa5a*")
|
515
498
|
unless marker == "#"
|
516
|
-
f, errno, message =
|
499
|
+
f, errno, message = data.unpack("Cva*") # Version 4.0 Error
|
517
500
|
@sqlstate = ""
|
518
501
|
end
|
502
|
+
message.force_encoding(@charset.encoding)
|
519
503
|
if Mysql::ServerError::ERROR_MAP.key? errno
|
520
504
|
raise Mysql::ServerError::ERROR_MAP[errno].new(message, @sqlstate)
|
521
505
|
end
|
522
506
|
raise Mysql::ServerError.new(message, @sqlstate)
|
523
507
|
end
|
524
|
-
Packet.new(
|
508
|
+
Packet.new(data)
|
525
509
|
end
|
526
510
|
|
527
511
|
# Write one packet data
|
data/spec/mysql/packet_spec.rb
CHANGED
data/spec/mysql_spec.rb
CHANGED
@@ -13,7 +13,7 @@ MYSQL_SOCKET = ENV['MYSQL_SOCKET']
|
|
13
13
|
|
14
14
|
describe 'Mysql::VERSION' do
|
15
15
|
it 'returns client version' do
|
16
|
-
Mysql::VERSION.should ==
|
16
|
+
Mysql::VERSION.should == 20912
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -130,8 +130,8 @@ describe 'Mysql#options' do
|
|
130
130
|
end
|
131
131
|
it 'OPT_CONNECT_TIMEOUT: set timeout for connecting' do
|
132
132
|
@m.options(Mysql::OPT_CONNECT_TIMEOUT, 0.1).should == @m
|
133
|
-
UNIXSocket.stub
|
134
|
-
TCPSocket.stub
|
133
|
+
UNIXSocket.stub(:new).and_return{sleep 1}
|
134
|
+
TCPSocket.stub(:new).and_return{sleep 1}
|
135
135
|
proc{@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)}.should raise_error Mysql::ClientError, 'connection timeout'
|
136
136
|
proc{@m.connect}.should raise_error Mysql::ClientError, 'connection timeout'
|
137
137
|
end
|
@@ -1442,66 +1442,66 @@ describe 'Mysql::Stmt' do
|
|
1442
1442
|
|
1443
1443
|
it '#fetch tinyblob column' do
|
1444
1444
|
@m.query 'create temporary table t (i tinyblob)'
|
1445
|
-
@m.query "insert into t values (null),('
|
1445
|
+
@m.query "insert into t values (null),('#{"a"*255}')"
|
1446
1446
|
@s.prepare 'select i from t'
|
1447
1447
|
@s.execute
|
1448
|
-
@s.entries.should == [[nil], ["
|
1448
|
+
@s.entries.should == [[nil], ["a"*255]]
|
1449
1449
|
end
|
1450
1450
|
|
1451
1451
|
it '#fetch tinytext column' do
|
1452
1452
|
@m.query 'create temporary table t (i tinytext)'
|
1453
|
-
@m.query "insert into t values (null),('
|
1453
|
+
@m.query "insert into t values (null),('#{"a"*255}')"
|
1454
1454
|
@s.prepare 'select i from t'
|
1455
1455
|
@s.execute
|
1456
|
-
@s.entries.should == [[nil], ["
|
1456
|
+
@s.entries.should == [[nil], ["a"*255]]
|
1457
1457
|
end
|
1458
1458
|
|
1459
1459
|
it '#fetch blob column' do
|
1460
1460
|
@m.query 'create temporary table t (i blob)'
|
1461
|
-
@m.query "insert into t values (null),('
|
1461
|
+
@m.query "insert into t values (null),('#{"a"*65535}')"
|
1462
1462
|
@s.prepare 'select i from t'
|
1463
1463
|
@s.execute
|
1464
|
-
@s.entries.should == [[nil], ["
|
1464
|
+
@s.entries.should == [[nil], ["a"*65535]]
|
1465
1465
|
end
|
1466
1466
|
|
1467
1467
|
it '#fetch text column' do
|
1468
1468
|
@m.query 'create temporary table t (i text)'
|
1469
|
-
@m.query "insert into t values (null),('
|
1469
|
+
@m.query "insert into t values (null),('#{"a"*65535}')"
|
1470
1470
|
@s.prepare 'select i from t'
|
1471
1471
|
@s.execute
|
1472
|
-
@s.entries.should == [[nil], ["
|
1472
|
+
@s.entries.should == [[nil], ["a"*65535]]
|
1473
1473
|
end
|
1474
1474
|
|
1475
1475
|
it '#fetch mediumblob column' do
|
1476
1476
|
@m.query 'create temporary table t (i mediumblob)'
|
1477
|
-
@m.query "insert into t values (null),('
|
1477
|
+
@m.query "insert into t values (null),('#{"a"*16777215}')"
|
1478
1478
|
@s.prepare 'select i from t'
|
1479
1479
|
@s.execute
|
1480
|
-
@s.entries.should == [[nil], [
|
1480
|
+
@s.entries.should == [[nil], ['a'*16777215]]
|
1481
1481
|
end
|
1482
1482
|
|
1483
1483
|
it '#fetch mediumtext column' do
|
1484
1484
|
@m.query 'create temporary table t (i mediumtext)'
|
1485
|
-
@m.query "insert into t values (null),('
|
1485
|
+
@m.query "insert into t values (null),('#{"a"*16777215}')"
|
1486
1486
|
@s.prepare 'select i from t'
|
1487
1487
|
@s.execute
|
1488
|
-
@s.entries.should == [[nil], [
|
1488
|
+
@s.entries.should == [[nil], ['a'*16777215]]
|
1489
1489
|
end
|
1490
1490
|
|
1491
1491
|
it '#fetch longblob column' do
|
1492
1492
|
@m.query 'create temporary table t (i longblob)'
|
1493
|
-
@m.query "insert into t values (null),('
|
1493
|
+
@m.query "insert into t values (null),('#{"a"*16777216}')"
|
1494
1494
|
@s.prepare 'select i from t'
|
1495
1495
|
@s.execute
|
1496
|
-
@s.entries.should == [[nil], ["
|
1496
|
+
@s.entries.should == [[nil], ["a"*16777216]]
|
1497
1497
|
end
|
1498
1498
|
|
1499
1499
|
it '#fetch longtext column' do
|
1500
1500
|
@m.query 'create temporary table t (i longtext)'
|
1501
|
-
@m.query "insert into t values (null),('
|
1501
|
+
@m.query "insert into t values (null),('#{"a"*16777216}')"
|
1502
1502
|
@s.prepare 'select i from t'
|
1503
1503
|
@s.execute
|
1504
|
-
@s.entries.should == [[nil], ["
|
1504
|
+
@s.entries.should == [[nil], ["a"*16777216]]
|
1505
1505
|
end
|
1506
1506
|
|
1507
1507
|
it '#fetch enum column' do
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-mysql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.9.
|
4
|
+
version: 2.9.12
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Tomita Masahiro
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2013-
|
12
|
+
date: 2013-12-17 00:00:00.000000000 Z
|
12
13
|
dependencies: []
|
13
14
|
description: This is MySQL connector. pure Ruby version
|
14
15
|
email: tommy@tmtm.org
|
@@ -29,28 +30,28 @@ files:
|
|
29
30
|
homepage: http://github.com/tmtm/ruby-mysql
|
30
31
|
licenses:
|
31
32
|
- Ruby's
|
32
|
-
metadata: {}
|
33
33
|
post_install_message:
|
34
34
|
rdoc_options: []
|
35
35
|
require_paths:
|
36
36
|
- lib
|
37
37
|
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
38
39
|
requirements:
|
39
|
-
- - '>='
|
40
|
+
- - ! '>='
|
40
41
|
- !ruby/object:Gem::Version
|
41
42
|
version: '0'
|
42
43
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
43
45
|
requirements:
|
44
|
-
- - '>='
|
46
|
+
- - ! '>='
|
45
47
|
- !ruby/object:Gem::Version
|
46
48
|
version: '0'
|
47
49
|
requirements: []
|
48
50
|
rubyforge_project:
|
49
|
-
rubygems_version:
|
51
|
+
rubygems_version: 1.8.23
|
50
52
|
signing_key:
|
51
|
-
specification_version:
|
53
|
+
specification_version: 3
|
52
54
|
summary: MySQL connector
|
53
55
|
test_files:
|
54
56
|
- spec/mysql_spec.rb
|
55
57
|
- spec/mysql/packet_spec.rb
|
56
|
-
has_rdoc: true
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 7021fb12fc21daf12ea89138b4b10f9f95a68dd0
|
4
|
-
data.tar.gz: 71ab24b33c3eec96baeb7d242175a1591aa3952b
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: 85760ac7c8b6357ab21baf9a38fab0ade85c654f2375a038dda0c7a8052216eb6e3d0c8ce248bca660cca712e6b82548b5cb0539382939525f17c714a27a8602
|
7
|
-
data.tar.gz: bcac0ca18511fe52460591511559cda8c242815d5fa7844a559cc0a05c3a93db6c4cde5cf93bd7ed2f7e837f303926ecb10226dbc224f100a16f0ec5e28b7758
|