class Mv::Mysql::Constraint::Builder::Trigger

Public Instance Methods

create() click to toggle source
# File lib/mv/mysql/constraint/builder/trigger.rb, line 6
def create
  validation_builders.group_by(&:table_name).each do |table_name, validations|
    db.execute(drop_trigger_statement(table_name))
    db.execute(create_trigger_statement(table_name))
  end
end
delete() click to toggle source
# File lib/mv/mysql/constraint/builder/trigger.rb, line 13
def delete
  validation_builders.group_by(&:table_name).each do |table_name, validations|
    db.execute(drop_trigger_statement(table_name))
  end
end
update(new_constraint_builder) click to toggle source
# File lib/mv/mysql/constraint/builder/trigger.rb, line 19
def update new_constraint_builder
  delete
  new_constraint_builder.create
end

Private Instance Methods

create_trigger_statement(table_name) click to toggle source
# File lib/mv/mysql/constraint/builder/trigger.rb, line 31
def create_trigger_statement table_name
  "CREATE TRIGGER #{name} BEFORE #{update? ? 'UPDATE' : 'INSERT'} ON #{table_name} FOR EACH ROW
   BEGIN
    DECLARE var INT;

    #{trigger_body(table_name)};
   END;"
end
drop_trigger_statement(table_name) click to toggle source
# File lib/mv/mysql/constraint/builder/trigger.rb, line 27
def drop_trigger_statement table_name
  "DROP TRIGGER IF EXISTS #{name};"
end
raise_error_statement(message) click to toggle source
# File lib/mv/mysql/constraint/builder/trigger.rb, line 48
def raise_error_statement message
  return "SIGNAL SQLSTATE '45000' SET message_text = '#{message}';" if db.support_signal?

  "SET var = (SELECT MAX(1) FROM `#{message}`);"
end
trigger_body(table_name) click to toggle source
# File lib/mv/mysql/constraint/builder/trigger.rb, line 40
def trigger_body(table_name)
  validation_builders.select{|b| b.table_name == table_name }.collect(&:conditions).flatten.collect do |condition|
    "IF NOT(#{condition[:statement]}) THEN
      #{raise_error_statement(condition[:message])}
    END IF".squish
  end.join("; \n")
end