67 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  module Database
 | 
						|
    module Migrations
 | 
						|
      module ExtensionHelpers
 | 
						|
        def create_extension(extension)
 | 
						|
          execute("CREATE EXTENSION IF NOT EXISTS #{extension}")
 | 
						|
        rescue ActiveRecord::StatementInvalid => e
 | 
						|
          dbname = ApplicationRecord.database.database_name
 | 
						|
          user = ApplicationRecord.database.username
 | 
						|
 | 
						|
          warn(<<~MSG) if e.to_s.include?('permission denied')
 | 
						|
            GitLab requires the PostgreSQL extension '#{extension}' installed in database '#{dbname}', but
 | 
						|
            the database user is not allowed to install the extension.
 | 
						|
 | 
						|
            You can either install the extension manually using a database superuser:
 | 
						|
 | 
						|
              CREATE EXTENSION IF NOT EXISTS #{extension}
 | 
						|
 | 
						|
            Or, you can solve this by logging in to the GitLab
 | 
						|
            database (#{dbname}) using a superuser and running:
 | 
						|
 | 
						|
                ALTER #{user} WITH SUPERUSER
 | 
						|
 | 
						|
            This query will grant the user superuser permissions, ensuring any database extensions
 | 
						|
            can be installed through migrations.
 | 
						|
 | 
						|
            For more information, refer to https://docs.gitlab.com/ee/install/postgresql_extensions.html.
 | 
						|
          MSG
 | 
						|
 | 
						|
          raise
 | 
						|
        end
 | 
						|
 | 
						|
        def drop_extension(extension)
 | 
						|
          execute("DROP EXTENSION IF EXISTS #{extension}")
 | 
						|
        rescue ActiveRecord::StatementInvalid => e
 | 
						|
          dbname = ApplicationRecord.database.database_name
 | 
						|
          user = ApplicationRecord.database.username
 | 
						|
 | 
						|
          warn(<<~MSG) if e.to_s.include?('permission denied')
 | 
						|
            This migration attempts to drop the PostgreSQL extension '#{extension}'
 | 
						|
            installed in database '#{dbname}', but the database user is not allowed
 | 
						|
            to drop the extension.
 | 
						|
 | 
						|
            You can either drop the extension manually using a database superuser:
 | 
						|
 | 
						|
              DROP EXTENSION IF EXISTS #{extension}
 | 
						|
 | 
						|
            Or, you can solve this by logging in to the GitLab
 | 
						|
            database (#{dbname}) using a superuser and running:
 | 
						|
 | 
						|
                ALTER #{user} WITH SUPERUSER
 | 
						|
 | 
						|
            This query will grant the user superuser permissions, ensuring any database extensions
 | 
						|
            can be dropped through migrations.
 | 
						|
 | 
						|
            For more information, refer to https://docs.gitlab.com/ee/install/postgresql_extensions.html.
 | 
						|
          MSG
 | 
						|
 | 
						|
          raise
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |