Skip to main content

cdk_sql_common/mint/
keyvalue.rs

1//! Key-Value store database implementation
2
3use 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}