taubyte_sdk/database/
list.rs1use super::{imports, Database};
2use crate::{errno::Error, utils::codec};
3
4impl Database {
5 fn list_size_unsafe(&self, key: &str, size: *mut usize) -> Error {
6 #[allow(unused_unsafe)]
7 unsafe {
8 imports::databaseListSize(self.id, key.as_ptr(), key.len(), size)
9 }
10 }
11
12 fn list_unsafe(&self, key: &str, buf_ptr: *mut u8) -> Error {
13 #[allow(unused_unsafe)]
14 unsafe {
15 imports::databaseList(self.id, key.as_ptr(), key.len(), buf_ptr)
16 }
17 }
18
19 pub fn list(&self, key: &str) -> Result<Vec<String>, Box<dyn std::error::Error>> {
20 let mut size: usize = 0;
21 let err0 = self.list_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.list_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(codec::string_slice::to(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 SUB_KEYS: [&str; 2] = ["a", "b"];
49
50 #[test]
51 fn test_list() {
52 let database = Database::new(test::DATABASE_NAME).unwrap_or_else(|err| {
53 panic!("{}", err);
54 });
55
56 let value = database.list(KEY).unwrap_or_else(|err| {
57 panic!("{}", err);
58 });
59
60 assert_eq!(value, SUB_KEYS)
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 databaseList(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_string_slice(data, &test::SUB_KEYS);
83 Errno::ErrorNone.error()
84 }
85 }
86
87 pub fn databaseListSize(
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_string_slice_size(size, &test::SUB_KEYS);
101 Errno::ErrorNone.error()
102 }
103 }
104}