Example #1
0
 /**
  * Fetches messages headers (by UID)
  *
  * @param  string  $folder   Folder name
  * @param  array   $msgs     Message UIDs
  * @param  bool    $sort     Enables result sorting by $msgs
  * @param  bool    $force    Disables cache use
  *
  * @return array Messages headers indexed by UID
  */
 function fetch_headers($folder, $msgs, $sort = true, $force = false)
 {
     if (empty($msgs)) {
         return array();
     }
     if (!$force && ($mcache = $this->get_mcache_engine())) {
         $headers = $mcache->get_messages($folder, $msgs);
     } else {
         if (!$this->check_connection()) {
             return array();
         } else {
             // fetch reqested headers from server
             $headers = $this->conn->fetchHeaders($folder, $msgs, true, false, $this->get_fetch_headers());
         }
     }
     if (empty($headers)) {
         return array();
     }
     foreach ($headers as $h) {
         $h->folder = $folder;
         $a_msg_headers[$h->uid] = $h;
     }
     if ($sort) {
         // use this class for message sorting
         $sorter = new rcube_message_header_sorter();
         $sorter->set_index($msgs);
         $sorter->sort_headers($a_msg_headers);
     }
     return $a_msg_headers;
 }
Example #2
0
 /**
  * Fetches messages headers
  *
  * @param  string  $mailbox  Mailbox name
  * @param  array   $msgs     Messages sequence numbers
  * @param  bool    $is_uid   Enable if $msgs numbers are UIDs
  * @param  bool    $force    Disables cache use
  *
  * @return array Messages headers indexed by UID
  * @access private
  */
 function fetch_headers($mailbox, $msgs, $is_uid = false, $force = false)
 {
     if (empty($msgs)) {
         return array();
     }
     if (!$force && ($mcache = $this->get_mcache_engine())) {
         return $mcache->get_messages($mailbox, $msgs, $is_uid);
     }
     // fetch reqested headers from server
     $index = $this->conn->fetchHeaders($mailbox, $msgs, $is_uid, false, $this->get_fetch_headers());
     if (empty($index)) {
         return array();
     }
     foreach ($index as $headers) {
         $a_msg_headers[$headers->uid] = $headers;
     }
     return $a_msg_headers;
 }
Example #3
0
 /**
  * @param string $mailbox Mailbox name
  * @access private
  */
 private function sync_header_index($mailbox)
 {
     $cache_key = $mailbox . '.msg';
     $cache_index = $this->get_message_cache_index($cache_key);
     $chunk_size = 1000;
     // cache is empty, get all messages
     if (is_array($cache_index) && empty($cache_index)) {
         $max = $this->_messagecount($mailbox);
         // syncing a big folder maybe slow
         @set_time_limit(0);
         $start = 1;
         $end = min($chunk_size, $max);
         while (true) {
             // do this in loop to save memory (1000 msgs ~= 10 MB)
             if ($headers = $this->conn->fetchHeaders($mailbox, "{$start}:{$end}", false, false, $this->get_fetch_headers())) {
                 foreach ($headers as $header) {
                     $this->add_message_cache($cache_key, $header->id, $header, NULL, true);
                 }
             }
             if ($end - $start < $chunk_size - 1) {
                 break;
             }
             $end = min($end + $chunk_size, $max);
             $start += $chunk_size;
         }
         return;
     }
     // fetch complete message index
     if (isset($this->icache['folder_index'])) {
         $a_message_index =& $this->icache['folder_index'];
     } else {
         $a_message_index = $this->conn->fetchHeaderIndex($mailbox, "1:*", 'UID', $this->skip_deleted);
     }
     if ($a_message_index === false || $cache_index === null) {
         return;
     }
     // compare cache index with real index
     foreach ($a_message_index as $id => $uid) {
         // message in cache at correct position
         if ($cache_index[$id] == $uid) {
             unset($cache_index[$id]);
             continue;
         }
         // other message at this position
         if (isset($cache_index[$id])) {
             $for_remove[] = $cache_index[$id];
             unset($cache_index[$id]);
         }
         // message in cache but at wrong position
         if (is_int($key = array_search($uid, $cache_index))) {
             $for_remove[] = $uid;
             unset($cache_index[$key]);
         }
         $for_update[] = $id;
     }
     // remove messages at wrong positions and those deleted that are still in cache_index
     if (!empty($for_remove)) {
         $cache_index = array_merge($cache_index, $for_remove);
     }
     if (!empty($cache_index)) {
         $this->remove_message_cache($cache_key, $cache_index);
     }
     // fetch complete headers and add to cache
     if (!empty($for_update)) {
         // syncing a big folder maybe slow
         @set_time_limit(0);
         // To save memory do this in chunks
         $for_update = array_chunk($for_update, $chunk_size);
         foreach ($for_update as $uids) {
             if ($headers = $this->conn->fetchHeaders($mailbox, $uids, false, false, $this->get_fetch_headers())) {
                 foreach ($headers as $header) {
                     $this->add_message_cache($cache_key, $header->id, $header, NULL, true);
                 }
             }
         }
     }
 }