0
0
mirror of https://github.com/postfixadmin/postfixadmin.git synced 2024-09-19 19:22:14 +02:00
postfixadmin/list-domain.php
Christian Boltz 84a5203fe1 list-domain.php:
- 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
2009-05-12 22:19:39 +00:00

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: */
?>