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_remove(
48        &mut self,
49        primary_namespace: &str,
50        secondary_namespace: &str,
51        key: &str,
52    ) -> Result<(), Error> {
53        crate::keyvalue::kv_remove_in_transaction(
54            &self.inner,
55            primary_namespace,
56            secondary_namespace,
57            key,
58        )
59        .await
60    }
61
62    async fn kv_list(
63        &mut self,
64        primary_namespace: &str,
65        secondary_namespace: &str,
66    ) -> Result<Vec<String>, Error> {
67        crate::keyvalue::kv_list_in_transaction(&self.inner, primary_namespace, secondary_namespace)
68            .await
69    }
70}
71
72#[async_trait]
73impl<RM> cdk_common::database::KVStoreDatabase for SQLMintDatabase<RM>
74where
75    RM: DatabasePool + 'static,
76{
77    type Err = Error;
78
79    async fn kv_read(
80        &self,
81        primary_namespace: &str,
82        secondary_namespace: &str,
83        key: &str,
84    ) -> Result<Option<Vec<u8>>, Error> {
85        crate::keyvalue::kv_read(&self.pool, primary_namespace, secondary_namespace, key).await
86    }
87
88    async fn kv_list(
89        &self,
90        primary_namespace: &str,
91        secondary_namespace: &str,
92    ) -> Result<Vec<String>, Error> {
93        crate::keyvalue::kv_list(&self.pool, primary_namespace, secondary_namespace).await
94    }
95}
96
97#[async_trait]
98impl<RM> cdk_common::database::KVStoreCompareAndSwap for SQLMintDatabase<RM>
99where
100    RM: DatabasePool + 'static,
101{
102    async fn kv_compare_and_swap(
103        &self,
104        primary_namespace: &str,
105        secondary_namespace: &str,
106        key: &str,
107        expected: Option<&[u8]>,
108        replacement: &[u8],
109    ) -> Result<bool, Self::Err> {
110        crate::keyvalue::kv_compare_and_swap(
111            &self.pool,
112            primary_namespace,
113            secondary_namespace,
114            key,
115            expected,
116            replacement,
117        )
118        .await
119    }
120}
121
122#[async_trait]
123impl<RM> cdk_common::database::KVStore for SQLMintDatabase<RM>
124where
125    RM: DatabasePool + 'static,
126{
127    async fn begin_transaction(
128        &self,
129    ) -> Result<Box<dyn cdk_common::database::KVStoreTransaction<Self::Err> + Send + Sync>, Error>
130    {
131        Ok(Box::new(SQLTransaction {
132            inner: ConnectionWithTransaction::new(
133                self.pool
134                    .get()
135                    .await
136                    .map_err(|e| Error::Database(Box::new(e)))?,
137            )
138            .await?,
139        }))
140    }
141}