-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathgeolite2.py
72 lines (55 loc) · 2 KB
/
geolite2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import maxminddb
from threading import Lock
from datetime import datetime
from _maxminddb_geolite2 import geolite2_database
class DatabaseInfo(object):
"""Provides information about the GeoIP database."""
def __init__(self, filename=None, date=None,
internal_name=None):
#: If available the filename which backs the database.
self.filename = filename
#: Optionally the build date of the database as datetime object.
self.date = date
#: Optionally the internal name of the database.
self.internal_name = internal_name
def __repr__(self):
return '<%s filename=%r date=%r internal_name=%r>' % (
self.__class__.__name__,
self.filename,
self.date,
self.internal_name,
)
class MaxMindDb(object):
"""Provides access to the packaged GeoLite2 database."""
def __init__(self, filename):
self.filename = filename
self._lock = Lock()
self._reader = None
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, tb):
self.close()
def close(self):
with self._lock:
if self._reader is not None:
self._reader.close()
self._reader = None
def get_info(self):
return DatabaseInfo(
filename=self.filename,
date=datetime.utcfromtimestamp(self.reader().metadata().build_epoch),
internal_name=self.reader().metadata().database_type,
)
def _open_packaged_database(self):
return maxminddb.open_database(self.filename)
def reader(self):
if self._reader is not None:
return self._reader
with self._lock:
if self._reader is not None:
return self._reader
rv = self._open_packaged_database()
self._reader = rv
return rv
#: Provides access to the geolite2 cities database.
geolite2 = MaxMindDb(filename=geolite2_database())