MDL-22800 stats code using new enrol tables, I did not test it much because I do...
authorPetr Skoda <skodak@moodle.org>
Sat, 10 Jul 2010 14:45:07 +0000 (14:45 +0000)
committerPetr Skoda <skodak@moodle.org>
Sat, 10 Jul 2010 14:45:07 +0000 (14:45 +0000)
admin/settings/server.php
lang/en/admin.php
lib/db/upgrade.php
lib/statslib.php
version.php

index 028804b..8e29e16 100644 (file)
@@ -118,9 +118,6 @@ $temp->add(new admin_setting_configselect('statsmaxruntime', get_string('statsma
 $temp->add(new admin_setting_configtext('statsruntimedays', get_string('statsruntimedays', 'admin'), get_string('configstatsruntimedays', 'admin'), 31, PARAM_INT));
 $temp->add(new admin_setting_configtime('statsruntimestarthour', 'statsruntimestartminute', get_string('statsruntimestart', 'admin'), get_string('configstatsruntimestart', 'admin'), array('h' => 0, 'm' => 0)));
 $temp->add(new admin_setting_configtext('statsuserthreshold', get_string('statsuserthreshold', 'admin'), get_string('configstatsuserthreshold', 'admin'), 0, PARAM_INT));
-
-$options = array(0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6);
-$temp->add(new admin_setting_configselect('statscatdepth', get_string('statscatdepth', 'admin'), get_string('configstatscatdepth', 'admin'), 1, $options));
 $ADMIN->add('server', $temp);
 
 
index d412207..57ccf6a 100755 (executable)
@@ -329,7 +329,6 @@ $string['configsmtphosts'] = 'Give the full name of one or more local SMTP serve
 $string['configsmtpmaxbulk'] = 'Maximum number of messages sent per SMTP session. Grouping messages may speed up the sending of emails. Values lower than 2 force creation of new SMTP session for each email.';
 $string['configsmtpuser'] = 'If you have specified an SMTP server above, and the server requires authentication, then enter the username and password here.';
 $string['configstartwday'] = 'Start of Week';
-$string['configstatscatdepth'] = 'Statistics code uses simplified course enrolment logic, overrides are ignored and there is a maximum number of verified parent course categories. Number 0 means detect only direct role assignments on site and course level, 1 means detect also role assignments in parent category of course, etc. Higher numbers result in much higher database server load during stats processing.';
 $string['configstatsfirstrun'] = 'This specifies how far back the logs should be processed <b>the first time</b> the cronjob wants to process statistics. If you have a lot of traffic and are on shared hosting, it\'s probably not a good idea to go too far back, as it could take a long time to run and be quite resource intensive. (Note that for this setting, 1 month = 28 days. In the graphs and reports generated, 1 month = 1 calendar month.)';
 $string['configstatsmaxruntime'] = 'Stats processing can be quite intensive, so use a combination of this field and the next one to specify when it will run and how long for.';
 $string['configstatsmaxruntime2'] = 'Stats processing can be quite intensive, specify maximum time allowed for gathering of one day of statistics. Maximum number of days processed in one cron execution is 31.';
@@ -892,7 +891,6 @@ $string['smtpuser'] = 'SMTP username';
 $string['soaprecommended'] = 'Installing the optional soap extension is useful for web services and some contrib modules.';
 $string['spellengine'] = 'Spell engine';
 $string['stats'] = 'Statistics';
-$string['statscatdepth'] = 'Maximum parent categories';
 $string['statsfirstrun'] = 'Maximum processing interval';
 $string['statsmaxruntime'] = 'Maximum runtime';
 $string['statsruntimedays'] = 'Days to process';
index 7596e9b..04350ad 100644 (file)
@@ -4723,6 +4723,12 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
         upgrade_main_savepoint(true, 2010071000);
     }
 
+    if ($oldversion < 2010071001) {
+        // purge obsolete stats settings
+        unset_config('statscatdepth');
+        upgrade_main_savepoint(true, 2010071001);
+    }
+
 
     return true;
 }
index 966e64a..515e5f2 100644 (file)
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
-    /** THESE CONSTANTS ARE USED FOR THE REPORTING PAGE. */
-
-    define('STATS_REPORT_LOGINS',1); // double impose logins and unqiue logins on a line graph. site course only.
-    define('STATS_REPORT_READS',2); // double impose student reads and teacher reads on a line graph.
-    define('STATS_REPORT_WRITES',3); // double impose student writes and teacher writes on a line graph.
-    define('STATS_REPORT_ACTIVITY',4); // 2+3 added up, teacher vs student.
-    define('STATS_REPORT_ACTIVITYBYROLE',5); // all activity, reads vs writes, seleted by role.
-
-    // user level stats reports.
-    define('STATS_REPORT_USER_ACTIVITY',7);
-    define('STATS_REPORT_USER_ALLACTIVITY',8);
-    define('STATS_REPORT_USER_LOGINS',9);
-    define('STATS_REPORT_USER_VIEW',10);  // this is the report you see on the user profile.
-
-    // admin only ranking stats reports
-    define('STATS_REPORT_ACTIVE_COURSES',11);
-    define('STATS_REPORT_ACTIVE_COURSES_WEIGHTED',12);
-    define('STATS_REPORT_PARTICIPATORY_COURSES',13);
-    define('STATS_REPORT_PARTICIPATORY_COURSES_RW',14);
-
-    // start after 0 = show dailies.
-    define('STATS_TIME_LASTWEEK',1);
-    define('STATS_TIME_LAST2WEEKS',2);
-    define('STATS_TIME_LAST3WEEKS',3);
-    define('STATS_TIME_LAST4WEEKS',4);
-
-    // start after 10 = show weeklies
-    define('STATS_TIME_LAST2MONTHS',12);
-
-    define('STATS_TIME_LAST3MONTHS',13);
-    define('STATS_TIME_LAST4MONTHS',14);
-    define('STATS_TIME_LAST5MONTHS',15);
-    define('STATS_TIME_LAST6MONTHS',16);
-
-    // start after 20 = show monthlies
-    define('STATS_TIME_LAST7MONTHS',27);
-    define('STATS_TIME_LAST8MONTHS',28);
-    define('STATS_TIME_LAST9MONTHS',29);
-    define('STATS_TIME_LAST10MONTHS',30);
-    define('STATS_TIME_LAST11MONTHS',31);
-    define('STATS_TIME_LASTYEAR',32);
-
-    // different modes for what reports to offer
-    define('STATS_MODE_GENERAL',1);
-    define('STATS_MODE_DETAILED',2);
-    define('STATS_MODE_RANKED',3); // admins only - ranks courses
+/** THESE CONSTANTS ARE USED FOR THE REPORTING PAGE. */
+
+define('STATS_REPORT_LOGINS',1); // double impose logins and unique logins on a line graph. site course only.
+define('STATS_REPORT_READS',2); // double impose student reads and teacher reads on a line graph.
+define('STATS_REPORT_WRITES',3); // double impose student writes and teacher writes on a line graph.
+define('STATS_REPORT_ACTIVITY',4); // 2+3 added up, teacher vs student.
+define('STATS_REPORT_ACTIVITYBYROLE',5); // all activity, reads vs writes, selected by role.
+
+// user level stats reports.
+define('STATS_REPORT_USER_ACTIVITY',7);
+define('STATS_REPORT_USER_ALLACTIVITY',8);
+define('STATS_REPORT_USER_LOGINS',9);
+define('STATS_REPORT_USER_VIEW',10);  // this is the report you see on the user profile.
+
+// admin only ranking stats reports
+define('STATS_REPORT_ACTIVE_COURSES',11);
+define('STATS_REPORT_ACTIVE_COURSES_WEIGHTED',12);
+define('STATS_REPORT_PARTICIPATORY_COURSES',13);
+define('STATS_REPORT_PARTICIPATORY_COURSES_RW',14);
+
+// start after 0 = show dailies.
+define('STATS_TIME_LASTWEEK',1);
+define('STATS_TIME_LAST2WEEKS',2);
+define('STATS_TIME_LAST3WEEKS',3);
+define('STATS_TIME_LAST4WEEKS',4);
+
+// start after 10 = show weeklies
+define('STATS_TIME_LAST2MONTHS',12);
+
+define('STATS_TIME_LAST3MONTHS',13);
+define('STATS_TIME_LAST4MONTHS',14);
+define('STATS_TIME_LAST5MONTHS',15);
+define('STATS_TIME_LAST6MONTHS',16);
+
+// start after 20 = show monthlies
+define('STATS_TIME_LAST7MONTHS',27);
+define('STATS_TIME_LAST8MONTHS',28);
+define('STATS_TIME_LAST9MONTHS',29);
+define('STATS_TIME_LAST10MONTHS',30);
+define('STATS_TIME_LAST11MONTHS',31);
+define('STATS_TIME_LASTYEAR',32);
+
+// different modes for what reports to offer
+define('STATS_MODE_GENERAL',1);
+define('STATS_MODE_DETAILED',2);
+define('STATS_MODE_RANKED',3); // admins only - ranks courses
 
 /**
  * Print daily cron progress
@@ -101,6 +101,8 @@ function stats_cron_daily($maxdays=1) {
 
     $now = time();
 
+    $fpcontext = get_context_instance(CONTEXT_COURSE, SITEID, MUST_EXIST);
+
     // read last execution date from db
     if (!$timestart = get_config(NULL, 'statslastdaily')) {
         $timestart = stats_get_base_daily(stats_get_start_from('daily'));
@@ -142,15 +144,12 @@ function stats_cron_daily($maxdays=1) {
     $DB->delete_records_select('stats_user_daily', "timeend > $timestart");
 
     // Read in a few things we'll use later
-    $viewactions = implode(',', stats_get_action_names('view'));
-    $postactions = implode(',', stats_get_action_names('post'));
-
-    $guest     = get_complete_user_data('username', 'guest');
-    $guestrole = get_guest_role();
+    $viewactions = stats_get_action_names('view');
+    $postactions = stats_get_action_names('post');
 
-    list($enroljoin, $enrolwhere, $enrolparams)          = stats_get_enrolled_sql($CFG->statscatdepth, true);
-    list($enroljoin_na, $enrolwhere_na, $enrolparams_na) = stats_get_enrolled_sql($CFG->statscatdepth, false);
-    list($fpjoin, $fpwhere, $fpparams)                   = stats_get_enrolled_sql(0, true);
+    $guest           = (int)$CFG->siteguest;
+    $guestrole       = (int)$CFG->guestroleid;
+    $defaultfproleid = (int)$CFG->defaultfrontpageroleid;
 
     mtrace("Running daily statistics gathering, starting at $timestart:");
 
@@ -229,9 +228,6 @@ function stats_cron_daily($maxdays=1) {
         // at given times in history :-(
         // - stat1: enrolled users
         // - stat2: enrolled users active in this period
-        // - enrolment is defined now as having course:view capability in
-        //   course context or above, we look 3 cats upwards only and ignore prevent
-        //   and prohibit caps to simplify it
         // - SITEID is special case here, because it's all about default enrolment
         //   in that case, we'll count non-deleted users.
         //
@@ -240,16 +236,15 @@ function stats_cron_daily($maxdays=1) {
 
                 SELECT 'enrolments', timeend, courseid, roleid, COUNT(DISTINCT userid), 0
                   FROM (
-                           SELECT $nextmidnight AS timeend, pl.courseid, pl.roleid, pl.userid
-                             FROM (
-                                      SELECT DISTINCT ra.roleid, ra.userid, c.id as courseid
-                                        FROM {role_assignments} ra $enroljoin_na
-                                       WHERE $enrolwhere_na
-                                  ) pl
-                       ) inline_view
+                           SELECT $nextmidnight AS timeend, e.courseid, ra.roleid, ue.userid
+                             FROM {role_assignments} ra
+                             JOIN {context} c ON (c.id = ra.contextid AND c.contextlevel = :courselevel)
+                             JOIN {enrol} e ON e.courseid = c.instanceid
+                             JOIN {user_enrolments} ue ON (ue.enrolid = e.id AND ue.userid = ra.userid)
+                        ) inline_view
               GROUP BY timeend, courseid, roleid";
 
-        if (!$DB->execute($sql, $enrolparams_na)) {
+        if (!$DB->execute($sql, array('courselevel'=>CONTEXT_COURSE))) {
             $failed = true;
             break;
         }
@@ -258,10 +253,12 @@ function stats_cron_daily($maxdays=1) {
         // using table alias in UPDATE does not work in pg < 8.2
         $sql = "UPDATE {stats_daily}
                    SET stat2 = (SELECT COUNT(DISTINCT ra.userid)
-                                  FROM {role_assignments} ra $enroljoin_na
-                                 WHERE ra.roleid = {stats_daily}.roleid AND
-                                       c.id = {stats_daily}.courseid AND
-                                       $enrolwhere_na AND
+                                  FROM {role_assignments} ra
+                                  JOIN {context} c ON (c.id = ra.contextid AND c.contextlevel = :courselevel)
+                                  JOIN {enrol} e ON e.courseid = c.instanceid
+                                  JOIN {user_enrolments} ue ON (ue.enrolid = e.id AND ue.userid = ra.userid)
+                                  WHERE ra.roleid = {stats_daily}.roleid AND
+                                       e.courseid = {stats_daily}.courseid AND
                                        EXISTS (SELECT 'x'
                                                  FROM {log} l
                                                 WHERE l.course = {stats_daily}.courseid AND
@@ -273,7 +270,7 @@ function stats_cron_daily($maxdays=1) {
                              FROM {log} l
                             WHERE $timesql)";
 
-        if (!$DB->execute($sql, $enrolparams_na)) {
+        if (!$DB->execute($sql, array('courselevel'=>CONTEXT_COURSE))) {
             $failed = true;
             break;
         }
@@ -284,28 +281,28 @@ function stats_cron_daily($maxdays=1) {
 
                 SELECT 'enrolments', timeend, id, nroleid, COUNT(DISTINCT userid), 0
                   FROM (
-                           SELECT $nextmidnight AS timeend, c.id, 0 AS nroleid, ra.userid
-                             FROM {role_assignments} ra $enroljoin_na
-                            WHERE c.id <> ".SITEID." AND $enrolwhere_na
+                           SELECT $nextmidnight AS timeend, e.courseid AS id, 0 AS nroleid, ue.userid
+                             FROM {enrol} e
+                             JOIN {user_enrolments} ue ON ue.enrolid = e.id
                        ) inline_view
               GROUP BY timeend, id, nroleid
                 HAVING COUNT(DISTINCT userid) > 0";
 
-        if ($logspresent and !$DB->execute($sql, $enrolparams_na)) {
+        if ($logspresent and !$DB->execute($sql)) {
             $failed = true;
             break;
         }
         stats_daily_progress('5');
 
         $sql = "UPDATE {stats_daily}
-                   SET stat2 = (SELECT COUNT(DISTINCT ra.userid)
-                                  FROM {role_assignments} ra $enroljoin_na
-                                 WHERE c.id = {stats_daily}.courseid AND
-                                       $enrolwhere_na AND
+                   SET stat2 = (SELECT COUNT(DISTINCT ue.userid)
+                                  FROM {enrol} e
+                                  JOIN {user_enrolments} ue ON ue.enrolid = e.id
+                                 WHERE e.courseid = {stats_daily}.courseid AND
                                        EXISTS (SELECT 'x'
                                                  FROM {log} l
                                                 WHERE l.course = {stats_daily}.courseid AND
-                                                      l.userid = ra.userid AND $timesql))
+                                                      l.userid = ue.userid AND $timesql))
                  WHERE {stats_daily}.stattype = 'enrolments' AND
                        {stats_daily}.timeend = $nextmidnight AND
                        {stats_daily}.roleid = 0 AND
@@ -314,7 +311,7 @@ function stats_cron_daily($maxdays=1) {
                              FROM {log} l
                             WHERE $timesql AND l.course <> ".SITEID.")";
 
-        if ($logspresent and !$DB->execute($sql, $enrolparams_na)) {
+        if ($logspresent and !$DB->execute($sql, array())) {
             $failed = true;
             break;
         }
@@ -339,12 +336,6 @@ function stats_cron_daily($maxdays=1) {
         }
         stats_daily_progress('7');
 
-        if (empty($CFG->defaultfrontpageroleid)) { // 1.9 only, so far
-            $defaultfproleid = 0;
-        } else {
-            $defaultfproleid = $CFG->defaultfrontpageroleid;
-        }
-
     /// Default frontpage role enrolments are all site users (not deleted)
         if ($defaultfproleid) {
             // first remove default frontpage role counts if created by previous query
@@ -384,6 +375,8 @@ function stats_cron_daily($maxdays=1) {
 
 
     /// individual user stats (including not-logged-in) in each course, this is slow - reuse this data if possible
+        list($viewactionssql, $params1) = $DB->get_in_or_equal($viewactions, SQL_PARAMS_NAMED, 'view000');
+        list($postactionssql, $params2) = $DB->get_in_or_equal($postactions, SQL_PARAMS_NAMED, 'post000');
         $sql = "INSERT INTO {stats_user_daily} (stattype, timeend, courseid, userid, statsreads, statswrites)
 
                 SELECT 'activity' AS stattype, $nextmidnight AS timeend, d.courseid, d.userid,
@@ -391,12 +384,12 @@ function stats_cron_daily($maxdays=1) {
                           FROM {log} l
                          WHERE l.userid = d.userid AND
                                l.course = d.courseid AND $timesql AND
-                               l.action IN ($viewactions)) AS statsreads,
+                               l.action $viewactionssql) AS statsreads,
                        (SELECT COUNT('x')
                           FROM {log} l
                          WHERE l.userid = d.userid AND
                                l.course = d.courseid AND $timesql AND
-                               l.action IN ($postactions)) AS statswrites
+                               l.action $postactionssql) AS statswrites
                   FROM (SELECT DISTINCT u.id AS userid, l.course AS courseid
                           FROM {user} u, {log} l
                          WHERE u.id = l.userid AND $timesql
@@ -404,7 +397,7 @@ function stats_cron_daily($maxdays=1) {
                         SELECT 0 AS userid, ".SITEID." AS courseid" . $DB->sql_null_from_clause() . ") d";
                         // can not use group by here because pg can not handle it :-(
 
-        if ($logspresent and !$DB->execute($sql)) {
+        if ($logspresent and !$DB->execute($sql, array_merge($params1, $params2))) {
             $failed = true;
             break;
         }
@@ -417,18 +410,18 @@ function stats_cron_daily($maxdays=1) {
                 SELECT 'activity' AS stattype, $nextmidnight AS timeend, c.id AS courseid, 0,
                        (SELECT COUNT('x')
                           FROM {log} l1
-                         WHERE l1.course = c.id AND l1.action IN ($viewactions) AND
+                         WHERE l1.course = c.id AND l1.action $viewactionssql AND
                                $timesql1) AS stat1,
                        (SELECT COUNT('x')
                           FROM {log} l2
-                         WHERE l2.course = c.id AND l2.action IN ($postactions) AND
+                         WHERE l2.course = c.id AND l2.action $postactionssql AND
                                $timesql2) AS stat2
                   FROM {course} c
                  WHERE EXISTS (SELECT 'x'
                                  FROM {log} l
                                 WHERE l.course = c.id and $timesql)";
 
-        if ($logspresent and !$DB->execute($sql)) {
+        if ($logspresent and !$DB->execute($sql, array_merge($params1, $params2))) {
             $failed = true;
             break;
         }
@@ -443,12 +436,13 @@ function stats_cron_daily($maxdays=1) {
                   FROM (
                            SELECT $nextmidnight AS timeend, pl.courseid, pl.roleid, sud.statsreads, sud.statswrites
                              FROM {stats_user_daily} sud,
-                                      (SELECT DISTINCT ra.userid, ra.roleid, c.id AS courseid
-                                         FROM {role_assignments} ra $enroljoin
-                                        WHERE c.id <> ".SITEID." AND
-                                              ra.roleid <> $guestrole->id AND
-                                              ra.userid <> $guest->id AND
-                                              $enrolwhere
+                                      (SELECT DISTINCT ra.userid, ra.roleid, e.courseid
+                                         FROM {role_assignments} ra
+                                         JOIN {context} c ON (c.id = ra.contextid AND c.contextlevel = :courselevel)
+                                         JOIN {enrol} e ON e.courseid = c.instanceid
+                                         JOIN {user_enrolments} ue ON (ue.enrolid = e.id AND ue.userid = ra.userid)
+                                        WHERE ra.roleid <> $guestrole AND
+                                              ra.userid <> $guest
                                       ) pl
                             WHERE sud.userid = pl.userid AND
                                   sud.courseid = pl.courseid AND
@@ -458,34 +452,33 @@ function stats_cron_daily($maxdays=1) {
               GROUP BY timeend, courseid, roleid
                 HAVING SUM(statsreads) > 0 OR SUM(statswrites) > 0";
 
-        if ($logspresent and !$DB->execute($sql, $enrolparams)) {
+        if ($logspresent and !$DB->execute($sql, array('courselevel'=>CONTEXT_COURSE))) {
             $failed = true;
             break;
         }
         stats_daily_progress('12');
 
     /// how many view actions from guests only in each course - excluding frontpage
-    /// (guest is anybody with guest role or no role with course:view in course - this may not work properly if category limit too low)
     /// normal users may enter course with temporary guest access too
 
         $sql = "INSERT INTO {stats_daily} (stattype, timeend, courseid, roleid, stat1, stat2)
 
                 SELECT 'activity', timeend, courseid, nroleid, SUM(statsreads), SUM(statswrites)
                   FROM (
-                           SELECT $nextmidnight AS timeend, sud.courseid, $guestrole->id AS nroleid, sud.statsreads, sud.statswrites
+                           SELECT $nextmidnight AS timeend, sud.courseid, $guestrole AS nroleid, sud.statsreads, sud.statswrites
                              FROM {stats_user_daily} sud
                             WHERE sud.timeend = $nextmidnight AND sud.courseid <> ".SITEID." AND
                                   sud.stattype='activity' AND
-                                  (sud.userid = $guest->id OR sud.userid
-                                    NOT IN (SELECT ra.userid
-                                              FROM {role_assignments} ra $enroljoin
-                                             WHERE c.id <> ".SITEID." AND  ra.roleid <> $guestrole->id AND
-                                                   $enrolwhere))
+                                  (sud.userid = $guest OR sud.userid
+                                    NOT IN (SELECT ue.userid
+                                              FROM {user_enrolments} ue
+                                              JOIN {enrol} e ON ue.enrolid = e.id
+                                             WHERE e.courseid = sud.courseid))
                        ) inline_view
               GROUP BY timeend, courseid, nroleid
                 HAVING SUM(statsreads) > 0 OR SUM(statswrites) > 0";
 
-        if ($logspresent and !$DB->execute($sql, $enrolparams)) {
+        if ($logspresent and !$DB->execute($sql, array())) {
             $failed = true;
             break;
         }
@@ -499,13 +492,13 @@ function stats_cron_daily($maxdays=1) {
                   FROM (
                            SELECT $nextmidnight AS timeend, pl.courseid, pl.roleid, sud.statsreads, sud.statswrites
                              FROM {stats_user_daily} sud,
-                                      (SELECT DISTINCT ra.userid, ra.roleid, c.id AS courseid
-                                         FROM {role_assignments} ra $enroljoin
-                                        WHERE c.id = ".SITEID." AND
+                                      (SELECT DISTINCT ra.userid, ra.roleid, c.instanceid AS courseid
+                                         FROM {role_assignments} ra
+                                         JOIN {context} c ON c.id = ra.contextid
+                                        WHERE ra.contextid = :fpcontext AND
                                               ra.roleid <> $defaultfproleid AND
-                                              ra.roleid <> $guestrole->id AND
-                                              ra.userid <> $guest->id AND
-                                              $enrolwhere
+                                              ra.roleid <> $guestrole AND
+                                              ra.userid <> $guest
                                       ) pl
                             WHERE sud.userid = pl.userid AND
                                   sud.courseid = pl.courseid AND
@@ -515,7 +508,7 @@ function stats_cron_daily($maxdays=1) {
               GROUP BY timeend, courseid, roleid
                 HAVING SUM(statsreads) > 0 OR SUM(statswrites) > 0";
 
-        if ($logspresent and !$DB->execute($sql, $enrolparams)) {
+        if ($logspresent and !$DB->execute($sql, array('fpcontext'=>$fpcontext->id))) {
             $failed = true;
             break;
         }
@@ -527,20 +520,20 @@ function stats_cron_daily($maxdays=1) {
 
                 SELECT 'activity', timeend, courseid, nroleid, SUM(statsreads), SUM(statswrites)
                   FROM (
-                           SELECT $nextmidnight AS timeend, sud.courseid, $defaultfproleid AS nroleid, sud.statsreads, sud.statswrites
+                           SELECT sud.timeend AS timeend, sud.courseid, $defaultfproleid AS nroleid, sud.statsreads, sud.statswrites
                              FROM {stats_user_daily} sud
-                            WHERE sud.timeend = $nextmidnight AND sud.courseid = ".SITEID." AND
+                            WHERE sud.timeend = :nextm AND sud.courseid = :siteid AND
                                   sud.stattype='activity' AND
-                                  sud.userid <> $guest->id AND sud.userid <> 0 AND sud.userid
+                                  sud.userid <> $guest AND sud.userid <> 0 AND sud.userid
                                   NOT IN (SELECT ra.userid
-                                            FROM {role_assignments} ra $fpjoin
-                                           WHERE c.id = ".SITEID." AND  ra.roleid <> $guestrole->id AND
-                                                 ra.roleid <> $defaultfproleid AND $fpwhere)
+                                            FROM {role_assignments} ra
+                                           WHERE ra.roleid <> $guestrole AND
+                                                 ra.roleid <> $defaultfproleid AND ra.contextid = :fpcontext)
                        ) inline_view
               GROUP BY timeend, courseid, nroleid
                 HAVING SUM(statsreads) > 0 OR SUM(statswrites) > 0";
 
-        if ($logspresent and !$DB->execute($sql, $fpparams)) {
+        if ($logspresent and !$DB->execute($sql, array('fpcontext'=>$fpcontext->id, 'siteid'=>SITEID, 'nextm'=>$nextmidnight))) {
             $failed = true;
             break;
         }
@@ -551,11 +544,11 @@ function stats_cron_daily($maxdays=1) {
 
                 SELECT 'activity', timeend, courseid, nroleid, SUM(statsreads), SUM(statswrites)
                   FROM (
-                           SELECT $nextmidnight AS timeend, ".SITEID." AS courseid, $guestrole->id AS nroleid, pl.statsreads, pl.statswrites
+                           SELECT $nextmidnight AS timeend, ".SITEID." AS courseid, $guestrole AS nroleid, pl.statsreads, pl.statswrites
                              FROM (
                                       SELECT sud.statsreads, sud.statswrites
                                         FROM {stats_user_daily} sud
-                                       WHERE (sud.userid = $guest->id OR sud.userid = 0) AND
+                                       WHERE (sud.userid = $guest OR sud.userid = 0) AND
                                              sud.timeend = $nextmidnight AND sud.courseid = ".SITEID." AND
                                              sud.stattype='activity'
                                   ) pl
@@ -849,44 +842,6 @@ function stats_cron_monthly() {
     return true;
 }
 
-/**
- * Returns simplified enrolment sql join data
- * @param int $limit number of max parent course categories
- * @param bool $includedoanything include also admins
- * @return array ra join and where string
- */
-function stats_get_enrolled_sql($limit, $ignored) {
-    global $CFG;
-    static $n = 0;
-
-    $params = array();
-    $n++;
-
-    $join = "JOIN {context} ctx ON ctx.id = ra.contextid
-            CROSS JOIN {course} c
-             JOIN {role_capabilities} rc ON rc.roleid = ra.roleid";
-    $where = "((rc.capability = :sge_courseview_$n)
-               AND rc.permission = 1 AND rc.contextid = ".SYSCONTEXTID."
-               AND (ctx.contextlevel = ".CONTEXT_SYSTEM."
-                    OR (c.id = ctx.instanceid AND ctx.contextlevel = ".CONTEXT_COURSE.")";
-    $params['sge_courseview_'.$n] = 'moodle/course:participate';
-
-    for($i=1; $i<=$limit; $i++) {
-        if ($i == 1) {
-            $join .= " LEFT JOIN {course_categories} cc1 ON cc1.id = c.category";
-            $where .= " OR (cc1.id = ctx.instanceid AND ctx.contextlevel = ".CONTEXT_COURSECAT.")";
-        } else {
-            $j = $i-1;
-            $join .= " LEFT JOIN {course_categories} cc$i ON cc$i.id = cc$j.parent";
-            $where .= " OR (cc$i.id = ctx.instanceid AND ctx.contextlevel = ".CONTEXT_COURSECAT.")";
-        }
-    }
-
-    $where .= "))";
-
-    return array($join, $where, $params);
-}
-
 /**
  * Return starting date of stats processing
  * @param string $str name of table - daily, weekly or monthly
@@ -1191,13 +1146,13 @@ function stats_get_parameters($time,$report,$courseid,$mode,$roleid=0) {
                        FROM (
                             SELECT courseid, sum(stat1+stat2) AS all_activity
                               FROM {stats_'.$param->table.'}
-                             WHERE stattype=\'activity\' AND timeend >= '.$param->timeafter.' AND roleid = 0 GROUP BY courseid
+                             WHERE stattype=\'activity\' AND timeend >= '.(int)$param->timeafter.' AND roleid = 0 GROUP BY courseid
                        ) activity
                        INNER JOIN
                             (
                             SELECT courseid, max(stat1) AS highest_enrolments
                               FROM {stats_'.$param->table.'}
-                             WHERE stattype=\'enrolments\' AND timeend >= '.$param->timeafter.' AND stat1 > '.$threshold.'
+                             WHERE stattype=\'enrolments\' AND timeend >= '.(int)$param->timeafter.' AND stat1 > '.(int)$threshold.'
                           GROUP BY courseid
                       ) enrolments
                       ON (activity.courseid = enrolments.courseid)
@@ -1220,9 +1175,9 @@ function stats_get_parameters($time,$report,$courseid,$mode,$roleid=0) {
                            SELECT courseid, timeend, stat2 as active_enrolments,
                                   stat1 as all_enrolments, '.$DB->sql_cast_char2real('stat2').'/'.$DB->sql_cast_char2real('stat1').' AS proportion_active
                              FROM {stats_'.$param->table.'}
-                            WHERE stattype=\'enrolments\' AND roleid = 0 AND stat1 > '.$threshold.'
+                            WHERE stattype=\'enrolments\' AND roleid = 0 AND stat1 > '.(int)$threshold.'
                        ) aq
-                       WHERE timeend >= '.$param->timeafter.'
+                       WHERE timeend >= '.(int)$param->timeafter.'
                        GROUP BY courseid
                        ORDER BY line3 DESC';
 
@@ -1242,7 +1197,7 @@ function stats_get_parameters($time,$report,$courseid,$mode,$roleid=0) {
                              FROM {stats_'.$param->table.'}
                             WHERE stattype=\'activity\' AND roleid = 0 AND stat1 > 0
                        ) aq
-                       WHERE timeend >= '.$param->timeafter.'
+                       WHERE timeend >= '.(int)$param->timeafter.'
                        GROUP BY courseid
                        ORDER BY line3 DESC';
         $param->line1 = get_string('views');
@@ -1296,7 +1251,7 @@ function stats_get_action_names($str) {
     $actions =  array_values(array_unique($actions));
     $c = count($actions);
     for ($n=0;$n<$c;$n++) {
-        $actions[$n] = "'" . $actions[$n] . "'"; // quote them for SQL
+        $actions[$n] = $actions[$n];
     }
     return $actions;
 }
index bde345b..96d42ec 100644 (file)
@@ -6,7 +6,7 @@
 // This is compared against the values stored in the database to determine
 // whether upgrades should be performed (see lib/db/*.php)
 
-    $version = 2010071000;  // YYYYMMDD   = date of the last version bump
+    $version = 2010071001;  // YYYYMMDD   = date of the last version bump
                             //         XX = daily increments
 
     $release = '2.0 Preview 4+ (Build: 20100710)';  // Human-friendly version name