├── .github
├── dependabot.yml
└── workflows
│ ├── codeql-analysis.yml
│ ├── test.yml
│ └── zizmor.yml
├── .gitignore
├── .gitmodules
├── CHANGELOG.md
├── LICENSE
├── README.dev.md
├── README.md
├── checkstyle-suppressions.xml
├── checkstyle.xml
├── dev-bin
└── release.sh
├── pom.xml
├── sample
└── Benchmark.java
└── src
├── main
└── java
│ ├── com
│ └── maxmind
│ │ └── db
│ │ ├── BufferHolder.java
│ │ ├── CHMCache.java
│ │ ├── CacheKey.java
│ │ ├── CachedConstructor.java
│ │ ├── ClosedDatabaseException.java
│ │ ├── ConstructorNotFoundException.java
│ │ ├── CtrlData.java
│ │ ├── DatabaseRecord.java
│ │ ├── DecodedValue.java
│ │ ├── Decoder.java
│ │ ├── DeserializationException.java
│ │ ├── InvalidDatabaseException.java
│ │ ├── InvalidNetworkException.java
│ │ ├── MaxMindDbConstructor.java
│ │ ├── MaxMindDbParameter.java
│ │ ├── Metadata.java
│ │ ├── Network.java
│ │ ├── Networks.java
│ │ ├── NetworksIterationException.java
│ │ ├── NoCache.java
│ │ ├── NodeCache.java
│ │ ├── ParameterNotFoundException.java
│ │ ├── Reader.java
│ │ ├── Type.java
│ │ └── package-info.java
│ └── module-info.java
└── test
└── java
└── com
└── maxmind
└── db
├── DecoderTest.java
├── MultiThreadedTest.java
├── NetworkTest.java
├── PointerTest.java
├── ReaderTest.java
└── TestDecoder.java
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: maven
4 | directory: "/"
5 | schedule:
6 | interval: daily
7 | open-pull-requests-limit: 10
8 | - package-ecosystem: "github-actions"
9 | directory: "/"
10 | schedule:
11 | interval: daily
12 |
--------------------------------------------------------------------------------
/.github/workflows/codeql-analysis.yml:
--------------------------------------------------------------------------------
1 | name: "Code scanning - action"
2 |
3 | on:
4 | push:
5 | branches-ignore:
6 | - 'dependabot/**'
7 | pull_request:
8 | schedule:
9 | - cron: '0 6 * * 3'
10 |
11 | jobs:
12 | CodeQL-Build:
13 |
14 | runs-on: ubuntu-latest
15 |
16 | permissions:
17 | security-events: write
18 |
19 | steps:
20 | - name: Checkout repository
21 | uses: actions/checkout@v4
22 | with:
23 | # We must fetch at least the immediate parents so that if this is
24 | # a pull request then we can checkout the head.
25 | fetch-depth: 2
26 | persist-credentials: false
27 |
28 | # If this run was triggered by a pull request event, then checkout
29 | # the head of the pull request instead of the merge commit.
30 | - run: git checkout HEAD^2
31 | if: ${{ github.event_name == 'pull_request' }}
32 |
33 | # Initializes the CodeQL tools for scanning.
34 | - name: Initialize CodeQL
35 | uses: github/codeql-action/init@v3
36 | # Override language selection by uncommenting this and choosing your languages
37 | # with:
38 | # languages: go, javascript, csharp, python, cpp, java
39 |
40 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
41 | # If this step fails, then you should remove it and run the build manually (see below)
42 | - name: Autobuild
43 | uses: github/codeql-action/autobuild@v3
44 |
45 | # ℹ️ Command-line programs to run using the OS shell.
46 | # 📚 https://git.io/JvXDl
47 |
48 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
49 | # and modify them (or add more) to build your code if your project
50 | # uses a compiled language
51 |
52 | #- run: |
53 | # make bootstrap
54 | # make release
55 |
56 | - name: Perform CodeQL Analysis
57 | uses: github/codeql-action/analyze@v3
58 |
--------------------------------------------------------------------------------
/.github/workflows/test.yml:
--------------------------------------------------------------------------------
1 | name: Run tests
2 | on: [push, pull_request]
3 | permissions: {}
4 | jobs:
5 | test:
6 | runs-on: ${{ matrix.os }}
7 | strategy:
8 | fail-fast: false
9 | matrix:
10 | distribution: ['zulu']
11 | os: [ubuntu-latest, windows-latest, macos-latest]
12 | version: [ 11, 17, 21, 22 ]
13 | steps:
14 | - uses: actions/checkout@v4
15 | with:
16 | submodules: true
17 | persist-credentials: false
18 | - uses: actions/setup-java@v4
19 | with:
20 | distribution: ${{ matrix.distribution }}
21 | java-version: ${{ matrix.version }}
22 | - run: mvn test -B
23 |
--------------------------------------------------------------------------------
/.github/workflows/zizmor.yml:
--------------------------------------------------------------------------------
1 | name: GitHub Actions Security Analysis with zizmor
2 |
3 | on:
4 | push:
5 | branches: ["main"]
6 | pull_request:
7 | branches: ["**"]
8 |
9 | jobs:
10 | zizmor:
11 | name: zizmor latest via PyPI
12 | runs-on: ubuntu-latest
13 | permissions:
14 | security-events: write
15 | # required for workflows in private repositories
16 | contents: read
17 | actions: read
18 | steps:
19 | - name: Checkout repository
20 | uses: actions/checkout@v4
21 | with:
22 | persist-credentials: false
23 |
24 | - name: Install the latest version of uv
25 | uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb # 6.1.0
26 | with:
27 | enable-cache: false
28 |
29 | - name: Run zizmor
30 | run: uvx zizmor@1.7.0 --format plain .
31 | env:
32 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
33 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.class
2 | *~
3 | *.iml
4 | *.jar
5 | *.war
6 | *.ear
7 | *.sw?
8 | *.classpath
9 | .gh-pages
10 | .idea
11 | .pmd
12 | .project
13 | .settings
14 | bin
15 | doc
16 | hs_err*.log
17 | target
18 | /sample/GeoLite2-City.mmdb
19 | /sample/run.sh
20 | reports
21 | Test.java
22 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "src/test/resources/maxmind-db"]
2 | path = src/test/resources/maxmind-db
3 | url = https://github.com/maxmind/MaxMind-DB
4 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | CHANGELOG
2 | =========
3 |
4 | 3.2.0 (2025-05-28)
5 | ------------------
6 |
7 | * First release using Central Portal instead of Legacy OSSRH.
8 | * Improve internal uses of types and other code cleanups. Pull requests
9 | by Philippe Marschall. GitHub #246, #247, #248, and #249.
10 |
11 | 3.1.1 (2024-09-19)
12 | ------------------
13 |
14 | * When handling a deserialization exception, the decoder now avoids
15 | throwing a `NullPointerException` when one of the constructor arguments
16 | is `null`. Reported by Keith Massey. GitHub #164.
17 |
18 | 3.1.0 (2023-12-05)
19 | ------------------
20 |
21 | * Reader supports iterating over the whole database or within a network.
22 |
23 | 3.0.0 (2022-12-12)
24 | ------------------
25 |
26 | * Java 11 or greater is now required.
27 | * This library is now a Java module.
28 |
29 | 2.1.0 (2022-10-31)
30 | ------------------
31 |
32 | * Messages for `DeserializationException` have been improved, and the cause
33 | is included, if any. Moreover, the message provides detail about the involved
34 | types, if the exception is caused by an `IllegalArgumentException`.
35 |
36 | 2.0.0 (2020-10-13)
37 | ------------------
38 |
39 | * No changes since 2.0.0-rc2.
40 |
41 | 2.0.0-rc2 (2020-09-29)
42 | ----------------------
43 |
44 | * Build using the `--release` command-line option so linking when using
45 | Java 8 works.
46 |
47 | 2.0.0-rc1 (2020-09-24)
48 | ----------------------
49 |
50 | * Significant API changes. The `get()` and `getRecord()` methods now take a
51 | class parameter specifying the type of object to deserialize into. You
52 | can either deserialize into a `Map` or to model classes that use the
53 | `MaxMindDbConstructor` and `MaxMindDbParameter` annotations to identify
54 | the constructors and parameters to deserialize into.
55 | * `jackson-databind` is no longer a dependency.
56 | * The `Record` class is now named `DatabaseRecord`. This is to avoid a
57 | conflict with `java.lang.Record` in Java 14.
58 |
59 | 1.4.0 (2020-06-12)
60 | ------------------
61 |
62 | * IMPORTANT: Java 8 is now required. If you need Java 7 support, please
63 | continue using 1.3.1 or earlier.
64 | * The decoder will now throw an `InvalidDatabaseException` on an invalid
65 | control byte in the data section rather than an
66 | `ArrayIndexOutOfBoundsException`. Reported by Edwin Delgado H. GitHub
67 | #68.
68 | * In order to improve performance when lookups are done from multiple
69 | threads, a use of `synchronized` has been removed. GitHub #65 & #69.
70 | * `jackson-databind` has been upgraded to 2.11.0.
71 |
72 | 1.3.1 (2020-03-03)
73 | ------------------
74 |
75 | * Correctly decode strings that are between 157 and 288 bytes long. 1.3.0
76 | introduced a regression when decoding these due to using a signed `byte`
77 | as an unsigned value. Reported by Dongmin Yu. GitHub #181 in
78 | maxmind/GeoIP2-java.
79 | * Update `jackson-databind` dependency.
80 |
81 | 1.3.0 (2019-12-13)
82 | ------------------
83 |
84 | * IMPORTANT: Java 7 is now required. If you need Java 6 support, please
85 | continue using 1.2.2 or earlier.
86 | * The method `getRecord` was added to `com.maxmind.db.Reader`. This method
87 | returns a `com.maxmind.db.Record` object that includes the data for the
88 | record as well as the network associated with the record.
89 |
90 | 1.2.2 (2017-02-22)
91 | ------------------
92 |
93 | * Remove the version range. As of today, `jackson-databind` is no longer
94 | resolved correctly when a range is used. GitHub #28.
95 |
96 | 1.2.1 (2016-04-15)
97 | ------------------
98 |
99 | * Specify a hard minimum dependency for `jackson-databind`. This API will not
100 | work with versions earlier than 2.7.0, and Maven's nearest-first resolution
101 | rule often pulled in older versions.
102 |
103 | 1.2.0 (2016-01-13)
104 | ------------------
105 |
106 | * `JsonNode` containers returned by the `get(ip)` are now backed by
107 | unmodifiable collections. Any mutation done to them will fail with an
108 | `UnsupportedOperationException` exception. This allows safe caching of the
109 | nodes to be done without doing a deep copy of the cached data. Pull request
110 | by Viktor Szathmáry. GitHub #24.
111 |
112 | 1.1.0 (2016-01-04)
113 | ------------------
114 |
115 | * The reader now supports pluggable caching of the decoded data. By default,
116 | no caching is performed. Please see the `README.md` file or the API docs
117 | for information on how to enable caching. Pull requests by Viktor Szathmáry.
118 | GitHub #21.
119 | * This release also includes several additional performance enhancements as
120 | well as code cleanup from Viktor Szathmáry. GitHub #18, #19, #20, #22,and
121 | #23.
122 |
123 | 1.0.1 (2015-12-17)
124 | ------------------
125 |
126 | * Several optimizations have been made to reduce allocations when decoding a
127 | record. Pull requests by Viktor Szathmáry. GitHub #16 & #17.
128 |
129 | 1.0.0 (2014-09-29)
130 | ------------------
131 |
132 | * First production release.
133 |
134 | 0.4.0 (2014-09-23)
135 | ------------------
136 |
137 | * Made `com.maxmind.db.Metadata` public and added public getters for most
138 | of the interesting metadata. This is accessible through the `getMetadata()`
139 | method on a `Reader` object.
140 |
141 | 0.3.4 (2014-08-27)
142 | ------------------
143 |
144 | * Previously the Reader would hold onto the underlying file and FileChannel,
145 | not closing them until the Reader was closed. This was unnecessary; they
146 | are now closed immediately after they are used. Fix by Andrew Snare; GitHub
147 | issue #7.
148 | * The Reader now discards the reference to the underlying buffer when
149 | `close()` is called. This is done to help ensure that the buffer is garbage
150 | collected sooner, which may mitigate file locking issues that some users
151 | have experienced on Windows when updating the database. Patch by Andrew
152 | Snare; GitHub issue #8.
153 |
154 | 0.3.3 (2014-06-02)
155 | ------------------
156 |
157 | * A potential (small) resource leak when using this library with a thread
158 | pool was fixed.
159 |
160 | 0.3.2 (2014-04-02)
161 | ------------------
162 |
163 | * Added tests and documentation for multi-threaded use.
164 |
165 | 0.3.1 (2013-11-05)
166 | ------------------
167 |
168 | * An `InputStream` constructor was added to the `Reader` class. This reads the
169 | stream into memory as if it was using `FileMode.MEMORY`. Patch by Matthew
170 | Daniel.
171 | * The source code is now attached during packaging. Patch by Matthew Daniel.
172 | * The artifact ID was changed to `maxmind-db` in order to increase naming
173 | consistency.
174 |
175 | 0.3.0 (2013-10-17)
176 | ------------------
177 |
178 | * IMPORTANT: The package name was changed to `com.maxmind.db`. The
179 | `MaxMindDbReader` class was renamed to `Reader`.
180 | * Improved error handling and test coverage.
181 | * Performance improvements.
182 |
183 | 0.2.0 (2013-07-08)
184 | ------------------
185 |
186 | * The reader and database format now uses IEEE 754 doubles and floats.
187 | * FileMode.IN_MEMORY was renamed to FileMode.MEMORY.
188 | * Cache Type enum values array.
189 |
190 | 0.1.0 (2013-06-14)
191 | ------------------
192 |
193 | * Initial release
194 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 |
2 | Apache License
3 | Version 2.0, January 2004
4 | http://www.apache.org/licenses/
5 |
6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7 |
8 | 1. Definitions.
9 |
10 | "License" shall mean the terms and conditions for use, reproduction,
11 | and distribution as defined by Sections 1 through 9 of this document.
12 |
13 | "Licensor" shall mean the copyright owner or entity authorized by
14 | the copyright owner that is granting the License.
15 |
16 | "Legal Entity" shall mean the union of the acting entity and all
17 | other entities that control, are controlled by, or are under common
18 | control with that entity. For the purposes of this definition,
19 | "control" means (i) the power, direct or indirect, to cause the
20 | direction or management of such entity, whether by contract or
21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
22 | outstanding shares, or (iii) beneficial ownership of such entity.
23 |
24 | "You" (or "Your") shall mean an individual or Legal Entity
25 | exercising permissions granted by this License.
26 |
27 | "Source" form shall mean the preferred form for making modifications,
28 | including but not limited to software source code, documentation
29 | source, and configuration files.
30 |
31 | "Object" form shall mean any form resulting from mechanical
32 | transformation or translation of a Source form, including but
33 | not limited to compiled object code, generated documentation,
34 | and conversions to other media types.
35 |
36 | "Work" shall mean the work of authorship, whether in Source or
37 | Object form, made available under the License, as indicated by a
38 | copyright notice that is included in or attached to the work
39 | (an example is provided in the Appendix below).
40 |
41 | "Derivative Works" shall mean any work, whether in Source or Object
42 | form, that is based on (or derived from) the Work and for which the
43 | editorial revisions, annotations, elaborations, or other modifications
44 | represent, as a whole, an original work of authorship. For the purposes
45 | of this License, Derivative Works shall not include works that remain
46 | separable from, or merely link (or bind by name) to the interfaces of,
47 | the Work and Derivative Works thereof.
48 |
49 | "Contribution" shall mean any work of authorship, including
50 | the original version of the Work and any modifications or additions
51 | to that Work or Derivative Works thereof, that is intentionally
52 | submitted to Licensor for inclusion in the Work by the copyright owner
53 | or by an individual or Legal Entity authorized to submit on behalf of
54 | the copyright owner. For the purposes of this definition, "submitted"
55 | means any form of electronic, verbal, or written communication sent
56 | to the Licensor or its representatives, including but not limited to
57 | communication on electronic mailing lists, source code control systems,
58 | and issue tracking systems that are managed by, or on behalf of, the
59 | Licensor for the purpose of discussing and improving the Work, but
60 | excluding communication that is conspicuously marked or otherwise
61 | designated in writing by the copyright owner as "Not a Contribution."
62 |
63 | "Contributor" shall mean Licensor and any individual or Legal Entity
64 | on behalf of whom a Contribution has been received by Licensor and
65 | subsequently incorporated within the Work.
66 |
67 | 2. Grant of Copyright License. Subject to the terms and conditions of
68 | this License, each Contributor hereby grants to You a perpetual,
69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70 | copyright license to reproduce, prepare Derivative Works of,
71 | publicly display, publicly perform, sublicense, and distribute the
72 | Work and such Derivative Works in Source or Object form.
73 |
74 | 3. Grant of Patent License. Subject to the terms and conditions of
75 | this License, each Contributor hereby grants to You a perpetual,
76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77 | (except as stated in this section) patent license to make, have made,
78 | use, offer to sell, sell, import, and otherwise transfer the Work,
79 | where such license applies only to those patent claims licensable
80 | by such Contributor that are necessarily infringed by their
81 | Contribution(s) alone or by combination of their Contribution(s)
82 | with the Work to which such Contribution(s) was submitted. If You
83 | institute patent litigation against any entity (including a
84 | cross-claim or counterclaim in a lawsuit) alleging that the Work
85 | or a Contribution incorporated within the Work constitutes direct
86 | or contributory patent infringement, then any patent licenses
87 | granted to You under this License for that Work shall terminate
88 | as of the date such litigation is filed.
89 |
90 | 4. Redistribution. You may reproduce and distribute copies of the
91 | Work or Derivative Works thereof in any medium, with or without
92 | modifications, and in Source or Object form, provided that You
93 | meet the following conditions:
94 |
95 | (a) You must give any other recipients of the Work or
96 | Derivative Works a copy of this License; and
97 |
98 | (b) You must cause any modified files to carry prominent notices
99 | stating that You changed the files; and
100 |
101 | (c) You must retain, in the Source form of any Derivative Works
102 | that You distribute, all copyright, patent, trademark, and
103 | attribution notices from the Source form of the Work,
104 | excluding those notices that do not pertain to any part of
105 | the Derivative Works; and
106 |
107 | (d) If the Work includes a "NOTICE" text file as part of its
108 | distribution, then any Derivative Works that You distribute must
109 | include a readable copy of the attribution notices contained
110 | within such NOTICE file, excluding those notices that do not
111 | pertain to any part of the Derivative Works, in at least one
112 | of the following places: within a NOTICE text file distributed
113 | as part of the Derivative Works; within the Source form or
114 | documentation, if provided along with the Derivative Works; or,
115 | within a display generated by the Derivative Works, if and
116 | wherever such third-party notices normally appear. The contents
117 | of the NOTICE file are for informational purposes only and
118 | do not modify the License. You may add Your own attribution
119 | notices within Derivative Works that You distribute, alongside
120 | or as an addendum to the NOTICE text from the Work, provided
121 | that such additional attribution notices cannot be construed
122 | as modifying the License.
123 |
124 | You may add Your own copyright statement to Your modifications and
125 | may provide additional or different license terms and conditions
126 | for use, reproduction, or distribution of Your modifications, or
127 | for any such Derivative Works as a whole, provided Your use,
128 | reproduction, and distribution of the Work otherwise complies with
129 | the conditions stated in this License.
130 |
131 | 5. Submission of Contributions. Unless You explicitly state otherwise,
132 | any Contribution intentionally submitted for inclusion in the Work
133 | by You to the Licensor shall be under the terms and conditions of
134 | this License, without any additional terms or conditions.
135 | Notwithstanding the above, nothing herein shall supersede or modify
136 | the terms of any separate license agreement you may have executed
137 | with Licensor regarding such Contributions.
138 |
139 | 6. Trademarks. This License does not grant permission to use the trade
140 | names, trademarks, service marks, or product names of the Licensor,
141 | except as required for reasonable and customary use in describing the
142 | origin of the Work and reproducing the content of the NOTICE file.
143 |
144 | 7. Disclaimer of Warranty. Unless required by applicable law or
145 | agreed to in writing, Licensor provides the Work (and each
146 | Contributor provides its Contributions) on an "AS IS" BASIS,
147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148 | implied, including, without limitation, any warranties or conditions
149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150 | PARTICULAR PURPOSE. You are solely responsible for determining the
151 | appropriateness of using or redistributing the Work and assume any
152 | risks associated with Your exercise of permissions under this License.
153 |
154 | 8. Limitation of Liability. In no event and under no legal theory,
155 | whether in tort (including negligence), contract, or otherwise,
156 | unless required by applicable law (such as deliberate and grossly
157 | negligent acts) or agreed to in writing, shall any Contributor be
158 | liable to You for damages, including any direct, indirect, special,
159 | incidental, or consequential damages of any character arising as a
160 | result of this License or out of the use or inability to use the
161 | Work (including but not limited to damages for loss of goodwill,
162 | work stoppage, computer failure or malfunction, or any and all
163 | other commercial damages or losses), even if such Contributor
164 | has been advised of the possibility of such damages.
165 |
166 | 9. Accepting Warranty or Additional Liability. While redistributing
167 | the Work or Derivative Works thereof, You may choose to offer,
168 | and charge a fee for, acceptance of support, warranty, indemnity,
169 | or other liability obligations and/or rights consistent with this
170 | License. However, in accepting such obligations, You may act only
171 | on Your own behalf and on Your sole responsibility, not on behalf
172 | of any other Contributor, and only if You agree to indemnify,
173 | defend, and hold each Contributor harmless for any liability
174 | incurred by, or claims asserted against, such Contributor by reason
175 | of your accepting any such warranty or additional liability.
176 |
177 | END OF TERMS AND CONDITIONS
178 |
179 | APPENDIX: How to apply the Apache License to your work.
180 |
181 | To apply the Apache License to your work, attach the following
182 | boilerplate notice, with the fields enclosed by brackets "[]"
183 | replaced with your own identifying information. (Don't include
184 | the brackets!) The text should be enclosed in the appropriate
185 | comment syntax for the file format. We also recommend that a
186 | file or class name and description of purpose be included on the
187 | same "printed page" as the copyright notice for easier
188 | identification within third-party archives.
189 |
190 | Copyright [yyyy] [name of copyright owner]
191 |
192 | Licensed under the Apache License, Version 2.0 (the "License");
193 | you may not use this file except in compliance with the License.
194 | You may obtain a copy of the License at
195 |
196 | http://www.apache.org/licenses/LICENSE-2.0
197 |
198 | Unless required by applicable law or agreed to in writing, software
199 | distributed under the License is distributed on an "AS IS" BASIS,
200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201 | See the License for the specific language governing permissions and
202 | limitations under the License.
203 |
--------------------------------------------------------------------------------
/README.dev.md:
--------------------------------------------------------------------------------
1 | See the [`README.dev.md` in `minfraud-api-java`](https://github.com/maxmind/minfraud-api-java/blob/main/README.dev.md).
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MaxMind DB Reader #
2 |
3 | ## Description ##
4 |
5 | This is the Java API for reading MaxMind DB files. MaxMind DB is a binary file
6 | format that stores data indexed by IP address subnets (IPv4 or IPv6).
7 |
8 | ## Installation ##
9 |
10 | ### Maven ###
11 |
12 | We recommend installing this package with [Maven](https://maven.apache.org/).
13 | To do this, add the dependency to your pom.xml:
14 |
15 | ```xml
16 |
17 | com.maxmind.db
18 | maxmind-db
19 | 3.2.0
20 |
21 | ```
22 |
23 | ### Gradle ###
24 |
25 | Add the following to your `build.gradle` file:
26 |
27 | ```
28 | repositories {
29 | mavenCentral()
30 | }
31 | dependencies {
32 | compile 'com.maxmind.db:maxmind-db:3.2.0'
33 | }
34 | ```
35 |
36 | ## Usage ##
37 |
38 | *Note:* For accessing MaxMind GeoIP2 databases, we generally recommend using
39 | the [GeoIP2 Java API](https://maxmind.github.io/GeoIP2-java/) rather than using
40 | this package directly.
41 |
42 | To use the API, you must first create a `Reader` object. The constructor for
43 | the reader object takes a `File` representing your MaxMind DB. Optionally you
44 | may pass a second parameter with a `FileMode` with a value of `MEMORY_MAP` or
45 | `MEMORY`. The default mode is `MEMORY_MAP`, which maps the file to virtual
46 | memory. This often provides performance comparable to loading the file into
47 | real memory with `MEMORY`.
48 |
49 | To look up an IP address, pass the address as an `InetAddress` to the `get`
50 | method on `Reader`, along with the class of the object you want to
51 | deserialize into. This method will create an instance of the class and
52 | populate it. See examples below.
53 |
54 | We recommend reusing the `Reader` object rather than creating a new one for
55 | each lookup. The creation of this object is relatively expensive as it must
56 | read in metadata for the file.
57 |
58 | ## Example ##
59 |
60 | ```java
61 | import com.maxmind.db.MaxMindDbConstructor;
62 | import com.maxmind.db.MaxMindDbParameter;
63 | import com.maxmind.db.Reader;
64 | import com.maxmind.db.DatabaseRecord;
65 |
66 | import java.io.File;
67 | import java.io.IOException;
68 | import java.net.InetAddress;
69 |
70 | public class Lookup {
71 | public static void main(String[] args) throws IOException {
72 | File database = new File("/path/to/database/GeoIP2-City.mmdb");
73 | try (Reader reader = new Reader(database)) {
74 | InetAddress address = InetAddress.getByName("24.24.24.24");
75 |
76 | // get() returns just the data for the associated record
77 | LookupResult result = reader.get(address, LookupResult.class);
78 |
79 | System.out.println(result.getCountry().getIsoCode());
80 |
81 | // getRecord() returns a DatabaseRecord class that contains both
82 | // the data for the record and associated metadata.
83 | DatabaseRecord record
84 | = reader.getRecord(address, LookupResult.class);
85 |
86 | System.out.println(record.getData().getCountry().getIsoCode());
87 | System.out.println(record.getNetwork());
88 | }
89 | }
90 |
91 | public static class LookupResult {
92 | private final Country country;
93 |
94 | @MaxMindDbConstructor
95 | public LookupResult (
96 | @MaxMindDbParameter(name="country") Country country
97 | ) {
98 | this.country = country;
99 | }
100 |
101 | public Country getCountry() {
102 | return this.country;
103 | }
104 | }
105 |
106 | public static class Country {
107 | private final String isoCode;
108 |
109 | @MaxMindDbConstructor
110 | public Country (
111 | @MaxMindDbParameter(name="iso_code") String isoCode
112 | ) {
113 | this.isoCode = isoCode;
114 | }
115 |
116 | public String getIsoCode() {
117 | return this.isoCode;
118 | }
119 | }
120 | }
121 | ```
122 |
123 | You can also use the reader object to iterate over the database.
124 | The `reader.networks()` and `reader.networksWithin()` methods can
125 | be used for this purpose.
126 |
127 | ```java
128 | Reader reader = new Reader(file);
129 | Networks networks = reader.networks(Map.class);
130 |
131 | while(networks.hasNext()) {
132 | DatabaseRecord