From a2b4861dc413fd98761b2631bacc062e41d1a9a2 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Mon, 23 Apr 2012 08:16:40 +0000 Subject: [PATCH] * email: caching of folderObjects for session under certain conditions, to speed up email module access managing session cache for cached folderObjects; attempt to introduce better sorting for folderObjects in shared/other namespace (if available); removal of obsolete code --- emailadmin/inc/class.emailadmin_bo.inc.php | 4 ++ felamimail/inc/class.ajaxfelamimail.inc.php | 15 ++++++- felamimail/inc/class.felamimail_bo.inc.php | 49 +++++++++++++-------- felamimail/inc/class.uifelamimail.inc.php | 40 ----------------- 4 files changed, 48 insertions(+), 60 deletions(-) diff --git a/emailadmin/inc/class.emailadmin_bo.inc.php b/emailadmin/inc/class.emailadmin_bo.inc.php index 1d837c7fdd..7457f83eee 100644 --- a/emailadmin/inc/class.emailadmin_bo.inc.php +++ b/emailadmin/inc/class.emailadmin_bo.inc.php @@ -607,6 +607,10 @@ class emailadmin_bo extends so_sql unset($structure[$_profileID]); egw_cache::setCache(egw_cache::INSTANCE,'email','structureCache'.trim($GLOBALS['egw_info']['user']['account_id']),$structure, $expiration=60*60*1); } + //reset cache, to trigger reload + $folders2return =& egw_cache::getSession('felamimail','folderObjects'); + if (isset($folders2return[$this->bofelamimail->icServer->ImapServerId])) unset($folders2return[$this->bofelamimail->icServer->ImapServerId]); + $nameSpace = egw_cache::getSession('email','defaultimap_nameSpace'); if (isset($nameSpace[$_profileID])) { diff --git a/felamimail/inc/class.ajaxfelamimail.inc.php b/felamimail/inc/class.ajaxfelamimail.inc.php index 2c2ee5931d..a7bcb63fe3 100644 --- a/felamimail/inc/class.ajaxfelamimail.inc.php +++ b/felamimail/inc/class.ajaxfelamimail.inc.php @@ -102,7 +102,10 @@ class ajaxfelamimail $newSubFolder = $this->_encodeDisplayFolderName($newSubFolder); $response->addScript("tree.insertNewItem('$parentFolder','$folderName','$newSubFolder',onNodeSelect,'folderClosed.gif',0,0,'CHILD,CHECKED');"); } - + //reset cache, to trigger reload + $folders2return =& egw_cache::getSession('felamimail','folderObjects'); + if (isset($folders2return[$this->bofelamimail->icServer->ImapServerId])) unset($folders2return[$this->bofelamimail->icServer->ImapServerId]); + //reset Form $response->addAssign("newSubFolder", "value", ''); return $response->getXML(); @@ -426,6 +429,9 @@ class ajaxfelamimail $folderName = $this->_encodeFolderName($folderName); $response->addScript("tree.deleteItem('$folderName',1);"); } + //reset cache, to trigger reload + $folders2return =& egw_cache::getSession('felamimail','folderObjects'); + if (isset($folders2return[$this->bofelamimail->icServer->ImapServerId])) unset($folders2return[$this->bofelamimail->icServer->ImapServerId]); return $response->getXML(); } @@ -1315,6 +1321,10 @@ class ajaxfelamimail $response->addScript("window.tree.insertNewItem('$_parentFolder','$newFolderName','$folderName',onNodeSelect,'MailFolderPlain.png',0,0,'CHILD,CHECKED,SELECT,CALL');"); } } + //reset cache, to trigger reload + $folders2return =& egw_cache::getSession('felamimail','folderObjects'); + if (isset($folders2return[$this->bofelamimail->icServer->ImapServerId])) unset($folders2return[$this->bofelamimail->icServer->ImapServerId]); + return $response->getXML(); } @@ -1588,6 +1598,9 @@ class ajaxfelamimail $status = (bool)$_status; $this->bofelamimail->subscribe($folderName, $status); + //reset cache, to trigger reload + $folders2return =& egw_cache::getSession('felamimail','folderObjects'); + if (isset($folders2return[$this->bofelamimail->icServer->ImapServerId])) unset($folders2return[$this->bofelamimail->icServer->ImapServerId]); $response = new xajaxResponse(); return $response->getXML(); diff --git a/felamimail/inc/class.felamimail_bo.inc.php b/felamimail/inc/class.felamimail_bo.inc.php index 816866e25c..70a16af5f0 100644 --- a/felamimail/inc/class.felamimail_bo.inc.php +++ b/felamimail/inc/class.felamimail_bo.inc.php @@ -1812,7 +1812,7 @@ class felamimail_bo * * returns an array of IMAP folder objects. Put INBOX folder in first * position. Preserves the folder seperator for later use. The returned - * array is indexed using the foldername. + * array is indexed using the foldername. Use cachedObjects when retrieving subscribedFolders * * @param _subscribedOnly boolean get subscribed or all folders * @param _getCounters boolean get get messages counters @@ -1823,6 +1823,17 @@ class felamimail_bo */ function getFolderObjects($_subscribedOnly=false, $_getCounters=false, $_alwaysGetDefaultFolders=false) { + if (self::$debug) error_log(__METHOD__.__LINE__.' '."subscribedOnly:$_subscribedOnly, getCounters:$_getCounters, alwaysGetDefaultFolders:$_alwaysGetDefaultFolders"); + static $folders2return; + if ($_subscribedOnly && $_getCounters===false) + { + if (is_null($folders2return)) $folders2return =& egw_cache::getSession('felamimail','folderObjects'); + if (isset($folders2return[$this->icServer->ImapServerId])) + { + //error_log(__METHOD__.__LINE__.' using Cached folderObjects'); + return $folders2return[$this->icServer->ImapServerId]; + } + } $isUWIMAP = false; $delimiter = $this->getHierarchyDelimiter(); @@ -2075,6 +2086,7 @@ class felamimail_bo } } #echo "
FolderNameSpace To Process:";_debug_array($foldersNameSpace); + $autoFolderObjects = array(); foreach( array('personal', 'others', 'shared') as $type) { if(isset($foldersNameSpace[$type])) { if($_subscribedOnly) { @@ -2102,18 +2114,6 @@ class felamimail_bo } if($_getCounters == true) { - /* - $folderStatus = $this->_getStatus($folderName); - #echo "
FolderStatus:";_debug_array($folderStatus); - if(is_array($folderStatus)) { - $status = new stdClass; - $status->messages = $folderStatus['MESSAGES']; - $status->unseen = $folderStatus['UNSEEN']; - $status->recent = $folderStatus['RECENT']; - - $folderObject->counter = $status; - } - */ $folderObject->counter = $this->bofelamimail->getMailBoxCounters($folderName); } @@ -2135,8 +2135,8 @@ class felamimail_bo $folderObject->displayName = $this->encodeFolderName($folderObject->folderName); $folderObject->shortDisplayName = $this->encodeFolderName($shortName); } - $folderName = $folderName; - if (in_array($shortName,self::$autoFolders)) { + //$folderName = $folderName; + if (in_array($shortName,self::$autoFolders)&&self::searchValueInFolderObjects($shortName,$autoFolderObjects)===false) { $autoFolderObjects[$folderName] = $folderObject; } else { $folders[$folderName] = $folderObject; @@ -2144,13 +2144,24 @@ class felamimail_bo } } } - if (is_array($autoFolderObjects)) { + if (is_array($autoFolderObjects) && !empty($autoFolderObjects)) { uasort($autoFolderObjects,array($this,"sortByAutoFolderPos")); } if (is_array($folders)) uasort($folders,array($this,"sortByDisplayName")); //$folders2return = array_merge($autoFolderObjects,$folders); //_debug_array($folders2return); #exit; - return array_merge($inboxFolderObject,(array)$autoFolderObjects,(array)$folders); + $folders2return[$this->icServer->ImapServerId] = array_merge($inboxFolderObject,$autoFolderObjects,(array)$folders); + return $folders2return[$this->icServer->ImapServerId]; + } + + static function searchValueInFolderObjects($needle, $haystack) + { + $rv = false; + foreach ($haystack as $k => $v) + { + foreach($v as $sk => $sv) if (trim($sv)==trim($needle)) return $k; + } + return $rv; } function sortByDisplayName($a,$b) @@ -2162,8 +2173,8 @@ class felamimail_bo function sortByAutoFolderPos($a,$b) { // 0, 1 und -1 - $pos1 = array_search($a->shortFolderName,self::$autoFolders); - $pos2 = array_search($b->shortFolderName,self::$autoFolders); + $pos1 = array_search(trim($a->shortFolderName),self::$autoFolders); + $pos2 = array_search(trim($b->shortFolderName),self::$autoFolders); if ($pos1 == $pos2) return 0; return ($pos1 < $pos2) ? -1 : 1; } diff --git a/felamimail/inc/class.uifelamimail.inc.php b/felamimail/inc/class.uifelamimail.inc.php index fb63de7929..0bf683f360 100644 --- a/felamimail/inc/class.uifelamimail.inc.php +++ b/felamimail/inc/class.uifelamimail.inc.php @@ -25,8 +25,6 @@ class uifelamimail 'compressFolder' => True, 'importMessage' => True, 'importMessageFromVFS2DraftAndDisplay' => True, - 'deleteMessage' => True, - 'undeleteMessage' => True, 'hookAdmin' => True, 'toggleFilter' => True, 'viewMainScreen' => True, @@ -675,44 +673,6 @@ class uifelamimail } - function deleteMessage() - { - //error_log(__METHOD__." called from:".function_backtrace()); - $message[] = $_GET["message"]; - $mailfolder = NULL; - if (!empty($_GET['folder'])) $mailfolder = base64_decode($_GET['folder']); - - $this->bofelamimail->deleteMessages($message,$mailfolder); - - // set the url to open when refreshing - $linkData = array - ( - 'menuaction' => 'felamimail.uifelamimail.viewMainScreen' - ); - $refreshURL = $GLOBALS['egw']->link('/index.php',$linkData); - - print ""; - } - - function undeleteMessage() - { // only for messages marked as deleted - $message[] = $_GET["message"]; - $mailfolder = NULL; - if (!empty($_GET['folder'])) $mailfolder = base64_decode($_GET['folder']); - $this->bofelamimail->flagMessages('undelete',$message,$mailfolder); - // set the url to open when refreshing - $linkData = array - ( - 'menuaction' => 'felamimail.uifelamimail.viewMainScreen' - ); - $refreshURL = $GLOBALS['egw']->link('/index.php',$linkData); - print ""; - } - function display_app_header($includeFMStuff=true) { if ($includeFMStuff)