qnip/
query.rs

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 build_cache(&mut self, ip_list: &Vec<String>) {
52    //     self.query.build_cache(ip_list);
53    // }
54
55    pub fn version(&self) -> super::data::VersionInfo {
56        self.query.version()
57    }
58}
59