sql-maker 0.0.1 → 0.0.2
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/sql/maker.rb +2 -2
- data/lib/sql/maker/condition.rb +25 -14
- data/lib/sql/maker/select.rb +6 -5
- data/spec/maker/bind_param_spec.rb +22 -0
- data/sql-maker.gemspec +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 32ac24cfad827c72f15a9d677d0c7ea6a68317a2
|
4
|
+
data.tar.gz: 51e81c781768b04148522f9408777dd532b4c62b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 029d20d44324f0e04c82a68556301dfb31b18e09c3f2e633e9e00f3ab450dddccd8b04fb715af57e489d5bdb2aa81b5dc32980484037170cc2b6d9dfc381965b
|
7
|
+
data.tar.gz: 30e4544a8d797d4b36dd0bde3bd6d342ce9b1d7ca9e63c510930b5d97d5aef298a5f92752d49ac877879f82eacbf86ae1fe0bc5c840f05ca04401e6139961b85
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## 0.0.2 (2014/06/18)
|
2
|
+
|
3
|
+
Enhancements:
|
4
|
+
|
5
|
+
* Add default :quote_char, :name_sep for SQL::Maker::Select, and SQL::Maker::Condition
|
6
|
+
* Add auto_bind option to SQL::Maker::Condition
|
7
|
+
* Inherit SQL::Maker::Condition parameters on creating sub conditions
|
8
|
+
|
1
9
|
## 0.0.1 (2014/06/18)
|
2
10
|
|
3
11
|
First version
|
data/lib/sql/maker.rb
CHANGED
@@ -20,7 +20,7 @@ class SQL::Maker
|
|
20
20
|
end
|
21
21
|
unless @quote_char = args[:quote_char]
|
22
22
|
@quote_char =
|
23
|
-
if driver
|
23
|
+
if @driver == 'mysql'
|
24
24
|
%q{`}
|
25
25
|
else
|
26
26
|
%q{"}
|
@@ -28,7 +28,7 @@ class SQL::Maker
|
|
28
28
|
end
|
29
29
|
@select_class = @driver == 'oracle' ? SQL::Maker::Select::Oracle : SQL::Maker::Select
|
30
30
|
|
31
|
-
@name_sep = args[:name_sep] || '
|
31
|
+
@name_sep = args[:name_sep] || '.'
|
32
32
|
@new_line = args[:new_line] || "\n"
|
33
33
|
@strict = args[:strict] || false
|
34
34
|
@auto_bind = args[:auto_bind] || false # apply client-side prepared statement binding autocatically
|
data/lib/sql/maker/condition.rb
CHANGED
@@ -3,14 +3,25 @@ require 'sql/query_maker'
|
|
3
3
|
|
4
4
|
class SQL::Maker::Condition
|
5
5
|
include SQL::Maker::Util
|
6
|
-
attr_accessor :
|
6
|
+
attr_accessor :quote_char, :name_sep, :strict, :auto_bind
|
7
|
+
attr_accessor :sql, :bind
|
7
8
|
|
8
9
|
def initialize(args = {})
|
10
|
+
@quote_char = args[:quote_char] || ''
|
11
|
+
@name_sep = args[:name_sep] || '.'
|
12
|
+
@strict = args[:strict] || false
|
13
|
+
@auto_bind = args[:auto_bind] || false
|
14
|
+
|
9
15
|
@sql = args[:sql] || []
|
10
16
|
@bind = args[:bind] || []
|
11
|
-
|
12
|
-
|
13
|
-
|
17
|
+
end
|
18
|
+
|
19
|
+
def new_condition(args = {})
|
20
|
+
SQL::Maker::Condition.new({
|
21
|
+
:quote_char => self.quote_char,
|
22
|
+
:name_sep => self.name_sep,
|
23
|
+
:strict => self.strict,
|
24
|
+
}.merge(args))
|
14
25
|
end
|
15
26
|
|
16
27
|
def &(other)
|
@@ -125,21 +136,21 @@ class SQL::Maker::Condition
|
|
125
136
|
def compose_and(other)
|
126
137
|
if self.sql.empty?
|
127
138
|
if other.sql.empty?
|
128
|
-
return
|
139
|
+
return new_condition
|
129
140
|
end
|
130
|
-
return
|
141
|
+
return new_condition(
|
131
142
|
:sql => ['(' + other.as_sql() + ')'],
|
132
143
|
:bind => other.bind,
|
133
144
|
)
|
134
145
|
end
|
135
146
|
if other.sql.empty?
|
136
|
-
return
|
147
|
+
return new_condition(
|
137
148
|
:sql => ['(' + self.as_sql() + ')'],
|
138
149
|
:bind => self.bind,
|
139
150
|
)
|
140
151
|
end
|
141
152
|
|
142
|
-
return
|
153
|
+
return new_condition(
|
143
154
|
:sql => ['(' + self.as_sql() + ') AND (' + other.as_sql() + ')'],
|
144
155
|
:bind => self.bind + other.bind,
|
145
156
|
)
|
@@ -148,15 +159,15 @@ class SQL::Maker::Condition
|
|
148
159
|
def compose_or(other)
|
149
160
|
if self.sql.empty?
|
150
161
|
if other.sql.empty?
|
151
|
-
return
|
162
|
+
return new_condition
|
152
163
|
end
|
153
|
-
return
|
164
|
+
return new_condition(
|
154
165
|
:sql => ['(' + other.as_sql() + ')'],
|
155
166
|
:bind => other.bind,
|
156
167
|
)
|
157
168
|
end
|
158
169
|
if other.sql.empty?
|
159
|
-
return
|
170
|
+
return new_condition(
|
160
171
|
:sql => ['(' + self.as_sql() + ')'],
|
161
172
|
:bind => self.bind,
|
162
173
|
)
|
@@ -164,16 +175,16 @@ class SQL::Maker::Condition
|
|
164
175
|
|
165
176
|
# return value is enclosed with '()'.
|
166
177
|
# because 'OR' operator priority less than 'AND'.
|
167
|
-
return
|
178
|
+
return new_condition(
|
168
179
|
:sql => ['((' + self.as_sql() + ') OR (' + other.as_sql() + '))'],
|
169
180
|
:bind => self.bind + other.bind,
|
170
181
|
)
|
171
182
|
end
|
172
183
|
|
173
184
|
def as_sql
|
174
|
-
self.sql.join(' AND ')
|
185
|
+
sql = self.sql.join(' AND ')
|
186
|
+
@auto_bind ? bind_param(sql, self.bind) : sql
|
175
187
|
end
|
176
|
-
alias_method :to_s, :as_sql
|
177
188
|
end
|
178
189
|
|
179
190
|
__END__
|
data/lib/sql/maker/select.rb
CHANGED
@@ -9,6 +9,12 @@ class SQL::Maker::Select
|
|
9
9
|
:index_hint, :group_by, :order_by, :where, :having, :for_update, :subqueries
|
10
10
|
|
11
11
|
def initialize(args = {})
|
12
|
+
@quote_char = args[:quote_char] || ''
|
13
|
+
@name_sep = args[:name_sep] || '.'
|
14
|
+
@new_line = args[:new_line] || "\n"
|
15
|
+
@strict = args[:strict] || false
|
16
|
+
@auto_bind = args[:auto_bind] || false
|
17
|
+
|
12
18
|
@select = args[:select] || []
|
13
19
|
@distinct = args[:distinct] || false
|
14
20
|
@select_map = args[:select_map] || {}
|
@@ -19,16 +25,11 @@ class SQL::Maker::Select
|
|
19
25
|
@group_by = args[:group_by] || []
|
20
26
|
@order_by = args[:order_by] || []
|
21
27
|
@prefix = args[:prefix] || 'SELECT '
|
22
|
-
@new_line = args[:new_line] || "\n"
|
23
|
-
@strict = args[:strict] || false
|
24
|
-
@auto_bind = args[:auto_bind] || false
|
25
28
|
@where = args[:where]
|
26
29
|
@having = args[:having]
|
27
30
|
@limit = args[:limit]
|
28
31
|
@offset = args[:offset]
|
29
32
|
@for_update = args[:for_update]
|
30
|
-
@quote_char = args[:quote_char]
|
31
|
-
@name_sep = args[:name_sep]
|
32
33
|
@subqueries = []
|
33
34
|
end
|
34
35
|
|
@@ -60,3 +60,25 @@ describe 'SQL::Maker' do
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
63
|
+
|
64
|
+
describe 'SQL::Maker::Select' do
|
65
|
+
let(:builder) { SQL::Maker::Select.new(:auto_bind => true, :new_line => ' ') }
|
66
|
+
|
67
|
+
it 'auto bind' do
|
68
|
+
sql = builder
|
69
|
+
.add_select('foo')
|
70
|
+
.add_from('table')
|
71
|
+
.add_where('hoge' => "t' OR 't' = 't")
|
72
|
+
.as_sql
|
73
|
+
expect(sql).to be == %q{SELECT foo FROM table WHERE (hoge = 't'' OR ''t'' = ''t')}
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe 'SQL::Maker::Condition' do
|
78
|
+
let(:builder) { SQL::Maker::Condition.new(:auto_bind => true) }
|
79
|
+
|
80
|
+
it 'auto bind' do
|
81
|
+
sql = builder.add('hoge' => "t' OR 't' = 't").as_sql
|
82
|
+
expect(sql).to be == %q{(hoge = 't'' OR ''t'' = ''t')}
|
83
|
+
end
|
84
|
+
end
|
data/sql-maker.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "sql-maker"
|
7
|
-
spec.version = "0.0.
|
7
|
+
spec.version = "0.0.2"
|
8
8
|
spec.authors = ["Naotoshi Seo"]
|
9
9
|
spec.email = ["sonots@gmail.com"]
|
10
10
|
spec.summary = %q{SQL Builder for Ruby}
|