class RailsDbTriggers::DbTriggersCreator
Attributes
triggers[R]
Public Class Methods
new()
click to toggle source
# File lib/rails_db_triggers/db_triggers_creator.rb, line 4 def initialize @triggers = {} end
Public Instance Methods
create_triggers()
click to toggle source
# File lib/rails_db_triggers/db_triggers_creator.rb, line 46 def create_triggers reset_triggers_status! @triggers.each{ |name, trigger| create_trigger name, trigger } end
drop_triggers()
click to toggle source
# File lib/rails_db_triggers/db_triggers_creator.rb, line 39 def drop_triggers reset_triggers_status! @triggers.each{ |name, trigger| drop_trigger name, trigger } end
register_files(files)
click to toggle source
# File lib/rails_db_triggers/db_triggers_creator.rb, line 8 def register_files files files.each do |file| trigger_name = File.basename(file, File.extname(file)) content = File.read(file) content_lines = content.split("\n") # Reject the commented lines from the file sql_content = content_lines.reject{ |x| x.strip =~ /^--/ || x.strip =~ /^#/ }.join("\n") file_obj = { path: file, sql_content: sql_content, status: :none, requires: [] } # Detect directives in commentary directives = content_lines.select{ |x| x.strip =~ /^--/ || x.strip =~ /^#/ }.map(&:strip).map{ |x| x =~ /^--/ ? x[2..-1] : x[1..-1] }.select{|x| x =~ /^!/ } directives.each do |directive| if directive =~ /^!require / #Currently only the require directive exists. file_obj[:requires] += directive.split(" ")[1..-1] end end if @triggers[trigger_name] puts "WARNING: #{trigger_name} already defined in `#{@triggers[trigger_name][:path]}`. Will be ignored and we use `#{file_obj[:path]}`..." end @triggers[trigger_name] = file_obj end end
Private Instance Methods
create_trigger(name, trigger)
click to toggle source
# File lib/rails_db_triggers/db_triggers_creator.rb, line 87 def create_trigger name, trigger # skip empty sql content if trigger[:sql_content].strip.blank? puts "TRIGGER #{name} EMPTY... SKIPPING" return end # trigger already loaded. return if trigger[:status] == :loaded if trigger[:status] == :inprogress raise "Error: Circular file reference! (trigger #{name})" end trigger[:status] = :inprogress trigger[:requires].each do |other_trigger| create_trigger other_trigger, @triggers[other_trigger] end table_name = (Rails.configuration.rails_db_triggers[:triggers_dbschema] || []).clone table_name << "[#{name}]" full_name = table_name.join('.') sql = "CREATE TRIGGER #{full_name} #{trigger[:sql_content]}" ActiveRecord::Base.connection.execute(sql) puts "CREATE TRIGGER #{full_name} ... OK" trigger[:status] = :loaded end
drop_trigger(name, trigger)
click to toggle source
# File lib/rails_db_triggers/db_triggers_creator.rb, line 61 def drop_trigger name, trigger return if trigger[:status] == :loaded if trigger[:status] == :inprogress raise "Error: Circular file reference! (trigger #{name})" end trigger[:requires].each do |other_trigger| drop_trigger other_trigger, @triggers[other_trigger] end table_name = (Rails.configuration.rails_db_triggers[:triggers_dbschema] || []).clone table_name << "[#{name}]" full_name = table_name.join('.') sql = "DROP TRIGGER #{full_name}" begin ActiveRecord::Base.connection.execute(sql) puts "DROP TRIGGER #{full_name}... OK" rescue puts "WARNING: DROP TRIGGER #{full_name}... ERROR" end trigger[:status] = :loaded end
reset_triggers_status!()
click to toggle source
# File lib/rails_db_triggers/db_triggers_creator.rb, line 54 def reset_triggers_status! @triggers.each{ |name, trigger| trigger[:status] = :none } end