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:
parent
f67c02e185
commit
007fd25f96
2 changed files with 38 additions and 24 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Add table
Reference in a new issue