Class: Migration::BaseDropper

Inherits:
Object
  • Object
show all
Defined in:
lib/migration/base_dropper.rb

Class Method Summary collapse

Class Method Details

.create_readonly_function(table_name, column_name = nil) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/migration/base_dropper.rb', line 7

def self.create_readonly_function(table_name, column_name = nil)
  DB.exec <<~SQL
    CREATE SCHEMA IF NOT EXISTS #{FUNCTION_SCHEMA_NAME};
  SQL

  message =
    (
      if column_name
        "Discourse: #{column_name} in #{table_name} is readonly"
      else
        "Discourse: #{table_name} is read only"
      end
    )

  DB.exec <<~SQL
    CREATE OR REPLACE FUNCTION #{readonly_function_name(table_name, column_name)} RETURNS trigger AS $rcr$
      BEGIN
        RAISE EXCEPTION '#{message}';
      END
    $rcr$ LANGUAGE plpgsql;
  SQL
end

.drop_readonly_function(table_name, column_name = nil) ⇒ Object



30
31
32
# File 'lib/migration/base_dropper.rb', line 30

def self.drop_readonly_function(table_name, column_name = nil)
  DB.exec("DROP FUNCTION IF EXISTS #{readonly_function_name(table_name, column_name)} CASCADE")
end

.existing_discourse_function_namesObject



60
61
62
63
64
65
66
# File 'lib/migration/base_dropper.rb', line 60

def self.existing_discourse_function_names
  DB.query_single(<<~SQL)
    SELECT routine_name::text
    FROM information_schema.routines
    WHERE routine_type = 'FUNCTION' AND specific_schema = '#{FUNCTION_SCHEMA_NAME}'
  SQL
end

.function_schema_exists?Boolean

Returns:

  • (Boolean)


52
53
54
55
56
57
58
# File 'lib/migration/base_dropper.rb', line 52

def self.function_schema_exists?
  DB.exec(<<~SQL).to_s == "1"
    SELECT schema_name
    FROM information_schema.schemata
    WHERE schema_name = '#{FUNCTION_SCHEMA_NAME}'
  SQL
end

.old_readonly_function_name(table_name, column_name = nil) ⇒ Object



44
45
46
# File 'lib/migration/base_dropper.rb', line 44

def self.old_readonly_function_name(table_name, column_name = nil)
  readonly_function_name(table_name, column_name).sub("#{FUNCTION_SCHEMA_NAME}.", "")
end

.readonly_function_name(table_name, column_name = nil, with_schema: true) ⇒ Object



34
35
36
37
38
39
40
41
42
# File 'lib/migration/base_dropper.rb', line 34

def self.readonly_function_name(table_name, column_name = nil, with_schema: true)
  function_name = ["raise", table_name, column_name, "readonly()"].compact.join("_")

  if with_schema && function_schema_exists?
    "#{FUNCTION_SCHEMA_NAME}.#{function_name}"
  else
    function_name
  end
end

.readonly_trigger_name(table_name, column_name = nil) ⇒ Object



48
49
50
# File 'lib/migration/base_dropper.rb', line 48

def self.readonly_trigger_name(table_name, column_name = nil)
  [table_name, column_name, "readonly"].compact.join("_")
end