mirror of
https://github.com/chatmail/core.git
synced 2026-05-20 15:26:30 +03:00
Avoid ChatId::is_unset for searching messages
Using a ChatId value of 0 to indicate global search is a left over from C-land. Refactor this to be an option instead.
This commit is contained in:
@@ -1136,10 +1136,15 @@ pub unsafe extern "C" fn dc_search_msgs(
|
|||||||
return ptr::null_mut();
|
return ptr::null_mut();
|
||||||
}
|
}
|
||||||
let ctx = &*context;
|
let ctx = &*context;
|
||||||
|
let chat_id = if chat_id == 0 {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(ChatId::new(chat_id))
|
||||||
|
};
|
||||||
|
|
||||||
block_on(async move {
|
block_on(async move {
|
||||||
let arr = dc_array_t::from(
|
let arr = dc_array_t::from(
|
||||||
ctx.search_msgs(ChatId::new(chat_id), to_string_lossy(query))
|
ctx.search_msgs(chat_id, to_string_lossy(query))
|
||||||
.await
|
.await
|
||||||
.iter()
|
.iter()
|
||||||
.map(|msg_id| msg_id.to_u32())
|
.map(|msg_id| msg_id.to_u32())
|
||||||
|
|||||||
@@ -858,9 +858,9 @@ pub async fn cmdline(context: Context, line: &str, chat_id: &mut ChatId) -> Resu
|
|||||||
ensure!(!arg1.is_empty(), "Argument <query> missing.");
|
ensure!(!arg1.is_empty(), "Argument <query> missing.");
|
||||||
|
|
||||||
let chat = if let Some(ref sel_chat) = sel_chat {
|
let chat = if let Some(ref sel_chat) = sel_chat {
|
||||||
sel_chat.get_id()
|
Some(sel_chat.get_id())
|
||||||
} else {
|
} else {
|
||||||
ChatId::new(0)
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
let msglist = context.search_msgs(chat, arg1).await;
|
let msglist = context.search_msgs(chat, arg1).await;
|
||||||
|
|||||||
@@ -457,48 +457,22 @@ impl Context {
|
|||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
/// Searches for messages containing the query string.
|
||||||
pub async fn search_msgs(&self, chat_id: ChatId, query: impl AsRef<str>) -> Vec<MsgId> {
|
///
|
||||||
|
/// If `chat_id` is provided this searches only for messages in this chat, if `chat_id`
|
||||||
|
/// is `None` this searches messages from all chats.
|
||||||
|
pub async fn search_msgs(&self, chat_id: Option<ChatId>, query: impl AsRef<str>) -> Vec<MsgId> {
|
||||||
let real_query = query.as_ref().trim();
|
let real_query = query.as_ref().trim();
|
||||||
if real_query.is_empty() {
|
if real_query.is_empty() {
|
||||||
return Vec::new();
|
return Vec::new();
|
||||||
}
|
}
|
||||||
let strLikeInText = format!("%{}%", real_query);
|
let str_like_in_text = format!("%{}%", real_query);
|
||||||
let strLikeBeg = format!("{}%", real_query);
|
let str_like_beg = format!("{}%", real_query);
|
||||||
|
|
||||||
let query = if !chat_id.is_unset() {
|
let do_query = |query, params| {
|
||||||
concat!(
|
self.sql.query_map(
|
||||||
"SELECT m.id AS id, m.timestamp AS timestamp",
|
|
||||||
" FROM msgs m",
|
|
||||||
" LEFT JOIN contacts ct",
|
|
||||||
" ON m.from_id=ct.id",
|
|
||||||
" WHERE m.chat_id=?",
|
|
||||||
" AND m.hidden=0",
|
|
||||||
" AND ct.blocked=0",
|
|
||||||
" AND (txt LIKE ? OR ct.name LIKE ?)",
|
|
||||||
" ORDER BY m.timestamp,m.id;"
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
concat!(
|
|
||||||
"SELECT m.id AS id, m.timestamp AS timestamp",
|
|
||||||
" FROM msgs m",
|
|
||||||
" LEFT JOIN contacts ct",
|
|
||||||
" ON m.from_id=ct.id",
|
|
||||||
" LEFT JOIN chats c",
|
|
||||||
" ON m.chat_id=c.id",
|
|
||||||
" WHERE m.chat_id>9",
|
|
||||||
" AND m.hidden=0",
|
|
||||||
" AND (c.blocked=0 OR c.blocked=?)",
|
|
||||||
" AND ct.blocked=0",
|
|
||||||
" AND (m.txt LIKE ? OR ct.name LIKE ?)",
|
|
||||||
" ORDER BY m.timestamp DESC,m.id DESC;"
|
|
||||||
)
|
|
||||||
};
|
|
||||||
|
|
||||||
self.sql
|
|
||||||
.query_map(
|
|
||||||
query,
|
query,
|
||||||
paramsv![chat_id, strLikeInText, strLikeBeg],
|
params,
|
||||||
|row| row.get::<_, MsgId>("id"),
|
|row| row.get::<_, MsgId>("id"),
|
||||||
|rows| {
|
|rows| {
|
||||||
let mut ret = Vec::new();
|
let mut ret = Vec::new();
|
||||||
@@ -508,8 +482,42 @@ impl Context {
|
|||||||
Ok(ret)
|
Ok(ret)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(chat_id) = chat_id {
|
||||||
|
do_query(
|
||||||
|
"SELECT m.id AS id, m.timestamp AS timestamp
|
||||||
|
FROM msgs m
|
||||||
|
LEFT JOIN contacts ct
|
||||||
|
ON m.from_id=ct.id
|
||||||
|
WHERE m.chat_id=?
|
||||||
|
AND m.hidden=0
|
||||||
|
AND ct.blocked=0
|
||||||
|
AND (txt LIKE ? OR ct.name LIKE ?)
|
||||||
|
ORDER BY m.timestamp,m.id;",
|
||||||
|
paramsv![chat_id, str_like_in_text, str_like_beg],
|
||||||
|
)
|
||||||
.await
|
.await
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
|
} else {
|
||||||
|
do_query(
|
||||||
|
"SELECT m.id AS id, m.timestamp AS timestamp
|
||||||
|
FROM msgs m
|
||||||
|
LEFT JOIN contacts ct
|
||||||
|
ON m.from_id=ct.id
|
||||||
|
LEFT JOIN chats c
|
||||||
|
ON m.chat_id=c.id
|
||||||
|
WHERE m.chat_id>9
|
||||||
|
AND m.hidden=0
|
||||||
|
AND c.blocked=0
|
||||||
|
AND ct.blocked=0
|
||||||
|
AND (m.txt LIKE ? OR ct.name LIKE ?)
|
||||||
|
ORDER BY m.timestamp DESC,m.id DESC;",
|
||||||
|
paramsv![str_like_in_text, str_like_beg],
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap_or_default()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn is_inbox(&self, folder_name: impl AsRef<str>) -> bool {
|
pub async fn is_inbox(&self, folder_name: impl AsRef<str>) -> bool {
|
||||||
|
|||||||
Reference in New Issue
Block a user