xmtp_db/encrypted_store/
key_store_entry.rs1use diesel::prelude::*;
2
3use super::{ConnectionExt, StorageError, db_connection::DbConnection, schema::openmls_key_store};
4use crate::{Delete, impl_fetch, impl_store};
5
6#[derive(Insertable, Queryable, Debug, Clone)]
7#[diesel(table_name = openmls_key_store)]
8#[diesel(primary_key(key_bytes))]
9pub struct StoredKeyStoreEntry {
10 pub key_bytes: Vec<u8>,
11 pub value_bytes: Vec<u8>,
12}
13
14impl_fetch!(StoredKeyStoreEntry, openmls_key_store, Vec<u8>);
15impl_store!(StoredKeyStoreEntry, openmls_key_store);
16
17impl<C: ConnectionExt> Delete<StoredKeyStoreEntry> for DbConnection<C> {
18 type Key = Vec<u8>;
19 fn delete(&self, key: Vec<u8>) -> Result<usize, StorageError> where {
20 use super::schema::openmls_key_store::dsl::*;
21 Ok(self.raw_query_write(|conn| {
22 diesel::delete(openmls_key_store.filter(key_bytes.eq(key))).execute(conn)
23 })?)
24 }
25}
26
27pub trait QueryKeyStoreEntry {
28 fn insert_or_update_key_store_entry(
29 &self,
30 key: Vec<u8>,
31 value: Vec<u8>,
32 ) -> Result<(), StorageError>;
33}
34
35impl<T> QueryKeyStoreEntry for &T
36where
37 T: QueryKeyStoreEntry,
38{
39 fn insert_or_update_key_store_entry(
40 &self,
41 key: Vec<u8>,
42 value: Vec<u8>,
43 ) -> Result<(), StorageError> {
44 (**self).insert_or_update_key_store_entry(key, value)
45 }
46}
47
48impl<C: ConnectionExt> QueryKeyStoreEntry for DbConnection<C> {
49 fn insert_or_update_key_store_entry(
50 &self,
51 key: Vec<u8>,
52 value: Vec<u8>,
53 ) -> Result<(), StorageError> {
54 use super::schema::openmls_key_store::dsl::*;
55 let entry = StoredKeyStoreEntry {
56 key_bytes: key,
57 value_bytes: value,
58 };
59
60 self.raw_query_write(|conn| {
61 diesel::replace_into(openmls_key_store)
62 .values(entry)
63 .execute(conn)
64 })?;
65 Ok(())
66 }
67}