]> git.openstreetmap.org Git - rails.git/blobdiff - db/migrate/20120208122334_merge_acl_address_and_mask.rb
Combine the address and netmask for an ACL in one column
[rails.git] / db / migrate / 20120208122334_merge_acl_address_and_mask.rb
diff --git a/db/migrate/20120208122334_merge_acl_address_and_mask.rb b/db/migrate/20120208122334_merge_acl_address_and_mask.rb
new file mode 100644 (file)
index 0000000..791bf65
--- /dev/null
@@ -0,0 +1,45 @@
+require "ipaddr"
+
+class IPAddr
+  def address
+    _to_string(@addr)
+  end
+
+  def netmask
+    _to_string(@mask_addr)
+  end
+end
+
+class MergeAclAddressAndMask < ActiveRecord::Migration
+  def up
+    Acl.find_each do |acl|
+      address = IPAddr.new(acl.address)
+      netmask = IPAddr.new(acl.netmask)
+      prefix = 0
+
+      while netmask != "0.0.0.0"
+        netmask = netmask << 1
+        prefix = prefix + 1
+      end
+
+      acl.address = "#{address.mask(prefix)}/#{prefix}"
+      acl.save!
+    end
+
+    remove_column :acls, :netmask
+  end
+
+  def down
+    add_column :acls, :netmask, :inet
+
+    Acl.find_each do |acl|
+      address = IPAddr.new(acl.address)
+
+      acl.address = address.address
+      acl.netmask = address.netmask
+      acl.save!
+    end
+
+    change_column :acls, :netmask, :inet, :null => false
+  end
+end