]> granicus.if.org Git - mutt/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)
committerKevin McCarthy <kevin@8t8.us>
Fri, 6 Jan 2017 22:37:48 +0000 (14:37 -0800)
Replace the linear scan for each result with a hash lookup.  This
should greatly improve performance for large mailboxes.

imap/command.c

index 2c6f25c1d9c78327d2a58c9a1678fa4648ad962d..c0c370f6ef5c57e4761b8df6d406f8a439bb7721 100644 (file)
@@ -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;
   }
 }