From d04f558af55b4fa840e4d0c8f3425ebcf4ceca09 Mon Sep 17 00:00:00 2001 From: Stas Date: Fri, 29 Apr 2016 18:17:41 +0300 Subject: [PATCH] 114677695-converter_and_migration --- app/models/nameserver.rb | 10 +++++ ...9114732_add_puny_hostname_to_nameserver.rb | 9 ++++ lib/tasks/convert.rake | 42 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 db/migrate/20160429114732_add_puny_hostname_to_nameserver.rb diff --git a/app/models/nameserver.rb b/app/models/nameserver.rb index 168b5129e..d86813908 100644 --- a/app/models/nameserver.rb +++ b/app/models/nameserver.rb @@ -16,6 +16,8 @@ class Nameserver < ActiveRecord::Base # rubocop: enable Metrics/LineLength before_validation :normalize_attributes + before_validation :hostname_to_utf + after_validation :add_hostname_puny delegate :name, to: :domain, prefix: true @@ -41,6 +43,14 @@ class Nameserver < ActiveRecord::Base self.ipv6 = Array(ipv6).reject(&:blank?).map(&:strip).map(&:upcase) end + def hostname_to_utf + self.hostname = SimpleIDN.to_unicode(hostname) + end + + def add_hostname_puny + self.hostname_puny = SimpleIDN.to_ascii(hostname) + end + def to_s hostname end diff --git a/db/migrate/20160429114732_add_puny_hostname_to_nameserver.rb b/db/migrate/20160429114732_add_puny_hostname_to_nameserver.rb new file mode 100644 index 000000000..368d9f144 --- /dev/null +++ b/db/migrate/20160429114732_add_puny_hostname_to_nameserver.rb @@ -0,0 +1,9 @@ +class AddPunyHostnameToNameserver < ActiveRecord::Migration + + def change + + add_column :nameservers, :hostname_puny, :string + execute "UPDATE nameservers n SET hostname_puny = n.hostname" + + end +end diff --git a/lib/tasks/convert.rake b/lib/tasks/convert.rake index 35e68046c..47e0ec7c2 100644 --- a/lib/tasks/convert.rake +++ b/lib/tasks/convert.rake @@ -71,5 +71,47 @@ namespace :convert do end end end + + desc 'Convert nameservers hostname and hostname_puny' + task nameserves_hostname: :environment do + + start = Time.zone.now.to_f + count = 0 + puts '-----> Converting hostnames...' + + Nameserver.find_each(:batch_size => 1000) do |ns| + ns.hostname = SimpleIDN.to_unicode(ns.hostname) + ns.hostname_puny = SimpleIDN.to_ascii(ns.hostname_puny) + ns.save validate: false + count += 1 + puts "-----> Converted #{count} nameservers" if count % 1000 == 0 + end + puts "-----> Converted #{count} nameservers #{(Time.zone.now.to_f - start).round(2)} seconds" + + end + + desc 'Convert nameservers history hostname' + task nameserves_history_hostname: :environment do + + start = Time.zone.now.to_f + count = 0 + puts '-----> Converting hostnames history...' + + NameserverVersion.find_each do |ns| + if obj = ns.object + obj["hostname"] = SimpleIDN.to_unicode(obj["hostname"]) + ns.object = obj + end + + if (obj_c = ns.object_changes).present? + obj_c["name"].map!{|e| e ? SimpleIDN.to_unicode(e) : e } if obj_c["hostname"] + ns.object_changes = obj_c + end + count += 1 + ns.save! + end + puts "-----> Converted #{count} history rows #{(Time.zone.now.to_f - start).round(2)} seconds" + end + end