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