Assurer flag is not set correctly on updatesort.php run
This commit is contained in:
Wytze van der Raay 2012-08-10 11:08:22 +00:00
parent ccad5d5e16
commit 7c873275ed
2 changed files with 75 additions and 71 deletions

View file

@ -17,34 +17,79 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
function fix_assurer_flag($userID) /**
* Function to recalculate the cached Assurer status
*
* @param int $userID
* if the user ID is not given the flag will be recalculated for all users
*
* @return bool
* false if there was an error on fixing the flag. This does NOT return the
* new value of the flag
*/
function fix_assurer_flag($userID = NULL)
{ {
// If requirements for assurers are modified see also scripts/cron/updatesort.php // Update Assurer-Flag on users table if 100 points and CATS passed.
//
// Update Assurer-Flag on users table if 100 points. // We may have some performance issues here if no userID is given
// Should the number of points be SUM(points) or SUM(awarded)? // there are ~150k assurances and ~220k users currently
$query = mysql_query('UPDATE `users` AS `u` SET `assurer` = 1 WHERE '. // but the exists-clause on cats_passed should be a good filter
'`u`.`id` = \''.(int)intval($userID).'\' AND '. $sql = '
'EXISTS(SELECT 1 FROM `cats_passed` AS `cp`, `cats_variant` AS `cv` '. UPDATE `users` AS `u` SET `assurer` = 1
'WHERE `cp`.`variant_id` = `cv`.`id` AND `cv`.`type_id` = 1 AND '. WHERE '.(
'`cp`.`user_id` = `u`.`id`) AND '. ($userID === NULL) ?
'(SELECT SUM(`points`) FROM `notary` AS `n` WHERE `n`.`to` = `u`.`id` '. '`u`.`assurer` = 0' :
'AND (`n`.`expire` > now() OR `n`.`expire` IS NULL)) >= 100'); '`u`.`id` = \''.intval($userID).'\''
// Challenge has been passed and non-expired points >= 100 ).'
AND EXISTS(
SELECT 1 FROM `cats_passed` AS `cp`, `cats_variant` AS `cv`
WHERE `cp`.`variant_id` = `cv`.`id`
AND `cv`.`type_id` = 1
AND `cp`.`user_id` = `u`.`id`
)
AND (
SELECT SUM(`points`) FROM `notary` AS `n`
WHERE `n`.`to` = `u`.`id`
AND (`n`.`expire` > now()
OR `n`.`expire` IS NULL)
) >= 100';
$query = mysql_query($sql);
if (!$query) { if (!$query) {
return false; return false;
} }
// Challenge has been passed and non-expired points >= 100
// Reset flag if requirements are not met // Reset flag if requirements are not met
$query = mysql_query('UPDATE `users` AS `u` SET `assurer` = 0 WHERE '. //
'`u`.`id` = \''.(int)intval($userID).'\' AND '. // Also a bit performance critical but assurer flag is only set on
'(NOT EXISTS(SELECT 1 FROM `cats_passed` AS `cp`, `cats_variant` AS '. // ~5k accounts
'`cv` WHERE `cp`.`variant_id` = `cv`.`id` AND `cv`.`type_id` = 1 '. $sql = '
'AND `cp`.`user_id` = `u`.`id`) OR '. UPDATE `users` AS `u` SET `assurer` = 0
'(SELECT SUM(`points`) FROM `notary` AS `n` WHERE `n`.`to` = `u`.`id` '. WHERE '.(
'AND (`n`.`expire` > now() OR `n`.`expire` IS NULL)) < 100)'); ($userID === NULL) ?
'`u`.`assurer` <> 0' :
'`u`.`id` = \''.intval($userID).'\''
).'
AND (
NOT EXISTS(
SELECT 1 FROM `cats_passed` AS `cp`,
`cats_variant` AS `cv`
WHERE `cp`.`variant_id` = `cv`.`id`
AND `cv`.`type_id` = 1
AND `cp`.`user_id` = `u`.`id`
)
OR (
SELECT SUM(`points`) FROM `notary` AS `n`
WHERE `n`.`to` = `u`.`id`
AND (
`n`.`expire` > now()
OR `n`.`expire` IS NULL
)
) < 100
)';
$query = mysql_query($sql);
if (!$query) { if (!$query) {
return false; return false;
} }

View file

@ -17,55 +17,14 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
require_once(dirname(__FILE__).'/../../includes/mysql.php'); require_once(dirname(__FILE__).'/../../includes/mysql.php');
require_once(dirname(__FILE__).'/../../includes/lib/account.php');
// Recalculate assurer flag for all accounts
/* Set assurer flag for accounts who miss it if (!fix_assurer_flag()) {
fwrite(STDERR, "ERROR on fixing the assurer flag. Continuing anyway");
See also includes/lib/account.php, function fix_assurer_flag($userID)
We may have some performance problems here, there are 150k assurances and 220k users
in the production database. The exists-clause on cats_passed should be a good filter... */
/* Synchronisation of assurer flag currently deactivated, see https://bugs.cacert.org/view.php?id=1003
and https://bugs.cacert.org/view.php?id=1024 */
/*
$query = "select `n`.`to` as `uid` from `notary` as `n`, `users` as `u` ".
" where `n`.`to`=`u`.`id` and `u`.`assurer`<>'1' ".
" and (`n`.`expire` > now() OR `n`.`expire` IS NULL) ".
" and exists(select 1 from `cats_passed` as `cp`, `cats_variant` as `cv` ".
" where `cp`.`variant_id`=`cv`.`id` and `cv`.`type_id` = 1 and `cp`.`user_id`=`n`.`to`)".
" group by `n`.`to` having sum(`n`.`points`)>=100";
$res = mysql_query($query);
while($row = mysql_fetch_assoc($res))
{
$query = "update users set `assurer`='1' where `id`='${row['uid']}'";
//echo $query."\n";
mysql_query($query);
} }
*/
/* Remove assurer flag from accounts not eligible.
Also a bit performance critical, but assurer flag is only set at 5k accounts
*/
/* Synchronisation of assurer flag currently deactivated, see https://bugs.cacert.org/view.php?id=1003
and https://bugs.cacert.org/view.php?id=1024 */
/*
$query = "select `u`.id as `uid` from `users` as `u` " .
" where `u`.`assurer` = '1' ".
" and (not exists(select 1 from `cats_passed` as `cp`, `cats_variant` as `cv` ".
" where `cp`.`variant_id`=`cv`.`id` and `cv`.`type_id` = 1 and `cp`.`user_id`=`u`.`id`) ".
" or (select sum(`n`.`points`) from `notary` as `n` where `n`.`to`=`u`.`id` and (`n`.`expire` > now() OR `n`.`expire` IS NULL)) < 100) ";
$res = mysql_query($query);
while($row = mysql_fetch_assoc($res))
{
$query = "update users set `assurer`='0' where `id`='${row['uid']}'";
//echo $query."\n";
mysql_query($query);
}
*/
mysql_query("update `locations` set `acount`=0"); mysql_query("update `locations` set `acount`=0");
$query = "SELECT `users`.`locid` AS `locid`, count(*) AS `total` FROM `users` $query = "SELECT `users`.`locid` AS `locid`, count(*) AS `total` FROM `users`