1use darkfi_serial::Encodable;
20
21use crate::{
22 crypto::ContractId,
23 error::{ContractError, GenericResult},
24 wasm,
25};
26
27pub type DbHandle = u32;
28
29pub fn db_init(contract_id: ContractId, db_name: &str) -> GenericResult<DbHandle> {
35 unsafe {
36 let mut len = 0;
37 let mut buf = vec![];
38 len += contract_id.encode(&mut buf)?;
39 len += db_name.to_string().encode(&mut buf)?;
40
41 let ret = db_init_(buf.as_ptr(), len as u32);
42
43 if ret < 0 {
44 return Err(ContractError::from(ret))
45 }
46
47 Ok(ret as u32)
48 }
49}
50
51pub fn db_lookup(contract_id: ContractId, db_name: &str) -> GenericResult<DbHandle> {
53 unsafe {
54 let mut len = 0;
55 let mut buf = vec![];
56 len += contract_id.encode(&mut buf)?;
57 len += db_name.to_string().encode(&mut buf)?;
58
59 let ret = db_lookup_(buf.as_ptr(), len as u32);
60
61 if ret < 0 {
62 return Err(ContractError::from(ret))
63 }
64
65 Ok(ret as u32)
66 }
67}
68
69pub fn db_get(db_handle: DbHandle, key: &[u8]) -> GenericResult<Option<Vec<u8>>> {
75 let mut len = 0;
76 let mut buf = vec![];
77 len += db_handle.encode(&mut buf)?;
78 len += key.to_vec().encode(&mut buf)?;
79
80 let ret = unsafe { db_get_(buf.as_ptr(), len as u32) };
81 wasm::util::parse_ret(ret)
82}
83
84pub fn db_contains_key(db_handle: DbHandle, key: &[u8]) -> GenericResult<bool> {
92 let mut len = 0;
93 let mut buf = vec![];
94 len += db_handle.encode(&mut buf)?;
95 len += key.to_vec().encode(&mut buf)?;
96
97 let ret = unsafe { db_contains_key_(buf.as_ptr(), len as u32) };
98
99 if ret < 0 {
100 return Err(ContractError::from(ret))
101 }
102
103 match ret {
104 0 => Ok(false),
105 1 => Ok(true),
106 _ => unreachable!(),
107 }
108}
109
110pub fn db_set(db_handle: DbHandle, key: &[u8], value: &[u8]) -> GenericResult<()> {
116 unsafe {
118 let mut len = 0;
119 let mut buf = vec![];
120 len += db_handle.encode(&mut buf)?;
121 len += key.to_vec().encode(&mut buf)?;
122 len += value.to_vec().encode(&mut buf)?;
123
124 let ret = db_set_(buf.as_ptr(), len as u32);
125
126 if ret != wasm::entrypoint::SUCCESS {
127 return Err(ContractError::from(ret))
128 }
129
130 Ok(())
131 }
132}
133
134pub fn db_del(db_handle: DbHandle, key: &[u8]) -> GenericResult<()> {
140 unsafe {
142 let mut len = 0;
143 let mut buf = vec![];
144 len += db_handle.encode(&mut buf)?;
145 len += key.to_vec().encode(&mut buf)?;
146
147 let ret = db_del_(buf.as_ptr(), len as u32);
148
149 if ret != wasm::entrypoint::SUCCESS {
150 return Err(ContractError::from(ret))
151 }
152
153 Ok(())
154 }
155}
156
157pub fn zkas_db_set(bincode: &[u8]) -> GenericResult<()> {
159 unsafe {
160 let mut len = 0;
161 let mut buf = vec![];
162 len += bincode.to_vec().encode(&mut buf)?;
163
164 let ret = zkas_db_set_(buf.as_ptr(), len as u32);
165
166 if ret != wasm::entrypoint::SUCCESS {
167 return Err(ContractError::from(ret))
168 }
169
170 Ok(())
171 }
172}
173
174extern "C" {
175 fn db_init_(ptr: *const u8, len: u32) -> i64;
176 fn db_lookup_(ptr: *const u8, len: u32) -> i64;
177 fn db_get_(ptr: *const u8, len: u32) -> i64;
178 fn db_contains_key_(ptr: *const u8, len: u32) -> i64;
179 fn db_set_(ptr: *const u8, len: u32) -> i64;
180 fn db_del_(ptr: *const u8, len: u32) -> i64;
181
182 fn zkas_db_set_(ptr: *const u8, len: u32) -> i64;
183}