Remove MySQL-specific code from Mastodon::MigrationHelpers (#15924)
Mastodon::MigrationHelpers has been forked from Gitlab a long time ago, but Mastodon has never supported using a MySQL database. Removing MySQL support from Mastodon::MigrationHelpers makes it a little easier to maintain. In particular, it removes code that would need updating with Rails 6.
This commit is contained in:
		
							parent
							
								
									82caed594c
								
							
						
					
					
						commit
						c31c95ffe4
					
				| 
						 | 
				
			
			@ -41,42 +41,18 @@
 | 
			
		|||
 | 
			
		||||
module Mastodon
 | 
			
		||||
  module MigrationHelpers
 | 
			
		||||
    # Stub for Database.postgresql? from GitLab
 | 
			
		||||
    def self.postgresql?
 | 
			
		||||
      ActiveRecord::Base.configurations[Rails.env]['adapter'].casecmp('postgresql').zero?
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Stub for Database.mysql? from GitLab
 | 
			
		||||
    def self.mysql?
 | 
			
		||||
      ActiveRecord::Base.configurations[Rails.env]['adapter'].casecmp('mysql2').zero?
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Model that can be used for querying permissions of a SQL user.
 | 
			
		||||
    class Grant < ActiveRecord::Base
 | 
			
		||||
      self.table_name =
 | 
			
		||||
        if Mastodon::MigrationHelpers.postgresql?
 | 
			
		||||
          'information_schema.role_table_grants'
 | 
			
		||||
        else
 | 
			
		||||
          'mysql.user'
 | 
			
		||||
        end
 | 
			
		||||
      self.table_name = 'information_schema.role_table_grants'
 | 
			
		||||
 | 
			
		||||
      def self.scope_to_current_user
 | 
			
		||||
        if Mastodon::MigrationHelpers.postgresql?
 | 
			
		||||
          where('grantee = user')
 | 
			
		||||
        else
 | 
			
		||||
          where("CONCAT(User, '@', Host) = current_user()")
 | 
			
		||||
        end
 | 
			
		||||
        where('grantee = user')
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      # Returns true if the current user can create and execute triggers on the
 | 
			
		||||
      # given table.
 | 
			
		||||
      def self.create_and_execute_trigger?(table)
 | 
			
		||||
        priv =
 | 
			
		||||
          if Mastodon::MigrationHelpers.postgresql?
 | 
			
		||||
            where(privilege_type: 'TRIGGER', table_name: table)
 | 
			
		||||
          else
 | 
			
		||||
            where(Trigger_priv: 'Y')
 | 
			
		||||
          end
 | 
			
		||||
        priv = where(privilege_type: 'TRIGGER', table_name: table)
 | 
			
		||||
 | 
			
		||||
        priv.scope_to_current_user.any?
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			@ -141,10 +117,8 @@ module Mastodon
 | 
			
		|||
          'in the body of your migration class'
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      if MigrationHelpers.postgresql?
 | 
			
		||||
        options = options.merge({ algorithm: :concurrently })
 | 
			
		||||
        disable_statement_timeout
 | 
			
		||||
      end
 | 
			
		||||
      options = options.merge({ algorithm: :concurrently })
 | 
			
		||||
      disable_statement_timeout
 | 
			
		||||
 | 
			
		||||
      add_index(table_name, column_name, options)
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -199,8 +173,6 @@ module Mastodon
 | 
			
		|||
 | 
			
		||||
    # Only available on Postgresql >= 9.2
 | 
			
		||||
    def supports_drop_index_concurrently?
 | 
			
		||||
      return false unless MigrationHelpers.postgresql?
 | 
			
		||||
 | 
			
		||||
      version = select_one("SELECT current_setting('server_version_num') AS v")['v'].to_i
 | 
			
		||||
 | 
			
		||||
      version >= 90200
 | 
			
		||||
| 
						 | 
				
			
			@ -226,13 +198,7 @@ module Mastodon
 | 
			
		|||
      # While MySQL does allow disabling of foreign keys it has no equivalent
 | 
			
		||||
      # of PostgreSQL's "VALIDATE CONSTRAINT". As a result we'll just fall
 | 
			
		||||
      # back to the normal foreign key procedure.
 | 
			
		||||
      if MigrationHelpers.mysql?
 | 
			
		||||
        return add_foreign_key(source, target,
 | 
			
		||||
                               column: column,
 | 
			
		||||
                               on_delete: on_delete)
 | 
			
		||||
      else
 | 
			
		||||
        on_delete = 'SET NULL' if on_delete == :nullify
 | 
			
		||||
      end
 | 
			
		||||
      on_delete = 'SET NULL' if on_delete == :nullify
 | 
			
		||||
 | 
			
		||||
      disable_statement_timeout
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -270,7 +236,7 @@ module Mastodon
 | 
			
		|||
    # the database. Disable the session's statement timeout to ensure
 | 
			
		||||
    # migrations don't get killed prematurely. (PostgreSQL only)
 | 
			
		||||
    def disable_statement_timeout
 | 
			
		||||
      execute('SET statement_timeout TO 0') if MigrationHelpers.postgresql?
 | 
			
		||||
      execute('SET statement_timeout TO 0')
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Updates the value of a column in batches.
 | 
			
		||||
| 
						 | 
				
			
			@ -487,11 +453,7 @@ module Mastodon
 | 
			
		|||
      # If we were in the middle of update_column_in_batches, we should remove
 | 
			
		||||
      # the old column and start over, as we have no idea where we were.
 | 
			
		||||
      if column_for(table, new)
 | 
			
		||||
        if MigrationHelpers.postgresql?
 | 
			
		||||
          remove_rename_triggers_for_postgresql(table, trigger_name)
 | 
			
		||||
        else
 | 
			
		||||
          remove_rename_triggers_for_mysql(trigger_name)
 | 
			
		||||
        end
 | 
			
		||||
        remove_rename_triggers_for_postgresql(table, trigger_name)
 | 
			
		||||
 | 
			
		||||
        remove_column(table, new)
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			@ -521,13 +483,8 @@ module Mastodon
 | 
			
		|||
      quoted_old = quote_column_name(old)
 | 
			
		||||
      quoted_new = quote_column_name(new)
 | 
			
		||||
 | 
			
		||||
      if MigrationHelpers.postgresql?
 | 
			
		||||
        install_rename_triggers_for_postgresql(trigger_name, quoted_table,
 | 
			
		||||
                                               quoted_old, quoted_new)
 | 
			
		||||
      else
 | 
			
		||||
        install_rename_triggers_for_mysql(trigger_name, quoted_table,
 | 
			
		||||
                                          quoted_old, quoted_new)
 | 
			
		||||
      end
 | 
			
		||||
      install_rename_triggers_for_postgresql(trigger_name, quoted_table,
 | 
			
		||||
                                             quoted_old, quoted_new)
 | 
			
		||||
 | 
			
		||||
      update_column_in_batches(table, new, Arel::Table.new(table)[old])
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -685,11 +642,7 @@ module Mastodon
 | 
			
		|||
 | 
			
		||||
      check_trigger_permissions!(table)
 | 
			
		||||
 | 
			
		||||
      if MigrationHelpers.postgresql?
 | 
			
		||||
        remove_rename_triggers_for_postgresql(table, trigger_name)
 | 
			
		||||
      else
 | 
			
		||||
        remove_rename_triggers_for_mysql(trigger_name)
 | 
			
		||||
      end
 | 
			
		||||
      remove_rename_triggers_for_postgresql(table, trigger_name)
 | 
			
		||||
 | 
			
		||||
      remove_column(table, old)
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -844,18 +797,9 @@ module Mastodon
 | 
			
		|||
      quoted_pattern = Arel::Nodes::Quoted.new(pattern.to_s)
 | 
			
		||||
      quoted_replacement = Arel::Nodes::Quoted.new(replacement.to_s)
 | 
			
		||||
 | 
			
		||||
      if MigrationHelpers.mysql?
 | 
			
		||||
        locate = Arel::Nodes::NamedFunction
 | 
			
		||||
          .new('locate', [quoted_pattern, column])
 | 
			
		||||
        insert_in_place = Arel::Nodes::NamedFunction
 | 
			
		||||
          .new('insert', [column, locate, pattern.size, quoted_replacement])
 | 
			
		||||
 | 
			
		||||
        Arel::Nodes::SqlLiteral.new(insert_in_place.to_sql)
 | 
			
		||||
      else
 | 
			
		||||
        replace = Arel::Nodes::NamedFunction
 | 
			
		||||
          .new("regexp_replace", [column, quoted_pattern, quoted_replacement])
 | 
			
		||||
        Arel::Nodes::SqlLiteral.new(replace.to_sql)
 | 
			
		||||
      end
 | 
			
		||||
      replace = Arel::Nodes::NamedFunction
 | 
			
		||||
        .new("regexp_replace", [column, quoted_pattern, quoted_replacement])
 | 
			
		||||
      Arel::Nodes::SqlLiteral.new(replace.to_sql)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def remove_foreign_key_without_error(*args)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue