summaryrefslogtreecommitdiff
path: root/includes/lib
diff options
context:
space:
mode:
authorMichael Tänzer <neo@nhng.de>2012-03-28 23:39:20 +0200
committerMichael Tänzer <neo@nhng.de>2012-03-28 23:39:20 +0200
commit7a3e7c10d30b59a6de4d2acad1fb345dbce4f4d5 (patch)
tree0a15a8ff78bb9107f0440a07ef62f92ab349015c /includes/lib
parent02d307527b6797e8dd6f6117b8ff24707d007137 (diff)
downloadcacert-devel-7a3e7c10d30b59a6de4d2acad1fb345dbce4f4d5.tar.gz
cacert-devel-7a3e7c10d30b59a6de4d2acad1fb345dbce4f4d5.tar.xz
cacert-devel-7a3e7c10d30b59a6de4d2acad1fb345dbce4f4d5.zip
bug 1024: now for the interesting stuff: implement the optional parameterbug-1024
for fix_assurer_flag() and use it Signed-off-by: Michael Tänzer <neo@nhng.de>
Diffstat (limited to 'includes/lib')
-rw-r--r--includes/lib/account.php81
1 files changed, 63 insertions, 18 deletions
diff --git a/includes/lib/account.php b/includes/lib/account.php
index 4d427d5..e311668 100644
--- a/includes/lib/account.php
+++ b/includes/lib/account.php
@@ -17,32 +17,77 @@
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)
{
- // Update Assurer-Flag on users table if 100 points.
- // Should the number of points be SUM(points) or SUM(awarded)?
- $sql = '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
- $sql = '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) {