Skip to content

Commit fe042ae

Browse files
committed
add support for reading a database from buffers
1 parent ed2cdb2 commit fe042ae

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

maxminddb/reader.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,11 @@ def __init__(
8383
elif mode == MODE_FD:
8484
self._buffer = database.read() # type: ignore[union-attr]
8585
self._buffer_size = len(self._buffer) # type: ignore[arg-type]
86-
filename = database.name # type: ignore[union-attr]
86+
# io buffers are not guaranteed to have a name attribute
87+
if hasattr(database, "name"):
88+
filename = database.name # type: ignore[union-attr]
89+
else:
90+
filename = f"<{type(database)}>"
8791
else:
8892
msg = (
8993
f"Unsupported open mode ({mode}). Only MODE_AUTO, MODE_FILE, "

tests/reader_test.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
import ipaddress
4+
import io
45
import multiprocessing
56
import os
67
import pathlib
@@ -524,6 +525,14 @@ def test_closed_metadata(self) -> None:
524525
else:
525526
self.assertIsNotNone(metadata, "pure Python implementation returns value")
526527

528+
def test_reading_from_buffer(self) -> None:
529+
filename = "tests/data/test-data/MaxMind-DB-test-ipv4-24.mmdb"
530+
with open(filename, "rb") as f:
531+
buf = io.BytesIO(f.read())
532+
reader = open_database(buf, MODE_FD)
533+
self._check_ip_v4(reader, filename)
534+
reader.close()
535+
527536
if os.name != "nt":
528537

529538
def test_multiprocessing(self):

0 commit comments

Comments
 (0)