(dig,hpk) pull out job collection from sql query/lock logic

This commit is contained in:
holger krekel
2019-07-18 14:03:57 +02:00
parent 7d0b5d8abb
commit 8f240f7153
3 changed files with 87 additions and 81 deletions

View File

@@ -1962,7 +1962,7 @@ pub unsafe fn dc_forward_msgs(
curr_timestamp = dc_create_smeared_timestamps(context, msg_cnt);
idsstr = dc_arr_to_string(msg_ids, msg_cnt);
context
let ids = context
.sql
.query_map(
format!(
@@ -1972,8 +1972,12 @@ pub unsafe fn dc_forward_msgs(
params![],
|row| row.get::<_, i32>(0),
|ids| {
for id in ids {
let src_msg_id = id?;
ids.collect::<Result<Vec<_>, _>>().map_err(Into::into)
}
);
for id in ids.unwrap() {
let src_msg_id = id;
if !dc_msg_load_from_db(msg, context, src_msg_id as u32) {
break;
}
@@ -2025,10 +2029,6 @@ pub unsafe fn dc_forward_msgs(
0 as *mut libc::c_uint,
);
}
Ok(())
},
)
.unwrap(); // TODO: better error handling
}
if !created_db_entries.is_null() {

View File

@@ -80,12 +80,14 @@ unsafe fn dc_job_perform(context: &Context, thread: libc::c_int, probe_network:
params_probe
};
let jobs: Vec<dc_job_t> = context
info!(context, 0, "dc_job_perform before query");
let jobs: Result<Vec<dc_job_t>,_> = context
.sql
.query_map(
query,
params,
|row| {
info!(context, 0, "START jobs query_maps");
let job = dc_job_t {
job_id: row.get(0)?,
action: row.get(1)?,
@@ -100,16 +102,22 @@ unsafe fn dc_job_perform(context: &Context, thread: libc::c_int, probe_network:
let packed: String = row.get(3)?;
dc_param_set_packed(job.param, to_cstring(packed).as_ptr());
info!(context, 0, "DONE jobs query_maps row");
Ok(job)
},
|jobs| {
jobs.collect::<Result<Vec<dc_job_t>, _>>()
.map_err(Into::into)
info!(context, 0, "collecting jobs");
let res = jobs.collect::<Result<Vec<dc_job_t>, _>>()
.map_err(Into::into);
info!(context, 0, "collecting jobs done");
res
},
)
.unwrap_or_default();
for mut job in jobs {
);
match jobs {
Ok(ref res) => {info!(context, 0, "query done, {:?}", res.len()); },
Err(ref err) => {info!(context, 0, "query failed: {:?}", err); }
}
for mut job in jobs.unwrap_or_default() {
info!(
context,
0,

View File

@@ -471,24 +471,9 @@ impl Imap {
fn unsetup_handle(&self, context: &Context) {
info!(context, 0, "IMAP unsetup_handle starts");
// XXX the next line currently can block even if all threads
// terminated already
let session = self.session.lock().unwrap().take();
info!(
context,
0, "IMAP unsetup_handle step1 (acquired session.lock)"
);
if session.is_some() {
match session.unwrap().close() {
Ok(_) => {}
Err(err) => {
eprintln!("failed to close connection: {:?}", err);
}
}
}
info!(
context,
0, "IMAP unsetup_handle step 2 (closing down stream)."
0, "IMAP unsetup_handle step 1 (closing down stream)."
);
let stream = self.stream.write().unwrap().take();
if stream.is_some() {
@@ -499,6 +484,19 @@ impl Imap {
}
}
}
info!(
context,
0, "IMAP unsetup_handle step 2 (acquired session.lock)"
);
let session = self.session.lock().unwrap().take();
if session.is_some() {
match session.unwrap().close() {
Ok(_) => {}
Err(err) => {
eprintln!("failed to close connection: {:?}", err);
}
}
}
info!(context, 0, "IMAP unsetup_handle step 3 (clearing config).");
self.config.write().unwrap().selected_folder = None;