mysql2-cs-bind 0.0.3 → 0.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 +7 -0
- data/README.md +2 -2
- data/lib/mysql2-cs-bind.rb +22 -8
- data/mysql2-cs-bind.gemspec +4 -3
- data/spec/mysql2/client_spec.rb +33 -1
- metadata +18 -47
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4407a9571990644923605f3e94e689cfa2f58a2b0ae65751df47fe504c9f87cc
|
4
|
+
data.tar.gz: 9e7f64a7e17c636b9da92d3a8849468b35519b7bf301bcda722e7664b0f39346
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1635039201253b1d8b48251fef0e5acf02ea4ac8e379af39bf417b0f1ab83f1b9f2cfe4d5587006e3c8ca5b8dd817e19978698182778e45865ae620d02f8d7f4
|
7
|
+
data.tar.gz: 1dfec3139736b9de9d6bb61a76a53fcf72f2909ea16f79c6620d99ad55de045288cc6557cf04c70ecd6e48a662a4cc5154e74dd31e6cd0ab86992ba921619707
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
#
|
1
|
+
# mysql2-cs-bind
|
2
2
|
|
3
|
-
'
|
3
|
+
'mysql2-cs-bind' is extension of 'mysql2', to add method of client-side variable binding (pseudo prepared statement).
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
data/lib/mysql2-cs-bind.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'mysql2'
|
2
4
|
|
3
5
|
class Mysql2::Client
|
@@ -11,7 +13,7 @@ class Mysql2::Client
|
|
11
13
|
if args.size < 1
|
12
14
|
query(sql, options)
|
13
15
|
else
|
14
|
-
query(Mysql2::Client.pseudo_bind(sql, args
|
16
|
+
query(Mysql2::Client.pseudo_bind(sql, args), options)
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
@@ -24,21 +26,33 @@ class Mysql2::Client
|
|
24
26
|
placeholders.push(pos)
|
25
27
|
search_pos = pos + 1
|
26
28
|
end
|
29
|
+
values = values.flatten(1) if placeholders.length == values.flatten(1).length
|
27
30
|
raise ArgumentError, "mismatch between placeholders number and values arguments" if placeholders.length != values.length
|
28
31
|
|
29
32
|
while pos = placeholders.pop()
|
30
33
|
rawvalue = values.pop()
|
31
|
-
if rawvalue.
|
32
|
-
sql[pos] =
|
33
|
-
elsif rawvalue.is_a?(Time)
|
34
|
-
sql[pos] = "'" + rawvalue.strftime('%Y-%m-%d %H:%M:%S') + "'"
|
35
|
-
elsif rawvalue.is_a?(Array)
|
36
|
-
sql[pos] = rawvalue.map{|v| "'" + Mysql2::Client.escape(v.to_s) + "'" }.join(",")
|
34
|
+
if rawvalue.is_a?(Array)
|
35
|
+
sql[pos] = rawvalue.map{|v| quote(v) }.join(",")
|
37
36
|
else
|
38
|
-
sql[pos] =
|
37
|
+
sql[pos] = quote(rawvalue)
|
39
38
|
end
|
40
39
|
end
|
41
40
|
sql
|
42
41
|
end
|
43
42
|
|
43
|
+
private
|
44
|
+
|
45
|
+
def self.quote(rawvalue)
|
46
|
+
if rawvalue.nil?
|
47
|
+
'NULL'
|
48
|
+
elsif rawvalue == true
|
49
|
+
'TRUE'
|
50
|
+
elsif rawvalue == false
|
51
|
+
'FALSE'
|
52
|
+
elsif rawvalue.respond_to?(:strftime)
|
53
|
+
"'#{rawvalue.strftime('%Y-%m-%d %H:%M:%S')}'"
|
54
|
+
else
|
55
|
+
"'#{Mysql2::Client.escape(rawvalue.to_s)}'"
|
56
|
+
end
|
57
|
+
end
|
44
58
|
end
|
data/mysql2-cs-bind.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
4
|
gem.name = "mysql2-cs-bind"
|
5
|
-
gem.version = "0.0
|
5
|
+
gem.version = "0.1.0"
|
6
6
|
gem.authors = ["TAGOMORI Satoshi"]
|
7
7
|
gem.email = ["tagomoris@gmail.com"]
|
8
8
|
gem.homepage = "https://github.com/tagomoris/mysql2-cs-bind"
|
@@ -14,10 +14,11 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
|
17
|
-
gem.
|
17
|
+
gem.required_ruby_version = ">= 2.0.0"
|
18
|
+
|
19
|
+
gem.add_runtime_dependency "mysql2"
|
18
20
|
|
19
21
|
# tests
|
20
|
-
gem.add_development_dependency "mysql2"
|
21
22
|
gem.add_development_dependency 'eventmachine'
|
22
23
|
gem.add_development_dependency 'rake-compiler', "~> 0.7.7"
|
23
24
|
gem.add_development_dependency 'rake', '0.8.7' # NB: 0.8.7 required by rake-compiler 0.7.9
|
data/spec/mysql2/client_spec.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
require 'spec_helper'
|
3
|
+
require 'time'
|
3
4
|
|
4
5
|
describe Mysql2::Client do
|
5
6
|
before(:each) do
|
@@ -41,14 +42,23 @@ describe Mysql2::Client do
|
|
41
42
|
end
|
42
43
|
|
43
44
|
it "should replace placeholder with formatted timestamp string about Time object" do
|
44
|
-
require 'time'
|
45
45
|
t = Time.strptime('2012/04/20 16:50:45', '%Y/%m/%d %H:%M:%S')
|
46
46
|
@klass.pseudo_bind("UPDATE x SET y=? WHERE x=?", [t,1]).should eql("UPDATE x SET y='2012-04-20 16:50:45' WHERE x='1'")
|
47
47
|
end
|
48
48
|
|
49
|
+
it "should replace placeholder with TRUE/FALSE about true/false" do
|
50
|
+
@klass.pseudo_bind("UPDATE x SET y=? WHERE x=?", [true,1]).should eql("UPDATE x SET y=TRUE WHERE x='1'")
|
51
|
+
@klass.pseudo_bind("UPDATE x SET y=? WHERE x=?", [false,1]).should eql("UPDATE x SET y=FALSE WHERE x='1'")
|
52
|
+
end
|
53
|
+
|
49
54
|
it "should replace placeholder with value list about Array object" do
|
55
|
+
t = Time.strptime('2012/04/20 16:50:45', '%Y/%m/%d %H:%M:%S')
|
50
56
|
@klass.pseudo_bind("SELECT x,y,z FROM x WHERE x in (?)", [[1,2,3]]).should eql("SELECT x,y,z FROM x WHERE x in ('1','2','3')")
|
51
57
|
@klass.pseudo_bind("SELECT x,y,z FROM x WHERE x = ? and y in (?)", [1, [1, 2, 3]]).should eql("SELECT x,y,z FROM x WHERE x = '1' and y in ('1','2','3')")
|
58
|
+
@klass.pseudo_bind("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id = ? OR id in (?)", [1, [2,3]]).should eql("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id = '1' OR id in ('2','3')")
|
59
|
+
@klass.pseudo_bind("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id in (?) OR id = ?", [[1,2], 3]).should eql("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id in ('1','2') OR id = '3'")
|
60
|
+
@klass.pseudo_bind("SELECT x,y,z FROM x WHERE x = ? and y in (?)", [1, [true, nil]]).should eql("SELECT x,y,z FROM x WHERE x = '1' and y in (TRUE,NULL)")
|
61
|
+
@klass.pseudo_bind("SELECT x,y,z FROM x WHERE x = ? and y in (?)", [1, [t, nil]]).should eql("SELECT x,y,z FROM x WHERE x = '1' and y in ('2012-04-20 16:50:45',NULL)")
|
52
62
|
end
|
53
63
|
end
|
54
64
|
|
@@ -80,6 +90,28 @@ describe Mysql2::Client do
|
|
80
90
|
@client.xquery("SELECT ?+1", 1).first.should eql([2.0])
|
81
91
|
end
|
82
92
|
|
93
|
+
it "should read multi style args" do
|
94
|
+
@client.xquery("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id IN (1)").first["id"].should eql(1)
|
95
|
+
|
96
|
+
@client.xquery("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id = ?", 1).first["id"].should eql(1)
|
97
|
+
@client.xquery("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id = ? OR id = ?", 1, 2).first["id"].should eql(1)
|
98
|
+
@client.xquery("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id = ? OR id = ?", [1,2]).first["id"].should eql(1)
|
99
|
+
|
100
|
+
@client.xquery("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id in (?)", [1,2,3]).first["id"].should eql(1)
|
101
|
+
@client.xquery("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id = ? OR id in (?)", 1, [2,3]).first["id"].should eql(1)
|
102
|
+
@client.xquery("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id = ? OR id in (?)", [1, [2,3]]).first["id"].should eql(1)
|
103
|
+
@client.xquery("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id in (?) OR id = ?", [1,2], 3).first["id"].should eql(1)
|
104
|
+
@client.xquery("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id in (?) OR id = ?", [[1,2], 3]).first["id"].should eql(1)
|
105
|
+
|
106
|
+
@client.xquery("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id IN (1)",:something => :else).first["id"].should eql(1)
|
107
|
+
@client.xquery("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id = ? OR id in (?)", 1, [2,3],:something => :else).first["id"].should eql(1)
|
108
|
+
@client.xquery("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id in (?) OR id = ?", [[1,2], 3],:something => :else).first["id"].should eql(1)
|
109
|
+
|
110
|
+
expect {
|
111
|
+
@client.xquery("SELECT id FROM (SELECT 1 AS id) AS tbl WHERE id in (?) OR id = ?", [[1,2], 3, 4],:something => :else)
|
112
|
+
}.should raise_exception(ArgumentError)
|
113
|
+
end
|
114
|
+
|
83
115
|
it "should be able to return results with symbolized keys" do
|
84
116
|
@client.xquery("SELECT 1", :symbolize_keys => true).first.keys[0].class.should eql(Symbol)
|
85
117
|
end
|
metadata
CHANGED
@@ -1,84 +1,60 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mysql2-cs-bind
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- TAGOMORI Satoshi
|
9
|
-
autorequire:
|
8
|
+
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2020-09-15 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: mysql2
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0'
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: mysql2
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ! '>='
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '0'
|
38
|
-
type: :development
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ! '>='
|
24
|
+
- - ">="
|
44
25
|
- !ruby/object:Gem::Version
|
45
26
|
version: '0'
|
46
27
|
- !ruby/object:Gem::Dependency
|
47
28
|
name: eventmachine
|
48
29
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
30
|
requirements:
|
51
|
-
- -
|
31
|
+
- - ">="
|
52
32
|
- !ruby/object:Gem::Version
|
53
33
|
version: '0'
|
54
34
|
type: :development
|
55
35
|
prerelease: false
|
56
36
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
37
|
requirements:
|
59
|
-
- -
|
38
|
+
- - ">="
|
60
39
|
- !ruby/object:Gem::Version
|
61
40
|
version: '0'
|
62
41
|
- !ruby/object:Gem::Dependency
|
63
42
|
name: rake-compiler
|
64
43
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
44
|
requirements:
|
67
|
-
- - ~>
|
45
|
+
- - "~>"
|
68
46
|
- !ruby/object:Gem::Version
|
69
47
|
version: 0.7.7
|
70
48
|
type: :development
|
71
49
|
prerelease: false
|
72
50
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
51
|
requirements:
|
75
|
-
- - ~>
|
52
|
+
- - "~>"
|
76
53
|
- !ruby/object:Gem::Version
|
77
54
|
version: 0.7.7
|
78
55
|
- !ruby/object:Gem::Dependency
|
79
56
|
name: rake
|
80
57
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
58
|
requirements:
|
83
59
|
- - '='
|
84
60
|
- !ruby/object:Gem::Version
|
@@ -86,7 +62,6 @@ dependencies:
|
|
86
62
|
type: :development
|
87
63
|
prerelease: false
|
88
64
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
65
|
requirements:
|
91
66
|
- - '='
|
92
67
|
- !ruby/object:Gem::Version
|
@@ -94,7 +69,6 @@ dependencies:
|
|
94
69
|
- !ruby/object:Gem::Dependency
|
95
70
|
name: rspec
|
96
71
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
72
|
requirements:
|
99
73
|
- - '='
|
100
74
|
- !ruby/object:Gem::Version
|
@@ -102,7 +76,6 @@ dependencies:
|
|
102
76
|
type: :development
|
103
77
|
prerelease: false
|
104
78
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
79
|
requirements:
|
107
80
|
- - '='
|
108
81
|
- !ruby/object:Gem::Version
|
@@ -115,7 +88,7 @@ executables: []
|
|
115
88
|
extensions: []
|
116
89
|
extra_rdoc_files: []
|
117
90
|
files:
|
118
|
-
- .gitignore
|
91
|
+
- ".gitignore"
|
119
92
|
- Gemfile
|
120
93
|
- MIT-LICENSE
|
121
94
|
- README.md
|
@@ -128,27 +101,25 @@ files:
|
|
128
101
|
- spec/spec_helper.rb
|
129
102
|
homepage: https://github.com/tagomoris/mysql2-cs-bind
|
130
103
|
licenses: []
|
131
|
-
|
104
|
+
metadata: {}
|
105
|
+
post_install_message:
|
132
106
|
rdoc_options: []
|
133
107
|
require_paths:
|
134
108
|
- lib
|
135
109
|
required_ruby_version: !ruby/object:Gem::Requirement
|
136
|
-
none: false
|
137
110
|
requirements:
|
138
|
-
- -
|
111
|
+
- - ">="
|
139
112
|
- !ruby/object:Gem::Version
|
140
|
-
version:
|
113
|
+
version: 2.0.0
|
141
114
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
|
-
none: false
|
143
115
|
requirements:
|
144
|
-
- -
|
116
|
+
- - ">="
|
145
117
|
- !ruby/object:Gem::Version
|
146
118
|
version: '0'
|
147
119
|
requirements: []
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
specification_version: 3
|
120
|
+
rubygems_version: 3.1.2
|
121
|
+
signing_key:
|
122
|
+
specification_version: 4
|
152
123
|
summary: extension for mysql2 to add client-side variable binding
|
153
124
|
test_files:
|
154
125
|
- spec/mysql2/client_spec.rb
|