diff options
author | Stan Hu <stanhu@gmail.com> | 2017-09-13 16:29:44 +0000 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2017-09-13 16:29:44 +0000 |
commit | 3527312189fae49d75828ce2eb8db843d8bcbad4 (patch) | |
tree | 5623b45fe119a9e165b541b07efa122546ea3057 /db | |
parent | 4879e438c435f5f2507a1eb5e895580d59a27904 (diff) | |
parent | 652a9324a1d702c42a35c916c8b4548c8f5724ca (diff) | |
download | gitlab-ce-3527312189fae49d75828ce2eb8db843d8bcbad4.tar.gz |
Merge branch 'revert-373ff978' into 'master'
Revert "Merge branch 'rs-remove-bad-foreground-migration' into 'master'"
See merge request !14253
Diffstat (limited to 'db')
-rw-r--r-- | db/migrate/20170828135939_migrate_user_external_mail_data.rb | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/db/migrate/20170828135939_migrate_user_external_mail_data.rb b/db/migrate/20170828135939_migrate_user_external_mail_data.rb new file mode 100644 index 00000000000..592e141b7e6 --- /dev/null +++ b/db/migrate/20170828135939_migrate_user_external_mail_data.rb @@ -0,0 +1,57 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class MigrateUserExternalMailData < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + class User < ActiveRecord::Base + self.table_name = 'users' + + include EachBatch + end + + class UserSyncedAttributesMetadata < ActiveRecord::Base + self.table_name = 'user_synced_attributes_metadata' + + include EachBatch + end + + def up + User.each_batch do |batch| + start_id, end_id = batch.pluck('MIN(id), MAX(id)').first + + execute <<-EOF + INSERT INTO user_synced_attributes_metadata (user_id, provider, email_synced) + SELECT id, email_provider, external_email + FROM users + WHERE external_email = TRUE + AND NOT EXISTS ( + SELECT true + FROM user_synced_attributes_metadata + WHERE user_id = users.id + AND provider = users.email_provider + ) + AND id BETWEEN #{start_id} AND #{end_id} + EOF + end + end + + def down + UserSyncedAttributesMetadata.each_batch do |batch| + start_id, end_id = batch.pluck('MIN(id), MAX(id)').first + + execute <<-EOF + UPDATE users + SET users.email_provider = metadata.provider, users.external_email = metadata.email_synced + FROM user_synced_attributes_metadata as metadata, users + WHERE metadata.email_synced = TRUE + AND metadata.user_id = users.id + AND id BETWEEN #{start_id} AND #{end_id} + EOF + end + end +end |