grid_rs/
kvs.rs

1//! Key-value store.
2//!
3//! This module provides access to the host's key-value store. You should be able to manage keys,
4//! values, and stores from within your functions.
5//!
6//! *Note:* stores are currently only available, one for each function.
7use 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/// Key-value storage endpoints.
18#[derive(Default)]
19pub struct Storage;
20
21impl Storage {
22    /// Get a value from the key-value store.
23    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    /// Put a value into the key-value store.
36    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    /// Delete a value from the key-value store.
46    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    /// Delete the entire key-value store.
54    pub fn delete_store() {
55        unsafe { kv_delete_store() };
56    }
57
58    /// Persist the key-value store to the host storage.
59    pub fn commit() {
60        unsafe { kv_commit() };
61    }
62}