sqb 1.0.1 → 1.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2387d8f2e864013ed743ea61957668337b6845cf12ee726f21b6b8e5c780a27b
4
- data.tar.gz: 346cf18dec4a83500e1b946e1ce0a8803343abb14de0be3b91d201672bd3bd2d
3
+ metadata.gz: 36cfacce28d143bb31c2b714cc2b4a99744a7dfd117832e0952979767bfcd7af
4
+ data.tar.gz: 72efb2953532af5f444b55833e3342138bfe68a94560567658e81981d38db043
5
5
  SHA512:
6
- metadata.gz: 992277c06cef720684186e15492b6f48cc93cd18286054966392a65af711e5eb05b3e19eb16f0d0f9c82d0d0a4ea336eda23b1091ffbd33178846966863a27b9
7
- data.tar.gz: 4f961eebaf2c818a6b3601bed4dafe4f089ad2cdffd6149fdef8af4047e1ead9ff28680a89e338b4c10fdd9b4c91dff16c012666c2fa956d618f830095432c67
6
+ metadata.gz: 9bad00a3fad97d424d51d7a150ca64055885fdd730d8c925712895176ac6fa61e575433f3bc18b90f165d5a2fa2bda5b32c5e07ba463d0460d39578c9cdcaa76
7
+ data.tar.gz: 0b927ede58eaa630e8a665a1d5ee9e564eaaebfd96d8ed29a66a0b0606aab22fe000f75142428386084d512d6238f3450a1642ebf13bdce57bade20a449023a6
data/lib/sqb.rb CHANGED
@@ -1,2 +1,9 @@
1
1
  require 'sqb/query'
2
2
  require 'sqb/version'
3
+ require 'sqb/safe_string'
4
+
5
+ module SQB
6
+ def self.safe(string)
7
+ SafeString.new(string)
8
+ end
9
+ end
data/lib/sqb/query.rb CHANGED
@@ -37,12 +37,12 @@ module SQB
37
37
  query << "SELECT"
38
38
  query << "DISTINCT" if @distinct
39
39
  if @columns.empty?
40
- query << column_tuple(@table_name, '*')
40
+ query << escape_and_join(@table_name, '*')
41
41
  else
42
42
  query << @columns.join(', ')
43
43
  end
44
44
  query << "FROM"
45
- query << escape(@table_name)
45
+ query << escape_and_join(@options[:database_name], @table_name)
46
46
 
47
47
  unless @joins.empty?
48
48
  query << @joins.join(' ')
@@ -85,7 +85,7 @@ module SQB
85
85
  if options[:function]
86
86
  query << "#{escape_function(options[:function])}("
87
87
  end
88
- query << column_tuple(table, column)
88
+ query << escape_and_join(table, column)
89
89
  if options[:function]
90
90
  query << ")"
91
91
  end
@@ -176,7 +176,7 @@ module SQB
176
176
  end
177
177
 
178
178
  with_table_and_column(column) do |table, column|
179
- @orders << [column_tuple(table, column), direction].join(' ')
179
+ @orders << [escape_and_join(table, column), direction].join(' ')
180
180
  end
181
181
 
182
182
  self
@@ -199,7 +199,7 @@ module SQB
199
199
  # @return [Query]
200
200
  def group_by(column)
201
201
  with_table_and_column(column) do |table, column|
202
- @groups << column_tuple(table, column)
202
+ @groups << escape_and_join(table, column)
203
203
  end
204
204
  self
205
205
  end
@@ -223,13 +223,13 @@ module SQB
223
223
 
224
224
  @joins << [].tap do |query|
225
225
  query << "INNER JOIN"
226
- query << escape(table_name)
226
+ query << escape_and_join(@options[:database_name], table_name)
227
227
  query << "AS"
228
228
  query << escape(join_name)
229
229
  query << "ON"
230
- query << column_tuple(@table_name, 'id')
230
+ query << escape_and_join(@table_name, 'id')
231
231
  query << "="
232
- query << column_tuple(join_name, foreign_key)
232
+ query << escape_and_join(join_name, foreign_key)
233
233
  end.join(' ')
234
234
 
235
235
  if options[:where]
@@ -266,7 +266,7 @@ module SQB
266
266
  key = key.first[1]
267
267
  end
268
268
 
269
- key = column_tuple(table, key)
269
+ key = escape_and_join(table, key)
270
270
 
271
271
  if value.is_a?(Array)
272
272
  escaped_values = value.map { |v| value_escape(v) }.join(', ')
@@ -299,6 +299,10 @@ module SQB
299
299
  escaped_values = value.map { |v| value_escape(v) }.join(', ')
300
300
  op = operator == :in ? "IN" : "NOT IN"
301
301
  sql << "#{key} #{op} (#{escaped_values})"
302
+ when :like
303
+ sql << "#{key} LIKE #{value_escape(value)}"
304
+ when :not_like
305
+ sql << "#{key} NOT LIKE #{value_escape(value)}"
302
306
  else
303
307
  raise InvalidOperatorError, "Invalid operator '#{operator}'"
304
308
  end
@@ -314,11 +318,19 @@ module SQB
314
318
  end
315
319
 
316
320
  def escape(name)
317
- "`#{name.to_s.gsub('`', '``')}`"
321
+ if name.is_a?(SafeString)
322
+ name
323
+ else
324
+ "`#{name.to_s.gsub('`', '``')}`"
325
+ end
318
326
  end
319
327
 
320
328
  def escape_function(name)
321
- name.to_s.gsub(/[^a-z0-9\_]/i, '').upcase
329
+ if name.is_a?(SafeString)
330
+ name
331
+ else
332
+ name.to_s.gsub(/[^a-z0-9\_]/i, '').upcase
333
+ end
322
334
  end
323
335
 
324
336
  def value_escape(value)
@@ -345,12 +357,18 @@ module SQB
345
357
  if input.is_a?(Hash)
346
358
  input.each { |table, column| block.call(table, column) }
347
359
  else
348
- block.call(@table_name, input.to_sym)
360
+ block.call(@table_name, input)
349
361
  end
350
362
  end
351
363
 
352
- def column_tuple(table, column)
353
- [escape(table), escape(column)].join('.')
364
+ def escape_and_join(*parts)
365
+ if parts.last.is_a?(SafeString)
366
+ # If a safe string is provided as a column name, we'll
367
+ # always use this even if a table name is provided too.
368
+ parts.last
369
+ else
370
+ parts.compact.map { |part| escape(part) }.join('.')
371
+ end
354
372
  end
355
373
 
356
374
  end
@@ -0,0 +1,5 @@
1
+ module SQB
2
+ class SafeString < String
3
+
4
+ end
5
+ end
data/lib/sqb/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module SQB
2
- VERSION = '1.0.1'
2
+ VERSION = '1.0.2'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Cooke
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-26 00:00:00.000000000 Z
11
+ date: 2018-02-27 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A friendly SQL builder for MySQL.
14
14
  email:
@@ -20,6 +20,7 @@ files:
20
20
  - lib/sqb.rb
21
21
  - lib/sqb/error.rb
22
22
  - lib/sqb/query.rb
23
+ - lib/sqb/safe_string.rb
23
24
  - lib/sqb/version.rb
24
25
  homepage: https://github.com/adamcooke/sqb
25
26
  licenses: