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
'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
# 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
# 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
# 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.
# 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
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])
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
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)