fix and improve load_next job logic

This commit is contained in:
dignifiedquire
2020-05-21 14:48:55 +02:00
parent e8e82d9760
commit c89d7b5b18

View File

@@ -1094,47 +1094,68 @@ LIMIT 1;
paramsv![thread_i] paramsv![thread_i]
}; };
let job = context let job = loop {
.sql let job_res = context
.query_row_optional(query, params, |row| { .sql
let job = Job { .query_row_optional(query, params.clone(), |row| {
job_id: row.get(0)?, let job = Job {
action: row.get(1)?, job_id: row.get(0)?,
foreign_id: row.get(2)?, action: row.get(1)?,
desired_timestamp: row.get(5)?, foreign_id: row.get(2)?,
added_timestamp: row.get(4)?, desired_timestamp: row.get(5)?,
tries: row.get(6)?, added_timestamp: row.get(4)?,
param: row.get::<_, String>(3)?.parse().unwrap_or_default(), tries: row.get(6)?,
pending_error: None, param: row.get::<_, String>(3)?.parse().unwrap_or_default(),
}; pending_error: None,
};
Ok(job) Ok(job)
}) })
.await; .await;
match job { dbg!(&job_res);
Ok(job) => { match job_res {
if thread == Thread::Imap { Ok(job) => break job,
if let Some(job) = job { Err(_) => {
if job.action < Action::DeleteMsgOnImap { // Remove invalid job from the DB
load_imap_deletion_job(context)
// TODO: improve by only doing a single query
match context
.sql
.query_row(query, params.clone(), |row| row.get::<_, i32>(0))
.await
{
Ok(id) => {
context
.sql
.execute("DELETE FROM jobs WHERE id=?", paramsv![id])
.await .await
.unwrap_or_default() .ok();
.or(Some(job)) }
} else { Err(err) => {
Some(job) error!(context, "failed to retrieve invalid job from DB: {}", err);
break None;
} }
} else {
load_imap_deletion_job(context).await.unwrap_or_default()
} }
} else {
job
} }
} }
Err(err) => { };
warn!(context, "Bad job from the database: {}", err);
None if thread == Thread::Imap {
if let Some(job) = job {
if job.action < Action::DeleteMsgOnImap {
load_imap_deletion_job(context)
.await
.unwrap_or_default()
.or(Some(job))
} else {
Some(job)
}
} else {
load_imap_deletion_job(context).await.unwrap_or_default()
} }
} else {
job
} }
} }