taubyte_sdk/database/
put.rs

1use super::{imports, Database};
2use crate::errno::Error;
3
4impl Database {
5    fn put_unsafe(&self, key: &str, buf_ptr: *mut u8, buf_size: usize) -> Error {
6        #[allow(unused_unsafe)]
7        unsafe {
8            imports::databasePut(self.id, key.as_ptr(), key.len(), buf_ptr, buf_size)
9        }
10    }
11
12    pub fn put(&self, key: &str, value: &[u8]) -> Result<(), Box<dyn std::error::Error>> {
13        let err = self.put_unsafe(key, value.as_ptr() as *mut u8, value.len());
14        if err.is_err() {
15            Err(format!("Putting key: `{}` failed with: {}", key, err).into())
16        } else {
17            Ok(())
18        }
19    }
20}
21
22#[cfg(test)]
23pub mod test {
24    use crate::database::{new::test, Database};
25    pub static KEY: &str = "/test/v1";
26    pub static VALUE: &str = "a value";
27
28    #[test]
29    fn test_put() {
30        let database = Database::new(test::DATABASE_NAME).unwrap_or_else(|err| {
31            panic!("{}", err);
32        });
33
34        database.put(KEY, VALUE.as_bytes()).unwrap_or_else(|err| {
35            panic!("{}", err);
36        });
37    }
38}
39
40#[cfg(test)]
41#[allow(non_snake_case)]
42pub mod mock {
43    use super::test;
44    use crate::{
45        database::new::test as new_test,
46        errno::{Errno, Error},
47        utils::test as utils,
48    };
49
50    pub fn databasePut(
51        id: u32,
52        key_ptr: *const u8,
53        key_size: usize,
54        data: *mut u8,
55        data_size: usize,
56    ) -> Error {
57        let key = utils::read_string(key_ptr, key_size);
58
59        if id != new_test::DATABASE_ID {
60            Errno::ErrorCap.error()
61        } else if key != test::KEY {
62            Errno::ErrorCap.error()
63        } else {
64            assert_eq!(utils::read_bytes(data, data_size), test::VALUE.as_bytes());
65            Errno::ErrorNone.error()
66        }
67    }
68}