keyvalue.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //! Key-Value store database implementation
  2. use async_trait::async_trait;
  3. use cdk_common::database::Error;
  4. use super::{SQLMintDatabase, SQLTransaction};
  5. use crate::database::ConnectionWithTransaction;
  6. use crate::pool::DatabasePool;
  7. #[async_trait]
  8. impl<RM> cdk_common::database::KVStoreTransaction<Error> for SQLTransaction<RM>
  9. where
  10. RM: DatabasePool + 'static,
  11. {
  12. async fn kv_read(
  13. &mut self,
  14. primary_namespace: &str,
  15. secondary_namespace: &str,
  16. key: &str,
  17. ) -> Result<Option<Vec<u8>>, Error> {
  18. crate::keyvalue::kv_read_in_transaction(
  19. &self.inner,
  20. primary_namespace,
  21. secondary_namespace,
  22. key,
  23. )
  24. .await
  25. }
  26. async fn kv_write(
  27. &mut self,
  28. primary_namespace: &str,
  29. secondary_namespace: &str,
  30. key: &str,
  31. value: &[u8],
  32. ) -> Result<(), Error> {
  33. crate::keyvalue::kv_write_in_transaction(
  34. &self.inner,
  35. primary_namespace,
  36. secondary_namespace,
  37. key,
  38. value,
  39. )
  40. .await
  41. }
  42. async fn kv_remove(
  43. &mut self,
  44. primary_namespace: &str,
  45. secondary_namespace: &str,
  46. key: &str,
  47. ) -> Result<(), Error> {
  48. crate::keyvalue::kv_remove_in_transaction(
  49. &self.inner,
  50. primary_namespace,
  51. secondary_namespace,
  52. key,
  53. )
  54. .await
  55. }
  56. async fn kv_list(
  57. &mut self,
  58. primary_namespace: &str,
  59. secondary_namespace: &str,
  60. ) -> Result<Vec<String>, Error> {
  61. crate::keyvalue::kv_list_in_transaction(&self.inner, primary_namespace, secondary_namespace)
  62. .await
  63. }
  64. }
  65. #[async_trait]
  66. impl<RM> cdk_common::database::KVStoreDatabase for SQLMintDatabase<RM>
  67. where
  68. RM: DatabasePool + 'static,
  69. {
  70. type Err = Error;
  71. async fn kv_read(
  72. &self,
  73. primary_namespace: &str,
  74. secondary_namespace: &str,
  75. key: &str,
  76. ) -> Result<Option<Vec<u8>>, Error> {
  77. crate::keyvalue::kv_read(&self.pool, primary_namespace, secondary_namespace, key).await
  78. }
  79. async fn kv_list(
  80. &self,
  81. primary_namespace: &str,
  82. secondary_namespace: &str,
  83. ) -> Result<Vec<String>, Error> {
  84. crate::keyvalue::kv_list(&self.pool, primary_namespace, secondary_namespace).await
  85. }
  86. }
  87. #[async_trait]
  88. impl<RM> cdk_common::database::KVStore for SQLMintDatabase<RM>
  89. where
  90. RM: DatabasePool + 'static,
  91. {
  92. async fn begin_transaction(
  93. &self,
  94. ) -> Result<Box<dyn cdk_common::database::KVStoreTransaction<Self::Err> + Send + Sync>, Error>
  95. {
  96. Ok(Box::new(SQLTransaction {
  97. inner: ConnectionWithTransaction::new(
  98. self.pool.get().map_err(|e| Error::Database(Box::new(e)))?,
  99. )
  100. .await?,
  101. }))
  102. }
  103. }