class Fides::Sqlite3Writer

Public Class Methods

executable_add_statements(interface_name, models, polymorphic_model) click to toggle source
# File lib/fides/sqlite3_writer.rb, line 8
def self.executable_add_statements(interface_name, models, polymorphic_model)
  statements = []
  statements << drop_constraint_sql(interface_name, "create")
  statements << create_constraint_sql(interface_name, models, polymorphic_model)
  models.each do |model|
    statements << drop_constraint_sql(model.constantize.table_name, "delete")
    statements << delete_constraint_sql(interface_name, model, polymorphic_model)
  end
  statements << drop_constraint_sql(interface_name, "update")
  statements << update_constraint_sql(interface_name, models, polymorphic_model)
  return statements
end
executable_remove_statements(interface_name) click to toggle source
# File lib/fides/sqlite3_writer.rb, line 21
def self.executable_remove_statements(interface_name)
  statements = []
  statements << drop_constraint_sql(interface_name, "create")
  statements << drop_constraint_sql(interface_name, "delete")
  return statements
end

Private Class Methods

create_constraint_sql(interface_name, models, polymorphic_model) click to toggle source
# File lib/fides/sqlite3_writer.rb, line 34
def self.create_constraint_sql(interface_name, models, polymorphic_model)
    sql = %{

    CREATE TRIGGER check_#{interface_name}_create_integrity
      BEFORE INSERT ON #{polymorphic_model.constantize.table_name}
      BEGIN 
        SELECT CASE 
    }

  sql << 'WHEN ('

  models.each do |model|  
    sql << %{NEW.#{interface_name}_type != '#{model}' }
    sql << 'AND ' unless model == models.last
  end

  sql << %{) THEN RAISE(ABORT, 'There is no model by that name.') }

  models.each do |model|
    sql << %{ 
      WHEN ((NEW.#{interface_name}_type = '#{model}') AND (SELECT id 
        FROM #{model.constantize.table_name} WHERE id = NEW.#{interface_name}_id) ISNULL) 
        THEN RAISE(ABORT, 'There is no #{model} with that id.') 
    }
  end

  sql << "END; END;"

  return strip_non_essential_spaces(sql)
end
delete_constraint_sql(interface_name, associated_model, polymorphic_model) click to toggle source
# File lib/fides/sqlite3_writer.rb, line 96
def self.delete_constraint_sql(interface_name, associated_model, polymorphic_model)
  sql = %{

    CREATE TRIGGER check_#{associated_model.constantize.table_name}_delete_integrity
      BEFORE DELETE ON #{associated_model.constantize.table_name}
      BEGIN
        SELECT CASE
          WHEN ((SELECT id FROM #{polymorphic_model.constantize.table_name} 
            WHERE #{interface_name}_type = '#{associated_model}' AND #{interface_name}_id = OLD.id) NOTNULL) THEN 
              RAISE(ABORT, 'There are records in the #{polymorphic_model.constantize.table_name} table that refer to the #{associated_model.constantize.table_name} record that is attempting to be deleted. Delete the dependent records in the #{polymorphic_model.constantize.table_name} table first.')
        END;
      END;

  }

  return strip_non_essential_spaces(sql)
end
drop_constraint_sql(name, drop_type) click to toggle source
# File lib/fides/sqlite3_writer.rb, line 30
def self.drop_constraint_sql(name, drop_type)
  strip_non_essential_spaces "DROP TRIGGER IF EXISTS check_#{name}_#{drop_type}_integrity;"
end
update_constraint_sql(interface_name, models, polymorphic_model) click to toggle source
# File lib/fides/sqlite3_writer.rb, line 65
  def self.update_constraint_sql(interface_name, models, polymorphic_model)
    sql = %{

    CREATE TRIGGER check_#{interface_name}_update_integrity
      BEFORE UPDATE ON #{polymorphic_model.constantize.table_name}
      BEGIN 
        SELECT CASE 
    }

  sql << 'WHEN ('

  models.each do |model|  
    sql << %{NEW.#{interface_name}_type != '#{model}' }
    sql << 'AND ' unless model == models.last
  end

  sql << %{) THEN RAISE(ABORT, 'There is no model by that name.') }

  models.each do |model|
    sql << %{ 
      WHEN ((NEW.#{interface_name}_type = '#{model}') AND (SELECT id 
        FROM #{model.constantize.table_name} WHERE id = NEW.#{interface_name}_id) ISNULL) 
        THEN RAISE(ABORT, 'There is no #{model} with that id.') 
    }
  end

  sql << "END; END;"

  return strip_non_essential_spaces(sql)
end