Skip to content

Commit

Permalink
v1.2.5
Browse files Browse the repository at this point in the history
  • Loading branch information
jlopez committed Dec 7, 2011
1 parent 4ec7259 commit 33dab8d
Show file tree
Hide file tree
Showing 9 changed files with 230 additions and 23 deletions.
16 changes: 15 additions & 1 deletion ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
1.2.5 2011-05-10
* Remove Confidence and Accuracy Database it is unsued anyway. ( Boris
Zentner )
* Add new methods enable_teredo, teredo, time_zone_by_country_and_region
and lib_version ( Boris Zentner )
* Add support for Confidence and Accuracy Database.
* Add support for Netspeed Database. via:
id_by_addr
id_by_name
* Add IPv6 glue *** needs libGeoIP 1.4.7 ***
country_code_by_name_v6
country_name_by_name_v6
country_code_by_addr_v6
country_name_by_addr_v6 ( Boris Zentner )
1.2.4 2008-12-16
* Add charset and set_charset methods , as well as
* Add charset and set_charset methods, as well as
the new attributes GeoIP.GEOIP_CHARSET_ISO_8859_1 and
GeoIP.GEOIP_CHARSET_UTF8 ( Boris Zentner )
* Add test_city_charset.py script showing howto use
Expand Down
7 changes: 5 additions & 2 deletions README
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Requirements:
Python 2.0 or greater
GeoIP C Library 1.4.5 or greater
GeoIP C Library 1.4.7 or greater

To Install:
python setup.py build
Expand All @@ -11,6 +11,9 @@ Usage:
See test_org.py for example usage with GeoIP ISP and Organization
See test_city.py for example usage with GeoIP City
See test_region.py for example usage with GeoIP Region
See test_netspeed.py for example usage with GeoIP Netspeed
See test_v6.py for example usage with GeoIP v6 Country Database
See test_city_acc.py for example usage with GeoIP Confidence and Accuracy Database

Troubleshooting:

Expand All @@ -20,7 +23,7 @@ directory" error, add /usr/local/lib to /etc/ld.so.conf then run

License:

Copyright (c) 2008 MaxMind LLC
Copyright (c) 2010 MaxMind LLC

All rights reserved. This package is free software; it is licensed
under the LGPL.
196 changes: 180 additions & 16 deletions py_GeoIP.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,52 @@ GeoIP_GeoIP_dealloc(PyObject* self)
PyObject_Del(self);
}

static PyObject * GeoIP_country_code_by_name_v6_Py(PyObject *self, PyObject *args) {
char * name;
const char * retval;
GeoIP_GeoIPObject* GeoIP = (GeoIP_GeoIPObject*)self;
if (!PyArg_ParseTuple(args, "s", &name)) {
return NULL;
}
retval = GeoIP_country_code_by_name_v6(GeoIP->gi, name);
return Py_BuildValue("s", retval );
}

static PyObject * GeoIP_country_name_by_name_v6_Py(PyObject *self, PyObject *args) {
char * name;
const char * retval;
GeoIP_GeoIPObject* GeoIP = (GeoIP_GeoIPObject*)self;
if (!PyArg_ParseTuple(args, "s", &name)) {
return NULL;
}
retval = GeoIP_country_name_by_name_v6(GeoIP->gi, name);
return Py_BuildValue("s", retval);
}

static PyObject * GeoIP_country_code_by_addr_v6_Py(PyObject *self, PyObject *args) {
char * name;
const char * retval;
GeoIP_GeoIPObject* GeoIP = (GeoIP_GeoIPObject*)self;
if (!PyArg_ParseTuple(args, "s", &name)) {
return NULL;
}
retval = GeoIP_country_code_by_addr_v6(GeoIP->gi, name);
return Py_BuildValue("s", retval);
}

static PyObject * GeoIP_country_name_by_addr_v6_Py(PyObject *self, PyObject *args) {
char * name;
const char * retval;
PyObject * ret;
GeoIP_GeoIPObject* GeoIP = (GeoIP_GeoIPObject*)self;
if (!PyArg_ParseTuple(args, "s", &name)) {
return NULL;
}
retval = GeoIP_country_name_by_addr_v6(GeoIP->gi, name);
ret = Py_BuildValue("s", retval);
return ret;
}

static PyObject * GeoIP_country_code_by_name_Py(PyObject *self, PyObject *args) {
char * name;
const char * retval;
Expand Down Expand Up @@ -155,6 +201,28 @@ static PyObject * GeoIP_org_by_name_Py(PyObject *self, PyObject *args) {
return ret;
}

static PyObject * GeoIP_id_by_addr_Py(PyObject *self, PyObject *args) {
char * name;
int i;
GeoIP_GeoIPObject* GeoIP = (GeoIP_GeoIPObject*)self;
if (!PyArg_ParseTuple(args, "s", &name)) {
return NULL;
}
i = GeoIP_id_by_addr(GeoIP->gi, name);
return Py_BuildValue("i", i);
}

static PyObject * GeoIP_id_by_name_Py(PyObject *self, PyObject *args) {
char * name;
int i;
GeoIP_GeoIPObject* GeoIP = (GeoIP_GeoIPObject*)self;
if (!PyArg_ParseTuple(args, "s", &name)) {
return NULL;
}
i = GeoIP_id_by_name(GeoIP->gi, name);
return Py_BuildValue("i", i);
}

void GeoIP_SetItemString(PyObject *dict, const char * name, const char * value) {
PyObject * nameObj;
PyObject * valueObj;
Expand Down Expand Up @@ -185,6 +253,30 @@ void GeoIP_SetItemInt(PyObject *dict, const char * name, int value) {
Py_DECREF(valueObj);
}

void GeoIP_SetConfItemInt(PyObject *dict, const char * name, int value) {
PyObject * nameObj;
PyObject * valueObj;
nameObj = Py_BuildValue("s",name);
valueObj = value == GEOIP_UNKNOWN_CONF
? Py_BuildValue("")
: Py_BuildValue("i",value);
PyDict_SetItem(dict,nameObj,valueObj);
Py_DECREF(nameObj);
Py_DECREF(valueObj);
}

void GeoIP_SetAccuracyItemInt(PyObject *dict, const char * name, int value) {
PyObject * nameObj;
PyObject * valueObj;
nameObj = Py_BuildValue("s",name);
valueObj = value == GEOIP_UNKNOWN_ACCURACY_RADIUS
? Py_BuildValue("")
: Py_BuildValue("i",value);
PyDict_SetItem(dict,nameObj,valueObj);
Py_DECREF(nameObj);
Py_DECREF(valueObj);
}

static PyObject * GeoIP_region_populate_dict(GeoIPRegion * gir) {
PyObject * retval;
const char * region_name = NULL;
Expand All @@ -199,7 +291,7 @@ static PyObject * GeoIP_region_populate_dict(GeoIPRegion * gir) {
return retval;
}

static PyObject * GeoIP_populate_dict(GeoIPRecord *gir) {
static PyObject * GeoIP_populate_dict(GeoIP* gi, GeoIPRecord *gir) {
PyObject * retval;
retval = PyDict_New();
GeoIP_SetItemString(retval,"country_code",gir->country_code);
Expand All @@ -208,22 +300,39 @@ static PyObject * GeoIP_populate_dict(GeoIPRecord *gir) {
GeoIP_SetItemString(retval,"region",gir->region);
GeoIP_SetItemString(retval,"city",gir->city);
GeoIP_SetItemString(retval,"postal_code",gir->postal_code);
GeoIP_SetItemFloat(retval,"latitude",gir->latitude);
GeoIP_SetItemFloat(retval,"longitude",gir->longitude);
/*
* metro_code is a alias for the depreciated dma_code.
* we use the depreciated gir->dma_code since the CAPI
* wrapper might be outdated and does not supply metro_code
*/
GeoIP_SetItemInt(retval,"dma_code",gir->dma_code);
/* we did __NOT__ use gir->metro_code here, since metro_code is
* somewhat new */
GeoIP_SetItemInt(retval,"metro_code",gir->dma_code);
GeoIP_SetItemInt(retval,"area_code",gir->area_code);
GeoIP_SetItemFloat(retval,"latitude", gir->latitude);
GeoIP_SetItemFloat(retval,"longitude", gir->longitude);
GeoIP_SetItemString(retval, "region_name",
GeoIP_region_name_by_code(gir->country_code, gir->region));
GeoIP_SetItemString(retval, "time_zone",
GeoIP_time_zone_by_country_and_region(gir->country_code, gir->region));
if ( gi->databaseType != GEOIP_CITY_EDITION_REV0 ){
/*
* metro_code is a alias for the depreciated dma_code.
* we use the depreciated gir->dma_code since the CAPI
* wrapper might be outdated and does not supply metro_code
*/
GeoIP_SetItemInt(retval,"dma_code",gir->dma_code);
/* we did __NOT__ use gir->metro_code here, since metro_code is
* somewhat new */
GeoIP_SetItemInt(retval,"metro_code",gir->dma_code);
GeoIP_SetItemInt(retval,"area_code",gir->area_code);
}

/*
* drop support for Confidence and Accuracy Database
* for now
if ( gi->databaseType != GEOIP_CITY_EDITION_REV1 ){
GeoIP_SetConfItemInt(retval, "country_conf", gir->country_conf );
GeoIP_SetConfItemInt(retval, "region_conf", gir->region_conf );
GeoIP_SetConfItemInt(retval, "city_conf", gir->city_conf );
GeoIP_SetConfItemInt(retval, "postal_conf", gir->postal_conf );
GeoIP_SetAccuracyItemInt(retval, "accuracy_radius", gir->accuracy_radius );
*/

GeoIPRecord_delete(gir);
return retval;
}
Expand All @@ -240,7 +349,7 @@ static PyObject * GeoIP_record_by_addr_Py(PyObject *self, PyObject *args) {
Py_INCREF(Py_None);
return Py_None;
}
return GeoIP_populate_dict(gir);
return GeoIP_populate_dict(GeoIP->gi, gir);
}

static PyObject * GeoIP_record_by_name_Py(PyObject *self, PyObject *args) {
Expand All @@ -255,7 +364,7 @@ static PyObject * GeoIP_record_by_name_Py(PyObject *self, PyObject *args) {
Py_INCREF(Py_None);
return Py_None;
}
return GeoIP_populate_dict(gir);
return GeoIP_populate_dict(GeoIP->gi, gir);
}

static PyObject * GeoIP_region_by_name_Py(PyObject *self, PyObject * args) {
Expand Down Expand Up @@ -328,6 +437,36 @@ static PyObject * GeoIP_last_netmask_Py(PyObject *self, PyObject * args) {
return Py_BuildValue("i", GeoIP_last_netmask(GeoIP->gi) );
}


static PyObject * GeoIP_teredo_Py(PyObject *self, PyObject * args) {
GeoIP_GeoIPObject* GeoIP = (GeoIP_GeoIPObject*)self;
return Py_BuildValue("i", GeoIP_teredo(GeoIP->gi) );
}

static PyObject * GeoIP_enable_teredo_Py(PyObject *self, PyObject * args) {
GeoIP_GeoIPObject* GeoIP = (GeoIP_GeoIPObject*)self;
int teredo;
if (!PyArg_ParseTuple(args, "i", &teredo)) {
return NULL;
}
return Py_BuildValue("i", GeoIP_enable_teredo(GeoIP->gi, teredo));
}

static PyObject*
GeoIP_lib_version_Py(PyObject* self, PyObject *args) {
return Py_BuildValue("s", GeoIP_lib_version());
}

static PyObject * GeoIP_time_zone_by_country_and_region_Py(PyObject *self, PyObject * args) {
char * country_code, *region;
if (!PyArg_ParseTuple(args, "ss", &country_code, &region)) {
return NULL;
}
return Py_BuildValue("s", GeoIP_time_zone_by_country_and_region(country_code, region));
}



static PyMethodDef GeoIP_Object_methods[] = {
{"country_code_by_name", GeoIP_country_code_by_name_Py, 1, "Lookup Country Code By Name"},
{"country_name_by_name", GeoIP_country_name_by_name_Py, 1, "Lookup Country Name By Name"},
Expand All @@ -342,7 +481,15 @@ static PyMethodDef GeoIP_Object_methods[] = {
{"range_by_ip", GeoIP_range_by_ip_Py, 1, "Lookup start and end IP's for a given IP"},
{"charset", GeoIP_charset_Py, 1, "Return the current charset ( either GEOIP_CHARSET_ISO_8859_1 or GEOIP_CHARSET_UTF8 )"},
{"set_charset", GeoIP_set_charset_Py, 1, "Set the charset for city records"},
{"last_netmask", GeoIP_last_netmask_Py, 1, "return the netmask depth of the last lookup"},
{"last_netmask", GeoIP_last_netmask_Py, 1, "Return the netmask depth of the last lookup"},
{"country_code_by_name_v6", GeoIP_country_code_by_name_v6_Py, 1, "Lookup IPv6 Country Code By Name"},
{"country_name_by_name_v6", GeoIP_country_name_by_name_v6_Py, 1, "Lookup IPv6 Country Name By Name"},
{"country_code_by_addr_v6", GeoIP_country_code_by_addr_v6_Py, 1, "Lookup IPv6 Country Code By IP Address"},
{"country_name_by_addr_v6", GeoIP_country_name_by_addr_v6_Py, 1, "Lookup IPv6 Country Name By IP Address"},
{"enable_teredo", GeoIP_enable_teredo_Py, 1, "Enable / disable teredo"},
{"teredo", GeoIP_teredo_Py, 1, "Returns true if teredo is enabled"},
{"id_by_addr", GeoIP_id_by_addr_Py, 1, "Lookup Netspeed By IP Address"},
{"id_by_name", GeoIP_id_by_name_Py, 1, "Lookup Netspeed By Name"},
{NULL, NULL, 0, NULL}
};

Expand Down Expand Up @@ -386,6 +533,8 @@ static PyTypeObject GeoIP_GeoIPType = {
static PyMethodDef GeoIP_Class_methods[] = {
{"new", GeoIP_new_Py, 1, "GeoIP Constructor"},
{"open", GeoIP_open_Py, 1, "GeoIP Constructor with database filename argument"},
{"lib_version", GeoIP_lib_version_Py, 1, "Returns the CAPI version"},
{"time_zone_by_country_and_region", GeoIP_time_zone_by_country_and_region_Py, 1, "Returns time_zone for country, region"},
{NULL, NULL, 0, NULL}
};

Expand Down Expand Up @@ -453,4 +602,19 @@ initGeoIP(void)
PyDict_SetItemString(d, "GEOIP_CHARSET_UTF8", tmp);
Py_DECREF(tmp);

tmp = PyInt_FromLong(GEOIP_UNKNOWN_SPEED);
PyDict_SetItemString(d, "GEOIP_UNKNOWN_SPEED", tmp);
Py_DECREF(tmp);

tmp = PyInt_FromLong(GEOIP_DIALUP_SPEED);
PyDict_SetItemString(d, "GEOIP_DIALUP_SPEED", tmp);
Py_DECREF(tmp);

tmp = PyInt_FromLong(GEOIP_CABLEDSL_SPEED);
PyDict_SetItemString(d, "GEOIP_CABLEDSL_SPEED", tmp);
Py_DECREF(tmp);

tmp = PyInt_FromLong(GEOIP_CORPORATE_SPEED);
PyDict_SetItemString(d, "GEOIP_CORPORATE_SPEED", tmp);
Py_DECREF(tmp);
}
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
include_dirs = ['/usr/local/include'])

setup (name = 'GeoIP-Python',
version = '1.2.4',
version = '1.2.5',
description = 'This is a python wrapper to GeoIP',
ext_modules = [module1])
2 changes: 1 addition & 1 deletion test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#gi = GeoIP.new(GeoIP.GEOIP_STANDARD)
gi = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)
#gi = GeoIP.open("/usr/local/share/GeoIP/GeoIP.data",GeoIP.GEOIP_STANDARD)
#gi = GeoIP.open("/usr/local/share/GeoIP/GeoIP.dat",GeoIP.GEOIP_STANDARD)

print gi.country_code_by_name("yahoo.com")
print gi.last_netmask()
Expand Down
1 change: 1 addition & 0 deletions test_city.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@
print gir['area_code']
print gir['time_zone']
print gir['metro_code']
print str(gir)
12 changes: 12 additions & 0 deletions test_netspeed.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/usr/bin/python

import GeoIP

gi = GeoIP.open("/usr/local/share/GeoIP/GeoIPNetspeed.dat",GeoIP.GEOIP_STANDARD)

# GEOIP_UNKNOWN_SPEED, GEOIP_DIALUP_SPEED, GEOIP_CABLEDSL_SPEED or
# GEOIP_CORPORATE_SPEED

print gi.id_by_name("yahoo.com")
print gi.id_by_name("www.maxmind.com") == GeoIP.GEOIP_UNKNOWN_SPEED
print gi.id_by_addr("203.195.93.0")
4 changes: 2 additions & 2 deletions test_org.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
gi = GeoIP.open("/usr/local/share/GeoIP/GeoIPOrg.dat",GeoIP.GEOIP_STANDARD)

print gi.org_by_name("yahoo.com")
print gi.org_by_name("www.government.de")
print gi.org_by_addr("203.195.93.0")
print gi.org_by_name("www.google.com")
print gi.org_by_addr("24.24.24.24")
13 changes: 13 additions & 0 deletions test_v6.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/usr/bin/python

import GeoIP

#gi = GeoIP.new(GeoIP.GEOIP_STANDARD)
#gi = GeoIP.new(GeoIP.GEOIP_MEMORY_CACHE)
gi = GeoIP.open("/usr/local/share/GeoIP/GeoIPv6.dat",GeoIP.GEOIP_STANDARD)

print gi.country_code_by_name_v6("ipv6.google.com")
print gi.country_name_by_name_v6("ipv6.google.com")
print gi.country_code_by_addr_v6("2001:4860:0:1001::68")
print gi.country_name_by_addr_v6("2001:4860:0:1001::68")

0 comments on commit 33dab8d

Please sign in to comment.