diff --git a/src/chat.rs b/src/chat.rs index e81416850..90fee9d19 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -866,13 +866,14 @@ impl ChatId { /// /// Returns `true`, if message was deleted, `false` otherwise. async fn maybe_delete_draft(self, context: &Context) -> Result { - match self.get_draft_msg_id(context).await? { - Some(msg_id) => { - msg_id.delete_from_db(context).await?; - Ok(true) - } - None => Ok(false), - } + Ok(context + .sql + .execute( + "DELETE FROM msgs WHERE chat_id=? AND state=?", + (self, MessageState::OutDraft), + ) + .await? + > 0) } /// Set provided message as draft message for specified chat. diff --git a/src/download.rs b/src/download.rs index d30dfb0a7..7fa657f90 100644 --- a/src/download.rs +++ b/src/download.rs @@ -335,7 +335,9 @@ mod tests { let msg = Message::load_from_db(&t, msg_id).await?; assert_eq!(msg.download_state(), *s); } - msg_id.delete_from_db(&t).await?; + t.sql + .execute("DELETE FROM msgs WHERE id=?", (msg_id,)) + .await?; // Nothing to do is ok. msg_id .update_download_state(&t, DownloadState::Done) diff --git a/src/message.rs b/src/message.rs index 99a780247..6a0770c77 100644 --- a/src/message.rs +++ b/src/message.rs @@ -148,21 +148,6 @@ impl MsgId { Ok(()) } - /// Deletes a message, corresponding MDNs and unsent SMTP messages from the database. - pub(crate) async fn delete_from_db(self, context: &Context) -> Result<()> { - context - .sql - .transaction(move |transaction| { - transaction.execute("DELETE FROM smtp WHERE msg_id=?", (self,))?; - transaction.execute("DELETE FROM msgs_mdns WHERE msg_id=?", (self,))?; - transaction.execute("DELETE FROM msgs_status_updates WHERE msg_id=?", (self,))?; - transaction.execute("DELETE FROM msgs WHERE id=?", (self,))?; - Ok(()) - }) - .await?; - Ok(()) - } - pub(crate) async fn set_delivered(self, context: &Context) -> Result<()> { update_msg_state(context, self, MessageState::OutDelivered).await?; let chat_id: ChatId = context diff --git a/src/sql/migrations.rs b/src/sql/migrations.rs index 10ce2f4e1..06ed60cdf 100644 --- a/src/sql/migrations.rs +++ b/src/sql/migrations.rs @@ -1046,6 +1046,30 @@ CREATE INDEX msgs_status_updates_index2 ON msgs_status_updates (uid); .await?; } + inc_and_check(&mut migration_version, 123)?; + if dbversion < migration_version { + // Add FOREIGN KEY(msg_id). + sql.execute_migration( + "CREATE TABLE new_msgs_status_updates ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + msg_id INTEGER, + update_item TEXT DEFAULT '', + uid TEXT UNIQUE, + FOREIGN KEY(msg_id) REFERENCES msgs(id) ON DELETE CASCADE + ); + INSERT OR IGNORE INTO new_msgs_status_updates SELECT + id, msg_id, update_item, uid + FROM msgs_status_updates; + DROP TABLE msgs_status_updates; + ALTER TABLE new_msgs_status_updates RENAME TO msgs_status_updates; + CREATE INDEX msgs_status_updates_index1 ON msgs_status_updates (msg_id); + CREATE INDEX msgs_status_updates_index2 ON msgs_status_updates (uid); + ", + migration_version, + ) + .await?; + } + let new_version = sql .get_raw_config_int(VERSION_CFG) .await?