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