mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 01:16:31 +03:00
attempt to sort adding jobs
This commit is contained in:
@@ -509,7 +509,7 @@ pub unsafe extern "C" fn dc_interrupt_imap_idle(context: *mut dc_context_t) {
|
|||||||
}
|
}
|
||||||
let ffi_context = &*context;
|
let ffi_context = &*context;
|
||||||
ffi_context
|
ffi_context
|
||||||
.with_inner(|ctx| job::interrupt_inbox_idle(ctx, true))
|
.with_inner(|ctx| job::interrupt_inbox_idle(ctx))
|
||||||
.unwrap_or(())
|
.unwrap_or(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1352,7 +1352,7 @@ pub fn delete(context: &Context, chat_id: u32) -> Result<(), Error> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
job_kill_action(context, Action::Housekeeping);
|
job_kill_action(context, Action::Housekeeping);
|
||||||
job_add(context, Action::Housekeeping, 0, Params::new(), 10);
|
add_job_with_interrupt(context, Action::Housekeeping, 0, Params::new(), 10);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ impl Context {
|
|||||||
}
|
}
|
||||||
Config::InboxWatch => {
|
Config::InboxWatch => {
|
||||||
let ret = self.sql.set_raw_config(self, key, value);
|
let ret = self.sql.set_raw_config(self, key, value);
|
||||||
interrupt_inbox_idle(self, true);
|
interrupt_inbox_idle(self);
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
Config::SentboxWatch => {
|
Config::SentboxWatch => {
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ pub fn configure(context: &Context) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
job_kill_action(context, Action::ConfigureImap);
|
job_kill_action(context, Action::ConfigureImap);
|
||||||
job_add(context, Action::ConfigureImap, 0, Params::new(), 0);
|
add_job_with_interrupt(context, Action::ConfigureImap, 0, Params::new(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check if the context is already configured.
|
/// Check if the context is already configured.
|
||||||
|
|||||||
@@ -14,13 +14,11 @@ use crate::contact::*;
|
|||||||
use crate::error::*;
|
use crate::error::*;
|
||||||
use crate::events::Event;
|
use crate::events::Event;
|
||||||
use crate::imap::*;
|
use crate::imap::*;
|
||||||
use crate::job::*;
|
|
||||||
use crate::job_thread::JobThread;
|
use crate::job_thread::JobThread;
|
||||||
use crate::key::*;
|
use crate::key::*;
|
||||||
use crate::login_param::LoginParam;
|
use crate::login_param::LoginParam;
|
||||||
use crate::lot::Lot;
|
use crate::lot::Lot;
|
||||||
use crate::message::{self, Message, MsgId};
|
use crate::message::{self, MsgId};
|
||||||
use crate::param::Params;
|
|
||||||
use crate::smtp::Smtp;
|
use crate::smtp::Smtp;
|
||||||
use crate::sql::Sql;
|
use crate::sql::Sql;
|
||||||
|
|
||||||
@@ -436,34 +434,6 @@ impl Context {
|
|||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn do_heuristics_moves(&self, folder: &str, msg_id: MsgId) {
|
|
||||||
if !self.get_config_bool(Config::MvboxMove) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if self.is_mvbox(folder) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if let Ok(msg) = Message::load_from_db(self, msg_id) {
|
|
||||||
if msg.is_setupmessage() {
|
|
||||||
// do not move setup messages;
|
|
||||||
// there may be a non-delta device that wants to handle it
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1 = dc message, 2 = reply to dc message
|
|
||||||
if 0 != msg.is_dc_message {
|
|
||||||
job_add(
|
|
||||||
self,
|
|
||||||
Action::MoveMsg,
|
|
||||||
msg.id.to_u32() as i32,
|
|
||||||
Params::new(),
|
|
||||||
0,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for Context {
|
impl Drop for Context {
|
||||||
|
|||||||
@@ -250,7 +250,7 @@ pub fn dc_receive_imf(
|
|||||||
|
|
||||||
// if we delete we don't need to try moving messages
|
// if we delete we don't need to try moving messages
|
||||||
if needs_delete_job && !created_db_entries.is_empty() {
|
if needs_delete_job && !created_db_entries.is_empty() {
|
||||||
job_add(
|
add_job_no_interrupt(
|
||||||
context,
|
context,
|
||||||
Action::DeleteMsgOnImap,
|
Action::DeleteMsgOnImap,
|
||||||
created_db_entries[0].1.to_u32() as i32,
|
created_db_entries[0].1.to_u32() as i32,
|
||||||
@@ -258,7 +258,7 @@ pub fn dc_receive_imf(
|
|||||||
0,
|
0,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
context.do_heuristics_moves(server_folder.as_ref(), insert_msg_id);
|
crate::imap::do_heuristics_moves(context, server_folder.as_ref(), insert_msg_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
info!(
|
info!(
|
||||||
|
|||||||
@@ -17,9 +17,9 @@ use crate::context::Context;
|
|||||||
use crate::dc_receive_imf::dc_receive_imf;
|
use crate::dc_receive_imf::dc_receive_imf;
|
||||||
use crate::events::Event;
|
use crate::events::Event;
|
||||||
use crate::imap_client::*;
|
use crate::imap_client::*;
|
||||||
use crate::job::{job_add, Action};
|
use crate::job::{add_job_no_interrupt, Action};
|
||||||
use crate::login_param::{CertificateChecks, LoginParam};
|
use crate::login_param::{CertificateChecks, LoginParam};
|
||||||
use crate::message::{self, update_server_uid};
|
use crate::message::{self, update_server_uid, Message, MsgId};
|
||||||
use crate::oauth2::dc_get_oauth2_access_token;
|
use crate::oauth2::dc_get_oauth2_access_token;
|
||||||
use crate::param::Params;
|
use crate::param::Params;
|
||||||
use crate::stock::StockMessage;
|
use crate::stock::StockMessage;
|
||||||
@@ -1202,8 +1202,8 @@ fn precheck_imf(context: &Context, rfc724_mid: &str, server_folder: &str, server
|
|||||||
{
|
{
|
||||||
if old_server_folder.is_empty() && old_server_uid == 0 {
|
if old_server_folder.is_empty() && old_server_uid == 0 {
|
||||||
info!(context, "[move] detected bbc-self {}", rfc724_mid,);
|
info!(context, "[move] detected bbc-self {}", rfc724_mid,);
|
||||||
context.do_heuristics_moves(server_folder.as_ref(), msg_id);
|
do_heuristics_moves(context, server_folder.as_ref(), msg_id);
|
||||||
job_add(
|
add_job_no_interrupt(
|
||||||
context,
|
context,
|
||||||
Action::MarkseenMsgOnImap,
|
Action::MarkseenMsgOnImap,
|
||||||
msg_id.to_u32() as i32,
|
msg_id.to_u32() as i32,
|
||||||
@@ -1237,3 +1237,32 @@ fn prefetch_get_message_id(prefetch_msg: &Fetch) -> Result<String> {
|
|||||||
|
|
||||||
wrapmime::parse_message_id(&message_id.unwrap()).map_err(Into::into)
|
wrapmime::parse_message_id(&message_id.unwrap()).map_err(Into::into)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn do_heuristics_moves(context: &Context, folder: &str, msg_id: MsgId) {
|
||||||
|
if !context.get_config_bool(crate::config::Config::MvboxMove) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if context.is_mvbox(folder) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if let Ok(msg) = Message::load_from_db(context, msg_id) {
|
||||||
|
if msg.is_setupmessage() {
|
||||||
|
// do not move setup messages;
|
||||||
|
// there may be a non-delta device that wants to handle it
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1 = dc message, 2 = reply to dc message
|
||||||
|
if 0 != msg.is_dc_message {
|
||||||
|
// we are called from receive_imf so there is no idle running
|
||||||
|
add_job_no_interrupt(
|
||||||
|
context,
|
||||||
|
Action::MoveMsg,
|
||||||
|
msg.id.to_u32() as i32,
|
||||||
|
Params::new(),
|
||||||
|
0,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ pub fn imex(context: &Context, what: ImexMode, param1: Option<impl AsRef<Path>>)
|
|||||||
}
|
}
|
||||||
|
|
||||||
job_kill_action(context, Action::ImexImap);
|
job_kill_action(context, Action::ImexImap);
|
||||||
job_add(context, Action::ImexImap, 0, param, 0);
|
add_job_with_interrupt(context, Action::ImexImap, 0, param, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the filename of the backup found (otherwise an error)
|
/// Returns the filename of the backup found (otherwise an error)
|
||||||
|
|||||||
46
src/job.rs
46
src/job.rs
@@ -134,7 +134,7 @@ impl Job {
|
|||||||
|
|
||||||
/// Updates the job already stored in the database.
|
/// Updates the job already stored in the database.
|
||||||
///
|
///
|
||||||
/// To add a new job, use [job_add].
|
/// To add a new job, use [add_job_*].
|
||||||
fn update(&self, context: &Context) -> bool {
|
fn update(&self, context: &Context) -> bool {
|
||||||
sql::execute(
|
sql::execute(
|
||||||
context,
|
context,
|
||||||
@@ -472,21 +472,10 @@ pub fn perform_sentbox_idle(context: &Context) {
|
|||||||
.idle(context, use_network);
|
.idle(context, use_network);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn interrupt_inbox_idle(context: &Context, block: bool) {
|
pub fn interrupt_inbox_idle(context: &Context) {
|
||||||
info!(context, "interrupt_inbox_idle called blocking={}", block);
|
info!(context, "interrupt_inbox_idle begin");
|
||||||
if block {
|
context.inbox_thread.read().unwrap().interrupt_idle(context);
|
||||||
context.inbox_thread.read().unwrap().interrupt_idle(context);
|
info!(context, "interrupt_inbox_idle finish");
|
||||||
} else {
|
|
||||||
match context.inbox_thread.try_read() {
|
|
||||||
Ok(inbox_thread) => {
|
|
||||||
inbox_thread.interrupt_idle(context);
|
|
||||||
}
|
|
||||||
Err(err) => {
|
|
||||||
*context.perform_inbox_jobs_needed.write().unwrap() = true;
|
|
||||||
warn!(context, "could not interrupt idle: {}", err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn interrupt_mvbox_idle(context: &Context) {
|
pub fn interrupt_mvbox_idle(context: &Context) {
|
||||||
@@ -596,7 +585,7 @@ pub fn maybe_network(context: &Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interrupt_smtp_idle(context);
|
interrupt_smtp_idle(context);
|
||||||
interrupt_inbox_idle(context, true);
|
interrupt_inbox_idle(context);
|
||||||
interrupt_mvbox_idle(context);
|
interrupt_mvbox_idle(context);
|
||||||
interrupt_sentbox_idle(context);
|
interrupt_sentbox_idle(context);
|
||||||
}
|
}
|
||||||
@@ -918,7 +907,7 @@ fn add_smtp_job(
|
|||||||
param.set(Param::File, blob.as_name());
|
param.set(Param::File, blob.as_name());
|
||||||
param.set(Param::Recipients, &recipients);
|
param.set(Param::Recipients, &recipients);
|
||||||
|
|
||||||
job_add(
|
add_job_with_interrupt(
|
||||||
context,
|
context,
|
||||||
action,
|
action,
|
||||||
rendered_msg
|
rendered_msg
|
||||||
@@ -934,7 +923,7 @@ fn add_smtp_job(
|
|||||||
|
|
||||||
/// Adds a job to the database, scheduling it `delay_seconds`
|
/// Adds a job to the database, scheduling it `delay_seconds`
|
||||||
/// after the current time.
|
/// after the current time.
|
||||||
pub fn job_add(
|
pub fn add_job_no_interrupt(
|
||||||
context: &Context,
|
context: &Context,
|
||||||
action: Action,
|
action: Action,
|
||||||
foreign_id: i32,
|
foreign_id: i32,
|
||||||
@@ -942,7 +931,7 @@ pub fn job_add(
|
|||||||
delay_seconds: i64,
|
delay_seconds: i64,
|
||||||
) {
|
) {
|
||||||
if action == Action::Unknown {
|
if action == Action::Unknown {
|
||||||
error!(context, "Invalid action passed to job_add");
|
error!(context, "Invalid action passed to add_job_no_interrupt");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -963,8 +952,23 @@ pub fn job_add(
|
|||||||
]
|
]
|
||||||
).ok();
|
).ok();
|
||||||
|
|
||||||
|
if thread == Thread::Imap {
|
||||||
|
*context.perform_inbox_jobs_needed.write().unwrap() = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_job_with_interrupt(
|
||||||
|
context: &Context,
|
||||||
|
action: Action,
|
||||||
|
foreign_id: i32,
|
||||||
|
param: Params,
|
||||||
|
delay_seconds: i64,
|
||||||
|
) {
|
||||||
|
let thread: Thread = action.into();
|
||||||
|
add_job_no_interrupt(context, action, foreign_id, param, delay_seconds);
|
||||||
|
|
||||||
match thread {
|
match thread {
|
||||||
Thread::Imap => interrupt_inbox_idle(context, false),
|
Thread::Imap => interrupt_inbox_idle(context),
|
||||||
Thread::Smtp => interrupt_smtp_idle(context),
|
Thread::Smtp => interrupt_smtp_idle(context),
|
||||||
Thread::Unknown => {}
|
Thread::Unknown => {}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ pub fn send_locations_to_chat(context: &Context, chat_id: u32, seconds: i64) {
|
|||||||
context.call_cb(Event::ChatModified(chat_id));
|
context.call_cb(Event::ChatModified(chat_id));
|
||||||
if 0 != seconds {
|
if 0 != seconds {
|
||||||
schedule_MAYBE_SEND_LOCATIONS(context, false);
|
schedule_MAYBE_SEND_LOCATIONS(context, false);
|
||||||
job_add(
|
add_job_with_interrupt(
|
||||||
context,
|
context,
|
||||||
Action::MaybeSendLocationsEnded,
|
Action::MaybeSendLocationsEnded,
|
||||||
chat_id as i32,
|
chat_id as i32,
|
||||||
@@ -241,7 +241,8 @@ pub fn send_locations_to_chat(context: &Context, chat_id: u32, seconds: i64) {
|
|||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
fn schedule_MAYBE_SEND_LOCATIONS(context: &Context, force_schedule: bool) {
|
fn schedule_MAYBE_SEND_LOCATIONS(context: &Context, force_schedule: bool) {
|
||||||
if force_schedule || !job_action_exists(context, Action::MaybeSendLocations) {
|
if force_schedule || !job_action_exists(context, Action::MaybeSendLocations) {
|
||||||
job_add(context, Action::MaybeSendLocations, 0, Params::new(), 60);
|
// XXX questionable to interrupt but set a +60secs target
|
||||||
|
add_job_with_interrupt(context, Action::MaybeSendLocations, 0, Params::new(), 60);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -875,7 +875,7 @@ pub fn delete_msgs(context: &Context, msg_ids: &[MsgId]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
update_msg_chat_id(context, *msg_id, DC_CHAT_ID_TRASH);
|
update_msg_chat_id(context, *msg_id, DC_CHAT_ID_TRASH);
|
||||||
job_add(
|
add_job_with_interrupt(
|
||||||
context,
|
context,
|
||||||
Action::DeleteMsgOnImap,
|
Action::DeleteMsgOnImap,
|
||||||
msg_id.to_u32() as i32,
|
msg_id.to_u32() as i32,
|
||||||
@@ -890,7 +890,7 @@ pub fn delete_msgs(context: &Context, msg_ids: &[MsgId]) {
|
|||||||
msg_id: MsgId::new(0),
|
msg_id: MsgId::new(0),
|
||||||
});
|
});
|
||||||
job_kill_action(context, Action::Housekeeping);
|
job_kill_action(context, Action::Housekeeping);
|
||||||
job_add(context, Action::Housekeeping, 0, Params::new(), 10);
|
add_job_with_interrupt(context, Action::Housekeeping, 0, Params::new(), 10);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -961,7 +961,7 @@ pub fn markseen_msgs(context: &Context, msg_ids: &[MsgId]) -> bool {
|
|||||||
update_msg_state(context, *id, MessageState::InSeen);
|
update_msg_state(context, *id, MessageState::InSeen);
|
||||||
info!(context, "Seen message {}.", id);
|
info!(context, "Seen message {}.", id);
|
||||||
|
|
||||||
job_add(
|
add_job_with_interrupt(
|
||||||
context,
|
context,
|
||||||
Action::MarkseenMsgOnImap,
|
Action::MarkseenMsgOnImap,
|
||||||
id.to_u32() as i32,
|
id.to_u32() as i32,
|
||||||
@@ -1319,7 +1319,7 @@ pub fn update_server_uid(
|
|||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub fn dc_empty_server(context: &Context, flags: u32) {
|
pub fn dc_empty_server(context: &Context, flags: u32) {
|
||||||
job_kill_action(context, Action::EmptyServer);
|
job_kill_action(context, Action::EmptyServer);
|
||||||
job_add(context, Action::EmptyServer, flags as i32, Params::new(), 0);
|
add_job_with_interrupt(context, Action::EmptyServer, flags as i32, Params::new(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ use crate::dc_tools::*;
|
|||||||
use crate::e2ee;
|
use crate::e2ee;
|
||||||
use crate::error::Result;
|
use crate::error::Result;
|
||||||
use crate::headerdef::HeaderDef;
|
use crate::headerdef::HeaderDef;
|
||||||
use crate::job::{job_add, Action};
|
use crate::job::{add_job_no_interrupt, Action};
|
||||||
use crate::location;
|
use crate::location;
|
||||||
use crate::message;
|
use crate::message;
|
||||||
use crate::message::MsgId;
|
use crate::message::MsgId;
|
||||||
@@ -782,7 +782,7 @@ impl<'a> MimeParser<'a> {
|
|||||||
if self.has_chat_version() && self.context.get_config_bool(Config::MvboxMove) {
|
if self.has_chat_version() && self.context.get_config_bool(Config::MvboxMove) {
|
||||||
param.set_int(Param::AlsoMove, 1);
|
param.set_int(Param::AlsoMove, 1);
|
||||||
}
|
}
|
||||||
job_add(self.context, Action::MarkseenMdnOnImap, 0, param, 0);
|
add_job_no_interrupt(self.context, Action::MarkseenMdnOnImap, 0, param, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user