On Saturday 22 February 2003 21:46, Andreas Aardal Hanssen wrote:

> Here's the change log for 1.0.24-1:
> - Fixed message size cacheing
> - FETCH only full-parses a message at an RFC822.SIZE request if the
>   size is not already cached.

Fetching the size of a message is now MUCH faster than before. That's nice :-)

However it is still very slow when fetching headers on large messages because 
the whole message is parsed even though only headers are fetched.
I know that the patch i sent probably wouldn't work in all situations but 
maybe it could be done in a more proper way so fetching of headers on large 
messages could be speeded up a bit.

I guess it should be something like this:
If no section is given in the attributes to FETCH BODY and it is not TEXT that 
is requested only the headers should be parsed. Otherwise the full message is 
parsed.

I have made some changes to 1.0.24 and tested it quite well. It seems to work 
with all the different section types (HEADER, HEADER.FIELDS, TEXT, 
HEADER.FIELDS.NOT, MIME).
Here's my patch (looks a bit like the previous one i sent). Please give me 
some feedback on it.


diff -u -r bincimap-1.0.24/src/bincimapd-fetch.cc 
bincimap-1.0.24-patched/src/bincimapd-fetch.cc
--- bincimap-1.0.24/src/bincimapd-fetch.cc      2003-02-21 20:51:58.000000000 +0100
+++ bincimap-1.0.24-patched/src/bincimapd-fetch.cc      2003-02-24 
16:38:48.000000000 +0100
@@ -581,21 +581,40 @@
 
            bool peek = (fatt.type == "BODY.PEEK");
 
-           if (!message->isAllParsed()) {
-             if (prevmessage != message || (prevmessage != NULL && 
!prevmessage->isAllParsed())) {
-               if (prevmessage != NULL) {
-                 prevmessage->close();
-                 prevmessage = NULL;
+           if (fatt.section != "" || fatt.sectiontext == "TEXT") {
+             if (!message->isAllParsed()) {
+               if (prevmessage != message || (prevmessage != NULL && 
!prevmessage->isAllParsed())) {
+                 if (prevmessage != NULL) {
+                   prevmessage->close();
+                   prevmessage = NULL;
+                 }
+                 prevmessage = message;
                }
-               prevmessage = message;
+
+               if ((fp = depot->open(message->getID())) == NULL)
+                 throw MessageException("error opening file");
+
+               message->parseFull(fp);
+               fclose(fp);
+               fp = NULL;
+             }
+           } else {
+             if (!message->isHeaderParsed() && !message->isAllParsed()) {
+               if (prevmessage != message || (prevmessage != NULL && 
!prevmessage->isHeaderParsed())) {
+                 if (prevmessage != NULL) {
+                   prevmessage->close();
+                   prevmessage = NULL;
+                 }
+                 prevmessage = message;
+               }
+
+               if ((fp = depot->open(message->getID())) == NULL)
+                 throw MessageException("error opening file");
+
+               message->parseOnlyHeader(fp);
+               fclose(fp);
+               fp = NULL;
              }
-             
-             if ((fp = depot->open(message->getID())) == NULL)
-               throw MessageException("error opening file");
-             
-             message->parseFull(fp);
-             fclose(fp);
-             fp = NULL;
            }
 
            com << fatt.toString();
diff -u -r bincimap-1.0.24/src/parsers/mime/mime-parseonlyheader.cc 
bincimap-1.0.24-patched/src/parsers/mime/mime-parseonlyheader.cc
--- bincimap-1.0.24/src/parsers/mime/mime-parseonlyheader.cc    2003-02-16 
17:28:59.000000000 +0100
+++ bincimap-1.0.24-patched/src/parsers/mime/mime-parseonlyheader.cc    
2003-02-24 16:04:46.000000000 +0100
@@ -70,7 +70,7 @@
   headerlength = 0;
   bodystartoffset = 0;
   bodylength = 0;
-  size = -1;
+  //size = -1;  size is not calculated here so don't overwrite the cached 
size
   messagerfc822 = false;
   multipart = false;
 
@@ -91,7 +91,7 @@
   memset(cqueue, 0, sizeof(cqueue));
 
   headerstartoffset = bytenr;
-  //  int headerstartoffsetcrlf = crlfnr;
+  int headerstartoffsetcrlf = crlfnr;
 
   bool quit = false;
   int c = '\0';
@@ -188,5 +188,7 @@
     h.add(name, content);
   }
 
+  headerlength = crlfnr - headerstartoffsetcrlf;
+
   return 1;
 }


--
Thomas Petersen

Reply via email to