@@ -843,44 +843,48 @@ impl Contact {
843
843
844
844
let mut update_addr = false ;
845
845
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
849
852
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 ) ?;
881
860
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 (
884
888
"UPDATE contacts SET name=?, addr=?, origin=?, authname=? WHERE id=?;" ,
885
889
(
886
890
new_name,
@@ -899,88 +903,38 @@ impl Contact {
899
903
} else {
900
904
row_authname
901
905
} ,
902
- row_id
906
+ row_id,
903
907
) ,
904
908
) ?;
905
909
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 {
919
911
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) ?;
950
913
}
914
+ sth_modified = Modifier :: Modified ;
951
915
}
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;
957
919
958
- transaction
959
- . execute (
920
+ transaction. execute (
960
921
"INSERT INTO contacts (name, addr, origin, authname)
961
922
VALUES (?, ?, ?, ?);" ,
962
- (
963
- if update_name {
964
- & name
965
- } else {
966
- ""
967
- } ,
923
+ (
924
+ if update_name { & name } else { "" } ,
968
925
& addr,
969
926
origin,
970
- if update_authname {
971
- & name
972
- } else {
973
- ""
974
- }
927
+ if update_authname { & name } else { "" } ,
975
928
) ,
976
929
) ?;
977
930
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 ?;
984
938
985
939
let contact_id = ContactId :: new ( row_id) ;
986
940
@@ -1606,6 +1560,60 @@ impl Contact {
1606
1560
}
1607
1561
}
1608
1562
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
+
1609
1617
pub ( crate ) async fn set_blocked (
1610
1618
context : & Context ,
1611
1619
sync : sync:: Sync ,
0 commit comments