1use async_trait::async_trait;
4use cdk_common::database::Error;
5
6use super::{SQLMintDatabase, SQLTransaction};
7use crate::database::ConnectionWithTransaction;
8use crate::pool::DatabasePool;
9
10#[async_trait]
11impl<RM> cdk_common::database::KVStoreTransaction<Error> for SQLTransaction<RM>
12where
13 RM: DatabasePool + 'static,
14{
15 async fn kv_read(
16 &mut self,
17 primary_namespace: &str,
18 secondary_namespace: &str,
19 key: &str,
20 ) -> Result<Option<Vec<u8>>, Error> {
21 crate::keyvalue::kv_read_in_transaction(
22 &self.inner,
23 primary_namespace,
24 secondary_namespace,
25 key,
26 )
27 .await
28 }
29
30 async fn kv_write(
31 &mut self,
32 primary_namespace: &str,
33 secondary_namespace: &str,
34 key: &str,
35 value: &[u8],
36 ) -> Result<(), Error> {
37 crate::keyvalue::kv_write_in_transaction(
38 &self.inner,
39 primary_namespace,
40 secondary_namespace,
41 key,
42 value,
43 )
44 .await
45 }
46
47 async fn kv_write_if_absent(
48 &mut self,
49 primary_namespace: &str,
50 secondary_namespace: &str,
51 key: &str,
52 value: &[u8],
53 ) -> Result<bool, Error> {
54 crate::keyvalue::kv_write_if_absent_in_transaction(
55 &self.inner,
56 primary_namespace,
57 secondary_namespace,
58 key,
59 value,
60 )
61 .await
62 }
63
64 async fn kv_remove(
65 &mut self,
66 primary_namespace: &str,
67 secondary_namespace: &str,
68 key: &str,
69 ) -> Result<(), Error> {
70 crate::keyvalue::kv_remove_in_transaction(
71 &self.inner,
72 primary_namespace,
73 secondary_namespace,
74 key,
75 )
76 .await
77 }
78
79 async fn kv_write_if_equals(
80 &mut self,
81 primary_namespace: &str,
82 secondary_namespace: &str,
83 key: &str,
84 expected: &[u8],
85 replacement: &[u8],
86 ) -> Result<bool, Error> {
87 crate::keyvalue::kv_write_if_equals_in_transaction(
88 &self.inner,
89 primary_namespace,
90 secondary_namespace,
91 key,
92 expected,
93 replacement,
94 )
95 .await
96 }
97
98 async fn kv_list(
99 &mut self,
100 primary_namespace: &str,
101 secondary_namespace: &str,
102 ) -> Result<Vec<String>, Error> {
103 crate::keyvalue::kv_list_in_transaction(&self.inner, primary_namespace, secondary_namespace)
104 .await
105 }
106}
107
108#[async_trait]
109impl<RM> cdk_common::database::KVStoreDatabase for SQLMintDatabase<RM>
110where
111 RM: DatabasePool + 'static,
112{
113 type Err = Error;
114
115 async fn kv_read(
116 &self,
117 primary_namespace: &str,
118 secondary_namespace: &str,
119 key: &str,
120 ) -> Result<Option<Vec<u8>>, Error> {
121 crate::keyvalue::kv_read(&self.pool, primary_namespace, secondary_namespace, key).await
122 }
123
124 async fn kv_list(
125 &self,
126 primary_namespace: &str,
127 secondary_namespace: &str,
128 ) -> Result<Vec<String>, Error> {
129 crate::keyvalue::kv_list(&self.pool, primary_namespace, secondary_namespace).await
130 }
131}
132
133#[async_trait]
134impl<RM> cdk_common::database::KVStoreCompareAndSwap for SQLMintDatabase<RM>
135where
136 RM: DatabasePool + 'static,
137{
138 async fn kv_compare_and_swap(
139 &self,
140 primary_namespace: &str,
141 secondary_namespace: &str,
142 key: &str,
143 expected: Option<&[u8]>,
144 replacement: &[u8],
145 ) -> Result<bool, Self::Err> {
146 crate::keyvalue::kv_compare_and_swap(
147 &self.pool,
148 primary_namespace,
149 secondary_namespace,
150 key,
151 expected,
152 replacement,
153 )
154 .await
155 }
156}
157
158#[async_trait]
159impl<RM> cdk_common::database::KVStore for SQLMintDatabase<RM>
160where
161 RM: DatabasePool + 'static,
162{
163 async fn begin_transaction(
164 &self,
165 ) -> Result<Box<dyn cdk_common::database::KVStoreTransaction<Self::Err> + Send + Sync>, Error>
166 {
167 Ok(Box::new(SQLTransaction {
168 inner: ConnectionWithTransaction::new(
169 self.pool
170 .get()
171 .await
172 .map_err(|e| Error::Database(Box::new(e)))?,
173 )
174 .await?,
175 }))
176 }
177}