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: mutt-1-8-rel~47 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9b1f9339b8cd954e4518a828ae82c07c29317c19;p=mutt 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 2c6f25c1..c0c370f6 100644 --- a/imap/command.c +++ b/imap/command.c @@ -855,36 +855,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; dprint (2, (debugfile, "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; } }