discourse/lib/migration/base_dropper.rb

56 lines
1.5 KiB
Ruby

# frozen_string_literal: true
module Migration
class BaseDropper
FUNCTION_SCHEMA_NAME ||= "discourse_functions".freeze
def self.create_readonly_function(table_name, column_name = nil)
DB.exec <<~SQL
CREATE SCHEMA IF NOT EXISTS #{FUNCTION_SCHEMA_NAME};
SQL
message = column_name ?
"Discourse: #{column_name} in #{table_name} is readonly" :
"Discourse: #{table_name} is read only"
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
def self.readonly_function_name(table_name, column_name = nil)
function_name = [
"raise",
table_name,
column_name,
"readonly()"
].compact.join("_")
if DB.exec(<<~SQL).to_s == '1'
SELECT schema_name
FROM information_schema.schemata
WHERE schema_name = '#{FUNCTION_SCHEMA_NAME}'
SQL
"#{FUNCTION_SCHEMA_NAME}.#{function_name}"
else
function_name
end
end
def self.old_readonly_function_name(table_name, column_name = nil)
readonly_function_name(table_name, column_name).sub(
"#{FUNCTION_SCHEMA_NAME}.", ''
)
end
def self.readonly_trigger_name(table_name, column_name = nil)
[table_name, column_name, "readonly"].compact.join("_")
end
end
end