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 "      CREATE OR REPLACE FUNCTION \#{schema}.deny_changes()\n        RETURNS TRIGGER\n      AS $$\n        BEGIN\n          RAISE EXCEPTION '% denied on % (master data)', TG_OP, TG_RELNAME;\n        END;\n      $$\n      LANGUAGE plpgsql;\n    SQL\n    tables.each do |table_name|\n      database.query <<~SQL\n        CREATE TRIGGER deny_changes\n          BEFORE INSERT\n              OR UPDATE\n              OR DELETE\n              OR TRUNCATE\n          ON \#{schema}.\#{table_name}\n          FOR EACH STATEMENT\n            EXECUTE PROCEDURE \#{schema}.deny_changes()\n      SQL\n    end\n  end\nend\n"