#[async_trait]
impl SignalStore for MyCustomStore {
// --- Identity Operations ---
async fn put_identity(&self, address: &str, key: [u8; 32]) -> Result<()> {
self.connection.execute(
"INSERT OR REPLACE INTO identities (address, key) VALUES (?, ?)",
&[address, &key[..]],
).await?;
Ok(())
}
async fn load_identity(&self, address: &str) -> Result<Option<Vec<u8>>> {
let row = self.connection.query_optional(
"SELECT key FROM identities WHERE address = ?",
&[address],
).await?;
Ok(row.map(|r| r.get(0)))
}
async fn delete_identity(&self, address: &str) -> Result<()> {
self.connection.execute(
"DELETE FROM identities WHERE address = ?",
&[address],
).await?;
Ok(())
}
// --- Session Operations ---
async fn get_session(&self, address: &str) -> Result<Option<Vec<u8>>> {
let row = self.connection.query_optional(
"SELECT record FROM sessions WHERE address = ?",
&[address],
).await?;
Ok(row.map(|r| r.get(0)))
}
async fn put_session(&self, address: &str, session: &[u8]) -> Result<()> {
self.connection.execute(
"INSERT OR REPLACE INTO sessions (address, record) VALUES (?, ?)",
&[address, session],
).await?;
Ok(())
}
async fn delete_session(&self, address: &str) -> Result<()> {
self.connection.execute(
"DELETE FROM sessions WHERE address = ?",
&[address],
).await?;
Ok(())
}
// --- PreKey Operations ---
async fn store_prekey(&self, id: u32, record: &[u8], uploaded: bool) -> Result<()> {
self.connection.execute(
"INSERT OR REPLACE INTO prekeys (id, record, uploaded) VALUES (?, ?, ?)",
&[&id, record, &(uploaded as i32)],
).await?;
Ok(())
}
async fn load_prekey(&self, id: u32) -> Result<Option<Vec<u8>>> {
let row = self.connection.query_optional(
"SELECT record FROM prekeys WHERE id = ?",
&[&id],
).await?;
Ok(row.map(|r| r.get(0)))
}
async fn remove_prekey(&self, id: u32) -> Result<()> {
self.connection.execute(
"DELETE FROM prekeys WHERE id = ?",
&[&id],
).await?;
Ok(())
}
// --- Signed PreKey Operations ---
async fn store_signed_prekey(&self, id: u32, record: &[u8]) -> Result<()> {
self.connection.execute(
"INSERT OR REPLACE INTO signed_prekeys (id, record) VALUES (?, ?)",
&[&id, record],
).await?;
Ok(())
}
async fn load_signed_prekey(&self, id: u32) -> Result<Option<Vec<u8>>> {
let row = self.connection.query_optional(
"SELECT record FROM signed_prekeys WHERE id = ?",
&[&id],
).await?;
Ok(row.map(|r| r.get(0)))
}
async fn load_all_signed_prekeys(&self) -> Result<Vec<(u32, Vec<u8>)>> {
let rows = self.connection.query(
"SELECT id, record FROM signed_prekeys",
&[],
).await?;
Ok(rows.into_iter().map(|r| (r.get(0), r.get(1))).collect())
}
async fn remove_signed_prekey(&self, id: u32) -> Result<()> {
self.connection.execute(
"DELETE FROM signed_prekeys WHERE id = ?",
&[&id],
).await?;
Ok(())
}
// --- Sender Key Operations ---
async fn put_sender_key(&self, address: &str, record: &[u8]) -> Result<()> {
self.connection.execute(
"INSERT OR REPLACE INTO sender_keys (address, record) VALUES (?, ?)",
&[address, record],
).await?;
Ok(())
}
async fn get_sender_key(&self, address: &str) -> Result<Option<Vec<u8>>> {
let row = self.connection.query_optional(
"SELECT record FROM sender_keys WHERE address = ?",
&[address],
).await?;
Ok(row.map(|r| r.get(0)))
}
async fn delete_sender_key(&self, address: &str) -> Result<()> {
self.connection.execute(
"DELETE FROM sender_keys WHERE address = ?",
&[address],
).await?;
Ok(())
}
}