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::KVStore for SQLMintDatabase<RM>
99where
100    RM: DatabasePool + 'static,
101{
102    async fn begin_transaction(
103        &self,
104    ) -> Result<Box<dyn cdk_common::database::KVStoreTransaction<Self::Err> + Send + Sync>, Error>
105    {
106        Ok(Box::new(SQLTransaction {
107            inner: ConnectionWithTransaction::new(
108                self.pool.get().map_err(|e| Error::Database(Box::new(e)))?,
109            )
110            .await?,
111        }))
112    }
113}