summaryrefslogtreecommitdiff
path: root/lib/ipaddress/mongoid.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ipaddress/mongoid.rb')
-rw-r--r--lib/ipaddress/mongoid.rb75
1 files changed, 75 insertions, 0 deletions
diff --git a/lib/ipaddress/mongoid.rb b/lib/ipaddress/mongoid.rb
new file mode 100644
index 0000000..3af880a
--- /dev/null
+++ b/lib/ipaddress/mongoid.rb
@@ -0,0 +1,75 @@
+module IPAddress
+
+ #
+ # Mongoid field serialization
+ #
+ # IPAddress objects are converted to String
+ #
+ # IPAddress.mongoize IPAddress.parse("172.16.10.1")
+ # #=> "172.16.10.1"
+ #
+ # Prefix will be removed from host adresses
+ #
+ # IPAddress.mongoize "172.16.10.1/32"
+ # #=> "172.16.10.1"
+ #
+ # Prefix will be kept for network addresses
+ #
+ # IPAddress.mongoize "172.16.10.1/24"
+ # #=> "172.16.10.1/24"
+ #
+ # IPv6 addresses will be stored uncompressed to ease DB search and sorting
+ #
+ # IPAddress.mongoize "2001:db8::8:800:200c:417a"
+ # #=> "2001:0db8:0000:0000:0008:0800:200c:417a"
+ # IPAddress.mongoize "2001:db8::8:800:200c:417a/64"
+ # #=> "2001:0db8:0000:0000:0008:0800:200c:417a/64"
+ #
+ # Invalid addresses will be serialized as nil
+ #
+ # IPAddress.mongoize "invalid"
+ # #=> nil
+ # IPAddress.mongoize ""
+ # #=> nil
+ # IPAddress.mongoize 1
+ # #=> nil
+ # IPAddress.mongoize nil
+ # #=> nil
+ #
+ def self.mongoize(ipaddress)
+ ipaddress = self.parse(ipaddress) unless ipaddress.is_a?(IPAddress)
+ if ipaddress.bits.length == ipaddress.prefix
+ ipaddress.address
+ elsif ipaddress.is_a?(IPAddress::IPv6)
+ ipaddress.to_string_uncompressed
+ else
+ ipaddress.to_string
+ end
+ rescue ArgumentError
+ nil
+ end
+
+ #
+ # Mongoid field deserialization
+ #
+ def self.demongoize(string)
+ parse(string)
+ rescue ArgumentError
+ nil
+ end
+
+ #
+ # Delegates to IPAddress.mongoize
+ #
+ def self.evolve(ipaddress)
+ mongoize(ipaddress)
+ end
+
+ #
+ # Sends self object to IPAddress#mongoize
+ #
+ def mongoize
+ IPAddress.mongoize(self)
+ end
+
+end \ No newline at end of file