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