diff --git a/db/migrate/20151209145909_migrate_ci_emails.rb b/db/migrate/20151209145909_migrate_ci_emails.rb index 964dde841add4940b478a2c39b4570ecd5736f93..5ee11893582f2c2a8c882812f30473912666009d 100644 --- a/db/migrate/20151209145909_migrate_ci_emails.rb +++ b/db/migrate/20151209145909_migrate_ci_emails.rb @@ -3,13 +3,16 @@ class MigrateCiEmails < ActiveRecord::Migration def up # This inserts a new service: BuildsEmailService - # It also "manually" constructs the properties (JSON-encoded) + # It "manually" constructs the properties (JSON-encoded) # Migrating all ci_projects e-mail related columns execute( 'INSERT INTO services (project_id, type, created_at, updated_at, active, push_events, issues_events, merge_requests_events, tag_push_events, note_events, build_events, properties) ' \ - "SELECT projects.id, 'BuildsEmailService', ci_services.created_at, ci_services.updated_at, #{true_value}, #{false_value}, #{false_value}, #{false_value}, #{false_value}, #{false_value}, #{true_value}, " \ - "CONCAT('{\"notify_only_broken_builds\":\"', ci_projects.email_only_broken_builds, " \ - "'\",\"add_pusher\":\"', ci_projects.email_add_pusher, '\",\"recipients\":\"', ci_projects.email_recipients, '\"}') " \ + "SELECT projects.id, 'BuildsEmailService', ci_services.created_at, ci_services.updated_at, " \ + "#{true_value}, #{false_value}, #{false_value}, #{false_value}, #{false_value}, #{false_value}, #{true_value}, " \ + "CONCAT('{\"notify_only_broken_builds\":\"', #{convert_bool('ci_projects.email_only_broken_builds')}, " \ + "'\",\"add_pusher\":\"', #{convert_bool('ci_projects.email_add_pusher')}, " \ + "'\",\"recipients\":\"', #{escape_text('ci_projects.email_recipients')}, " \ + "'\"}') " \ 'FROM ci_services ' \ 'JOIN ci_projects ON ci_services.project_id = ci_projects.id ' \ 'JOIN projects ON ci_projects.gitlab_id = projects.id ' \ @@ -19,4 +22,20 @@ class MigrateCiEmails < ActiveRecord::Migration def down end + + # This function escapes double-quotes and slash + def escape_text(name) + "REPLACE(REPLACE(#{name}, '\\', '\\\\'), '\"', '\\\"')" + end + + # This function returns 0 or 1 for column + def convert_bool(name) + if self.postgresql? + # PostgreSQL uses BOOLEAN type + "CASE WHEN #{name} IS TRUE THEN '1' ELSE '0' END;" + else + # MySQL uses TINYINT + "#{name}" + end + end end