1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
extern crate k2hash_sys;
extern crate libc;
use std::ffi::CString;
use libc::{c_int, size_t};
pub const DEFAULT_MASK_BITCOUNT: c_int = k2hash_sys::DEFAULT_MASK_BITCOUNT;
pub const DEFAULT_COLLISION_MASK_BITCOUNT: c_int = k2hash_sys::DEFAULT_COLLISION_MASK_BITCOUNT;
pub const DEFAULT_MAX_ELEMENT_CNT: c_int = k2hash_sys::DEFAULT_MAX_ELEMENT_CNT;
pub const MIN_PAGE_SIZE: size_t = k2hash_sys::MIN_PAGE_SIZE;
pub struct K2Hash {
handler: k2hash_sys::k2h_h,
}
impl K2Hash {
pub fn new(
filepath: &std::path::Path,
readonly: bool,
removefile: bool,
fullmap: bool,
maskbitcnt: c_int,
cmaskbitcnt: c_int,
maxelementcnt: c_int,
pagesize: size_t,
) -> Result<K2Hash, std::io::Error> {
let path_str = filepath.to_str().unwrap();
let c_path = CString::new(path_str).unwrap();
unsafe {
let handler = k2hash_sys::k2h_open(
c_path.as_ptr(),
readonly,
removefile,
fullmap,
maskbitcnt,
cmaskbitcnt,
maxelementcnt,
pagesize);
if handler == 0 {
Err(std::io::Error::last_os_error())
} else {
Ok(K2Hash { handler: handler })
}
}
}
pub fn get_str(&self, key: String) -> Result<String, std::io::Error>
{
if self.handler == 0 {
return Err(std::io::Error::last_os_error())
}
unsafe {
let ckey = CString::new(key).unwrap();
let pval = k2hash_sys::k2h_get_str_direct_value(self.handler, ckey.as_ptr());
if pval.is_null() {
Err(std::io::Error::last_os_error())
} else {
let cval = CString::from_raw(pval as *mut i8);
let val = cval.into_string().unwrap();
Ok(val)
}
}
}
pub fn set_str(&self, key: String, value: String) -> Result<(), std::io::Error>
{
if self.handler == 0 {
return Err(std::io::Error::last_os_error())
}
unsafe {
let ckey = CString::new(key).unwrap();
let cval = CString::new(value).unwrap();
let success = k2hash_sys::k2h_set_str_value(self.handler, ckey.as_ptr(), cval.as_ptr());
if success {
Ok(())
} else {
Err(std::io::Error::last_os_error())
}
}
}
}
impl Drop for K2Hash {
fn drop(&mut self) {
unsafe {
k2hash_sys::k2h_close(self.handler);
}
}
}