]> granicus.if.org Git - neomutt/commitdiff
Convert cmd_parse_search to use the uid hash. (closes #3905)
authorKevin McCarthy <kevin@8t8.us>
Fri, 6 Jan 2017 22:37:48 +0000 (14:37 -0800)
committerRichard Russon <rich@flatcap.org>
Fri, 10 Feb 2017 03:32:55 +0000 (03:32 +0000)
Replace the linear scan for each result with a hash lookup.  This
should greatly improve performance for large mailboxes.

imap/command.c

index ee694ed3fbeaf0b32b50c2f479b35007e4ecbf2b..7328b6834795787d52ce15039830286578e8441f 100644 (file)
@@ -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;
   }
 }