mirror of
https://github.com/chatmail/core.git
synced 2026-05-07 08:56:30 +03:00
fix: take transport_id into account when using imap table
This commit is contained in:
@@ -153,11 +153,15 @@ pub(crate) async fn download_msg(
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let transport_id = session.transport_id();
|
||||||
let row = context
|
let row = context
|
||||||
.sql
|
.sql
|
||||||
.query_row_optional(
|
.query_row_optional(
|
||||||
"SELECT uid, folder FROM imap WHERE rfc724_mid=? AND target!=''",
|
"SELECT uid, folder FROM imap
|
||||||
(&msg.rfc724_mid,),
|
WHERE rfc724_mid=?
|
||||||
|
AND transport_id=?
|
||||||
|
AND target!=''",
|
||||||
|
(&msg.rfc724_mid, transport_id),
|
||||||
|row| {
|
|row| {
|
||||||
let server_uid: u32 = row.get(0)?;
|
let server_uid: u32 = row.get(0)?;
|
||||||
let server_folder: String = row.get(1)?;
|
let server_folder: String = row.get(1)?;
|
||||||
|
|||||||
26
src/imap.rs
26
src/imap.rs
@@ -916,7 +916,7 @@ impl Session {
|
|||||||
context
|
context
|
||||||
.sql
|
.sql
|
||||||
.transaction(move |transaction| {
|
.transaction(move |transaction| {
|
||||||
transaction.execute("DELETE FROM imap WHERE folder=?", (folder,))?;
|
transaction.execute("DELETE FROM imap WHERE transport_id=? AND folder=?", (transport_id, folder,))?;
|
||||||
for (uid, (rfc724_mid, target)) in &msgs {
|
for (uid, (rfc724_mid, target)) in &msgs {
|
||||||
// This may detect previously undetected moved
|
// This may detect previously undetected moved
|
||||||
// messages, so we update server_folder too.
|
// messages, so we update server_folder too.
|
||||||
@@ -1054,14 +1054,16 @@ impl Session {
|
|||||||
///
|
///
|
||||||
/// This is the only place where messages are moved or deleted on the IMAP server.
|
/// This is the only place where messages are moved or deleted on the IMAP server.
|
||||||
async fn move_delete_messages(&mut self, context: &Context, folder: &str) -> Result<()> {
|
async fn move_delete_messages(&mut self, context: &Context, folder: &str) -> Result<()> {
|
||||||
|
let transport_id = self.transport_id();
|
||||||
let rows = context
|
let rows = context
|
||||||
.sql
|
.sql
|
||||||
.query_map_vec(
|
.query_map_vec(
|
||||||
"SELECT id, uid, target FROM imap
|
"SELECT id, uid, target FROM imap
|
||||||
WHERE folder = ?
|
WHERE folder = ?
|
||||||
AND target != folder
|
AND transport_id = ?
|
||||||
ORDER BY target, uid",
|
AND target != folder
|
||||||
(folder,),
|
ORDER BY target, uid",
|
||||||
|
(folder, transport_id),
|
||||||
|row| {
|
|row| {
|
||||||
let rowid: i64 = row.get(0)?;
|
let rowid: i64 = row.get(0)?;
|
||||||
let uid: u32 = row.get(1)?;
|
let uid: u32 = row.get(1)?;
|
||||||
@@ -1277,10 +1279,10 @@ impl Session {
|
|||||||
};
|
};
|
||||||
let is_seen = fetch.flags().any(|flag| flag == Flag::Seen);
|
let is_seen = fetch.flags().any(|flag| flag == Flag::Seen);
|
||||||
if is_seen
|
if is_seen
|
||||||
&& let Some(chat_id) = mark_seen_by_uid(context, folder, uid_validity, uid)
|
&& let Some(chat_id) = mark_seen_by_uid(context, transport_id, folder, uid_validity, uid)
|
||||||
.await
|
.await
|
||||||
.with_context(|| {
|
.with_context(|| {
|
||||||
format!("failed to update seen status for msg {folder}/{uid}")
|
format!("Transport {transport_id}: Failed to update seen status for msg {folder}/{uid}")
|
||||||
})?
|
})?
|
||||||
{
|
{
|
||||||
updated_chat_ids.insert(chat_id);
|
updated_chat_ids.insert(chat_id);
|
||||||
@@ -2359,6 +2361,7 @@ pub(crate) async fn prefetch_should_download(
|
|||||||
/// Returns updated chat ID if any message was marked as seen.
|
/// Returns updated chat ID if any message was marked as seen.
|
||||||
async fn mark_seen_by_uid(
|
async fn mark_seen_by_uid(
|
||||||
context: &Context,
|
context: &Context,
|
||||||
|
transport_id: u32,
|
||||||
folder: &str,
|
folder: &str,
|
||||||
uid_validity: u32,
|
uid_validity: u32,
|
||||||
uid: u32,
|
uid: u32,
|
||||||
@@ -2369,12 +2372,13 @@ async fn mark_seen_by_uid(
|
|||||||
"SELECT id, chat_id FROM msgs
|
"SELECT id, chat_id FROM msgs
|
||||||
WHERE id > 9 AND rfc724_mid IN (
|
WHERE id > 9 AND rfc724_mid IN (
|
||||||
SELECT rfc724_mid FROM imap
|
SELECT rfc724_mid FROM imap
|
||||||
WHERE folder=?1
|
WHERE transport_id=?
|
||||||
AND uidvalidity=?2
|
AND folder=?
|
||||||
AND uid=?3
|
AND uidvalidity=?
|
||||||
|
AND uid=?
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
)",
|
)",
|
||||||
(&folder, uid_validity, uid),
|
(transport_id, &folder, uid_validity, uid),
|
||||||
|row| {
|
|row| {
|
||||||
let msg_id: MsgId = row.get(0)?;
|
let msg_id: MsgId = row.get(0)?;
|
||||||
let chat_id: ChatId = row.get(1)?;
|
let chat_id: ChatId = row.get(1)?;
|
||||||
|
|||||||
Reference in New Issue
Block a user