From 4f30d738385f3890aee43f131ff651199d0f5ea5 Mon Sep 17 00:00:00 2001 From: Septias Date: Fri, 15 Nov 2024 11:33:59 +0100 Subject: [PATCH 01/11] fix: don't overwrite equal draft --- src/chat.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/chat.rs b/src/chat.rs index c1d2f3d1d8..62fc24c5ae 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -922,6 +922,25 @@ impl ChatId { && old_draft.chat_id == self && old_draft.state == MessageState::OutDraft { + // Do not overwrite draft if text and file are the same + if old_draft.text == msg.text { + if msg.param.get(Param::File).is_some() { + let blob = msg + .param + .get_blob(Param::File, context, !msg.is_increation()) + .await? + .context("no file stored in params")?; + let old_blob = old_draft + .param + .get_blob(Param::File, context, false) + .await? + .context("no file stored in params")?; + if blob == old_blob { + return Ok(false); + } + } + return Ok(false); + }; context .sql .execute( From 65c08c535cb2a5b255a4cb37782debe8835721aa Mon Sep 17 00:00:00 2001 From: Septias Date: Fri, 15 Nov 2024 11:34:03 +0100 Subject: [PATCH 02/11] add test --- src/chat.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/chat.rs b/src/chat.rs index 62fc24c5ae..3215576dff 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -7715,4 +7715,18 @@ mod tests { Ok(()) } + + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn test_do_not_overwrite_draft() -> Result<()> { + let mut tcm = TestContextManager::new(); + let alice = tcm.alice().await; + let mut msg = Message::new_text("This is a draft message".to_string()); + let self_chat = alice.get_self_chat().await.id; + self_chat.set_draft(&alice, Some(&mut msg)).await.unwrap(); + let draft1 = self_chat.get_draft(&alice).await?.unwrap(); + self_chat.set_draft(&alice, Some(&mut msg)).await.unwrap(); + let draft2 = self_chat.get_draft(&alice).await?.unwrap(); + assert_eq!(draft1.timestamp_sort, draft2.timestamp_sort); + Ok(()) + } } From 321806217bf3a8ea55f69aea448f0acbef370986 Mon Sep 17 00:00:00 2001 From: Septias Date: Fri, 15 Nov 2024 11:49:40 +0100 Subject: [PATCH 03/11] add wait --- src/chat.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/chat.rs b/src/chat.rs index 3215576dff..e81ba80e6a 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -7724,6 +7724,7 @@ mod tests { let self_chat = alice.get_self_chat().await.id; self_chat.set_draft(&alice, Some(&mut msg)).await.unwrap(); let draft1 = self_chat.get_draft(&alice).await?.unwrap(); + tokio::time::sleep(Duration::from_millis(800)).await; self_chat.set_draft(&alice, Some(&mut msg)).await.unwrap(); let draft2 = self_chat.get_draft(&alice).await?.unwrap(); assert_eq!(draft1.timestamp_sort, draft2.timestamp_sort); From 3bed43941b43ff29cd8fe9df4b88a0f9090f4714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kl=C3=A4hn?= <39526136+Septias@users.noreply.github.com> Date: Fri, 15 Nov 2024 12:49:53 +0100 Subject: [PATCH 04/11] Update src/chat.rs Co-authored-by: l --- src/chat.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat.rs b/src/chat.rs index e81ba80e6a..299751f267 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -929,7 +929,7 @@ impl ChatId { .param .get_blob(Param::File, context, !msg.is_increation()) .await? - .context("no file stored in params")?; + .context("No file stored in params")?; let old_blob = old_draft .param .get_blob(Param::File, context, false) From 5da54a76c1860561dd3358ad30895a44a1ebbb6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kl=C3=A4hn?= <39526136+Septias@users.noreply.github.com> Date: Fri, 15 Nov 2024 12:50:03 +0100 Subject: [PATCH 05/11] Update src/chat.rs Co-authored-by: l --- src/chat.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat.rs b/src/chat.rs index 299751f267..e7fb1c7423 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -934,7 +934,7 @@ impl ChatId { .param .get_blob(Param::File, context, false) .await? - .context("no file stored in params")?; + .context("No file stored in params")?; if blob == old_blob { return Ok(false); } From 9bcd84ba82a11073b9c05f2f898539163262b754 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kl=C3=A4hn?= Date: Fri, 15 Nov 2024 12:57:25 +0100 Subject: [PATCH 06/11] use system time shift --- src/chat.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat.rs b/src/chat.rs index e7fb1c7423..da71468f08 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -7724,7 +7724,7 @@ mod tests { let self_chat = alice.get_self_chat().await.id; self_chat.set_draft(&alice, Some(&mut msg)).await.unwrap(); let draft1 = self_chat.get_draft(&alice).await?.unwrap(); - tokio::time::sleep(Duration::from_millis(800)).await; + SystemTime::shift(Duration::from_secs(1)).await; self_chat.set_draft(&alice, Some(&mut msg)).await.unwrap(); let draft2 = self_chat.get_draft(&alice).await?.unwrap(); assert_eq!(draft1.timestamp_sort, draft2.timestamp_sort); From 588d94476026d539d52609fc0448767afb0d5acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kl=C3=A4hn?= Date: Sat, 16 Nov 2024 10:31:30 +0100 Subject: [PATCH 07/11] use transaction --- src/chat.rs | 58 +++++++++++++++++++---------------------------------- 1 file changed, 21 insertions(+), 37 deletions(-) diff --git a/src/chat.rs b/src/chat.rs index da71468f08..a240d81532 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -922,43 +922,27 @@ impl ChatId { && old_draft.chat_id == self && old_draft.state == MessageState::OutDraft { - // Do not overwrite draft if text and file are the same - if old_draft.text == msg.text { - if msg.param.get(Param::File).is_some() { - let blob = msg - .param - .get_blob(Param::File, context, !msg.is_increation()) - .await? - .context("No file stored in params")?; - let old_blob = old_draft - .param - .get_blob(Param::File, context, false) - .await? - .context("No file stored in params")?; - if blob == old_blob { - return Ok(false); - } + return context.sql.transaction(|transaction| { + let affected_rows = transaction.execute( + "UPDATE msgs + SET type=$1,txt=$2,txt_normalized=$3,param=$4,mime_in_reply_to=$5 + WHERE id=? AND (type <> $1 OR txt <> $2 OR txt_normalized <> $3 OR param <> $4 OR mime_in_reply_to <> $5);", + ( + msg.viewtype, + &msg.text, + message::normalize_text(&msg.text), + msg.param.to_string(), + msg.in_reply_to.as_deref().unwrap_or_default(), + msg.id, + ), + )?; + if affected_rows > 0 { + transaction.execute("UPDATE msgs SET timestamp=? WHERE id=?;", (time(),msg.id))?; + Ok(true) + } else { + Ok(false) } - return Ok(false); - }; - context - .sql - .execute( - "UPDATE msgs - SET timestamp=?,type=?,txt=?,txt_normalized=?,param=?,mime_in_reply_to=? - WHERE id=?;", - ( - time(), - msg.viewtype, - &msg.text, - message::normalize_text(&msg.text), - msg.param.to_string(), - msg.in_reply_to.as_deref().unwrap_or_default(), - msg.id, - ), - ) - .await?; - return Ok(true); + }).await; } } } @@ -7724,7 +7708,7 @@ mod tests { let self_chat = alice.get_self_chat().await.id; self_chat.set_draft(&alice, Some(&mut msg)).await.unwrap(); let draft1 = self_chat.get_draft(&alice).await?.unwrap(); - SystemTime::shift(Duration::from_secs(1)).await; + SystemTime::shift(Duration::from_secs(1)); self_chat.set_draft(&alice, Some(&mut msg)).await.unwrap(); let draft2 = self_chat.get_draft(&alice).await?.unwrap(); assert_eq!(draft1.timestamp_sort, draft2.timestamp_sort); From 4c3eb3f812902ef46b0ff83a1435e238b4f3f163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kl=C3=A4hn?= Date: Sat, 16 Nov 2024 13:18:18 +0100 Subject: [PATCH 08/11] fmt & fixes --- src/chat.rs | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/chat.rs b/src/chat.rs index a240d81532..d8f380bcfb 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -922,11 +922,18 @@ impl ChatId { && old_draft.chat_id == self && old_draft.state == MessageState::OutDraft { - return context.sql.transaction(|transaction| { - let affected_rows = transaction.execute( + return context + .sql + .transaction(|transaction| { + let affected_rows = transaction.execute( "UPDATE msgs - SET type=$1,txt=$2,txt_normalized=$3,param=$4,mime_in_reply_to=$5 - WHERE id=? AND (type <> $1 OR txt <> $2 OR txt_normalized <> $3 OR param <> $4 OR mime_in_reply_to <> $5);", + SET type=?1,txt=?2,txt_normalized=?3,param=?4,mime_in_reply_to=?5 + WHERE id=? + AND (type <> ?1 + OR txt <> ?2 + OR txt_normalized <> ?3 + OR param <> ?4 + OR mime_in_reply_to <> ?5);", ( msg.viewtype, &msg.text, @@ -936,13 +943,17 @@ impl ChatId { msg.id, ), )?; - if affected_rows > 0 { - transaction.execute("UPDATE msgs SET timestamp=? WHERE id=?;", (time(),msg.id))?; - Ok(true) - } else { - Ok(false) - } - }).await; + if affected_rows > 0 { + transaction.execute( + "UPDATE msgs SET timestamp=? WHERE id=?;", + (time(), msg.id), + )?; + Ok(true) + } else { + Ok(false) + } + }) + .await; } } } From e670a328619cc4255119887db23f29198c053bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kl=C3=A4hn?= Date: Sat, 16 Nov 2024 15:29:29 +0100 Subject: [PATCH 09/11] immediately set timestamp --- src/chat.rs | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/chat.rs b/src/chat.rs index d8f380bcfb..038511780c 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -927,14 +927,15 @@ impl ChatId { .transaction(|transaction| { let affected_rows = transaction.execute( "UPDATE msgs - SET type=?1,txt=?2,txt_normalized=?3,param=?4,mime_in_reply_to=?5 - WHERE id=? - AND (type <> ?1 - OR txt <> ?2 - OR txt_normalized <> ?3 - OR param <> ?4 - OR mime_in_reply_to <> ?5);", + SET timestamp=?1,type=?2,txt=?3,txt_normalized=?4,param=?5,mime_in_reply_to=?6 + WHERE id=?7 + AND (type <> ?2 + OR txt <> ?3 + OR txt_normalized <> ?4 + OR param <> ?5 + OR mime_in_reply_to <> ?6);", ( + time(), msg.viewtype, &msg.text, message::normalize_text(&msg.text), @@ -944,10 +945,6 @@ impl ChatId { ), )?; if affected_rows > 0 { - transaction.execute( - "UPDATE msgs SET timestamp=? WHERE id=?;", - (time(), msg.id), - )?; Ok(true) } else { Ok(false) From 56fed531017acf3d849670e957076d3e3af7c692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kl=C3=A4hn?= Date: Sat, 16 Nov 2024 21:40:21 +0100 Subject: [PATCH 10/11] use normal execute query --- src/chat.rs | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/chat.rs b/src/chat.rs index 038511780c..23234c4577 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -922,10 +922,8 @@ impl ChatId { && old_draft.chat_id == self && old_draft.state == MessageState::OutDraft { - return context - .sql - .transaction(|transaction| { - let affected_rows = transaction.execute( + let affected_rows = context + .sql.execute( "UPDATE msgs SET timestamp=?1,type=?2,txt=?3,txt_normalized=?4,param=?5,mime_in_reply_to=?6 WHERE id=?7 @@ -943,14 +941,12 @@ impl ChatId { msg.in_reply_to.as_deref().unwrap_or_default(), msg.id, ), - )?; - if affected_rows > 0 { - Ok(true) - } else { - Ok(false) - } - }) - .await; + ).await?; + if affected_rows > 0 { + return Ok(true); + } else { + return Ok(false); + } } } } From 4dc4d6cf59177854800acd503c33fd62ea84ed9e Mon Sep 17 00:00:00 2001 From: Septias Date: Sun, 17 Nov 2024 09:26:46 +0100 Subject: [PATCH 11/11] simplify return --- src/chat.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/chat.rs b/src/chat.rs index 23234c4577..641791c92c 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -942,11 +942,7 @@ impl ChatId { msg.id, ), ).await?; - if affected_rows > 0 { - return Ok(true); - } else { - return Ok(false); - } + return Ok(affected_rows > 0); } } }