use same method to cache headers as felamimail; same cache store! try to gain control about the get_row calls

This commit is contained in:
Klaus Leithoff 2013-06-04 15:29:53 +00:00
parent b79460e7a0
commit de5e5ba478
3 changed files with 121 additions and 9 deletions

View File

@ -1081,7 +1081,8 @@ class mail_bo
$queryString = implode(',', $sortResult); $queryString = implode(',', $sortResult);
// fetch the data for the selected messages // fetch the data for the selected messages
if (self::$debug) $starttime = microtime(true); if (self::$debug) $starttime = microtime(true);
$headersNew = $this->icServer->getSummary($queryString, $rByUid); //$headersNew = $this->icServer->getSummary($queryString, $rByUid);
$headersNew = $this->_getSummary($queryString, $rByUid);
if (PEAR::isError($headersNew) && empty($queryString)) if (PEAR::isError($headersNew) && empty($queryString))
{ {
$headersNew = array(); $headersNew = array();
@ -2723,6 +2724,20 @@ class mail_bo
$this->flagMessages($_flag, array_slice($_messageUID,$h),($_folder?$_folder:$this->sessionData['mailbox'])); $this->flagMessages($_flag, array_slice($_messageUID,$h),($_folder?$_folder:$this->sessionData['mailbox']));
} }
} }
$summary = egw_cache::getCache(egw_cache::INSTANCE,'email','summaryCache'.trim($GLOBALS['egw_info']['user']['account_id']),$callback=null,$callback_params=array(),$expiration=60*60*1);
$cachemodified = false;
foreach ((array)$_messageUID as $k => $_uid)
{
if (isset($summary[$this->icServer->ImapServerId][(!empty($currentFolder)?$currentFolder: $this->sessionData['mailbox'])][$_uid]))
{
$cachemodified = true;
unset($summary[$this->icServer->ImapServerId][(!empty($currentFolder)?$currentFolder: $this->sessionData['mailbox'])][$_uid]);
}
}
if ($cachemodified)
{
egw_cache::setCache(egw_cache::INSTANCE,'email','summaryCache'.trim($GLOBALS['egw_info']['user']['account_id']),$summary,$expiration=60*60*1);
}
$this->sessionData['folderStatus'][$this->profileID][$this->sessionData['mailbox']]['uidValidity'] = 0; $this->sessionData['folderStatus'][$this->profileID][$this->sessionData['mailbox']]['uidValidity'] = 0;
$this->saveSessionData(); $this->saveSessionData();
@ -2781,6 +2796,21 @@ class mail_bo
$this->icServer->expunge(); $this->icServer->expunge();
} }
} }
$summary = egw_cache::getCache(egw_cache::INSTANCE,'email','summaryCache'.trim($GLOBALS['egw_info']['user']['account_id']),$callback=null,$callback_params=array(),$expiration=60*60*1);
$cachemodified = false;
foreach ((array)$_messageUID as $k => $_uid)
{
if (isset($summary[$this->icServer->ImapServerId][(!empty($currentFolder)?$currentFolder: $this->sessionData['mailbox'])][$_uid]))
{
$cachemodified = true;
unset($summary[$this->icServer->ImapServerId][(!empty($currentFolder)?$currentFolder: $this->sessionData['mailbox'])][$_uid]);
}
}
if ($cachemodified)
{
egw_cache::setCache(egw_cache::INSTANCE,'email','summaryCache'.trim($GLOBALS['egw_info']['user']['account_id']),$summary,$expiration=60*60*1);
}
//error_log(__METHOD__.__LINE__.array2string($retUid)); //error_log(__METHOD__.__LINE__.array2string($retUid));
return ($returnUIDs ? $retUid : true); return ($returnUIDs ? $retUid : true);
} }
@ -2966,6 +2996,65 @@ class mail_bo
return $structure[$this->icServer->ImapServerId][$_folder][$_uid]; return $structure[$this->icServer->ImapServerId][$_folder][$_uid];
} }
/**
* _getSummary
* fetch the summary for the mails, requested by queryString
* @param string/int $queryString the messageuid(s),
* @param boolean $byUid=true, is the messageuid given by UID or ID
* @param boolean $_ignoreCache=false, use or disregard cache, when fetching
* @param string $_folder='', if given search within that folder for the given $queryString, else use sessionData['mailbox'], or servers getCurrentMailbox
* @return array an array with the mail headers requested
*/
function _getSummary($queryString, $byUid=true, $_ignoreCache=false, $_folder = '')
{
static $summary;
if (empty($_folder)) $_folder = ($this->sessionData['mailbox']? $this->sessionData['mailbox'] : $this->icServer->getCurrentMailbox());
//error_log(__METHOD__.__LINE__.'User:'.trim($GLOBALS['egw_info']['user']['account_id'])." UID: $_uid, ".$this->icServer->ImapServerId.','.$_folder);
if (is_null($summary)) $summary = egw_cache::getCache(egw_cache::INSTANCE,'email','summaryCache'.trim($GLOBALS['egw_info']['user']['account_id']),$callback=null,$callback_params=array(),$expiration=60*60*1);
$_uids = explode(',', $queryString);
$uidsCached = (is_array($summary[$this->icServer->ImapServerId][$_folder])?array_keys($summary[$this->icServer->ImapServerId][$_folder]):array());
$toFetch = array_diff($_uids,(array)$uidsCached);
if (!empty($toFetch))
{
//error_log(__METHOD__.__LINE__.':'.$GLOBALS['egw_info']['user']['account_id'].'::'.$this->icServer->ImapServerId.'::'. $_folder.':QS:'.$queryString.'->'.array2string(array_keys((array)$summary[$this->icServer->ImapServerId][$_folder])));
error_log(__METHOD__.__LINE__.' fetch Summary for'.':'.$GLOBALS['egw_info']['user']['account_id'].'::'.$this->icServer->ImapServerId.'::'. $_folder.'::for headers with uids ToFetch:'.implode(',',$toFetch));
if (!isset($summary[$this->icServer->ImapServerId])) $summary[$this->icServer->ImapServerId]=array();
if (!isset($summary[$this->icServer->ImapServerId][$_folder])) $summary[$this->icServer->ImapServerId][$_folder]=array();
$result = $this->icServer->getSummary(implode(',',$toFetch), $byUid);
foreach ($result as $sum)
{
//error_log(__METHOD__.__LINE__.'::'.$sum['UID'].':'.$sum['SUBJECT']);
$summary[$this->icServer->ImapServerId][$_folder][$sum['UID']]=$sum;
}
}
foreach ($_uids as $_uid)
{
$fetched=false;
//error_log(__METHOD__.__LINE__." UID: $_uid, ".$this->icServer->ImapServerId.','.$_folder.'->'.array2string($summary[$this->icServer->ImapServerId][$_folder][$_uid]));
if (isset($summary[$this->icServer->ImapServerId]) && !empty($summary[$this->icServer->ImapServerId]) &&
isset($summary[$this->icServer->ImapServerId][$_folder]) && !empty($summary[$this->icServer->ImapServerId][$_folder]) &&
isset($summary[$this->icServer->ImapServerId][$_folder][$_uid]) && !empty($summary[$this->icServer->ImapServerId][$_folder][$_uid]))
{
if ($_ignoreCache===false)
{
//error_log(__METHOD__.__LINE__.' Using cache for structure on Server:'.$this->icServer->ImapServerId.' for uid:'.$_uid." in Folder:".$_folder.'->'.array2string($structure[$this->icServer->ImapServerId][$_folder][$_uid]));
$rv[] = $summary[$this->icServer->ImapServerId][$_folder][$_uid];
$fetched=true;
}
}
if ($fetched==false)
{
error_log(__METHOD__.__LINE__.' fetch Summary for Header of Mail with:'.$_uid);
$result = $this->icServer->getSummary($_uid, $byUid);
$summary[$this->icServer->ImapServerId][$_folder][$_uid] = $result[0];
$rv[] = $summary[$this->icServer->ImapServerId][$_folder][$_uid];
}
}
egw_cache::setCache(egw_cache::INSTANCE,'email','summaryCache'.trim($GLOBALS['egw_info']['user']['account_id']),$summary,$expiration=60*60*1);
//error_log(__METHOD__.__LINE__.' Using query for summary on Server:'.$this->icServer->ImapServerId.' for uid:'.$_uid." in Folder:".$_folder.'->'.array2string($structure[$this->icServer->ImapServerId][$_folder][$_uid]));
return $rv;
}
/** /**
* _getSubStructure * _getSubStructure
* fetch the substructure of a mail, by given structure and partid * fetch the substructure of a mail, by given structure and partid
@ -3392,6 +3481,20 @@ class mail_bo
} }
} }
if (self::$debug) _debug_array($structure); if (self::$debug) _debug_array($structure);
if ($_preserveSeen==false)
{
$summary = egw_cache::getCache(egw_cache::INSTANCE,'email','summaryCache'.trim($GLOBALS['egw_info']['user']['account_id']),$callback=null,$callback_params=array(),$expiration=60*60*1);
$cachemodified = false;
if (isset($summary[$this->icServer->ImapServerId][$this->sessionData['mailbox']][$_uid]))
{
$cachemodified = true;
unset($summary[$this->icServer->ImapServerId][$this->sessionData['mailbox']][$_uid]);
}
if ($cachemodified)
{
egw_cache::setCache(egw_cache::INSTANCE,'email','summaryCache'.trim($GLOBALS['egw_info']['user']['account_id']),$summary,$expiration=60*60*1);
}
}
switch($structure->type) { switch($structure->type) {
case 'APPLICATION': case 'APPLICATION':
return array( return array(

View File

@ -89,11 +89,12 @@ class mail_ui
* *
* @param int $icServerID * @param int $icServerID
*/ */
function changeProfile($_icServerID) function changeProfile($_icServerID,$unsetCache=false)
{ {
//if (self::$icServerID != $_icServerID) $unsetCache = true;
if (mail_bo::$debug) error_log(__METHOD__.__LINE__.'->'.self::$icServerID.'<->'.$_icServerID);
self::$icServerID = $_icServerID; self::$icServerID = $_icServerID;
if (mail_bo::$debug) error_log(__METHOD__.__LINE__.'->'.self::$icServerID); if ($unsetCache) emailadmin_bo::unsetCachedObjects(self::$icServerID);
emailadmin_bo::unsetCachedObjects(self::$icServerID);
$this->mail_bo = mail_bo::getInstance(false,self::$icServerID); $this->mail_bo = mail_bo::getInstance(false,self::$icServerID);
if (mail_bo::$debug) error_log(__METHOD__.__LINE__.' Fetched IC Server:'.self::$icServerID.'/'.$this->mail_bo->profileID.':'.function_backtrace()); if (mail_bo::$debug) error_log(__METHOD__.__LINE__.' Fetched IC Server:'.self::$icServerID.'/'.$this->mail_bo->profileID.':'.function_backtrace());
// no icServer Object: something failed big time // no icServer Object: something failed big time
@ -260,7 +261,7 @@ class mail_ui
_debug_array('Connection Reset triggered:'.$connectionReset.' for Profile with ID:'.$icServerID); _debug_array('Connection Reset triggered:'.$connectionReset.' for Profile with ID:'.$icServerID);
emailadmin_bo::unsetCachedObjects($icServerID); emailadmin_bo::unsetCachedObjects($icServerID);
/*
if (mail_bo::$idna2) if (mail_bo::$idna2)
{ {
_debug_array('Umlautdomains supported (see Example below)'); _debug_array('Umlautdomains supported (see Example below)');
@ -268,7 +269,7 @@ class mail_ui
$encDom = mail_bo::$idna2->encode($dom); $encDom = mail_bo::$idna2->encode($dom);
_debug_array(array('source'=>$dom,'result'=>array('encoded'=>$encDom,'decoded'=>mail_bo::$idna2->decode($encDom)))); _debug_array(array('source'=>$dom,'result'=>array('encoded'=>$encDom,'decoded'=>mail_bo::$idna2->decode($encDom))));
} }
*/
if ($preferences->preferences['prefcontroltestconnection'] == 'reset') exit; if ($preferences->preferences['prefcontroltestconnection'] == 'reset') exit;
echo "<hr /><h3 style='color:red'>".lang('IMAP Server')."</h3>"; echo "<hr /><h3 style='color:red'>".lang('IMAP Server')."</h3>";

View File

@ -50,8 +50,11 @@ app.mail = AppJS.extend(
{ {
if (_reset == true) if (_reset == true)
{ {
//var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm');
//if (this.mail_currentlyFocussed!='') nm.refresh([this.mail_currentlyFocussed],'delete');//egw.dataDeleteUID(this.mail_currentlyFocussed);
if (this.mail_currentlyFocussed!='') egw.dataDeleteUID(this.mail_currentlyFocussed); if (this.mail_currentlyFocussed!='') egw.dataDeleteUID(this.mail_currentlyFocussed);
for(var k = 0; k < this.mail_selectedMails.length; k++) egw.dataDeleteUID(this.mail_selectedMails[k]); for(var k = 0; k < this.mail_selectedMails.length; k++) egw.dataDeleteUID(this.mail_selectedMails[k]);
//nm.refresh(this.mail_selectedMails,'delete');
} }
this.mail_selectedMails = []; this.mail_selectedMails = [];
this.mail_currentlyFocussed = ''; this.mail_currentlyFocussed = '';
@ -177,7 +180,7 @@ app.mail = AppJS.extend(
console.log("mail_preview",nextmatch, selected); console.log("mail_preview",nextmatch, selected);
// Empty values, just in case selected is empty (user cleared selection) // Empty values, just in case selected is empty (user cleared selection)
var dataElem = {data:{subject:"",fromaddress:"",toaddress:"",date:"",subject:""}}; var dataElem = {data:{subject:"",fromaddress:"",toaddress:"",date:"",subject:""}};
if(typeof selected != 'undefined' && selected.length > 0) if(typeof selected != 'undefined' && selected.length == 1)
{ {
var _id = this.mail_fetchCurrentlyFocussed(selected); var _id = this.mail_fetchCurrentlyFocussed(selected);
dataElem = egw.dataGetUIDdata(_id); dataElem = egw.dataGetUIDdata(_id);
@ -259,7 +262,9 @@ app.mail = AppJS.extend(
var activeFolders = tree_wdg.getTreeNodeOpenItems(nodeToRefresh,mode2use); var activeFolders = tree_wdg.getTreeNodeOpenItems(nodeToRefresh,mode2use);
//alert(activeFolders.join('#,#')); //alert(activeFolders.join('#,#'));
this.mail_queueRefreshFolderList(activeFolders); this.mail_queueRefreshFolderList(activeFolders);
// maybe to use the mode forced as trigger for grid reload and using the grids own autorefresh
// would solve the refresh issue more accurately
//if (mode == "forced") this.mail_refreshMessageGrid();
this.mail_refreshMessageGrid(); this.mail_refreshMessageGrid();
} catch(e) { } // ignore the error; maybe the template is not loaded yet } catch(e) { } // ignore the error; maybe the template is not loaded yet
}, },
@ -858,7 +863,10 @@ app.mail = AppJS.extend(
// as the "onNodeSelect" function! // as the "onNodeSelect" function!
var request = new egw_json_request('mail.mail_ui.ajax_moveMessages',[target, messages]); var request = new egw_json_request('mail.mail_ui.ajax_moveMessages',[target, messages]);
request.sendRequest(false); request.sendRequest(false);
for (var i = 0; i < messages['msg'].length; i++) egw.dataDeleteUID(messages['msg'][i]); var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('nm');
this.mail_setRowClass(_senders,'deleted');
nm.refresh(messages['msg'],'delete')
//for (var i = 0; i < messages['msg'].length; i++) egw.dataDeleteUID(messages['msg'][i]);
this.mail_refreshMessageGrid(); this.mail_refreshMessageGrid();
}, },
/** /**