ruby-mysql 4.0.0 → 4.1.0
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/CHANGELOG.md +7 -0
- data/README.md +95 -2
- data/lib/mysql/protocol.rb +6 -3
- data/lib/mysql.rb +5 -1
- metadata +4 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd37c2f40ef7277952c0be41848abc338e29d3a4e9da3f3eed1d1d8f61407c76
|
4
|
+
data.tar.gz: 754994f1cb1f5e4cb007d5f1a3d81238e626ce8d224aef23c58c8af3d5fd351f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c31c8170682621713905f820a2816377a045b3ba489adc39d3575543483475411bdd7ecead30f806494533dd91819e8e53dad1bd3c090164b80d7600666ea1a4
|
7
|
+
data.tar.gz: 6f59d7638d0f09bd3c21cd34e32cae9e995f26219efc5594b3982b94562a0c3726a1258ebfff5e3b0afbe53764135d96eff0250d57d6d75289f65e3b9957e720
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
## [4.1.0] - 2023-10-08
|
2
|
+
|
3
|
+
- Support geometry column <https://gitlab.com/tmtms/ruby-mysql/-/merge_requests/1>
|
4
|
+
- FIX: If the server is localhost and disconnect the connection, Errno::EPIPE is raised <https://gitlab.com/tmtms/ruby-mysql/-/merge_requests/3> <https://gitlab.com/tmtms/ruby-mysql/-/issues/1>
|
5
|
+
- Allow for existing socket when connecting <https://gitlab.com/tmtms/ruby-mysql/-/merge_requests/2> <https://gitlab.com/tmtms/ruby-mysql/-/merge_requests/5>
|
6
|
+
- add `io` keyword parameter
|
7
|
+
|
1
8
|
## [4.0.0] - 2022-11-09
|
2
9
|
|
3
10
|
### Incompatible changes
|
data/README.md
CHANGED
@@ -2,17 +2,21 @@
|
|
2
2
|
|
3
3
|
## Description
|
4
4
|
|
5
|
-
MySQL
|
5
|
+
ruby-mysql is a MySQL client library.
|
6
|
+
It is written entirely in Ruby.
|
7
|
+
Therefore libmysqlclient is not required and no compilation is required during installation.
|
6
8
|
|
7
9
|
## Installation
|
8
10
|
|
9
|
-
```
|
11
|
+
```ruby
|
10
12
|
gem install ruby-mysql
|
11
13
|
```
|
12
14
|
|
13
15
|
## Synopsis
|
14
16
|
|
15
17
|
```ruby
|
18
|
+
require 'mysql'
|
19
|
+
|
16
20
|
my = Mysql.connect('mysql://username:password@hostname:port/dbname?charset=utf8mb4')
|
17
21
|
my.query("select col1, col2 from tblname").each do |col1, col2|
|
18
22
|
p col1, col2
|
@@ -21,6 +25,95 @@ stmt = my.prepare('insert into tblname (col1,col2) values (?,?)')
|
|
21
25
|
stmt.execute 123, 'abc'
|
22
26
|
```
|
23
27
|
|
28
|
+
## Major incompatibility with 3.0
|
29
|
+
|
30
|
+
### Result values are now converted by default
|
31
|
+
|
32
|
+
| MySQL type | Ruby class |
|
33
|
+
|---------------------|--------------------|
|
34
|
+
| NULL | NilClass |
|
35
|
+
| INT | Integer |
|
36
|
+
| DECIMAL | BigDecimal |
|
37
|
+
| FLOAT, DOUBLE | Float |
|
38
|
+
| DATE | Date |
|
39
|
+
| DATETIME, TIMESTAMP | Time |
|
40
|
+
| TIME | Float (as seconds) |
|
41
|
+
| YEAR | Integer |
|
42
|
+
| CHAR, VARCHAR | String |
|
43
|
+
| BIT | String |
|
44
|
+
| TEXT, BLOB, JSON | String |
|
45
|
+
|
46
|
+
3.0:
|
47
|
+
```ruby
|
48
|
+
pp my.query('select 123,123.45,now(),cast(now() as date)').fetch.map{[_1, _1.class]}
|
49
|
+
#=> [["123", String],
|
50
|
+
# ["123.45", String],
|
51
|
+
# ["2022-11-15 00:17:11", String],
|
52
|
+
# ["2022-11-15", String]]
|
53
|
+
```
|
54
|
+
|
55
|
+
4.0:
|
56
|
+
```ruby
|
57
|
+
pp my.query('select 123,123.45,now(),cast(now() as date)').fetch.map{[_1, _1.class]}
|
58
|
+
#=> [[123, Integer],
|
59
|
+
# [0.12345e3, BigDecimal],
|
60
|
+
# [2022-11-15 00:17:17 +0900, Time],
|
61
|
+
# [#<Date: 2022-11-15 ((2459899j,0s,0n),+0s,2299161j)>, Date]]
|
62
|
+
```
|
63
|
+
|
64
|
+
To specify `cast: false`, you get the same behavior as in 3.0.
|
65
|
+
```ruby
|
66
|
+
my.query('select 123,123.45,now(),cast(now() as date)', cast: false).fetch.map{[_1, _1.class]}
|
67
|
+
#=> [["123", String],
|
68
|
+
# ["123.45", String],
|
69
|
+
# ["2022-11-15 00:19:18", String],
|
70
|
+
# ["2022-11-15", String]]
|
71
|
+
```
|
72
|
+
|
73
|
+
It can also be specified during Mysql.new and Mysql.connect.
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
my = Mysql.connect('mysql://user:pass@localhost/', cast: false)
|
77
|
+
```
|
78
|
+
|
79
|
+
Changing mysql.default_options will affect the behavior of subsequently created instances.
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
my1 = Mysql.connect('mysql://user:pass@localhost/')
|
83
|
+
Mysql.default_options[:cast] = false
|
84
|
+
my2 = Mysql.connect('mysql://user:pass@localhost/')
|
85
|
+
pp my1.query('select 123,123.45,now(),cast(now() as date)').fetch.map{[_1, _1.class]}
|
86
|
+
#=> [[123, Integer],
|
87
|
+
# [0.12345e3, BigDecimal],
|
88
|
+
# [2022-11-15 00:26:09 +0900, Time],
|
89
|
+
# [#<Date: 2022-11-15 ((2459899j,0s,0n),+0s,2299161j)>, Date]]
|
90
|
+
pp my2.query('select 123,123.45,now(),cast(now() as date)').fetch.map{[_1, _1.class]}
|
91
|
+
#=> [["123", String],
|
92
|
+
# ["123.45", String],
|
93
|
+
# ["2022-11-15 00:26:09", String],
|
94
|
+
# ["2022-11-15", String]]
|
95
|
+
```
|
96
|
+
|
97
|
+
### Mysql::Result#each now always return records from the beginning
|
98
|
+
|
99
|
+
3.0:
|
100
|
+
```ruby
|
101
|
+
res = my.query('select 123 union select 456')
|
102
|
+
res.entries
|
103
|
+
#=> [["123"], ["456"]]
|
104
|
+
res.entries
|
105
|
+
#=> []
|
106
|
+
```
|
107
|
+
|
108
|
+
4.0:
|
109
|
+
```ruby
|
110
|
+
res = my.query('select 123 union select 456')
|
111
|
+
res.entries
|
112
|
+
#=> [[123], [456]]
|
113
|
+
res.entries
|
114
|
+
#=> [[123], [456]]
|
115
|
+
```
|
116
|
+
|
24
117
|
## Copyright
|
25
118
|
|
26
119
|
* Author: TOMITA Masahiro <tommy@tmtm.org>
|
data/lib/mysql/protocol.rb
CHANGED
@@ -24,7 +24,7 @@ class Mysql
|
|
24
24
|
# @return [Object] converted value.
|
25
25
|
def self.net2value(pkt, type, unsigned)
|
26
26
|
case type
|
27
|
-
when Field::TYPE_STRING, Field::TYPE_VAR_STRING, Field::TYPE_BLOB, Field::TYPE_JSON
|
27
|
+
when Field::TYPE_STRING, Field::TYPE_VAR_STRING, Field::TYPE_BLOB, Field::TYPE_JSON, Field::TYPE_GEOMETRY
|
28
28
|
return pkt.lcs
|
29
29
|
when Field::TYPE_NEWDECIMAL
|
30
30
|
s = pkt.lcs
|
@@ -160,6 +160,7 @@ class Mysql
|
|
160
160
|
# @option :ssl_mode [Integer]
|
161
161
|
# @option :ssl_context_params [Hash<:Symbol, String>]
|
162
162
|
# @option :get_server_public_key [Boolean]
|
163
|
+
# @option :io [BasicSocket, OpenSSL::SSL::SSLSocket] Existing socket instance that will be used instead of creating a new socket
|
163
164
|
# @raise [ClientError] connection timeout
|
164
165
|
def initialize(opts)
|
165
166
|
@mutex = Mutex.new
|
@@ -172,7 +173,9 @@ class Mysql
|
|
172
173
|
set_state :INIT
|
173
174
|
@get_server_public_key = @opts[:get_server_public_key]
|
174
175
|
begin
|
175
|
-
if @opts[:
|
176
|
+
if @opts[:io]
|
177
|
+
@socket = @opts[:io]
|
178
|
+
elsif @opts[:host].nil? or @opts[:host].empty? or @opts[:host] == "localhost"
|
176
179
|
socket = @opts[:socket] || ENV["MYSQL_UNIX_PORT"] || MYSQL_UNIX_PORT
|
177
180
|
@socket = Socket.unix(socket)
|
178
181
|
else
|
@@ -185,7 +188,7 @@ class Mysql
|
|
185
188
|
end
|
186
189
|
|
187
190
|
def close
|
188
|
-
@socket.close
|
191
|
+
@socket.close rescue nil
|
189
192
|
end
|
190
193
|
|
191
194
|
# initial negotiate and authenticate.
|
data/lib/mysql.rb
CHANGED
@@ -22,7 +22,7 @@ class Mysql
|
|
22
22
|
require_relative "mysql/protocol"
|
23
23
|
require_relative "mysql/packet"
|
24
24
|
|
25
|
-
VERSION = -'4.
|
25
|
+
VERSION = -'4.1.0' # Version number of this library
|
26
26
|
MYSQL_UNIX_PORT = -"/tmp/mysql.sock" # UNIX domain socket filename
|
27
27
|
MYSQL_TCP_PORT = 3306 # TCP socket port number
|
28
28
|
|
@@ -40,6 +40,8 @@ class Mysql
|
|
40
40
|
# @return [String, nil] socket filename
|
41
41
|
# @!attribute [rw] flags
|
42
42
|
# @return [Integer, nil]
|
43
|
+
# @!attribute [rw] io
|
44
|
+
# @return [[BasicSocket, OpenSSL::SSL::SSLSocket], nil]
|
43
45
|
# @!attribute [rw] connect_timeout
|
44
46
|
# @return [Numeric, nil]
|
45
47
|
# @!attribute [rw] read_timeout
|
@@ -78,6 +80,7 @@ class Mysql
|
|
78
80
|
port: nil,
|
79
81
|
socket: nil,
|
80
82
|
flags: 0,
|
83
|
+
io: nil,
|
81
84
|
charset: nil,
|
82
85
|
connect_timeout: nil,
|
83
86
|
read_timeout: nil,
|
@@ -172,6 +175,7 @@ class Mysql
|
|
172
175
|
# @option opts :ssl_context_params [Hash<Symbol, String>]
|
173
176
|
# @option opts :get_server_public_key [Boolean]
|
174
177
|
# @option opts :connect_attrs [Hash]
|
178
|
+
# @option opts :io [BasicSocket, OpenSSL::SSL::SSLSocket] Existing socket instance that will be used instead of creating a new socket
|
175
179
|
def initialize(*args, **opts)
|
176
180
|
@fields = nil
|
177
181
|
@result = nil
|
metadata
CHANGED
@@ -1,57 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-mysql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tomita Masahiro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: power_assert
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rspec
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rubocop
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
11
|
+
date: 2023-10-08 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
55
13
|
description: This is MySQL connector. pure Ruby version
|
56
14
|
email: tommy@tmtm.org
|
57
15
|
executables: []
|
@@ -96,7 +54,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
54
|
- !ruby/object:Gem::Version
|
97
55
|
version: '0'
|
98
56
|
requirements: []
|
99
|
-
rubygems_version: 3.
|
57
|
+
rubygems_version: 3.5.0.dev
|
100
58
|
signing_key:
|
101
59
|
specification_version: 4
|
102
60
|
summary: MySQL connector
|