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