1use crate::region::Region;
8
9unsafe extern "C" {
10 fn kv_get(key_ptr: usize) -> usize;
11 fn kv_put(key_ptr: usize, value_ptr: usize);
12 fn kv_delete(key_ptr: usize);
13 fn kv_delete_store();
14 fn kv_commit();
15}
16
17#[derive(Default)]
19pub struct Storage;
20
21impl Storage {
22 pub fn get(key: &str) -> Option<Vec<u8>> {
24 let key = Region::build(key.as_bytes());
25 let key_ptr = &*key as *const Region;
26
27 let value_ptr = unsafe { kv_get(key_ptr as usize) };
28 if value_ptr == 0 {
29 return None;
30 }
31
32 unsafe { Some(Region::consume(value_ptr as *mut Region)) }
33 }
34
35 pub fn put(key: &str, value: &[u8]) {
37 let key = Region::build(key.as_bytes());
38 let key_ptr = &*key as *const Region;
39 let value = Region::build(value);
40 let value_ptr = &*value as *const Region;
41
42 unsafe { kv_put(key_ptr as usize, value_ptr as usize) };
43 }
44
45 pub fn delete(key: &str) {
47 let key = Region::build(key.as_bytes());
48 let key_ptr = &*key as *const Region;
49
50 unsafe { kv_delete(key_ptr as usize) };
51 }
52
53 pub fn delete_store() {
55 unsafe { kv_delete_store() };
56 }
57
58 pub fn commit() {
60 unsafe { kv_commit() };
61 }
62}