From 007fd25f96d73185cf0c5ddadbc95472f8bea8ab Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 9 Jul 2013 15:16:15 +0200 Subject: [PATCH] Unify fetching folder (metadata) types. This should also improve performance because get_metadata() arguments are used to build the cache key. --- plugins/kolab_folders/kolab_folders.php | 33 ++++++++++--------------- plugins/libkolab/lib/kolab_storage.php | 29 +++++++++++++++++++--- 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/plugins/kolab_folders/kolab_folders.php b/plugins/kolab_folders/kolab_folders.php index 12c0423e..e8ca2a64 100644 --- a/plugins/kolab_folders/kolab_folders.php +++ b/plugins/kolab_folders/kolab_folders.php @@ -103,25 +103,25 @@ class kolab_folders extends rcube_plugin return $args; } - $table = $args['table']; - $storage = $this->rc->get_storage(); - // get folders types - $folderdata = $storage->get_metadata('*', kolab_storage::CTYPE_KEY); + $folderdata = kolab_storage::folders_metadata(); if (!is_array($folderdata)) { return $args; } + $table = $args['table']; + // Add type-based style for table rows // See kolab_folders::folder_class_name() for ($i=1, $cnt=$table->size(); $i<=$cnt; $i++) { $attrib = $table->get_row_attribs($i); $folder = $attrib['foldername']; // UTF7-IMAP - $type = !empty($folderdata[$folder]) ? $folderdata[$folder][kolab_storage::CTYPE_KEY] : null; + $type = $folderdata[$folder]; - if (!$type) + if (!$type) { $type = 'mail'; + } $class_name = self::folder_class_name($type); @@ -362,15 +362,12 @@ class kolab_folders extends rcube_plugin return $args; } - $storage = $this->rc->get_storage(); - $folderdata = $storage->get_metadata('*', array(kolab_storage::CTYPE_KEY_PRIVATE, kolab_storage::CTYPE_KEY)); + $folderdata = kolab_storage::folders_metadata(); if (!is_array($folderdata)) { return $args; } - $folderdata = array_map(array('kolab_storage', 'folder_select_metadata'), $folderdata); - foreach ($opts as $opt_name => $type) { $foldername = $args['prefs'][$opt_name]; if (strlen($foldername)) { @@ -445,15 +442,13 @@ class kolab_folders extends rcube_plugin */ function get_default_folder($type) { - $storage = $this->rc->get_storage(); - $folderdata = $storage->get_metadata('*', array(kolab_storage::CTYPE_KEY_PRIVATE, kolab_storage::CTYPE_KEY)); + $folderdata = kolab_storage::folders_metadata(); if (!is_array($folderdata)) { return null; } // get all folders of specified type - $folderdata = array_map(array('kolab_storage', 'folder_select_metadata'), $folderdata); $folderdata = array_intersect($folderdata, array($type.'.default')); return key($folderdata); @@ -516,14 +511,12 @@ class kolab_folders extends rcube_plugin return; } + if ($folderdata === null) { + $folderdata = kolab_storage::folders_metadata(); + } + if (!is_array($folderdata)) { - $folderdata = $storage->get_metadata('*', array(kolab_storage::CTYPE_KEY_PRIVATE, kolab_storage::CTYPE_KEY)); - - if (!is_array($folderdata)) { - return; - } - - $folderdata = array_map(array('kolab_storage', 'folder_select_metadata'), $folderdata); + return; } // find default folders diff --git a/plugins/libkolab/lib/kolab_storage.php b/plugins/libkolab/lib/kolab_storage.php index 4205cf37..d1ada99f 100644 --- a/plugins/libkolab/lib/kolab_storage.php +++ b/plugins/libkolab/lib/kolab_storage.php @@ -596,17 +596,15 @@ class kolab_storage } $prefix = $root . $mbox; + $regexp = '/^' . preg_quote($filter, '/') . '(\..+)?$/'; // get folders types - $folderdata = self::$imap->get_metadata($prefix, array(self::CTYPE_KEY, self::CTYPE_KEY_PRIVATE)); + $folderdata = self::folders_metadata($prefix); if (!is_array($folderdata)) { return array(); } - $folderdata = array_map(array('kolab_storage', 'folder_select_metadata'), $folderdata); - $regexp = '/^' . preg_quote($filter, '/') . '(\..+)?$/'; - // In some conditions we can skip LIST command (?) if (!$subscribed && $filter != 'mail' && $prefix == '*') { foreach ($folderdata as $folder => $type) { @@ -646,6 +644,29 @@ class kolab_storage } + /** + * Returns folder types indexed by folder name + * + * @param string $prefix Folder prefix (Default '*' for all folders) + * + * @return array|bool List of folders, False on failure + */ + static function folders_metadata($prefix = '*') + { + if (!self::setup()) { + return false; + } + + $folderdata = self::$imap->get_metadata($prefix, array(self::CTYPE_KEY, self::CTYPE_KEY_PRIVATE)); + + if (!is_array($folderdata)) { + return false; + } + + return array_map(array('kolab_storage', 'folder_select_metadata'), $folderdata); + } + + /** * Callback for array_map to select the correct annotation value */