jdbc-helper 0.4.0 → 0.4.1
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.
- data/lib/jdbc-helper/sql.rb +42 -38
- data/lib/jdbc-helper/wrapper/table_wrapper.rb +11 -9
- data/test/test_object_wrapper.rb +6 -0
- data/test/test_performance.rb +3 -2
- data/test/test_sql.rb +10 -1
- metadata +2 -2
data/lib/jdbc-helper/sql.rb
CHANGED
@@ -39,7 +39,7 @@ class SQL
|
|
39
39
|
|
40
40
|
# Generates SQL where cluase with the given conditions.
|
41
41
|
# Parameter can be either Hash of String.
|
42
|
-
def self.where conds
|
42
|
+
def self.where *conds
|
43
43
|
where_clause = where_internal conds
|
44
44
|
where_clause.empty? ? where_clause : check(where_clause)
|
45
45
|
end
|
@@ -97,6 +97,7 @@ class SQL
|
|
97
97
|
end
|
98
98
|
|
99
99
|
# FIXME: Naive protection for SQL Injection
|
100
|
+
# TODO: check caching?
|
100
101
|
def self.check expr, is_name = false
|
101
102
|
return nil if expr.nil?
|
102
103
|
|
@@ -126,43 +127,46 @@ private
|
|
126
127
|
|
127
128
|
# No check
|
128
129
|
def self.where_internal conds
|
129
|
-
|
130
|
-
|
131
|
-
where
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
130
|
+
conds = [conds] unless conds.is_a? Array
|
131
|
+
where_clause = conds.compact.map { |cond| where_unit cond }.reject(&:empty?).join(' and ')
|
132
|
+
where_clause.empty? ? '' : 'where ' + where_clause
|
133
|
+
end
|
134
|
+
|
135
|
+
def self.where_unit conds
|
136
|
+
case conds
|
137
|
+
when String
|
138
|
+
conds = conds.strip
|
139
|
+
conds.empty? ? '' : "(#{conds})"
|
140
|
+
when Hash
|
141
|
+
conds.map { |k, v|
|
142
|
+
"#{k} " +
|
143
|
+
case v
|
144
|
+
when NilClass
|
145
|
+
"is null"
|
146
|
+
when NotNilClass
|
147
|
+
"is not null"
|
148
|
+
when Fixnum, Bignum, Float, JDBCHelper::SQL
|
149
|
+
"= #{v}"
|
150
|
+
when Range
|
151
|
+
">= #{v.first} and #{k} <#{'=' unless v.exclude_end?} #{v.last}"
|
152
|
+
when Array
|
153
|
+
"in (" +
|
154
|
+
v.map { |e|
|
155
|
+
case e
|
156
|
+
when String
|
157
|
+
"'#{esc e}'"
|
158
|
+
else
|
159
|
+
e
|
160
|
+
end }.join(', ') + ")"
|
161
|
+
when String
|
162
|
+
"= '#{esc v}'"
|
163
|
+
else
|
164
|
+
raise NotImplementedError.new("Unsupported class: #{v.class}")
|
165
|
+
end
|
166
|
+
}.join(' and ')
|
167
|
+
else
|
168
|
+
raise NotImplementedError.new("Parameter to where must be either Hash or String")
|
169
|
+
end
|
166
170
|
end
|
167
171
|
|
168
172
|
def self.insert_internal cmd, table, data_hash
|
@@ -47,17 +47,17 @@ class TableWrapper < ObjectWrapper
|
|
47
47
|
alias to_s name
|
48
48
|
|
49
49
|
# Retrieves the count of the table
|
50
|
-
# @param [Hash/String] Filter conditions
|
50
|
+
# @param [List of Hash/String] where Filter conditions
|
51
51
|
# @return [Fixnum] Count of the records.
|
52
|
-
def count where
|
53
|
-
@connection.query(JDBCHelper::SQL.count name, where
|
52
|
+
def count *where
|
53
|
+
@connection.query(JDBCHelper::SQL.count name, where.empty? ? @query_where : where)[0][0].to_i
|
54
54
|
end
|
55
55
|
|
56
56
|
# Sees if the table is empty
|
57
57
|
# @param [Hash/String] Filter conditions
|
58
58
|
# @return [boolean]
|
59
|
-
def empty? where
|
60
|
-
count(where) == 0
|
59
|
+
def empty? *where
|
60
|
+
count(*where) == 0
|
61
61
|
end
|
62
62
|
|
63
63
|
# Inserts a record into the table with the given hash
|
@@ -95,10 +95,10 @@ class TableWrapper < ObjectWrapper
|
|
95
95
|
end
|
96
96
|
|
97
97
|
# Deletes records matching given condtion
|
98
|
-
# @param [Hash] where Delete filters
|
98
|
+
# @param [List of Hash/String] where Delete filters
|
99
99
|
# @return [Fixnum] Number of affected records
|
100
|
-
def delete where
|
101
|
-
@connection.send @update_method, JDBCHelper::SQL.delete(name, where
|
100
|
+
def delete *where
|
101
|
+
@connection.send @update_method, JDBCHelper::SQL.delete(name, where.empty? ? @query_where : where)
|
102
102
|
end
|
103
103
|
|
104
104
|
# Empties the table.
|
@@ -136,7 +136,9 @@ class TableWrapper < ObjectWrapper
|
|
136
136
|
# @param [Hash/String] Filter conditions
|
137
137
|
# @return [JDBCHelper::TableWrapper]
|
138
138
|
# @since 0.4.0
|
139
|
-
def where conditions, &block
|
139
|
+
def where *conditions, &block
|
140
|
+
raise ArgumentError.new("Wrong number of arguments") if conditions.empty?
|
141
|
+
|
140
142
|
obj = self.dup
|
141
143
|
obj.instance_variable_set :@query_where, conditions
|
142
144
|
ret obj, &block
|
data/test/test_object_wrapper.rb
CHANGED
@@ -249,6 +249,12 @@ class TestObjectWrapper < Test::Unit::TestCase
|
|
249
249
|
select(:a, :b, 'c cc').
|
250
250
|
order('id desc', 'name asc').sql
|
251
251
|
|
252
|
+
assert_equal "select a, b, c cc from tmp_jdbc_helper " +
|
253
|
+
"where (id != 15) and id >= 11 and id <= 20 order by id desc, name asc",
|
254
|
+
table.where("id != 15", :id => 11..20).
|
255
|
+
select(:a, :b, 'c cc').
|
256
|
+
order('id desc', 'name asc').sql
|
257
|
+
|
252
258
|
assert_raise(ArgumentError) { table.order }
|
253
259
|
assert_raise(ArgumentError) { table.order.where }
|
254
260
|
assert_raise(ArgumentError) { table.where.order }
|
data/test/test_performance.rb
CHANGED
@@ -54,13 +54,14 @@ class TestPerformance < Test::Unit::TestCase
|
|
54
54
|
end
|
55
55
|
}.real}"
|
56
56
|
|
57
|
-
puts "Inserts with hash (chunk-transactional): #{Benchmark.measure {
|
57
|
+
puts "Inserts with hash (batch & chunk-transactional): #{Benchmark.measure {
|
58
58
|
table = conn.table(@table)
|
59
59
|
(0...@count).each_slice(50) do |slice|
|
60
60
|
conn.transaction do
|
61
61
|
slice.each do |i|
|
62
|
-
table.insert @range.inject({}) { |hash, key| hash[key] = rand; hash }
|
62
|
+
table.batch.insert @range.inject({}) { |hash, key| hash[key] = rand; hash }
|
63
63
|
end
|
64
|
+
conn.execute_batch
|
64
65
|
end
|
65
66
|
end
|
66
67
|
}.real}"
|
data/test/test_sql.rb
CHANGED
@@ -47,7 +47,11 @@ class TestSQL < Test::Unit::TestCase
|
|
47
47
|
assert_equal "where sysdate = sysdate", SQL.where(JDBCHelper::SQL('sysdate') => JDBCHelper::SQL('sysdate'))
|
48
48
|
assert_equal "where a in ('aa', 'bb', 'cc')", SQL.where(:a => %w[aa bb cc])
|
49
49
|
assert_equal "where a = 1 and b = 'A''s'", SQL.where(:a => 1, :b => "A's")
|
50
|
-
assert_equal "where a = 1 or b = 1",
|
50
|
+
assert_equal "where (a = 1 or b = 1)", SQL.where("a = 1 or b = 1")
|
51
|
+
assert_equal "where (a = 1 or b = 1) and c = 2", SQL.where("a = 1 or b = 1", :c => 2)
|
52
|
+
assert_equal "where c = 2 and (a = 1 or b = 1)", SQL.where({:c => 2}, "a = 1 or b = 1")
|
53
|
+
assert_equal "where c = 2 and (a = 1 or b = 1) and (e = 2) and f = 3",
|
54
|
+
SQL.where({:c => 2}, "a = 1 or b = 1", nil, "", "e = 2", nil, {:f => 3}, {})
|
51
55
|
assert_equal '', SQL.where(nil)
|
52
56
|
assert_equal '', SQL.where(" ")
|
53
57
|
|
@@ -55,6 +59,11 @@ class TestSQL < Test::Unit::TestCase
|
|
55
59
|
assert_raise(NotImplementedError) { SQL.where(:a => Time.now) }
|
56
60
|
|
57
61
|
# Invalid SQL detection
|
62
|
+
assert_raise(ArgumentError) { SQL.where(" 'a--b' -- cde") }
|
63
|
+
assert_raise(ArgumentError) { SQL.where(" 'a--b' ;") }
|
64
|
+
assert_raise(ArgumentError) { SQL.where(" 'a--b' -- cde", :a => 1) }
|
65
|
+
assert_raise(ArgumentError) { SQL.where(" 'a--b' -- cde", :a => 1) }
|
66
|
+
assert_raise(ArgumentError) { SQL.where({:a => 1}, "/* a") }
|
58
67
|
assert_raise(ArgumentError) { SQL.where(:a => JDBCHelper::SQL(" 'a--b' -- cde")) }
|
59
68
|
assert_raise(ArgumentError) { SQL.where(:a => JDBCHelper::SQL(" 'aabbb''dd")) }
|
60
69
|
assert_raise(ArgumentError) { SQL.where(:a => JDBCHelper::SQL(" 'aabbb''dd' /* aaa */")) }
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: jdbc-helper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.4.
|
5
|
+
version: 0.4.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Junegunn Choi
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-06-01 00:00:00 +09:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|