Class: Lexicon::Common::Production::TableLocker

Inherits:
Object
  • Object
show all
Includes:
Mixin::SchemaNamer
Defined in:
lib/lexicon/common/production/table_locker.rb

Instance Method Summary collapse

Constructor Details

#initialize(database_factory:, database_url:) ⇒ TableLocker

Returns a new instance of TableLocker.

Parameters:



11
12
13
14
# 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

Instance Method Details

#lock_tables(package:, tables: []) ⇒ Object

Parameters:



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 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