taubyte_sdk/database/
get.rs

1use super::{imports, Database};
2use crate::errno::Error;
3
4impl Database {
5    fn get_size_unsafe(&self, key: &str, size: *mut usize) -> Error {
6        #[allow(unused_unsafe)]
7        unsafe {
8            imports::databaseGetSize(self.id, key.as_ptr(), key.len(), size)
9        }
10    }
11
12    fn get_unsafe(&self, key: &str, buf_ptr: *mut u8) -> Error {
13        #[allow(unused_unsafe)]
14        unsafe {
15            imports::databaseGet(self.id, key.as_ptr(), key.len(), buf_ptr)
16        }
17    }
18
19    pub fn get(&self, key: &str) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
20        let mut size: usize = 0;
21        let err0 = self.get_size_unsafe(key, &mut size);
22        if err0.is_err() {
23            return Err(format!(
24                "Getting database size for key: `{}` failed with: {}",
25                key, err0
26            )
27            .into());
28        }
29        if size == 0 {
30            return Ok(Vec::new());
31        }
32
33        let mut buf = vec![0u8; size];
34        let err0 = self.get_unsafe(key, buf.as_mut_ptr());
35        if err0.is_err() {
36            Err(format!("Getting database for key: `{}` failed with: {}", key, err0).into())
37        } else {
38            Ok(buf)
39        }
40    }
41}
42
43#[cfg(test)]
44pub mod test {
45    use crate::database::{new::test, Database};
46
47    pub static KEY: &str = "/test/v1";
48    pub static VALUE: &str = "a value";
49
50    #[test]
51    fn test_get() {
52        let database = Database::new(test::DATABASE_NAME).unwrap_or_else(|err| {
53            panic!("{}", err);
54        });
55
56        let value = database.get(KEY).unwrap_or_else(|err| {
57            panic!("{}", err);
58        });
59
60        assert_eq!(value, VALUE.as_bytes())
61    }
62}
63
64#[cfg(test)]
65#[allow(non_snake_case)]
66pub mod mock {
67    use super::test;
68    use crate::{
69        database::new::test as new_test,
70        errno::{Errno, Error},
71        utils::test as utils,
72    };
73
74    pub fn databaseGet(id: u32, key_ptr: *const u8, key_size: usize, data: *mut u8) -> Error {
75        let key = utils::read_string(key_ptr, key_size);
76
77        if id != new_test::DATABASE_ID {
78            Errno::ErrorCap.error()
79        } else if key != test::KEY {
80            Errno::ErrorCap.error()
81        } else {
82            utils::write_bytes(data, test::VALUE.as_bytes());
83            Errno::ErrorNone.error()
84        }
85    }
86
87    pub fn databaseGetSize(
88        id: u32,
89        key_ptr: *const u8,
90        key_size: usize,
91        size: *mut usize,
92    ) -> Error {
93        let key = utils::read_string(key_ptr, key_size);
94
95        if id != new_test::DATABASE_ID {
96            Errno::ErrorCap.error()
97        } else if key != test::KEY {
98            Errno::ErrorCap.error()
99        } else {
100            utils::write_usize(size, test::VALUE.len());
101            Errno::ErrorNone.error()
102        }
103    }
104}