|
|
|
@ -17,34 +17,79 @@
|
|
|
|
|
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.
|
|
|
|
|
// Should the number of points be SUM(points) or SUM(awarded)?
|
|
|
|
|
$query = mysql_query('UPDATE `users` AS `u` SET `assurer` = 1 WHERE '.
|
|
|
|
|
'`u`.`id` = \''.(int)intval($userID).'\' 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');
|
|
|
|
|
// Challenge has been passed and non-expired points >= 100
|
|
|
|
|
// Update Assurer-Flag on users table if 100 points and CATS passed.
|
|
|
|
|
//
|
|
|
|
|
// We may have some performance issues here if no userID is given
|
|
|
|
|
// there are ~150k assurances and ~220k users currently
|
|
|
|
|
// but the exists-clause on cats_passed should be a good filter
|
|
|
|
|
$sql = '
|
|
|
|
|
UPDATE `users` AS `u` SET `assurer` = 1
|
|
|
|
|
WHERE '.(
|
|
|
|
|
($userID === NULL) ?
|
|
|
|
|
'`u`.`assurer` = 0' :
|
|
|
|
|
'`u`.`id` = \''.intval($userID).'\''
|
|
|
|
|
).'
|
|
|
|
|
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) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
// Challenge has been passed and non-expired points >= 100
|
|
|
|
|
|
|
|
|
|
// Reset flag if requirements are not met
|
|
|
|
|
$query = mysql_query('UPDATE `users` AS `u` SET `assurer` = 0 WHERE '.
|
|
|
|
|
'`u`.`id` = \''.(int)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)');
|
|
|
|
|
//
|
|
|
|
|
// Also a bit performance critical but assurer flag is only set on
|
|
|
|
|
// ~5k accounts
|
|
|
|
|
$sql = '
|
|
|
|
|
UPDATE `users` AS `u` SET `assurer` = 0
|
|
|
|
|
WHERE '.(
|
|
|
|
|
($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) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|