message: bubble up SQL errors in handle_mdn()

Previously handle_mdn() returned Ok(None) in response to SQL errors as
if SQL simply returned no rows.
This commit is contained in:
link2xt
2021-08-01 01:52:43 +03:00
parent ffb17c4e61
commit 265d54e431

View File

@@ -1644,7 +1644,7 @@ pub async fn handle_mdn(
let res = context let res = context
.sql .sql
.query_row( .query_row_optional(
concat!( concat!(
"SELECT", "SELECT",
" m.id AS msg_id,", " m.id AS msg_id,",
@@ -1665,75 +1665,82 @@ pub async fn handle_mdn(
)) ))
}, },
) )
.await; .await?;
if let Err(ref err) = res {
info!(context, "Failed to select MDN {:?}", err);
}
if let Ok((msg_id, chat_id, chat_type, msg_state)) = res { let (msg_id, chat_id, chat_type, msg_state) = if let Some(res) = res {
let mut read_by_all = false; res
} else {
info!(
context,
"handle_mdn found no message with Message-ID {:?} sent by us in the database",
rfc724_mid
);
return Ok(None);
};
if msg_state == MessageState::OutPreparing let mut read_by_all = false;
|| msg_state == MessageState::OutPending if msg_state == MessageState::OutPreparing
|| msg_state == MessageState::OutDelivered || msg_state == MessageState::OutPending
{ || msg_state == MessageState::OutDelivered
let mdn_already_in_table = context {
let mdn_already_in_table = context
.sql
.exists(
"SELECT COUNT(*) FROM msgs_mdns WHERE msg_id=? AND contact_id=?;",
paramsv![msg_id, from_id as i32,],
)
.await
.unwrap_or_default();
if !mdn_already_in_table {
context
.sql .sql
.exists( .execute(
"SELECT COUNT(*) FROM msgs_mdns WHERE msg_id=? AND contact_id=?;",
paramsv![msg_id, from_id as i32,],
)
.await
.unwrap_or_default();
if !mdn_already_in_table {
context.sql.execute(
"INSERT INTO msgs_mdns (msg_id, contact_id, timestamp_sent) VALUES (?, ?, ?);", "INSERT INTO msgs_mdns (msg_id, contact_id, timestamp_sent) VALUES (?, ?, ?);",
paramsv![msg_id, from_id as i32, timestamp_sent], paramsv![msg_id, from_id as i32, timestamp_sent],
) )
.await .await
.unwrap_or_default(); // TODO: better error handling .unwrap_or_default(); // TODO: better error handling
} }
// Normal chat? that's quite easy. // Normal chat? that's quite easy.
if chat_type == Chattype::Single { if chat_type == Chattype::Single {
update_msg_state(context, msg_id, MessageState::OutMdnRcvd).await;
read_by_all = true;
} else {
// send event about new state
let ist_cnt = context
.sql
.count(
"SELECT COUNT(*) FROM msgs_mdns WHERE msg_id=?;",
paramsv![msg_id],
)
.await?;
// Groupsize: Min. MDNs
// 1 S n/a
// 2 SR 1
// 3 SRR 2
// 4 SRRR 2
// 5 SRRRR 3
// 6 SRRRRR 3
//
// (S=Sender, R=Recipient)
// for rounding, SELF is already included!
let soll_cnt = (chat::get_chat_contact_cnt(context, chat_id).await? + 1) / 2;
if ist_cnt >= soll_cnt {
update_msg_state(context, msg_id, MessageState::OutMdnRcvd).await; update_msg_state(context, msg_id, MessageState::OutMdnRcvd).await;
read_by_all = true; read_by_all = true;
} else { } // else wait for more receipts
// send event about new state
let ist_cnt = context
.sql
.count(
"SELECT COUNT(*) FROM msgs_mdns WHERE msg_id=?;",
paramsv![msg_id],
)
.await?;
// Groupsize: Min. MDNs
// 1 S n/a
// 2 SR 1
// 3 SRR 2
// 4 SRRR 2
// 5 SRRRR 3
// 6 SRRRRR 3
//
// (S=Sender, R=Recipient)
// for rounding, SELF is already included!
let soll_cnt = (chat::get_chat_contact_cnt(context, chat_id).await? + 1) / 2;
if ist_cnt >= soll_cnt {
update_msg_state(context, msg_id, MessageState::OutMdnRcvd).await;
read_by_all = true;
} // else wait for more receipts
}
} }
return if read_by_all {
Ok(Some((chat_id, msg_id)))
} else {
Ok(None)
};
} }
Ok(None)
if read_by_all {
Ok(Some((chat_id, msg_id)))
} else {
Ok(None)
}
} }
/// Marks a message as failed after an ndn (non-delivery-notification) arrived. /// Marks a message as failed after an ndn (non-delivery-notification) arrived.