Sha256: 365eec7abd261ab48504939434abeb75f3c5d30188fc0e87d4661dd779d2b1c6

Contents?: true

Size: 868 Bytes

Versions: 2

Compression:

Stored size: 868 Bytes

Contents

require_relative "initialize_with_redis"
require 'ipaddr'

class Trifle
  class Finder
    include InitializeWithRedis

    def handle ip
      ip_i = IPAddr.new(ip).to_i
      find(ip_i, 0, max)
    rescue ArgumentError => ex
      nil
    end

    protected

    def find ip_i, lower, upper
      return nil if lower >= upper

      index = (lower+upper)/2

      current = entry_for(index)

      if in_range(current, ip_i)
        current.last(2)
      elsif ip_i < current[0]
        find ip_i, lower, index-1
      else
        find ip_i, index+1, upper
      end
    end

    def max
      redis.llen(key)
    end

    def entry_for index
      entry = redis.lindex(key, index).split(":")
      entry[0] = entry[0].to_i
      entry[1] = entry[1].to_i
      entry
    end

    def in_range range, ip_i
      range[0] <= ip_i && ip_i <= range[1]
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
trifle-0.0.7 lib/trifle/finder.rb
trifle-0.0.6 lib/trifle/finder.rb