From: Kevin McCarthy Date: Fri, 6 Jan 2017 22:37:48 +0000 (-0800) Subject: Convert cmd_parse_search to use the uid hash. (closes #3905) X-Git-Tag: neomutt-20170225~33^2~19 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b09e47974db5c46c9558db2782d7e2d7f6a07597;p=neomutt Convert cmd_parse_search to use the uid hash. (closes #3905) Replace the linear scan for each result with a hash lookup. This should greatly improve performance for large mailboxes. --- diff --git a/imap/command.c b/imap/command.c index ee694ed3f..7328b6834 100644 --- a/imap/command.c +++ b/imap/command.c @@ -862,36 +862,20 @@ static void cmd_parse_myrights (IMAP_DATA* idata, const char* s) } } -/* This should be optimised (eg with a tree or hash) */ -static int uid2msgno (IMAP_DATA* idata, unsigned int uid) -{ - int i; - - for (i = 0; i < idata->ctx->msgcount; i++) - { - HEADER* h = idata->ctx->hdrs[i]; - if (HEADER_DATA(h)->uid == uid) - return i; - } - - return -1; -} - /* cmd_parse_search: store SEARCH response for later use */ static void cmd_parse_search (IMAP_DATA* idata, const char* s) { unsigned int uid; - int msgno; + HEADER *h; mutt_debug (2, "Handling SEARCH\n"); while ((s = imap_next_word ((char*)s)) && *s != '\0') { - uid = atoi (s); - msgno = uid2msgno (idata, uid); - - if (msgno >= 0) - idata->ctx->hdrs[msgno]->matched = 1; + uid = (unsigned int)atoi (s); + h = (HEADER *)int_hash_find (idata->uid_hash, uid); + if (h) + h->matched = 1; } }