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;
}
$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

View file

@ -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
*/