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;
|
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
|
||||||
|
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue