ip2region_private/binding/rust/src/main.rs

131 lines
3.8 KiB
Rust

extern crate ip2region;
use ip2region::*;
use std::env;
use std::io::{self, *};
use std::time::Instant;
// cargo run --release --features lazy
fn main() {
let args = env::args().skip(1).collect::<Vec<String>>();
println!(
r#"ip2region cli test
+-----------------------------------------------------------------+
| ip2region [db_file] [alrogrithm]
| format : [ip] [alrogrithm]'
| overview: cargo run --release"
| usage: cargo run --release -- [db_file] [alrogrithm]"
| exit: quit or exit or Ctrl+C
+-----------------------------------------------------------------+`"#
);
if !args.is_empty() {
let db_path = if args[0] != "." { &args[0] } else { DB_PATH };
let mut ip2 = Ip2Region::new(db_path).unwrap();
let ip2o = ip2.to_owned().unwrap();
let alg = if args.len() > 1 {
args[1].to_lowercase()
} else {
"memory".to_lowercase()
};
let mut buf = String::with_capacity(256);
loop {
buf.clear();
print!("ip2region>>");
io::stdout().flush().unwrap();
let line = match io::stdin().read_line(&mut buf) {
Ok(_) => buf.trim(),
Err(e) => panic!("[Fatal]: Read String from Stdin Error: {:?}", e),
};
if line.is_empty() {
continue;
}
if line == "quit" || line == "exit" {
println!("[Info]: Thanks for your use, Bye.");
break;
}
let ip_alg = line
.split_whitespace()
.filter(|s| !s.is_empty())
.collect::<Vec<&str>>();
let alg = if ip_alg.len() > 1 {
ip_alg[1].to_owned()
} else {
alg.clone()
};
let start = Instant::now();
let res = match alg.as_str() {
"memory" => ip2o.memory_search(ip_alg[0]).map(|o| o.to_owned()),
"binary" => ip2.binary_search(ip_alg[0]),
"btree" | "b-tree" => ip2.btree_search(ip_alg[0]),
miss => {
eprintln!("Not have the Algorithm: {:?}", miss);
continue;
}
};
let end = start.elapsed().subsec_micros();
match res {
Ok(i) => {
println!("[{:6} {:06} microseconds]: {}", alg, end, i);
}
Err(e) => {
eprintln!("[Error]: {:?}", e);
}
};
}
} else {
overview()
}
}
fn overview() {
let mut ip2 = Ip2Region::new(DB_PATH).unwrap();
let ip2o = ip2.to_owned().unwrap();
for ip in &[
"117.136.105.202",
"47.95.47.253",
"127.0.0.1",
"10.0.0.1",
"1.1.1.1",
] {
let start = Instant::now();
let res = ip2o.memory_search(ip);
let end = start.elapsed().subsec_micros();
println!("memory {:06} microseconds: {:?}", end, res);
#[cfg(feature = "lazy")]
{
let start = Instant::now();
let res = memory_search(ip);
let end = start.elapsed().subsec_micros();
println!("lazy__ {:06} microseconds: {:?}", end, res);
}
let start = Instant::now();
let res = ip2.binary_search(ip);
let end = start.elapsed().subsec_micros();
println!("binary {:06} microseconds: {:?}", end, res);
let start = Instant::now();
let res = ip2.btree_search(ip);
let end = start.elapsed().subsec_micros();
println!("btree {:06} microseconds: {:?}", end, res);
println!();
}
}