1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
# frozen_string_literal: true
class Riddle::Query::Insert
attr_reader :columns, :values
def initialize(index, columns = [], values = [])
@index = index
@columns = columns
@values = values.first.is_a?(Array) ? values : [values]
@replace = false
end
def replace!
@replace = true
self
end
def to_sql
"#{command} INTO #{@index} (#{columns_to_s}) VALUES (#{values_to_s})"
end
private
def command
@replace ? 'REPLACE' : 'INSERT'
end
def columns_to_s
columns.collect { |column|
column.to_s == 'id' ? 'id' : "`#{column}`"
}.join(', ')
end
def values_to_s
values.collect { |value_set|
value_set.collect { |value|
translated_value(value)
}.join(', ')
}.join('), (')
end
def translated_value(value)
case value
when String
"'#{value.gsub(/['\\]/, '').gsub(/\s+/, ' ')}'"
when TrueClass, FalseClass
value ? 1 : 0
when Time
value.to_i
when Date
value.to_time.to_i
when Array
"(#{value.join(',')})"
else
value
end
end
end
|