class Baza::SqlQueries::GenericInsert

Public Class Methods

new(args) click to toggle source
# File lib/baza/sql_queries/generic_insert.rb, line 2
def initialize(args)
  @db = args.fetch(:db)
  @table_name = args.fetch(:table_name)
  @data = args.fetch(:data)
  @buffer = args[:buffer]
  @return_sql = args[:return_sql]
  @return_id = args[:return_id]
  @replace_line_breaks = args[:replace_line_breaks]
end

Public Instance Methods

execute() click to toggle source
# File lib/baza/sql_queries/generic_insert.rb, line 12
def execute
  if @return_sql
    to_sql
  elsif @buffer
    @buffer.query(to_sql)
  else
    @db.query(to_sql)
    @db.last_id if @return_id
  end
end
to_sql() click to toggle source
# File lib/baza/sql_queries/generic_insert.rb, line 23
def to_sql
  sql = "INSERT INTO #{@db.quote_table(@table_name)}"

  if !@data || @data.empty?
    sql << " #{sql_default_values}"
  else
    sql << " #{sql_columns} VALUES #{sql_values}"
  end

  sql
end

Private Instance Methods

convert_line_breaks(quoted) click to toggle source
# File lib/baza/sql_queries/generic_insert.rb, line 86
def convert_line_breaks(quoted)
  return quoted unless quoted.include?("\n")

  if @db.postgres?
    quoted.gsub("\n", "' || CHR(10) || '")
  else
    "CONCAT(#{quoted.gsub("\n", "', CHR(10), '")}"
  end
end
sql_columns() click to toggle source
# File lib/baza/sql_queries/generic_insert.rb, line 47
def sql_columns
  sql = "("

  first = true
  @data.each_key do |key|
    if first
      first = false
    else
      sql << ", "
    end

    sql << @db.quote_column(key)
  end

  sql << ")"
  sql
end
sql_default_values() click to toggle source
# File lib/baza/sql_queries/generic_insert.rb, line 37
def sql_default_values
  if @db.opts.fetch(:type).to_s.include?("mysql")
    "VALUES ()" # This is the correct syntax for inserting a blank row in MySQL.
  elsif @db.opts.fetch(:type).to_s.include?("sqlite3")
    "DEFAULT VALUES"
  else
    raise "Unknown database-type: '#{@db.opts.fetch(:type)}'."
  end
end
sql_values() click to toggle source
# File lib/baza/sql_queries/generic_insert.rb, line 65
def sql_values
  sql = "("

  first = true
  @data.each_value do |value|
    if first
      first = false
    else
      sql << ", "
    end

    quoted = @db.quote_value(value)
    quoted = convert_line_breaks(quoted) if @replace_line_breaks

    sql << quoted
  end

  sql << ")"
  sql
end