Code proposal to sync assurer flag
authorBernhard Froehlich <bernhard@cacert.org>
Sun, 18 Mar 2012 19:18:25 +0000 (20:18 +0100)
committerBernhard Froehlich <bernhard@cacert.org>
Sun, 18 Mar 2012 19:18:25 +0000 (20:18 +0100)
includes/lib/account.php
scripts/cron/updatesort.php

index f7a24fa..c7697ce 100644 (file)
@@ -19,6 +19,8 @@
 
 function fix_assurer_flag($userID)
 {
+       // 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 '.
@@ -29,11 +31,11 @@ function fix_assurer_flag($userID)
                '(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
-       
+
        if (!$query) {
                return false;
        }
+
        // Reset flag if requirements are not met
        $query = mysql_query('UPDATE `users` AS `u` SET `assurer` = 0 WHERE '.
                '`u`.`id` = \''.(int)intval($userID).'\' AND '.
@@ -42,10 +44,10 @@ function fix_assurer_flag($userID)
                        '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)');
-       
+
        if (!$query) {
                return false;
        }
-       
+
        return true;
 }
\ No newline at end of file
index 1c80756..93db060 100755 (executable)
 
 
 
-       //mysql_query("update users set assurer=0");
-       $query = "select notary.`to` as uid from notary group by notary.`to` having sum(points)>=100";
+       /* Set assurer flag for accounts who miss it
+
+          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... */
+
+       $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))
        {
                mysql_query($query);
        }
 
+       /* Remove assurer flag from accounts not eligible.
+
+          Also a bit performance critical, but assurer flag is only set at 5k accounts
+
+       */
+    $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");
        $query = "SELECT `users`.`locid` AS `locid`, count(*) AS `total` FROM `users`
        }
 
 
-
-
 ?>