mirror of
https://github.com/postfixadmin/postfixadmin.git
synced 2024-09-19 19:22:14 +02:00
84a5203fe1
- replace get_domain_properties() calls with two SQL queries that fetch the domain data and count the number of mailboxes and aliases per domain. This change speeds up list-domain extremely on setups with lots of domains, mailboxes and aliases. The old code took several minutes on my test data (that's about 55000 mailboxes and their aliases), the new code only needs some seconds. - $domain_properties now uses the domain name as index key instead of a serial number templates/admin_list-domain.php: - replace usage of $list_domains with $domain_properties - change main loop to use the domain name as $domain_properties array key instead of a serial number upgrade.php: - upgrade_655(): add index on domain column in mailbox and alias table. This speeds up list-domain from 14s to about 1s on my test data in MySQL (the 14s were _after_ the changes in list_domain.php) - added _add_index() function to hide the database specific details in upgrade functions This commit should fix the performance problems reported on http://sourceforge.net/forum/forum.php?thread_id=2343349&forum_id=676076 git-svn-id: https://svn.code.sf.net/p/postfixadmin/code/trunk@655 a1433add-5e2c-0410-b055-b7f2511e0802
109 lines
3.1 KiB
PHP
109 lines
3.1 KiB
PHP
<?php
|
|
/**
|
|
* Postfix Admin
|
|
*
|
|
* LICENSE
|
|
* This source file is subject to the GPL license that is bundled with
|
|
* this package in the file LICENSE.TXT.
|
|
*
|
|
* Further details on the project are available at :
|
|
* http://www.postfixadmin.com or http://postfixadmin.sf.net
|
|
*
|
|
* @version $Id$
|
|
* @license GNU GPL v2 or later.
|
|
*
|
|
* File: list-domain.php
|
|
* List all domains as a quick overview.
|
|
* Template File: admin_list-domain.php
|
|
*
|
|
* Template Variables:
|
|
*
|
|
* -none-
|
|
*
|
|
* Form POST \ GET Variables:
|
|
*
|
|
* fUsername
|
|
*/
|
|
|
|
require_once('common.php');
|
|
|
|
authentication_require_role('admin');
|
|
|
|
if (authentication_has_role('global-admin')) {
|
|
$list_admins = list_admins ();
|
|
$is_superadmin = 1;
|
|
$fUsername = safepost('fUsername', safeget('username')); # prefer POST over GET variable
|
|
if ($fUsername != "") $admin_properties = get_admin_properties($fUsername);
|
|
} else {
|
|
$list_admins = array(authentication_get_username());
|
|
$is_superadmin = 0;
|
|
$fUsername = "";
|
|
}
|
|
|
|
$list_all_domains = 0;
|
|
if (isset($admin_properties) && $admin_properties['domain_count'] == 'ALL') { # list all domains for superadmins
|
|
$list_all_domains = 1;
|
|
} elseif (!empty($fUsername)) {
|
|
$list_domains = list_domains_for_admin ($fUsername);
|
|
} elseif ($is_superadmin) {
|
|
$list_all_domains = 1;
|
|
} else {
|
|
$list_domains = list_domains_for_admin(authentication_get_username());
|
|
}
|
|
|
|
if ($list_all_domains == 1) {
|
|
$where = " WHERE domain.domain != 'ALL' "; # TODO: the ALL dummy domain is annoying...
|
|
} else {
|
|
$list_domains = escape_string($list_domains);
|
|
$where = " WHERE domain.domain IN ('" . join("','", $list_domains) . "') ";
|
|
}
|
|
|
|
# fetch domain data and number of mailboxes
|
|
# (PgSQL requires the extensive GROUP BY statement, https://sourceforge.net/forum/message.php?msg_id=7386240)
|
|
$query = "
|
|
SELECT domain.* , COUNT( DISTINCT mailbox.username ) AS mailbox_count
|
|
FROM domain
|
|
LEFT JOIN mailbox ON domain.domain = mailbox.domain
|
|
$where
|
|
GROUP BY domain.domain, domain.description, domain.aliases, domain.mailboxes,
|
|
domain.maxquota, domain.quota, domain.transport, domain.backupmx, domain.created,
|
|
domain.modified, domain.active
|
|
ORDER BY domain.domain
|
|
";
|
|
$result = db_query($query);
|
|
|
|
while ($row = db_array ($result['result'])) {
|
|
$domain_properties[$row['domain']] = $row;
|
|
}
|
|
|
|
# fetch number of aliases
|
|
# doing this separate is much faster than doing it in one "big" query
|
|
$query = "
|
|
SELECT domain.domain, COUNT( DISTINCT alias.address ) AS alias_count
|
|
FROM domain
|
|
LEFT JOIN alias ON domain.domain = alias.domain
|
|
$where
|
|
GROUP BY domain.domain
|
|
ORDER BY domain.domain
|
|
";
|
|
|
|
$result = db_query($query);
|
|
|
|
while ($row = db_array ($result['result'])) {
|
|
# add number of aliases to $domain_properties array. mailbox aliases do not count.
|
|
$domain_properties [$row['domain']] ['alias_count'] = $row['alias_count'] - $domain_properties [$row['domain']] ['mailbox_count'];
|
|
}
|
|
|
|
include ("templates/header.php");
|
|
include ("templates/menu.php");
|
|
|
|
if ($is_superadmin) {
|
|
include ("templates/admin_list-domain.php");
|
|
} else {
|
|
include ("templates/overview-get.php");
|
|
}
|
|
include ("templates/footer.php");
|
|
|
|
/* vim: set expandtab softtabstop=3 tabstop=3 shiftwidth=3: */
|
|
?>
|