Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Basic GeoIP2 database reader
  • Loading branch information
oschwald committed Jul 15, 2013
1 parent c898f76 commit 3e0fc2a
Show file tree
Hide file tree
Showing 5 changed files with 155 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
@@ -0,0 +1,3 @@
[submodule "maxmind-db"]
path = maxmind-db
url = git://github.com/maxmind/MaxMind-DB.git
1 change: 1 addition & 0 deletions composer.json
Expand Up @@ -14,6 +14,7 @@
],
"require": {
"guzzle/guzzle": "3.*",
"maxmind-db/reader": "0.*",
"php": ">=5.3.1"
},
"require-dev": {
Expand Down
1 change: 1 addition & 0 deletions maxmind-db
Submodule maxmind-db added at 96559f
140 changes: 140 additions & 0 deletions src/GeoIp2/Database/Reader.php
@@ -0,0 +1,140 @@
<?php

namespace GeoIp2\Database;

use GeoIp2\Exception\AddressNotFoundException;
use GeoIp2\Model\City;
use GeoIp2\Model\CityIspOrg;
use GeoIp2\Model\Country;
use GeoIp2\Model\Omni;

/**
* Instances of this class provide a reader for the GeoIP2 database format.
* IP addresses can be looked up using the <code>country</code>
* and <code>city</code> methods. We also provide <code>cityIspOrg</code>
* and <code>omni</code> methods to ease compatibility with the web service
* client, although we may offer the ability to specify additional databases
* to replicate these web services in the future (e.g., the ISP/Org database).
*
* **Usage**
*
* The basic API for this class is the same for every database. First, you
* create a reader object, specifying a file name. You then call the method
* corresponding to the specific database, passing it the IP address you want
* to look up.
*
* If the request succeeds, the method call will return a model class for
* the method you called. This model in turn contains multiple record classes,
* each of which represents part of the data returned by the database. If
* the database does not contain the requested information, the attributes
* on the record class will have a <code>null</code> value.
*
* If the address is not in the database, an
* {@link \GeoIp2\Exception\AddressNotFoundException} exception will be
* thrown. If an invalid IP address is passed to one of the methods, a
* SPL {@link \InvalidArgumentException} will be thrown. If the database is
* corrupt or invalid, a {@link \MaxMind\Db\Reader\InvalidDatabaseException}
* will be thrown.
*
*/
class Reader
{
private $dbReader;
private $languages;

/**
* Constructor.
*
* @param string $filename The path to the GeoIP2 database file.
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
* is corrupt or invalid
*/
public function __construct(
$filename,
$languages = array('en')
) {
$this->dbReader = new MaxMind\Db\Reader($filename);
$this->languages = $languages;
}

/**
* This method returns a GeoIP2 City model.
*
* @param string $ipAddress IPv4 or IPv6 address as a string.
*
* @return \GeoIp2\Model\City
*
* @throws \GeoIp2\Exception\AddressNotFoundException if the address is
* not in the database.
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
* is corrupt or invalid
*/
public function city($ipAddress)
{
return $this->responseFor('City', $ipAddress);
}

/**
* This method returns a GeoIP2 Country model.
*
* @param string $ipAddress IPv4 or IPv6 address as a string.
*
* @return \GeoIp2\Model\Country
*
* @throws \GeoIp2\Exception\AddressNotFoundException if the address is
* not in the database.
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
* is corrupt or invalid
*/
public function country($ipAddress)
{
return $this->responseFor('Country', $ipAddress);
}

/**
* This method returns a GeoIP2 City/ISP/Org model.
*
* @param string $ipAddress IPv4 or IPv6 address as a string.
*
* @return \GeoIp2\Model\CityIspOrg
*
* @throws \GeoIp2\Exception\AddressNotFoundException if the address is
* not in the database.
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
* is corrupt or invalid
*/
public function cityIspOrg($ipAddress)
{
return $this->responseFor('CityIspOrg', $ipAddress);
}

/**
* This method returns a GeoIP2 Omni model.
*
* @param string $ipAddress IPv4 or IPv6 address as a string.
*
* @return \GeoIp2\Model\Omni
*
* @throws \GeoIp2\Exception\AddressNotFoundException if the address is
* not in the database.
* @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database
* is corrupt or invalid
*/
public function omni($ipAddress)
{
return $this->responseFor('Omni', $ipAddress);
}

private function responseFor($class, $ipAddress)
{
$record = $this->dbReader->get($ipAddress);
if ($record === null) {
throw new AddressNotFoundException(
"$ipAddress was not found in the database."
);
}
$class = "GeoIp2\\Model\\" . $class;

return new $class($record, $this->languages);
}
}
10 changes: 10 additions & 0 deletions src/GeoIp2/Exception/AddressNotFoundException.php
@@ -0,0 +1,10 @@
<?php

namespace GeoIp2\Exception;

/**
* This class represents a generic error.
*/
class AddressNotFoundException extends \GeoIp2Exception
{
}

0 comments on commit 3e0fc2a

Please sign in to comment.