class Geocoder::Lookup::Maxmind

def base_query_url(query)

def base_query_url(query)
  "#{protocol}://geoip.maxmind.com/#{service_code}?"
end

def configured_service!


Return the name of the configured service, or raise an exception.
#
def configured_service!
  if s = configuration[:service] and services.keys.include?(s)
    return s
  else
    raise(
      Geocoder::ConfigurationError,
      "When using MaxMind you MUST specify a service name: " +
      "Geocoder.configure(:maxmind => {:service => ...}), " +
      "where '...' is one of: #{services.keys.inspect}"
    )
  end
end

def data_contains_error?(parsed_data)

def data_contains_error?(parsed_data)
  # if all fields given then there is an error
  parsed_data.size == service_response_fields_count and !parsed_data.last.nil?
end

def name

def name
  "MaxMind"
end

def parse_raw_data(raw_data)

def parse_raw_data(raw_data)
  # Maxmind just returns text/plain as csv format but according to documentation,
  # we get ISO-8859-1 encoded string. We need to convert it.
  CSV.parse_line raw_data.force_encoding("ISO-8859-1").encode("UTF-8")
end

def query_url_params(query)

def query_url_params(query)
  {
    :l => configuration.api_key,
    :i => query.sanitized_text
  }.merge(super)
end

def reserved_result

def reserved_result
  ",,,,0,0,0,0,,,".split(",")
end

def results(query)

def results(query)
  # don't look up a loopback or private address, just return the stored result
  return [reserved_result] if query.internal_ip_address?
  doc = fetch_data(query)
  if doc and doc.is_a?(Array)
    if !data_contains_error?(doc)
      return [doc]
    elsif doc.last == "INVALID_LICENSE_KEY"
      raise_error(Geocoder::InvalidApiKey) || Geocoder.log(:warn, "Invalid MaxMind API key.")
    end
  end
  return []
end

def service_code

def service_code
  services[configured_service!]
end

def service_response_fields_count

def service_response_fields_count
  Geocoder::Result::Maxmind.field_names[configured_service!].size
end

def services


Service names mapped to code used in URL.
#
def services
  {
    :country => "a",
    :city => "b",
    :city_isp_org => "f",
    :omni => "e"
  }
end