diff --git a/src/dc_contact.rs b/src/dc_contact.rs index eb20e56c2..13d9f517a 100644 --- a/src/dc_contact.rs +++ b/src/dc_contact.rs @@ -279,23 +279,19 @@ pub unsafe fn dc_contact_load_from_db( ); true } else { - dc_sqlite3_prepare( - (*contact).context,sql, + sql.query_row( "SELECT c.name, c.addr, c.origin, c.blocked, c.authname FROM contacts c WHERE c.id=?;", - ).and_then(|mut stmt| { - stmt.query_row( - params![contact_id as i32], - |row| { - (*contact).id = contact_id; - (*contact).name = dc_strdup(to_cstring(row.get::<_, String>(0)?).as_ptr()); - (*contact).addr = dc_strdup(to_cstring(row.get::<_, String>(1)?).as_ptr()); - (*contact).origin = row.get(2)?; - (*contact).blocked = row.get(3)?; - (*contact).authname = dc_strdup(to_cstring(row.get::<_, String>(4)?).as_ptr()); - Ok(()) - } - ).ok() - }).is_some() + params![contact_id as i32], + |row| { + (*contact).id = contact_id; + (*contact).name = dc_strdup(to_cstring(row.get::<_, String>(0)?).as_ptr()); + (*contact).addr = dc_strdup(to_cstring(row.get::<_, String>(1)?).as_ptr()); + (*contact).origin = row.get(2)?; + (*contact).blocked = row.get(3)?; + (*contact).authname = dc_strdup(to_cstring(row.get::<_, String>(4)?).as_ptr()); + Ok(()) + } + ).is_ok() } } @@ -360,13 +356,10 @@ pub fn dc_add_or_lookup_contact( let mut update_authname = false; let mut row_id = 0; - if let Some((id, row_name, row_addr, row_origin, row_authname)) = dc_sqlite3_prepare( - context, - &context.sql, + if let Ok((id, row_name, row_addr, row_origin, row_authname)) = context.sql.query_row( "SELECT id, name, addr, origin, authname FROM contacts WHERE addr=? COLLATE NOCASE;", - ) - .and_then(|mut stmt| { - stmt.query_row(params![addr], |row| { + params![addr], + |row| { let row_id = row.get(0)?; let row_name: String = row.get(1)?; let row_addr: String = row.get(2)?; @@ -386,9 +379,8 @@ pub fn dc_add_or_lookup_contact( update_authname = true; } Ok((row_id, row_name, row_addr, row_origin, row_authname)) - }) - .ok() - }) { + }, + ) { row_id = id; if origin >= row_origin && addr != row_addr { update_addr = true; @@ -534,38 +526,32 @@ pub fn dc_get_contacts( if 0 == listflags & 0x1 || query.is_null() { add_self = true; - if let Some(mut stmt) = dc_sqlite3_prepare( - context, - &context.sql, + context.sql.query_map( "SELECT id FROM contacts WHERE addr!=?1 AND id>?2 AND origin>=?3 AND blocked=0 ORDER BY LOWER(name||addr),id;", - ) { - let rows = stmt.query_map(params![self_addr, 9, 0x100], |row| row.get::<_, i32>(0)); - - if let Ok(ids) = rows { + params![self_addr, 9, 0x100], + |row| row.get::<_, i32>(0), + |ids| { for id in ids { - if let Ok(id) = id { - unsafe { dc_array_add_id(ret, id as u32) }; - } + unsafe { dc_array_add_id(ret, id? as u32) }; } + Ok(()) } - } + ).unwrap(); // TODO: better error handling } else { let s3strLikeCmd = format!("%{}%", if !query.is_null() { as_str(query) } else { "" }); - if let Some(mut stmt) = dc_sqlite3_prepare( - context, - &context.sql, - "SELECT c.id FROM contacts c \ - LEFT JOIN acpeerstates ps ON c.addr=ps.addr \ - WHERE c.addr!=?1 \ - AND c.id>?2 \ - AND c.origin>=?3 \ - AND c.blocked=0 \ - AND (c.name LIKE ?4 OR c.addr LIKE ?5) \ - AND (1=?6 OR LENGTH(ps.verified_key_fingerprint)!=0) \ - ORDER BY LOWER(c.name||c.addr),c.id;", - ) { - let rows = stmt.query_map( + context + .sql + .query_map( + "SELECT c.id FROM contacts c \ + LEFT JOIN acpeerstates ps ON c.addr=ps.addr \ + WHERE c.addr!=?1 \ + AND c.id>?2 \ + AND c.origin>=?3 \ + AND c.blocked=0 \ + AND (c.name LIKE ?4 OR c.addr LIKE ?5) \ + AND (1=?6 OR LENGTH(ps.verified_key_fingerprint)!=0) \ + ORDER BY LOWER(c.name||c.addr),c.id;", params![ self_addr, 9, @@ -575,16 +561,14 @@ pub fn dc_get_contacts( if 0 != listflags & 0x1 { 0 } else { 1 }, ], |row| row.get::<_, i32>(0), - ); - - if let Ok(ids) = rows { - for id in ids { - if let Ok(id) = id { - unsafe { dc_array_add_id(ret, id as u32) }; + |ids| { + for id in ids { + unsafe { dc_array_add_id(ret, id? as u32) }; } - } - } - } + Ok(()) + }, + ) + .unwrap(); // TODO: Better error handling let self_name = dc_sqlite3_get_config(context, &context.sql, "displayname", Some("")) .unwrap_or_default(); diff --git a/src/dc_msg.rs b/src/dc_msg.rs index 30a36f9d7..bad6d016f 100644 --- a/src/dc_msg.rs +++ b/src/dc_msg.rs @@ -96,38 +96,36 @@ pub unsafe fn dc_get_msg_info(context: &Context, msg_id: u32) -> *mut libc::c_ch return strdup(to_cstring(ret).as_ptr()); } - let rows = if let Some(mut stmt) = dc_sqlite3_prepare( - context, - &context.sql, - "SELECT contact_id, timestamp_sent FROM msgs_mdns WHERE msg_id=?;", - ) { - stmt.query_map(params![msg_id as i32], |row| { - let contact_id: i32 = row.get(0)?; - let ts: i64 = row.get(1)?; - Ok((contact_id, ts)) - }) - .and_then(|res| res.collect::>>()) - .ok() - } else { - None - }; + context + .sql + .query_map( + "SELECT contact_id, timestamp_sent FROM msgs_mdns WHERE msg_id=?;", + params![msg_id as i32], + |row| { + let contact_id: i32 = row.get(0)?; + let ts: i64 = row.get(1)?; + Ok((contact_id, ts)) + }, + |rows| { + for row in rows { + let (contact_id, ts) = row?; + let fts = dc_timestamp_to_str_safe(ts); + ret += &format!("Read: {}", fts); - if let Some(rows) = rows { - for (contact_id, ts) in rows { - let fts = dc_timestamp_to_str_safe(ts); - ret += &format!("Read: {}", fts); + let contact = dc_contact_new(context); + dc_contact_load_from_db(contact, &context.sql, contact_id as u32); - let contact = dc_contact_new(context); - dc_contact_load_from_db(contact, &context.sql, contact_id as u32); + p = dc_contact_get_name_n_addr(contact); + ret += &format!(" by {}", as_str(p)); + free(p as *mut libc::c_void); + dc_contact_unref(contact); - p = dc_contact_get_name_n_addr(contact); - ret += &format!(" by {}", as_str(p)); - free(p as *mut libc::c_void); - dc_contact_unref(contact); - - ret += "\n"; - } - } + ret += "\n"; + } + Ok(()) + }, + ) + .unwrap(); // TODO: better error handling ret += "State: "; match (*msg).state { @@ -431,16 +429,13 @@ pub unsafe fn dc_msg_get_timestamp(msg: *const dc_msg_t) -> i64 { } pub fn dc_msg_load_from_db<'a>(msg: *mut dc_msg_t<'a>, context: &'a Context, id: u32) -> bool { - dc_sqlite3_prepare( - context, - &context.sql, + context.sql.query_row( "SELECT \ m.id,rfc724_mid,m.mime_in_reply_to,m.server_folder,m.server_uid,m.move_state,m.chat_id, \ m.from_id,m.to_id,m.timestamp,m.timestamp_sent,m.timestamp_rcvd, m.type,m.state,m.msgrmsg,m.txt, \ m.param,m.starred,m.hidden,m.location_id, c.blocked \ FROM msgs m \ - LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id=?;" - ).and_then(|mut stmt| stmt.query_row( + LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id=?;", params![id as i32], |row| { unsafe { @@ -477,8 +472,7 @@ pub fn dc_msg_load_from_db<'a>(msg: *mut dc_msg_t<'a>, context: &'a Context, id: } Ok(()) } - ).ok() - ).is_some() + ).is_ok() } pub unsafe fn dc_get_mime_headers(context: &Context, msg_id: uint32_t) -> *mut libc::c_char { @@ -1229,48 +1223,39 @@ pub unsafe fn dc_mdn_from_ext( let mut read_by_all = 0; - if let Some((msg_id, chat_id, chat_type, msg_state)) = dc_sqlite3_prepare( - context, - &context.sql, + if let Ok((msg_id, chat_id, chat_type, msg_state)) = context.sql.query_row( "SELECT m.id, c.id, c.type, m.state FROM msgs m \ LEFT JOIN chats c ON m.chat_id=c.id \ WHERE rfc724_mid=? AND from_id=1 \ ORDER BY m.id;", - ) - .and_then(|mut stmt| { - stmt.query_row(params![as_str(rfc724_mid)], |row| { + params![as_str(rfc724_mid)], + |row| { Ok(( row.get::<_, i32>(0)?, row.get::<_, i32>(1)?, row.get::<_, i32>(2)?, row.get::<_, i32>(3)?, )) - }) - .ok() - }) { + }, + ) { *ret_msg_id = msg_id as u32; *ret_chat_id = chat_id as u32; if !(msg_state != 18 && msg_state != 20 && msg_state != 26) { /* eg. already marked as MDNS_RCVD. however, it is importent, that the message ID is set above as this will allow the caller eg. to move the message away */ - let mdn_already_in_table = dc_sqlite3_prepare( - context, - &context.sql, - "SELECT contact_id FROM msgs_mdns WHERE msg_id=? AND contact_id=?;", - ) - .and_then(|mut stmt| { - stmt.exists(params![*ret_msg_id as i32, from_id as i32,]) - .ok() - }) - .unwrap_or_default(); + let mdn_already_in_table = context + .sql + .exists( + "SELECT contact_id FROM msgs_mdns WHERE msg_id=? AND contact_id=?;", + params![*ret_msg_id as i32, from_id as i32,], + ) + .unwrap_or_default(); if !mdn_already_in_table { - dc_sqlite3_execute( - context, - &context.sql, + context.sql.execute( "INSERT INTO msgs_mdns (msg_id, contact_id, timestamp_sent) VALUES (?, ?, ?);", params![*ret_msg_id as i32, from_id as i32, timestamp_sent], - ); + ).unwrap(); // TODO: better error handling } // Normal chat? that's quite easy. diff --git a/src/dc_token.rs b/src/dc_token.rs index 704117946..20ce4af86 100644 --- a/src/dc_token.rs +++ b/src/dc_token.rs @@ -55,11 +55,11 @@ pub fn dc_token_exists( return false; } - dc_sqlite3_prepare( - context, - &context.sql, - "SELECT id FROM tokens WHERE namespc=? AND token=?;", - ) - .and_then(|mut stmt| stmt.exists(params![namespc as i32, as_str(token)]).ok()) - .unwrap_or_default() + context + .sql + .exists( + "SELECT id FROM tokens WHERE namespc=? AND token=?;", + params![namespc as i32, as_str(token)], + ) + .unwrap_or_default() } diff --git a/src/peerstate.rs b/src/peerstate.rs index ba087323e..aace05d63 100644 --- a/src/peerstate.rs +++ b/src/peerstate.rs @@ -192,10 +192,11 @@ impl<'a> Peerstate<'a> { P: IntoIterator, P::Item: rusqlite::ToSql, { - let mut res = Self::new(context); + context + .sql + .query_row(query, params, |row| { + let mut res = Self::new(context); - if let Some(mut stmt) = dc_sqlite3_prepare(context, &context.sql, query) { - stmt.query_row(params, |row| { res.addr = Some(row.get(0)?); res.last_seen = row.get(1)?; res.last_seen_autocrypt = row.get(2)?; @@ -231,9 +232,6 @@ impl<'a> Peerstate<'a> { Ok(res) }) .ok() - } else { - None - } } pub fn recalc_fingerprint(&mut self) {