Skip to content

Commit 5280448

Browse files
committed
refactor: factor out update_chat_names()
1 parent 891e166 commit 5280448

File tree

1 file changed

+112
-104
lines changed

1 file changed

+112
-104
lines changed

src/contact.rs

Lines changed: 112 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -843,44 +843,48 @@ impl Contact {
843843

844844
let mut update_addr = false;
845845

846-
let row_id = context.sql.transaction(|transaction| {
847-
let row = transaction.query_row(
848-
"SELECT id, name, addr, origin, authname
846+
let row_id = context
847+
.sql
848+
.transaction(|transaction| {
849+
let row = transaction
850+
.query_row(
851+
"SELECT id, name, addr, origin, authname
849852
FROM contacts WHERE addr=? COLLATE NOCASE",
850-
(addr,),
851-
|row| {
852-
let row_id: isize = row.get(0)?;
853-
let row_name: String = row.get(1)?;
854-
let row_addr: String = row.get(2)?;
855-
let row_origin: Origin = row.get(3)?;
856-
let row_authname: String = row.get(4)?;
857-
858-
Ok((row_id, row_name, row_addr, row_origin, row_authname))
859-
}).optional()?;
860-
861-
let row_id;
862-
if let Some((id, row_name, row_addr, row_origin, row_authname)) = row {
863-
let update_name = manual && name != row_name;
864-
let update_authname = !manual
865-
&& name != row_authname
866-
&& !name.is_empty()
867-
&& (origin >= row_origin
868-
|| origin == Origin::IncomingUnknownFrom
869-
|| row_authname.is_empty());
870-
871-
row_id = u32::try_from(id)?;
872-
if origin >= row_origin && addr.as_ref() != row_addr {
873-
update_addr = true;
874-
}
875-
if update_name || update_authname || update_addr || origin > row_origin {
876-
let new_name = if update_name {
877-
name.to_string()
878-
} else {
879-
row_name
880-
};
853+
(addr,),
854+
|row| {
855+
let row_id: u32 = row.get(0)?;
856+
let row_name: String = row.get(1)?;
857+
let row_addr: String = row.get(2)?;
858+
let row_origin: Origin = row.get(3)?;
859+
let row_authname: String = row.get(4)?;
881860

882-
transaction
883-
.execute(
861+
Ok((row_id, row_name, row_addr, row_origin, row_authname))
862+
},
863+
)
864+
.optional()?;
865+
866+
let row_id;
867+
if let Some((id, row_name, row_addr, row_origin, row_authname)) = row {
868+
let update_name = manual && name != row_name;
869+
let update_authname = !manual
870+
&& name != row_authname
871+
&& !name.is_empty()
872+
&& (origin >= row_origin
873+
|| origin == Origin::IncomingUnknownFrom
874+
|| row_authname.is_empty());
875+
876+
row_id = id;
877+
if origin >= row_origin && addr.as_ref() != row_addr {
878+
update_addr = true;
879+
}
880+
if update_name || update_authname || update_addr || origin > row_origin {
881+
let new_name = if update_name {
882+
name.to_string()
883+
} else {
884+
row_name
885+
};
886+
887+
transaction.execute(
884888
"UPDATE contacts SET name=?, addr=?, origin=?, authname=? WHERE id=?;",
885889
(
886890
new_name,
@@ -899,88 +903,38 @@ impl Contact {
899903
} else {
900904
row_authname
901905
},
902-
row_id
906+
row_id,
903907
),
904908
)?;
905909

906-
if update_name || update_authname {
907-
// Update the contact name also if it is used as a group name.
908-
// This is one of the few duplicated data, however, getting the chat list is easier this way.
909-
let chat_id: Option<ChatId> = transaction.query_row(
910-
"SELECT id FROM chats WHERE type=? AND id IN(SELECT chat_id FROM chats_contacts WHERE contact_id=?)",
911-
(Chattype::Single, isize::try_from(row_id)?),
912-
|row| {
913-
let chat_id: ChatId = row.get(0)?;
914-
Ok(chat_id)
915-
}
916-
).optional()?;
917-
918-
if let Some(chat_id) = chat_id {
910+
if update_name || update_authname {
919911
let contact_id = ContactId::new(row_id);
920-
let (addr, name, authname) =
921-
transaction.query_row(
922-
"SELECT addr, name, authname
923-
FROM contacts
924-
WHERE id=?",
925-
(contact_id,),
926-
|row| {
927-
let addr: String = row.get(0)?;
928-
let name: String = row.get(1)?;
929-
let authname: String = row.get(2)?;
930-
Ok((addr, name, authname))
931-
})?;
932-
933-
let chat_name = if !name.is_empty() {
934-
name
935-
} else if !authname.is_empty() {
936-
authname
937-
} else {
938-
addr
939-
};
940-
941-
let count = transaction.execute(
942-
"UPDATE chats SET name=?1 WHERE id=?2 AND name!=?1",
943-
(chat_name, chat_id))?;
944-
945-
if count > 0 {
946-
// Chat name updated
947-
context.emit_event(EventType::ChatModified(chat_id));
948-
chatlist_events::emit_chatlist_items_changed_for_contact(context, contact_id);
949-
}
912+
update_chat_names(context, &transaction, contact_id)?;
950913
}
914+
sth_modified = Modifier::Modified;
951915
}
952-
sth_modified = Modifier::Modified;
953-
}
954-
} else {
955-
let update_name = manual;
956-
let update_authname = !manual;
916+
} else {
917+
let update_name = manual;
918+
let update_authname = !manual;
957919

958-
transaction
959-
.execute(
920+
transaction.execute(
960921
"INSERT INTO contacts (name, addr, origin, authname)
961922
VALUES (?, ?, ?, ?);",
962-
(
963-
if update_name {
964-
&name
965-
} else {
966-
""
967-
},
923+
(
924+
if update_name { &name } else { "" },
968925
&addr,
969926
origin,
970-
if update_authname {
971-
&name
972-
} else {
973-
""
974-
}
927+
if update_authname { &name } else { "" },
975928
),
976929
)?;
977930

978-
sth_modified = Modifier::Created;
979-
row_id = u32::try_from(transaction.last_insert_rowid())?;
980-
info!(context, "Added contact id={row_id} addr={addr}.");
981-
}
982-
Ok(row_id)
983-
}).await?;
931+
sth_modified = Modifier::Created;
932+
row_id = u32::try_from(transaction.last_insert_rowid())?;
933+
info!(context, "Added contact id={row_id} addr={addr}.");
934+
}
935+
Ok(row_id)
936+
})
937+
.await?;
984938

985939
let contact_id = ContactId::new(row_id);
986940

@@ -1606,6 +1560,60 @@ impl Contact {
16061560
}
16071561
}
16081562

1563+
// Updates the names of the chats which use the contact name.
1564+
//
1565+
// This is one of the few duplicated data, however, getting the chat list is easier this way.
1566+
fn update_chat_names(
1567+
context: &Context,
1568+
transaction: &rusqlite::Connection,
1569+
contact_id: ContactId,
1570+
) -> Result<()> {
1571+
let chat_id: Option<ChatId> = transaction.query_row(
1572+
"SELECT id FROM chats WHERE type=? AND id IN(SELECT chat_id FROM chats_contacts WHERE contact_id=?)",
1573+
(Chattype::Single, contact_id),
1574+
|row| {
1575+
let chat_id: ChatId = row.get(0)?;
1576+
Ok(chat_id)
1577+
}
1578+
).optional()?;
1579+
1580+
if let Some(chat_id) = chat_id {
1581+
let (addr, name, authname) = transaction.query_row(
1582+
"SELECT addr, name, authname
1583+
FROM contacts
1584+
WHERE id=?",
1585+
(contact_id,),
1586+
|row| {
1587+
let addr: String = row.get(0)?;
1588+
let name: String = row.get(1)?;
1589+
let authname: String = row.get(2)?;
1590+
Ok((addr, name, authname))
1591+
},
1592+
)?;
1593+
1594+
let chat_name = if !name.is_empty() {
1595+
name
1596+
} else if !authname.is_empty() {
1597+
authname
1598+
} else {
1599+
addr
1600+
};
1601+
1602+
let count = transaction.execute(
1603+
"UPDATE chats SET name=?1 WHERE id=?2 AND name!=?1",
1604+
(chat_name, chat_id),
1605+
)?;
1606+
1607+
if count > 0 {
1608+
// Chat name updated
1609+
context.emit_event(EventType::ChatModified(chat_id));
1610+
chatlist_events::emit_chatlist_items_changed_for_contact(context, contact_id);
1611+
}
1612+
}
1613+
1614+
Ok(())
1615+
}
1616+
16091617
pub(crate) async fn set_blocked(
16101618
context: &Context,
16111619
sync: sync::Sync,

0 commit comments

Comments
 (0)