mirror of
https://github.com/chatmail/core.git
synced 2026-05-20 15:26:30 +03:00
more prepare conversions
This commit is contained in:
@@ -279,23 +279,19 @@ pub unsafe fn dc_contact_load_from_db(
|
|||||||
);
|
);
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
dc_sqlite3_prepare(
|
sql.query_row(
|
||||||
(*contact).context,sql,
|
|
||||||
"SELECT c.name, c.addr, c.origin, c.blocked, c.authname FROM contacts c WHERE c.id=?;",
|
"SELECT c.name, c.addr, c.origin, c.blocked, c.authname FROM contacts c WHERE c.id=?;",
|
||||||
).and_then(|mut stmt| {
|
params![contact_id as i32],
|
||||||
stmt.query_row(
|
|row| {
|
||||||
params![contact_id as i32],
|
(*contact).id = contact_id;
|
||||||
|row| {
|
(*contact).name = dc_strdup(to_cstring(row.get::<_, String>(0)?).as_ptr());
|
||||||
(*contact).id = contact_id;
|
(*contact).addr = dc_strdup(to_cstring(row.get::<_, String>(1)?).as_ptr());
|
||||||
(*contact).name = dc_strdup(to_cstring(row.get::<_, String>(0)?).as_ptr());
|
(*contact).origin = row.get(2)?;
|
||||||
(*contact).addr = dc_strdup(to_cstring(row.get::<_, String>(1)?).as_ptr());
|
(*contact).blocked = row.get(3)?;
|
||||||
(*contact).origin = row.get(2)?;
|
(*contact).authname = dc_strdup(to_cstring(row.get::<_, String>(4)?).as_ptr());
|
||||||
(*contact).blocked = row.get(3)?;
|
Ok(())
|
||||||
(*contact).authname = dc_strdup(to_cstring(row.get::<_, String>(4)?).as_ptr());
|
}
|
||||||
Ok(())
|
).is_ok()
|
||||||
}
|
|
||||||
).ok()
|
|
||||||
}).is_some()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -360,13 +356,10 @@ pub fn dc_add_or_lookup_contact(
|
|||||||
let mut update_authname = false;
|
let mut update_authname = false;
|
||||||
let mut row_id = 0;
|
let mut row_id = 0;
|
||||||
|
|
||||||
if let Some((id, row_name, row_addr, row_origin, row_authname)) = dc_sqlite3_prepare(
|
if let Ok((id, row_name, row_addr, row_origin, row_authname)) = context.sql.query_row(
|
||||||
context,
|
|
||||||
&context.sql,
|
|
||||||
"SELECT id, name, addr, origin, authname FROM contacts WHERE addr=? COLLATE NOCASE;",
|
"SELECT id, name, addr, origin, authname FROM contacts WHERE addr=? COLLATE NOCASE;",
|
||||||
)
|
params![addr],
|
||||||
.and_then(|mut stmt| {
|
|row| {
|
||||||
stmt.query_row(params![addr], |row| {
|
|
||||||
let row_id = row.get(0)?;
|
let row_id = row.get(0)?;
|
||||||
let row_name: String = row.get(1)?;
|
let row_name: String = row.get(1)?;
|
||||||
let row_addr: String = row.get(2)?;
|
let row_addr: String = row.get(2)?;
|
||||||
@@ -386,9 +379,8 @@ pub fn dc_add_or_lookup_contact(
|
|||||||
update_authname = true;
|
update_authname = true;
|
||||||
}
|
}
|
||||||
Ok((row_id, row_name, row_addr, row_origin, row_authname))
|
Ok((row_id, row_name, row_addr, row_origin, row_authname))
|
||||||
})
|
},
|
||||||
.ok()
|
) {
|
||||||
}) {
|
|
||||||
row_id = id;
|
row_id = id;
|
||||||
if origin >= row_origin && addr != row_addr {
|
if origin >= row_origin && addr != row_addr {
|
||||||
update_addr = true;
|
update_addr = true;
|
||||||
@@ -534,38 +526,32 @@ pub fn dc_get_contacts(
|
|||||||
if 0 == listflags & 0x1 || query.is_null() {
|
if 0 == listflags & 0x1 || query.is_null() {
|
||||||
add_self = true;
|
add_self = true;
|
||||||
|
|
||||||
if let Some(mut stmt) = dc_sqlite3_prepare(
|
context.sql.query_map(
|
||||||
context,
|
|
||||||
&context.sql,
|
|
||||||
"SELECT id FROM contacts WHERE addr!=?1 AND id>?2 AND origin>=?3 AND blocked=0 ORDER BY LOWER(name||addr),id;",
|
"SELECT id FROM contacts WHERE addr!=?1 AND id>?2 AND origin>=?3 AND blocked=0 ORDER BY LOWER(name||addr),id;",
|
||||||
) {
|
params![self_addr, 9, 0x100],
|
||||||
let rows = stmt.query_map(params![self_addr, 9, 0x100], |row| row.get::<_, i32>(0));
|
|row| row.get::<_, i32>(0),
|
||||||
|
|ids| {
|
||||||
if let Ok(ids) = rows {
|
|
||||||
for id in 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 {
|
} else {
|
||||||
let s3strLikeCmd = format!("%{}%", if !query.is_null() { as_str(query) } else { "" });
|
let s3strLikeCmd = format!("%{}%", if !query.is_null() { as_str(query) } else { "" });
|
||||||
|
|
||||||
if let Some(mut stmt) = dc_sqlite3_prepare(
|
context
|
||||||
context,
|
.sql
|
||||||
&context.sql,
|
.query_map(
|
||||||
"SELECT c.id FROM contacts c \
|
"SELECT c.id FROM contacts c \
|
||||||
LEFT JOIN acpeerstates ps ON c.addr=ps.addr \
|
LEFT JOIN acpeerstates ps ON c.addr=ps.addr \
|
||||||
WHERE c.addr!=?1 \
|
WHERE c.addr!=?1 \
|
||||||
AND c.id>?2 \
|
AND c.id>?2 \
|
||||||
AND c.origin>=?3 \
|
AND c.origin>=?3 \
|
||||||
AND c.blocked=0 \
|
AND c.blocked=0 \
|
||||||
AND (c.name LIKE ?4 OR c.addr LIKE ?5) \
|
AND (c.name LIKE ?4 OR c.addr LIKE ?5) \
|
||||||
AND (1=?6 OR LENGTH(ps.verified_key_fingerprint)!=0) \
|
AND (1=?6 OR LENGTH(ps.verified_key_fingerprint)!=0) \
|
||||||
ORDER BY LOWER(c.name||c.addr),c.id;",
|
ORDER BY LOWER(c.name||c.addr),c.id;",
|
||||||
) {
|
|
||||||
let rows = stmt.query_map(
|
|
||||||
params![
|
params![
|
||||||
self_addr,
|
self_addr,
|
||||||
9,
|
9,
|
||||||
@@ -575,16 +561,14 @@ pub fn dc_get_contacts(
|
|||||||
if 0 != listflags & 0x1 { 0 } else { 1 },
|
if 0 != listflags & 0x1 { 0 } else { 1 },
|
||||||
],
|
],
|
||||||
|row| row.get::<_, i32>(0),
|
|row| row.get::<_, i32>(0),
|
||||||
);
|
|ids| {
|
||||||
|
for id in ids {
|
||||||
if let Ok(ids) = rows {
|
unsafe { dc_array_add_id(ret, id? as u32) };
|
||||||
for id in ids {
|
|
||||||
if let Ok(id) = id {
|
|
||||||
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(""))
|
let self_name = dc_sqlite3_get_config(context, &context.sql, "displayname", Some(""))
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
|
|||||||
103
src/dc_msg.rs
103
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());
|
return strdup(to_cstring(ret).as_ptr());
|
||||||
}
|
}
|
||||||
|
|
||||||
let rows = if let Some(mut stmt) = dc_sqlite3_prepare(
|
context
|
||||||
context,
|
.sql
|
||||||
&context.sql,
|
.query_map(
|
||||||
"SELECT contact_id, timestamp_sent FROM msgs_mdns WHERE msg_id=?;",
|
"SELECT contact_id, timestamp_sent FROM msgs_mdns WHERE msg_id=?;",
|
||||||
) {
|
params![msg_id as i32],
|
||||||
stmt.query_map(params![msg_id as i32], |row| {
|
|row| {
|
||||||
let contact_id: i32 = row.get(0)?;
|
let contact_id: i32 = row.get(0)?;
|
||||||
let ts: i64 = row.get(1)?;
|
let ts: i64 = row.get(1)?;
|
||||||
Ok((contact_id, ts))
|
Ok((contact_id, ts))
|
||||||
})
|
},
|
||||||
.and_then(|res| res.collect::<rusqlite::Result<Vec<_>>>())
|
|rows| {
|
||||||
.ok()
|
for row in rows {
|
||||||
} else {
|
let (contact_id, ts) = row?;
|
||||||
None
|
let fts = dc_timestamp_to_str_safe(ts);
|
||||||
};
|
ret += &format!("Read: {}", fts);
|
||||||
|
|
||||||
if let Some(rows) = rows {
|
let contact = dc_contact_new(context);
|
||||||
for (contact_id, ts) in rows {
|
dc_contact_load_from_db(contact, &context.sql, contact_id as u32);
|
||||||
let fts = dc_timestamp_to_str_safe(ts);
|
|
||||||
ret += &format!("Read: {}", fts);
|
|
||||||
|
|
||||||
let contact = dc_contact_new(context);
|
p = dc_contact_get_name_n_addr(contact);
|
||||||
dc_contact_load_from_db(contact, &context.sql, contact_id as u32);
|
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 += "\n";
|
||||||
ret += &format!(" by {}", as_str(p));
|
}
|
||||||
free(p as *mut libc::c_void);
|
Ok(())
|
||||||
dc_contact_unref(contact);
|
},
|
||||||
|
)
|
||||||
ret += "\n";
|
.unwrap(); // TODO: better error handling
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret += "State: ";
|
ret += "State: ";
|
||||||
match (*msg).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 {
|
pub fn dc_msg_load_from_db<'a>(msg: *mut dc_msg_t<'a>, context: &'a Context, id: u32) -> bool {
|
||||||
dc_sqlite3_prepare(
|
context.sql.query_row(
|
||||||
context,
|
|
||||||
&context.sql,
|
|
||||||
"SELECT \
|
"SELECT \
|
||||||
m.id,rfc724_mid,m.mime_in_reply_to,m.server_folder,m.server_uid,m.move_state,m.chat_id, \
|
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.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 \
|
m.param,m.starred,m.hidden,m.location_id, c.blocked \
|
||||||
FROM msgs m \
|
FROM msgs m \
|
||||||
LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id=?;"
|
LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id=?;",
|
||||||
).and_then(|mut stmt| stmt.query_row(
|
|
||||||
params![id as i32],
|
params![id as i32],
|
||||||
|row| {
|
|row| {
|
||||||
unsafe {
|
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(())
|
||||||
}
|
}
|
||||||
).ok()
|
).is_ok()
|
||||||
).is_some()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn dc_get_mime_headers(context: &Context, msg_id: uint32_t) -> *mut libc::c_char {
|
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;
|
let mut read_by_all = 0;
|
||||||
|
|
||||||
if let Some((msg_id, chat_id, chat_type, msg_state)) = dc_sqlite3_prepare(
|
if let Ok((msg_id, chat_id, chat_type, msg_state)) = context.sql.query_row(
|
||||||
context,
|
|
||||||
&context.sql,
|
|
||||||
"SELECT m.id, c.id, c.type, m.state FROM msgs m \
|
"SELECT m.id, c.id, c.type, m.state FROM msgs m \
|
||||||
LEFT JOIN chats c ON m.chat_id=c.id \
|
LEFT JOIN chats c ON m.chat_id=c.id \
|
||||||
WHERE rfc724_mid=? AND from_id=1 \
|
WHERE rfc724_mid=? AND from_id=1 \
|
||||||
ORDER BY m.id;",
|
ORDER BY m.id;",
|
||||||
)
|
params![as_str(rfc724_mid)],
|
||||||
.and_then(|mut stmt| {
|
|row| {
|
||||||
stmt.query_row(params![as_str(rfc724_mid)], |row| {
|
|
||||||
Ok((
|
Ok((
|
||||||
row.get::<_, i32>(0)?,
|
row.get::<_, i32>(0)?,
|
||||||
row.get::<_, i32>(1)?,
|
row.get::<_, i32>(1)?,
|
||||||
row.get::<_, i32>(2)?,
|
row.get::<_, i32>(2)?,
|
||||||
row.get::<_, i32>(3)?,
|
row.get::<_, i32>(3)?,
|
||||||
))
|
))
|
||||||
})
|
},
|
||||||
.ok()
|
) {
|
||||||
}) {
|
|
||||||
*ret_msg_id = msg_id as u32;
|
*ret_msg_id = msg_id as u32;
|
||||||
*ret_chat_id = chat_id as u32;
|
*ret_chat_id = chat_id as u32;
|
||||||
|
|
||||||
if !(msg_state != 18 && msg_state != 20 && msg_state != 26) {
|
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 */
|
/* 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(
|
let mdn_already_in_table = context
|
||||||
context,
|
.sql
|
||||||
&context.sql,
|
.exists(
|
||||||
"SELECT contact_id FROM msgs_mdns WHERE msg_id=? AND contact_id=?;",
|
"SELECT contact_id FROM msgs_mdns WHERE msg_id=? AND contact_id=?;",
|
||||||
)
|
params![*ret_msg_id as i32, from_id as i32,],
|
||||||
.and_then(|mut stmt| {
|
)
|
||||||
stmt.exists(params![*ret_msg_id as i32, from_id as i32,])
|
.unwrap_or_default();
|
||||||
.ok()
|
|
||||||
})
|
|
||||||
.unwrap_or_default();
|
|
||||||
|
|
||||||
if !mdn_already_in_table {
|
if !mdn_already_in_table {
|
||||||
dc_sqlite3_execute(
|
context.sql.execute(
|
||||||
context,
|
|
||||||
&context.sql,
|
|
||||||
"INSERT INTO msgs_mdns (msg_id, contact_id, timestamp_sent) VALUES (?, ?, ?);",
|
"INSERT INTO msgs_mdns (msg_id, contact_id, timestamp_sent) VALUES (?, ?, ?);",
|
||||||
params![*ret_msg_id as i32, from_id as i32, timestamp_sent],
|
params![*ret_msg_id as i32, from_id as i32, timestamp_sent],
|
||||||
);
|
).unwrap(); // TODO: better error handling
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normal chat? that's quite easy.
|
// Normal chat? that's quite easy.
|
||||||
|
|||||||
@@ -55,11 +55,11 @@ pub fn dc_token_exists(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
dc_sqlite3_prepare(
|
context
|
||||||
context,
|
.sql
|
||||||
&context.sql,
|
.exists(
|
||||||
"SELECT id FROM tokens WHERE namespc=? AND token=?;",
|
"SELECT id FROM tokens WHERE namespc=? AND token=?;",
|
||||||
)
|
params![namespc as i32, as_str(token)],
|
||||||
.and_then(|mut stmt| stmt.exists(params![namespc as i32, as_str(token)]).ok())
|
)
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -192,10 +192,11 @@ impl<'a> Peerstate<'a> {
|
|||||||
P: IntoIterator,
|
P: IntoIterator,
|
||||||
P::Item: rusqlite::ToSql,
|
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.addr = Some(row.get(0)?);
|
||||||
res.last_seen = row.get(1)?;
|
res.last_seen = row.get(1)?;
|
||||||
res.last_seen_autocrypt = row.get(2)?;
|
res.last_seen_autocrypt = row.get(2)?;
|
||||||
@@ -231,9 +232,6 @@ impl<'a> Peerstate<'a> {
|
|||||||
Ok(res)
|
Ok(res)
|
||||||
})
|
})
|
||||||
.ok()
|
.ok()
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn recalc_fingerprint(&mut self) {
|
pub fn recalc_fingerprint(&mut self) {
|
||||||
|
|||||||
Reference in New Issue
Block a user