Unify fetching folder (metadata) types. This should also improve performance

because get_metadata() arguments are used to build the cache key.
This commit is contained in:
Aleksander Machniak 2013-07-09 15:16:15 +02:00
parent f67c02e185
commit 007fd25f96
2 changed files with 38 additions and 24 deletions

View file

@ -103,25 +103,25 @@ class kolab_folders extends rcube_plugin
return $args; return $args;
} }
$table = $args['table'];
$storage = $this->rc->get_storage();
// get folders types // get folders types
$folderdata = $storage->get_metadata('*', kolab_storage::CTYPE_KEY); $folderdata = kolab_storage::folders_metadata();
if (!is_array($folderdata)) { if (!is_array($folderdata)) {
return $args; return $args;
} }
$table = $args['table'];
// Add type-based style for table rows // Add type-based style for table rows
// See kolab_folders::folder_class_name() // See kolab_folders::folder_class_name()
for ($i=1, $cnt=$table->size(); $i<=$cnt; $i++) { for ($i=1, $cnt=$table->size(); $i<=$cnt; $i++) {
$attrib = $table->get_row_attribs($i); $attrib = $table->get_row_attribs($i);
$folder = $attrib['foldername']; // UTF7-IMAP $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'; $type = 'mail';
}
$class_name = self::folder_class_name($type); $class_name = self::folder_class_name($type);
@ -362,15 +362,12 @@ class kolab_folders extends rcube_plugin
return $args; return $args;
} }
$storage = $this->rc->get_storage(); $folderdata = kolab_storage::folders_metadata();
$folderdata = $storage->get_metadata('*', array(kolab_storage::CTYPE_KEY_PRIVATE, kolab_storage::CTYPE_KEY));
if (!is_array($folderdata)) { if (!is_array($folderdata)) {
return $args; return $args;
} }
$folderdata = array_map(array('kolab_storage', 'folder_select_metadata'), $folderdata);
foreach ($opts as $opt_name => $type) { foreach ($opts as $opt_name => $type) {
$foldername = $args['prefs'][$opt_name]; $foldername = $args['prefs'][$opt_name];
if (strlen($foldername)) { if (strlen($foldername)) {
@ -445,15 +442,13 @@ class kolab_folders extends rcube_plugin
*/ */
function get_default_folder($type) function get_default_folder($type)
{ {
$storage = $this->rc->get_storage(); $folderdata = kolab_storage::folders_metadata();
$folderdata = $storage->get_metadata('*', array(kolab_storage::CTYPE_KEY_PRIVATE, kolab_storage::CTYPE_KEY));
if (!is_array($folderdata)) { if (!is_array($folderdata)) {
return null; return null;
} }
// get all folders of specified type // get all folders of specified type
$folderdata = array_map(array('kolab_storage', 'folder_select_metadata'), $folderdata);
$folderdata = array_intersect($folderdata, array($type.'.default')); $folderdata = array_intersect($folderdata, array($type.'.default'));
return key($folderdata); return key($folderdata);
@ -516,14 +511,12 @@ class kolab_folders extends rcube_plugin
return; return;
} }
if ($folderdata === null) {
$folderdata = kolab_storage::folders_metadata();
}
if (!is_array($folderdata)) { if (!is_array($folderdata)) {
$folderdata = $storage->get_metadata('*', array(kolab_storage::CTYPE_KEY_PRIVATE, kolab_storage::CTYPE_KEY)); return;
if (!is_array($folderdata)) {
return;
}
$folderdata = array_map(array('kolab_storage', 'folder_select_metadata'), $folderdata);
} }
// find default folders // find default folders

View file

@ -596,17 +596,15 @@ class kolab_storage
} }
$prefix = $root . $mbox; $prefix = $root . $mbox;
$regexp = '/^' . preg_quote($filter, '/') . '(\..+)?$/';
// get folders types // 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)) { if (!is_array($folderdata)) {
return array(); return array();
} }
$folderdata = array_map(array('kolab_storage', 'folder_select_metadata'), $folderdata);
$regexp = '/^' . preg_quote($filter, '/') . '(\..+)?$/';
// In some conditions we can skip LIST command (?) // In some conditions we can skip LIST command (?)
if (!$subscribed && $filter != 'mail' && $prefix == '*') { if (!$subscribed && $filter != 'mail' && $prefix == '*') {
foreach ($folderdata as $folder => $type) { 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 * Callback for array_map to select the correct annotation value
*/ */