Add possibility to programmatically set cache mode, so it is possible

to cache only indexes/threads but not messages
pull/135/head
Aleksander Machniak 11 years ago
parent 4daaa09438
commit aceb0149b8

@ -3760,12 +3760,17 @@ class rcube_imap extends rcube_storage
/** /**
* Enable or disable messages caching * Enable or disable messages caching
* *
* @param boolean $set Flag * @param boolean $set Flag
* @param int $mode Cache mode
*/ */
public function set_messages_caching($set) public function set_messages_caching($set, $mode = null)
{ {
if ($set) { if ($set) {
$this->messages_caching = true; $this->messages_caching = true;
if ($mode && ($cache = $this->get_mcache_engine())) {
$cache->set_mode($mode);
}
} }
else { else {
if ($this->mcache) { if ($this->mcache) {
@ -3800,7 +3805,7 @@ class rcube_imap extends rcube_storage
* Clears the messages cache. * Clears the messages cache.
* *
* @param string $folder Folder name * @param string $folder Folder name
* @param array $uids Optional message UIDs to remove from cache * @param array $uids Optional message UIDs to remove from cache
*/ */
protected function clear_message_cache($folder = null, $uids = null) protected function clear_message_cache($folder = null, $uids = null)
{ {

@ -27,6 +27,9 @@
*/ */
class rcube_imap_cache class rcube_imap_cache
{ {
const MODE_INDEX = 1;
const MODE_MESSAGE = 2;
/** /**
* Instance of rcube_imap * Instance of rcube_imap
* *
@ -70,6 +73,7 @@ class rcube_imap_cache
private $icache = array(); private $icache = array();
private $skip_deleted = false; private $skip_deleted = false;
private $mode;
/** /**
* List of known flags. Thanks to this we can handle flag changes * List of known flags. Thanks to this we can handle flag changes
@ -95,6 +99,7 @@ class rcube_imap_cache
); );
/** /**
* Object constructor. * Object constructor.
* *
@ -117,6 +122,9 @@ class rcube_imap_cache
$this->skip_deleted = $skip_deleted; $this->skip_deleted = $skip_deleted;
$this->ttl = $ttl; $this->ttl = $ttl;
$this->threshold = $threshold; $this->threshold = $threshold;
// cache all possible information by default
$this->mode = self::MODE_INDEX | self::MODE_MESSAGE;
} }
@ -130,6 +138,17 @@ class rcube_imap_cache
} }
/**
* Set cache mode
*
* @param int $mode Cache mode
*/
public function set_mode($mode)
{
$this->mode = $mode;
}
/** /**
* Return (sorted) messages index (UIDs). * Return (sorted) messages index (UIDs).
* If index doesn't exist or is invalid, will be updated. * If index doesn't exist or is invalid, will be updated.
@ -308,27 +327,29 @@ class rcube_imap_cache
return array(); return array();
} }
// Fetch messages from cache
$sql_result = $this->db->query(
"SELECT uid, data, flags"
." FROM ".$this->db->table_name('cache_messages')
." WHERE user_id = ?"
." AND mailbox = ?"
." AND uid IN (".$this->db->array2list($msgs, 'integer').")",
$this->userid, $mailbox);
$msgs = array_flip($msgs); $msgs = array_flip($msgs);
$result = array(); $result = array();
while ($sql_arr = $this->db->fetch_assoc($sql_result)) { if ($this->mode & self::MODE_MESSAGE) {
$uid = intval($sql_arr['uid']); // Fetch messages from cache
$result[$uid] = $this->build_message($sql_arr); $sql_result = $this->db->query(
"SELECT uid, data, flags"
." FROM ".$this->db->table_name('cache_messages')
." WHERE user_id = ?"
." AND mailbox = ?"
." AND uid IN (".$this->db->array2list($msgs, 'integer').")",
$this->userid, $mailbox);
while ($sql_arr = $this->db->fetch_assoc($sql_result)) {
$uid = intval($sql_arr['uid']);
$result[$uid] = $this->build_message($sql_arr);
if (!empty($result[$uid])) { if (!empty($result[$uid])) {
// save memory, we don't need message body here (?) // save memory, we don't need message body here (?)
$result[$uid]->body = null; $result[$uid]->body = null;
unset($msgs[$uid]); unset($msgs[$uid]);
}
} }
} }
@ -339,7 +360,10 @@ class rcube_imap_cache
// Insert to DB and add to result list // Insert to DB and add to result list
if (!empty($messages)) { if (!empty($messages)) {
foreach ($messages as $msg) { foreach ($messages as $msg) {
$this->add_message($mailbox, $msg, !array_key_exists($msg->uid, $result)); if ($this->mode & self::MODE_MESSAGE) {
$this->add_message($mailbox, $msg, !array_key_exists($msg->uid, $result));
}
$result[$msg->uid] = $msg; $result[$msg->uid] = $msg;
} }
} }
@ -370,17 +394,19 @@ class rcube_imap_cache
return $this->icache['__message']['object']; return $this->icache['__message']['object'];
} }
$sql_result = $this->db->query( if ($this->mode & self::MODE_MESSAGE) {
"SELECT flags, data" $sql_result = $this->db->query(
." FROM ".$this->db->table_name('cache_messages') "SELECT flags, data"
." WHERE user_id = ?" ." FROM ".$this->db->table_name('cache_messages')
." AND mailbox = ?" ." WHERE user_id = ?"
." AND uid = ?", ." AND mailbox = ?"
$this->userid, $mailbox, (int)$uid); ." AND uid = ?",
$this->userid, $mailbox, (int)$uid);
if ($sql_arr = $this->db->fetch_assoc($sql_result)) { if ($sql_arr = $this->db->fetch_assoc($sql_result)) {
$message = $this->build_message($sql_arr); $message = $this->build_message($sql_arr);
$found = true; $found = true;
}
} }
// Get the message from IMAP server // Get the message from IMAP server
@ -389,6 +415,10 @@ class rcube_imap_cache
// cache will be updated in close(), see below // cache will be updated in close(), see below
} }
if (!($this->mode & self::MODE_MESSAGE)) {
return $message;
}
// Save the message in internal cache, will be written to DB in close() // Save the message in internal cache, will be written to DB in close()
// Common scenario: user opens unseen message // Common scenario: user opens unseen message
// - get message (SELECT) // - get message (SELECT)
@ -424,6 +454,10 @@ class rcube_imap_cache
return; return;
} }
if (!($this->mode & self::MODE_MESSAGE)) {
return;
}
$flags = 0; $flags = 0;
$msg = clone $message; $msg = clone $message;
@ -495,6 +529,10 @@ class rcube_imap_cache
return; return;
} }
if (!($this->mode & self::MODE_MESSAGE)) {
return;
}
$flag = strtoupper($flag); $flag = strtoupper($flag);
$idx = (int) array_search($flag, $this->flags); $idx = (int) array_search($flag, $this->flags);
$uids = (array) $uids; $uids = (array) $uids;
@ -535,6 +573,10 @@ class rcube_imap_cache
*/ */
function remove_message($mailbox = null, $uids = null) function remove_message($mailbox = null, $uids = null)
{ {
if (!($this->mode & self::MODE_MESSAGE)) {
return;
}
if (!strlen($mailbox)) { if (!strlen($mailbox)) {
$this->db->query( $this->db->query(
"DELETE FROM ".$this->db->table_name('cache_messages') "DELETE FROM ".$this->db->table_name('cache_messages')
@ -1036,15 +1078,17 @@ class rcube_imap_cache
$removed = array(); $removed = array();
// Get known UIDs // Get known UIDs
$sql_result = $this->db->query( if ($this->mode & self::MODE_MESSAGE) {
"SELECT uid" $sql_result = $this->db->query(
." FROM ".$this->db->table_name('cache_messages') "SELECT uid"
." WHERE user_id = ?" ." FROM ".$this->db->table_name('cache_messages')
." AND mailbox = ?", ." WHERE user_id = ?"
$this->userid, $mailbox); ." AND mailbox = ?",
$this->userid, $mailbox);
while ($sql_arr = $this->db->fetch_assoc($sql_result)) { while ($sql_arr = $this->db->fetch_assoc($sql_result)) {
$uids[] = $sql_arr['uid']; $uids[] = $sql_arr['uid'];
}
} }
// Synchronize messages data // Synchronize messages data

Loading…
Cancel
Save