- Performance improvements by use UID commands (#1485690)

release-0.6
alecpl 15 years ago
parent 34ebe0ba2c
commit 40dfeaddf8

@ -1,6 +1,7 @@
CHANGELOG RoundCube Webmail CHANGELOG RoundCube Webmail
=========================== ===========================
- Performance improvements by use UID commands (#1485690)
- Fix HTML editor tabIndex setting (#1485972) - Fix HTML editor tabIndex setting (#1485972)
- Added 'imap_debug' option - Added 'imap_debug' option
- Support strftime's format modifiers in date_* options (#1484806) - Support strftime's format modifiers in date_* options (#1484806)

@ -1119,21 +1119,16 @@ class rcube_imap
return $headers->structure; return $headers->structure;
} }
// resolve message sequence number
if (!($msg_id = $this->_uid2id($uid))) {
return FALSE;
}
if (!$structure_str) if (!$structure_str)
$structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id); $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $uid, true);
$structure = iml_GetRawStructureArray($structure_str); $structure = iml_GetRawStructureArray($structure_str);
$struct = false; $struct = false;
// parse structure and add headers // parse structure and add headers
if (!empty($structure)) if (!empty($structure))
{ {
$this->_msg_id = $msg_id;
$headers = $this->get_headers($uid); $headers = $this->get_headers($uid);
$this->_msg_id = $headers->id;
// set message charset from message headers // set message charset from message headers
if ($headers->charset) if ($headers->charset)
@ -1271,7 +1266,7 @@ class rcube_imap
// fetch message headers if message/rfc822 or named part (could contain Content-Location header) // fetch message headers if message/rfc822 or named part (could contain Content-Location header)
if ($struct->ctype_primary == 'message' || ($struct->ctype_parameters['name'] && !$struct->content_id)) { if ($struct->ctype_primary == 'message' || ($struct->ctype_parameters['name'] && !$struct->content_id)) {
if (empty($raw_headers)) if (empty($raw_headers))
$raw_headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id); $raw_headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $struct->mime_id);
$struct->headers = $this->_parse_headers($raw_headers) + $struct->headers; $struct->headers = $this->_parse_headers($raw_headers) + $struct->headers;
} }
@ -1314,7 +1309,7 @@ class rcube_imap
// we must fetch and parse headers "manually" // we must fetch and parse headers "manually"
if ($i<2) { if ($i<2) {
if (!$headers) if (!$headers)
$headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $part->mime_id); $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
$filename_mime = ''; $filename_mime = '';
$i = 0; $i = 0;
while (preg_match('/filename\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { while (preg_match('/filename\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
@ -1331,7 +1326,7 @@ class rcube_imap
} }
if ($i<2) { if ($i<2) {
if (!$headers) if (!$headers)
$headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $part->mime_id); $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
$filename_encoded = ''; $filename_encoded = '';
$i = 0; $matches = array(); $i = 0; $matches = array();
while (preg_match('/filename\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { while (preg_match('/filename\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
@ -1348,7 +1343,7 @@ class rcube_imap
} }
if ($i<2) { if ($i<2) {
if (!$headers) if (!$headers)
$headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $part->mime_id); $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
$filename_mime = ''; $filename_mime = '';
$i = 0; $matches = array(); $i = 0; $matches = array();
while (preg_match('/\s+name\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { while (preg_match('/\s+name\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
@ -1365,7 +1360,7 @@ class rcube_imap
} }
if ($i<2) { if ($i<2) {
if (!$headers) if (!$headers)
$headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, $part->mime_id); $headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $this->_msg_id, false, $part->mime_id);
$filename_encoded = ''; $filename_encoded = '';
$i = 0; $matches = array(); $i = 0; $matches = array();
while (preg_match('/\s+name\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { while (preg_match('/\s+name\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) {
@ -1429,13 +1424,10 @@ class rcube_imap
*/ */
function &get_message_part($uid, $part=1, $o_part=NULL, $print=NULL, $fp=NULL) function &get_message_part($uid, $part=1, $o_part=NULL, $print=NULL, $fp=NULL)
{ {
if (!($msg_id = $this->_uid2id($uid)))
return FALSE;
// get part encoding if not provided // get part encoding if not provided
if (!is_object($o_part)) if (!is_object($o_part))
{ {
$structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id); $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $uid, true);
$structure = iml_GetRawStructureArray($structure_str); $structure = iml_GetRawStructureArray($structure_str);
$part_type = iml_GetPartTypeCode($structure, $part); $part_type = iml_GetPartTypeCode($structure, $part);
$o_part = new rcube_message_part; $o_part = new rcube_message_part;
@ -1448,7 +1440,7 @@ class rcube_imap
if (!$part) $part = 'TEXT'; if (!$part) $part = 'TEXT';
$body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $uid, true, $part,
$o_part->encoding, $print, $fp); $o_part->encoding, $print, $fp);
if ($fp || $print) if ($fp || $print)
@ -1490,10 +1482,7 @@ class rcube_imap
*/ */
function &get_raw_body($uid) function &get_raw_body($uid)
{ {
if (!($msg_id = $this->_uid2id($uid))) return iil_C_HandlePartBody($this->conn, $this->mailbox, $uid, true);
return FALSE;
return iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id);
} }
@ -1505,12 +1494,7 @@ class rcube_imap
*/ */
function &get_raw_headers($uid) function &get_raw_headers($uid)
{ {
if (!($msg_id = $this->_uid2id($uid))) return iil_C_FetchPartHeader($this->conn, $this->mailbox, $uid, true);
return FALSE;
$headers = iil_C_FetchPartHeader($this->conn, $this->mailbox, $msg_id, NULL);
return $headers;
} }
@ -1521,10 +1505,7 @@ class rcube_imap
*/ */
function print_raw_body($uid) function print_raw_body($uid)
{ {
if (!($msg_id = $this->_uid2id($uid))) iil_C_HandlePartBody($this->conn, $this->mailbox, $uid, true, NULL, NULL, true);
return FALSE;
iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, NULL, NULL, true);
} }

@ -2190,14 +2190,14 @@ function iil_C_FetchMIMEHeaders(&$conn, $mailbox, $id, $parts) {
return $result; return $result;
} }
function iil_C_FetchPartHeader(&$conn, $mailbox, $id, $part) { function iil_C_FetchPartHeader(&$conn, $mailbox, $id, $is_uid=false, $part=NULL) {
$part = empty($part) ? 'HEADER' : $part.'.MIME'; $part = empty($part) ? 'HEADER' : $part.'.MIME';
return iil_C_HandlePartBody($conn, $mailbox, $id, $part); return iil_C_HandlePartBody($conn, $mailbox, $id, $is_uid, $part);
} }
function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part='', $encoding=NULL, $print=NULL, $file=NULL) { function iil_C_HandlePartBody(&$conn, $mailbox, $id, $is_uid=false, $part='', $encoding=NULL, $print=NULL, $file=NULL) {
$fp = $conn->fp; $fp = $conn->fp;
$result = false; $result = false;
@ -2224,7 +2224,7 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part='', $encoding=NULL, $
// format request // format request
$key = 'ftch0'; $key = 'ftch0';
$request = $key . " FETCH $id (BODY.PEEK[$part])"; $request = $key . ($is_uid ? ' UID' : '') . " FETCH $id (BODY.PEEK[$part])";
// send request // send request
if (!iil_PutLine($fp, $request)) { if (!iil_PutLine($fp, $request)) {
return false; return false;
@ -2346,14 +2346,6 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part='', $encoding=NULL, $
return false; return false;
} }
function iil_C_FetchPartBody(&$conn, $mailbox, $id, $part, $file=NULL) {
return iil_C_HandlePartBody($conn, $mailbox, $id, $part, NULL, NULL, $file);
}
function iil_C_PrintPartBody(&$conn, $mailbox, $id, $part) {
iil_C_HandlePartBody($conn, $mailbox, $id, $part, NULL, true, NULL);
}
function iil_C_CreateFolder(&$conn, $folder) { function iil_C_CreateFolder(&$conn, $folder) {
$fp = $conn->fp; $fp = $conn->fp;
if (iil_PutLine($fp, 'c CREATE "' . iil_Escape($folder) . '"')) { if (iil_PutLine($fp, 'c CREATE "' . iil_Escape($folder) . '"')) {
@ -2477,14 +2469,14 @@ function iil_C_AppendFromFile(&$conn, $folder, $path) {
return false; return false;
} }
function iil_C_FetchStructureString(&$conn, $folder, $id) { function iil_C_FetchStructureString(&$conn, $folder, $id, $is_uid=false) {
$fp = $conn->fp; $fp = $conn->fp;
$result = false; $result = false;
if (iil_C_Select($conn, $folder)) { if (iil_C_Select($conn, $folder)) {
$key = 'F1247'; $key = 'F1247';
if (iil_PutLine($fp, "$key FETCH $id (BODYSTRUCTURE)")) { if (iil_PutLine($fp, $key . ($is_uid ? ' UID' : '') ." FETCH $id (BODYSTRUCTURE)")) {
do { do {
$line = iil_ReadLine($fp, 5000); $line = iil_ReadLine($fp, 5000);
$line = iil_MultLine($fp, $line); $line = iil_MultLine($fp, $line);

Loading…
Cancel
Save