Source code taken from cacert-20121211.tar.bz2
[cacert-devel.git] / includes / lib / account.php
index f7a24fa..e311668 100644 (file)
     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)?
-       $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;
        }