Example #1
0
    /**
     * This function does daily cleaning up:
     *
     * - decrements warning levels if it's enabled
     * - consolidate spider statistics
     * - fix MySQL version
     * - regenerate Diffie-Hellman keys for OpenID
     * - remove obsolete login history logs
     */
    public function daily_maintenance()
    {
        global $modSettings, $db_type;
        $db = database();
        // First clean out the cache.
        clean_cache('data');
        // If warning decrement is enabled and we have people who have not had a new warning in 24 hours, lower their warning level.
        list(, , $modSettings['warning_decrement']) = explode(',', $modSettings['warning_settings']);
        if ($modSettings['warning_decrement']) {
            // Find every member who has a warning level...
            $request = $db->query('', '
				SELECT id_member, warning
				FROM {db_prefix}members
				WHERE warning > {int:no_warning}', array('no_warning' => 0));
            $members = array();
            while ($row = $db->fetch_assoc($request)) {
                $members[$row['id_member']] = $row['warning'];
            }
            $db->free_result($request);
            // Have some members to check?
            if (!empty($members)) {
                // Find out when they were last warned.
                $request = $db->query('', '
					SELECT id_recipient, MAX(log_time) AS last_warning
					FROM {db_prefix}log_comments
					WHERE id_recipient IN ({array_int:member_list})
						AND comment_type = {string:warning}
					GROUP BY id_recipient', array('member_list' => array_keys($members), 'warning' => 'warning'));
                $member_changes = array();
                while ($row = $db->fetch_assoc($request)) {
                    // More than 24 hours ago?
                    if ($row['last_warning'] <= time() - 86400) {
                        $member_changes[] = array('id' => $row['id_recipient'], 'warning' => $members[$row['id_recipient']] >= $modSettings['warning_decrement'] ? $members[$row['id_recipient']] - $modSettings['warning_decrement'] : 0);
                    }
                }
                $db->free_result($request);
                // Have some members to change?
                if (!empty($member_changes)) {
                    foreach ($member_changes as $change) {
                        updateMemberData($change['id'], array('warning' => $change['warning']));
                    }
                }
            }
        }
        // Do any spider stuff.
        if (!empty($modSettings['spider_mode']) && $modSettings['spider_mode'] > 1) {
            // We'll need this.
            require_once SUBSDIR . '/SearchEngines.subs.php';
            consolidateSpiderStats();
        }
        // Check the database version - for some buggy MySQL version.
        $server_version = $db->db_server_info();
        if ($db_type == 'mysql' && in_array(substr($server_version, 0, 6), array('5.0.50', '5.0.51'))) {
            updateSettings(array('db_mysql_group_by_fix' => '1'));
        } elseif (!empty($modSettings['db_mysql_group_by_fix'])) {
            $db->query('', '
				DELETE FROM {db_prefix}settings
				WHERE variable = {string:mysql_fix}', array('mysql_fix' => 'db_mysql_group_by_fix'));
        }
        // Regenerate the Diffie-Hellman keys if OpenID is enabled.
        if (!empty($modSettings['enableOpenID'])) {
            require_once SUBSDIR . '/OpenID.subs.php';
            $openID = new OpenID();
            $openID->setup_DH(true);
        } elseif (!empty($modSettings['dh_keys'])) {
            $db->query('', '
				DELETE FROM {db_prefix}settings
				WHERE variable = {string:dh_keys}', array('dh_keys' => 'dh_keys'));
        }
        // Clean up some old login history information.
        $db->query('', '
			DELETE FROM {db_prefix}member_logins
			WHERE time > {int:oldLogins}', array('oldLogins' => !empty($modSettings['loginHistoryDays']) ? 60 * 60 * $modSettings['loginHistoryDays'] : 108000));
        // Log we've done it...
        return true;
    }