From 67d95150331af2b661e2e677fde339b52def8e78 Mon Sep 17 00:00:00 2001 From: holger krekel Date: Fri, 26 Jul 2019 01:03:03 +0200 Subject: [PATCH] (jikstra, hpk) fix markseen logic to work like C: ignore if we get no rows for a message (eg desktop calls itwith msg_id=9 which is a special id -- and C just ignored it) --- python/src/deltachat/account.py | 15 +++++++++++++-- python/tests/test_lowlevel.py | 11 +++++++++++ src/dc_msg.rs | 8 ++++++-- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/python/src/deltachat/account.py b/python/src/deltachat/account.py index 02329c5f7..777ce0eed 100644 --- a/python/src/deltachat/account.py +++ b/python/src/deltachat/account.py @@ -7,9 +7,9 @@ import re import time from array import array try: - from queue import Queue + from queue import Queue, Empty except ImportError: - from Queue import Queue + from Queue import Queue, Empty import deltachat from . import const @@ -439,6 +439,17 @@ class EventLogger: raise ValueError("{}({!r},{!r})".format(*ev)) return ev + def ensure_event_not_queued(self, event_name_regex): + __tracebackhide__ = True + rex = re.compile("(?:{}).*".format(event_name_regex)) + while 1: + try: + ev = self._event_queue.get(False) + except Empty: + break + else: + assert not rex.match(ev[0]), "event found {}".format(ev) + def get_matching(self, event_name_regex, check_error=True): self._log("-- waiting for event with regex: {} --".format(event_name_regex)) rex = re.compile("(?:{}).*".format(event_name_regex)) diff --git a/python/tests/test_lowlevel.py b/python/tests/test_lowlevel.py index a21efdd3c..d0061afef 100644 --- a/python/tests/test_lowlevel.py +++ b/python/tests/test_lowlevel.py @@ -64,3 +64,14 @@ def test_sig(): assert sig(const.DC_EVENT_SMTP_CONNECTED) == 2 assert sig(const.DC_EVENT_IMAP_CONNECTED) == 2 assert sig(const.DC_EVENT_SMTP_MESSAGE_SENT) == 2 + + +def test_markseen_invalid_message_ids(acfactory): + ac1 = acfactory.get_configured_offline_account() + contact1 = ac1.create_contact(email="some1@example.com", name="some1") + chat = ac1.create_chat_by_contact(contact1) + chat.send_text("one messae") + ac1._evlogger.get_matching("DC_EVENT_MSGS_CHANGED") + msg_ids = [9] + lib.dc_markseen_msgs(ac1._dc_context, msg_ids, len(msg_ids)) + ac1._evlogger.ensure_event_not_queued("DC_EVENT_WARNING|DC_EVENT_ERROR") diff --git a/src/dc_msg.rs b/src/dc_msg.rs index e303aaf12..79e01046f 100644 --- a/src/dc_msg.rs +++ b/src/dc_msg.rs @@ -552,9 +552,13 @@ pub fn dc_markseen_msgs(context: &Context, msg_ids: *const u32, msg_cnt: usize) let mut res = Vec::with_capacity(msg_cnt); for i in 0..msg_cnt { let id = unsafe { *msg_ids.offset(i as isize) }; - let (state, blocked) = stmt.query_row(params![id as i32], |row| { + let query_res = stmt.query_row(params![id as i32], |row| { Ok((row.get::<_, i32>(0)?, row.get::<_, Option>(1)?.unwrap_or_default())) - })?; + }); + if let Err(rusqlite::Error::QueryReturnedNoRows) = query_res { + continue; + } + let (state, blocked) = query_res?; res.push((id, state, blocked)); } Ok(res)