class Lexicon::Common::Production::TableLocker
Attributes
database_factory[R]
@return [Database::Factory]
database_url[R]
@return [String]
Public Class Methods
new(database_factory:, database_url:)
click to toggle source
@param [Database::Factory] database_factory
@param [String] database_url
# File lib/lexicon/common/production/table_locker.rb, line 11 def initialize(database_factory:, database_url:) @database_factory = database_factory @database_url = database_url end
Public Instance Methods
lock_tables(package:, tables: [])
click to toggle source
@param [Package::Package] package @param [Array<String>] tables
# File lib/lexicon/common/production/table_locker.rb, line 18 def lock_tables(package:, tables: []) database = database_factory.new_instance(url: database_url) schema = version_to_schema(package.version) database.prepend_search_path schema do database.query <<~SQL CREATE OR REPLACE FUNCTION #{schema}.deny_changes() RETURNS TRIGGER AS $$ BEGIN RAISE EXCEPTION '% denied on % (master data)', TG_OP, TG_RELNAME; END; $$ LANGUAGE plpgsql; SQL tables.each do |table_name| database.query <<~SQL CREATE TRIGGER deny_changes BEFORE INSERT OR UPDATE OR DELETE OR TRUNCATE ON #{schema}.#{table_name} FOR EACH STATEMENT EXECUTE PROCEDURE #{schema}.deny_changes() SQL end end end