1use std::io::Read;
2use super::formats::Query;
3use super::formats::ipdb::Ipdb;
4use std::net::{IpAddr};
5
6pub struct QueryDb {
7 query: Box<dyn Query>,
8}
9
10impl QueryDb {
11 pub fn from_file(path: &str) -> std::io::Result<QueryDb> {
12 let mut file = std::fs::File::open(path)?;
13 let mut buffer = Vec::new();
14 file.read_to_end(&mut buffer)?;
15 Self::from_bytes(&buffer)
16 }
17
18 pub fn from_bytes(bytes: &[u8]) -> std::io::Result<QueryDb> {
19 let query = Ipdb::new(bytes)?;
20 let b = Box::new(query);
21 Ok(QueryDb { query: b })
22 }
23
24 pub fn query(&self, ip: &[u8]) -> std::io::Result<super::data::IpInfo> {
25 self.query.query(ip)
26 }
27
28 pub fn query_str(&self, ip: &str) -> std::io::Result<super::data::IpInfo> {
29 return match ip.parse::<IpAddr>() {
30 Ok(ipa) => {
31 match ipa {
32 IpAddr::V4(ipv4) => {
33 self.query.query(&ipv4.octets())
34 },
35 IpAddr::V6(ipv6) => {
36 self.query.query(&ipv6.octets())
37 },
38 }
39 },
40 Err(_) => {
41 Err(std::io::Error::new(std::io::ErrorKind::Other, "parse ip error"))
42 },
43 }
44 }
45
46 pub fn query_u32(&self, ip: u32) -> std::io::Result<super::data::IpInfo> {
47 let ipb = ip.to_be_bytes();
48 self.query(&ipb)
49 }
50
51 pub fn version(&self) -> super::data::VersionInfo {
56 self.query.version()
57 }
58}
59