ruby-mysql-ext 2.9.11 → 2.9.12

Sign up to get free protection for your applications and to get access to all the features.
data/lib/mysql.rb CHANGED
@@ -21,7 +21,7 @@ class Mysql
21
21
  rescue LoadError
22
22
  end
23
23
 
24
- VERSION = 20911 # Version number of this library
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
@@ -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 < 2**32/2 ? v : v-2**32
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 < 2**64/2 ? v : v-2**64
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 >= 0
83
- if v < 256
84
- type = Field::TYPE_TINY | 0x8000
85
- val = [v].pack("C")
86
- elsif v < 256**2
87
- type = Field::TYPE_SHORT | 0x8000
88
- val = [v].pack("v")
89
- elsif v < 256**4
90
- type = Field::TYPE_LONG | 0x8000
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
- if -v <= 256/2
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 Mysql::Time, ::Time
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 = [7, v.year, v.month, v.day, v.hour, v.min, v.sec].pack("CvCCCCC")
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
- ret = ""
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 ret[0] == ?\xff
514
- f, errno, marker, @sqlstate, message = ret.unpack("Cvaa5a*")
496
+ if data[0] == ?\xff
497
+ f, errno, marker, @sqlstate, message = data.unpack("Cvaa5a*")
515
498
  unless marker == "#"
516
- f, errno, message = ret.unpack("Cva*") # Version 4.0 Error
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(ret)
508
+ Packet.new(data)
525
509
  end
526
510
 
527
511
  # Write one packet data
@@ -1,4 +1,6 @@
1
1
  # coding: binary
2
+ require 'mysql/packet'
3
+
2
4
  describe Mysql::Packet do
3
5
  def self._(s)
4
6
  s.unpack('H*').first
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 == 20911
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!(:new).and_return{sleep 1}
134
- TCPSocket.stub!(:new).and_return{sleep 1}
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),('abc')"
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], ["abc"]]
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),('abc')"
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], ["abc"]]
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),('abc')"
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], ["abc"]]
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),('abc')"
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], ["abc"]]
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),('abc')"
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], ["abc"]]
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),('abc')"
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], ["abc"]]
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),('abc')"
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], ["abc"]]
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),('abc')"
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], ["abc"]]
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-ext
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.9.11
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-04-09 00:00:00.000000000 Z
12
+ date: 2013-12-17 00:00:00.000000000 Z
12
13
  dependencies: []
13
14
  description: This is MySQL connector with C extension.
14
15
  email: tommy@tmtm.org
@@ -32,28 +33,28 @@ files:
32
33
  homepage: http://github.com/tmtm/ruby-mysql
33
34
  licenses:
34
35
  - Ruby's
35
- metadata: {}
36
36
  post_install_message:
37
37
  rdoc_options: []
38
38
  require_paths:
39
39
  - lib
40
40
  required_ruby_version: !ruby/object:Gem::Requirement
41
+ none: false
41
42
  requirements:
42
- - - '>='
43
+ - - ! '>='
43
44
  - !ruby/object:Gem::Version
44
45
  version: '0'
45
46
  required_rubygems_version: !ruby/object:Gem::Requirement
47
+ none: false
46
48
  requirements:
47
- - - '>='
49
+ - - ! '>='
48
50
  - !ruby/object:Gem::Version
49
51
  version: '0'
50
52
  requirements: []
51
53
  rubyforge_project:
52
- rubygems_version: 2.0.0
54
+ rubygems_version: 1.8.23
53
55
  signing_key:
54
- specification_version: 4
56
+ specification_version: 3
55
57
  summary: MySQL connector with extension
56
58
  test_files:
57
59
  - spec/mysql_spec.rb
58
60
  - spec/mysql/packet_spec.rb
59
- has_rdoc: true
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 5d82b0a666dc3346c75e96ed0648c1e853223dcb
4
- data.tar.gz: 806fb647c2ccae615bfd9364a6c7d10f03cac41f
5
- SHA512:
6
- metadata.gz: bc07a9b319d07f335c485171a95fc32899e05280fbbd2abae29ba6b894d47e0743153a4b890f521914fbaef25e9d72d5c368cfac986e134ac8d9e5ef6e2b69d0
7
- data.tar.gz: 136723c2184834d041b70075236af6ddebc7aa2ef2f8fd012e1c697ab183fe9e9097dfd2a4846a242fc2450fbc33e011b6f95c828c6e6e8c6eaa4c3fb41efaad