refactor: factor out update_chat_names()

This commit is contained in:
link2xt
2025-03-19 20:00:00 +00:00
committed by l
parent 891e166996
commit 5280448cd3

View File

@@ -843,20 +843,25 @@ impl Contact {
let mut update_addr = false; let mut update_addr = false;
let row_id = context.sql.transaction(|transaction| { let row_id = context
let row = transaction.query_row( .sql
.transaction(|transaction| {
let row = transaction
.query_row(
"SELECT id, name, addr, origin, authname "SELECT id, name, addr, origin, authname
FROM contacts WHERE addr=? COLLATE NOCASE", FROM contacts WHERE addr=? COLLATE NOCASE",
(addr,), (addr,),
|row| { |row| {
let row_id: isize = row.get(0)?; let row_id: u32 = 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)?;
let row_origin: Origin = row.get(3)?; let row_origin: Origin = row.get(3)?;
let row_authname: String = row.get(4)?; let row_authname: String = row.get(4)?;
Ok((row_id, row_name, row_addr, row_origin, row_authname)) Ok((row_id, row_name, row_addr, row_origin, row_authname))
}).optional()?; },
)
.optional()?;
let row_id; let row_id;
if let Some((id, row_name, row_addr, row_origin, row_authname)) = row { if let Some((id, row_name, row_addr, row_origin, row_authname)) = row {
@@ -868,7 +873,7 @@ impl Contact {
|| origin == Origin::IncomingUnknownFrom || origin == Origin::IncomingUnknownFrom
|| row_authname.is_empty()); || row_authname.is_empty());
row_id = u32::try_from(id)?; row_id = id;
if origin >= row_origin && addr.as_ref() != row_addr { if origin >= row_origin && addr.as_ref() != row_addr {
update_addr = true; update_addr = true;
} }
@@ -879,8 +884,7 @@ impl Contact {
row_name row_name
}; };
transaction transaction.execute(
.execute(
"UPDATE contacts SET name=?, addr=?, origin=?, authname=? WHERE id=?;", "UPDATE contacts SET name=?, addr=?, origin=?, authname=? WHERE id=?;",
( (
new_name, new_name,
@@ -899,55 +903,13 @@ impl Contact {
} else { } else {
row_authname row_authname
}, },
row_id row_id,
), ),
)?; )?;
if update_name || update_authname { if update_name || update_authname {
// Update the contact name also if it is used as a group name.
// This is one of the few duplicated data, however, getting the chat list is easier this way.
let chat_id: Option<ChatId> = transaction.query_row(
"SELECT id FROM chats WHERE type=? AND id IN(SELECT chat_id FROM chats_contacts WHERE contact_id=?)",
(Chattype::Single, isize::try_from(row_id)?),
|row| {
let chat_id: ChatId = row.get(0)?;
Ok(chat_id)
}
).optional()?;
if let Some(chat_id) = chat_id {
let contact_id = ContactId::new(row_id); let contact_id = ContactId::new(row_id);
let (addr, name, authname) = update_chat_names(context, &transaction, contact_id)?;
transaction.query_row(
"SELECT addr, name, authname
FROM contacts
WHERE id=?",
(contact_id,),
|row| {
let addr: String = row.get(0)?;
let name: String = row.get(1)?;
let authname: String = row.get(2)?;
Ok((addr, name, authname))
})?;
let chat_name = if !name.is_empty() {
name
} else if !authname.is_empty() {
authname
} else {
addr
};
let count = transaction.execute(
"UPDATE chats SET name=?1 WHERE id=?2 AND name!=?1",
(chat_name, chat_id))?;
if count > 0 {
// Chat name updated
context.emit_event(EventType::ChatModified(chat_id));
chatlist_events::emit_chatlist_items_changed_for_contact(context, contact_id);
}
}
} }
sth_modified = Modifier::Modified; sth_modified = Modifier::Modified;
} }
@@ -955,23 +917,14 @@ impl Contact {
let update_name = manual; let update_name = manual;
let update_authname = !manual; let update_authname = !manual;
transaction transaction.execute(
.execute(
"INSERT INTO contacts (name, addr, origin, authname) "INSERT INTO contacts (name, addr, origin, authname)
VALUES (?, ?, ?, ?);", VALUES (?, ?, ?, ?);",
( (
if update_name { if update_name { &name } else { "" },
&name
} else {
""
},
&addr, &addr,
origin, origin,
if update_authname { if update_authname { &name } else { "" },
&name
} else {
""
}
), ),
)?; )?;
@@ -980,7 +933,8 @@ impl Contact {
info!(context, "Added contact id={row_id} addr={addr}."); info!(context, "Added contact id={row_id} addr={addr}.");
} }
Ok(row_id) Ok(row_id)
}).await?; })
.await?;
let contact_id = ContactId::new(row_id); let contact_id = ContactId::new(row_id);
@@ -1606,6 +1560,60 @@ impl Contact {
} }
} }
// Updates the names of the chats which use the contact name.
//
// This is one of the few duplicated data, however, getting the chat list is easier this way.
fn update_chat_names(
context: &Context,
transaction: &rusqlite::Connection,
contact_id: ContactId,
) -> Result<()> {
let chat_id: Option<ChatId> = transaction.query_row(
"SELECT id FROM chats WHERE type=? AND id IN(SELECT chat_id FROM chats_contacts WHERE contact_id=?)",
(Chattype::Single, contact_id),
|row| {
let chat_id: ChatId = row.get(0)?;
Ok(chat_id)
}
).optional()?;
if let Some(chat_id) = chat_id {
let (addr, name, authname) = transaction.query_row(
"SELECT addr, name, authname
FROM contacts
WHERE id=?",
(contact_id,),
|row| {
let addr: String = row.get(0)?;
let name: String = row.get(1)?;
let authname: String = row.get(2)?;
Ok((addr, name, authname))
},
)?;
let chat_name = if !name.is_empty() {
name
} else if !authname.is_empty() {
authname
} else {
addr
};
let count = transaction.execute(
"UPDATE chats SET name=?1 WHERE id=?2 AND name!=?1",
(chat_name, chat_id),
)?;
if count > 0 {
// Chat name updated
context.emit_event(EventType::ChatModified(chat_id));
chatlist_events::emit_chatlist_items_changed_for_contact(context, contact_id);
}
}
Ok(())
}
pub(crate) async fn set_blocked( pub(crate) async fn set_blocked(
context: &Context, context: &Context,
sync: sync::Sync, sync: sync::Sync,