Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
Basic GeoIP2 database reader
- Loading branch information
Showing
5 changed files
with
155 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
[submodule "maxmind-db"] | ||
path = maxmind-db | ||
url = git://github.com/maxmind/MaxMind-DB.git |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Submodule maxmind-db
added at
96559f
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?php | ||
|
||
namespace GeoIp2\Exception; | ||
|
||
/** | ||
* This class represents a generic error. | ||
*/ | ||
class AddressNotFoundException extends \GeoIp2Exception | ||
{ | ||
} |