/**
  * Returns IpRange
  *
  * @param $ip
  * @return null|GeoIpRange
  */
 protected function findRange($ip)
 {
     if (!$this->config['enabled']) {
         return null;
     }
     $long = sprintf("%u", ip2long($ip));
     return GeoIpRangeQuery::create()->filterByBegin($long, \Criteria::LESS_EQUAL)->filterByEnd($long, \Criteria::GREATER_EQUAL)->findOne();
 }
 /**
  * Updates ranges
  *
  * @param $resource
  * @param $progress
  */
 protected function updateIpRange($resource, $progress)
 {
     $current_time = date('Y-m-d H:i:s');
     while (($buffer = fgets($resource, 4096)) !== false) {
         $raw_range = mb_split("\t+", trim($buffer));
         if (count($raw_range) != static::FILE_IP_RANGE_COLUMNS) {
             continue;
         }
         /** @var GeoIpRange $range */
         $range = GeoIpRangeQuery::create()->filterByBegin($raw_range[static::RANGE_COLUMN_INDEX_BEGIN])->filterByEnd($raw_range[static::RANGE_COLUMN_INDEX_END])->findOneOrCreate();
         $city_id = $raw_range[static::RANGE_COLUMN_INDEX_CITY];
         if (!preg_match('/^\\d+$/', $city_id)) {
             $city_id = null;
         }
         $range->setGeoCityId($city_id);
         $range->setCountryCode($raw_range[static::RANGE_COLUMN_INDEX_COUNTRY]);
         $range->setDescription($raw_range[static::RANGE_COLUMN_INDEX_DESCRIPTION]);
         $range->setUpdatedAt($current_time);
         $range->save();
         $range->clearAllReferences(true);
         $progress->advance(mb_strlen($buffer));
         $range = null;
         $rawRange = null;
         $buffer = null;
         unset($range);
         unset($rawRange);
         unset($buffer);
     }
     GeoIpRangeQuery::create()->filterByUpdatedAt($current_time, \Criteria::LESS_THAN)->delete();
 }