/** * 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; }
/** * 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; }
/** * @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); } } } } }