- Improved performance of draft saving by usage of APPENDUID response if available (skipped SEARCH call)

release-0.7
alecpl 13 years ago
parent 56ec81cb6f
commit 765fdeb5b5

@ -2531,7 +2531,7 @@ class rcube_imap
* @param string $headers Headers string if $message contains only the body * @param string $headers Headers string if $message contains only the body
* @param boolean $is_file True if $message is a filename * @param boolean $is_file True if $message is a filename
* *
* @return boolean True on success, False on error * @return int|bool Appended message UID or True on success, False on error
*/ */
function save_message($mailbox, &$message, $headers='', $is_file=false) function save_message($mailbox, &$message, $headers='', $is_file=false)
{ {

@ -310,6 +310,10 @@ class rcube_imap_generic
} }
else { else {
$this->resultcode = null; $this->resultcode = null;
// parse response for [APPENDUID 1204196876 3456]
if (preg_match("/^\[APPENDUID [0-9]+ ([0-9,:*]+)\]/i", $str, $m)) {
$this->data['APPENDUID'] = $m[1];
}
} }
$this->result = $str; $this->result = $str;
@ -2498,8 +2502,18 @@ class rcube_imap_generic
return ($result == self::ERROR_OK); return ($result == self::ERROR_OK);
} }
/**
* Handler for IMAP APPEND command
*
* @param string $mailbox Mailbox name
* @param string $message Message content
*
* @return string|bool On success APPENDUID response (if available) or True, False on failure
*/
function append($mailbox, &$message) function append($mailbox, &$message)
{ {
unset($this->data['APPENDUID']);
if (!$mailbox) { if (!$mailbox) {
return false; return false;
} }
@ -2538,7 +2552,12 @@ class rcube_imap_generic
// Clear internal status cache // Clear internal status cache
unset($this->data['STATUS:'.$mailbox]); unset($this->data['STATUS:'.$mailbox]);
return ($this->parseResult($line, 'APPEND: ') == self::ERROR_OK); if ($this->parseResult($line, 'APPEND: ') != self::ERROR_OK)
return false;
else if (!empty($this->data['APPENDUID']))
return $this->data['APPENDUID'];
else
return true;
} }
else { else {
$this->setError(self::ERROR_COMMAND, "Unable to send command: $request"); $this->setError(self::ERROR_COMMAND, "Unable to send command: $request");
@ -2547,8 +2566,19 @@ class rcube_imap_generic
return false; return false;
} }
/**
* Handler for IMAP APPEND command.
*
* @param string $mailbox Mailbox name
* @param string $path Path to the file with message body
* @param string $headers Message headers
*
* @return string|bool On success APPENDUID response (if available) or True, False on failure
*/
function appendFromFile($mailbox, $path, $headers=null) function appendFromFile($mailbox, $path, $headers=null)
{ {
unset($this->data['APPENDUID']);
if (!$mailbox) { if (!$mailbox) {
return false; return false;
} }
@ -2615,7 +2645,12 @@ class rcube_imap_generic
// Clear internal status cache // Clear internal status cache
unset($this->data['STATUS:'.$mailbox]); unset($this->data['STATUS:'.$mailbox]);
return ($this->parseResult($line, 'APPEND: ') == self::ERROR_OK); if ($this->parseResult($line, 'APPEND: ') != self::ERROR_OK)
return false;
else if (!empty($this->data['APPENDUID']))
return $this->data['APPENDUID'];
else
return true;
} }
else { else {
$this->setError(self::ERROR_COMMAND, "Unable to send command: $request"); $this->setError(self::ERROR_COMMAND, "Unable to send command: $request");

@ -700,6 +700,7 @@ if ($store_target) {
if ($olddraftmessageid) { if ($olddraftmessageid) {
// delete previous saved draft // delete previous saved draft
// @TODO: use message UID (remember to check UIDVALIDITY) to skip this SEARCH
$a_deleteid = $IMAP->search_once($CONFIG['drafts_mbox'], $a_deleteid = $IMAP->search_once($CONFIG['drafts_mbox'],
'HEADER Message-ID '.$olddraftmessageid, true); 'HEADER Message-ID '.$olddraftmessageid, true);
@ -723,9 +724,12 @@ else if ($mailbody_file) {
if ($savedraft) { if ($savedraft) {
$msgid = strtr($message_id, array('>' => '', '<' => '')); $msgid = strtr($message_id, array('>' => '', '<' => ''));
// remember new draft-uid // remember new draft-uid ($saved could be an UID or TRUE here)
if (is_bool($saved)) {
$draftuids = $IMAP->search_once($CONFIG['drafts_mbox'], 'HEADER Message-ID '.$msgid, true); $draftuids = $IMAP->search_once($CONFIG['drafts_mbox'], 'HEADER Message-ID '.$msgid, true);
$_SESSION['compose']['param']['draft_uid'] = $draftuids[0]; $saved = $draftuids[0];
}
$_SESSION['compose']['param']['draft_uid'] = $saved;
// display success // display success
$OUTPUT->show_message('messagesaved', 'confirmation'); $OUTPUT->show_message('messagesaved', 'confirmation');

Loading…
Cancel
Save