/** * at which sequence is the message with the highest messageUid (cache + imap)? * * @param Felamimail_Model_Folder $_folder * @param Felamimail_Backend_ImapProxy $_imap * @param boolean $_updateFolder * @throws Felamimail_Exception * @throws Felamimail_Exception_IMAPMessageNotFound */ protected function _updateMessageSequence(Felamimail_Model_Folder $_folder, Felamimail_Backend_ImapProxy $_imap, $_updateFolder = TRUE) { if ($_folder->imap_totalcount > 0) { $transactionId = Tinebase_TransactionManager::getInstance()->startTransaction(Tinebase_Core::getDb()); $lastFailedUid = null; $messageSequence = null; $decrementMessagesCounter = 0; $decrementUnreadCounter = 0; while ($messageSequence === null) { $latestMessageUidArray = $this->_getLatestMessageUid($_folder); if (is_array($latestMessageUidArray)) { $latestMessageId = key($latestMessageUidArray); $latestMessageUid = current($latestMessageUidArray); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " {$latestMessageId} {$latestMessageUid}"); } if ($latestMessageUid === $lastFailedUid) { throw new Felamimail_Exception('Failed to delete invalid messageuid from cache'); } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " Check messageUid {$latestMessageUid} in folder " . $_folder->globalname); } try { $this->_imapMessageSequence = $_imap->resolveMessageUid($latestMessageUid); $this->_cacheMessageSequence = $_folder->cache_totalcount; $messageSequence = $this->_imapMessageSequence + 1; } catch (Zend_Mail_Protocol_Exception $zmpe) { if (!$_updateFolder) { throw new Felamimail_Exception_IMAPMessageNotFound('Message not found on IMAP'); } // message does not exist on imap server anymore, remove from local cache if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " messageUid {$latestMessageUid} not found => remove from cache"); } $lastFailedUid = $latestMessageUid; $latestMessage = $this->_backend->get($latestMessageId); $this->_backend->delete($latestMessage); $decrementMessagesCounter++; if (!$latestMessage->hasSeenFlag()) { $decrementUnreadCounter++; } } } else { $this->_imapMessageSequence = 0; $messageSequence = 1; } if (!$this->_timeLeft()) { $_folder->cache_status = Felamimail_Model_Folder::CACHE_STATUS_INCOMPLETE; break; } } Tinebase_TransactionManager::getInstance()->commitTransaction($transactionId); if ($decrementMessagesCounter > 0 || $decrementUnreadCounter > 0) { Felamimail_Controller_Folder::getInstance()->updateFolderCounter($_folder, array('cache_totalcount' => "-{$decrementMessagesCounter}", 'cache_unreadcount' => "-{$decrementUnreadCounter}")); } } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " Cache status cache total count: {$_folder->cache_totalcount} imap total count: {$_folder->imap_totalcount} cache sequence: {$this->_cacheMessageSequence} imap sequence: {$this->_imapMessageSequence}"); } }