Вход Регистрация
Файл: apwa/stk/tools/support/resync_report_flags.php
Строк: 113
<?php
/**
 *
 * @package Support Toolkit - Resynchronise report flags
 * @copyright (c) 2011 phpBB Group
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 *
 */

/**
 * @ignore
 */
if (!defined('IN_PHPBB'))
{
    exit;
}

/**
 * This class resynchronises the report flags in topics/posts/pms
 * all checks should be ran in order as they expect that the data
 * in the database is correct when ran
 */
class resync_report_flags
{
    
/**
     * Display Options
     */
    
function display_options()
    {
        return 
'RESYNC_REPORT_FLAGS';
    }

    
/**
     * Run tool
     */
    
function run_tool()
    {
        
$this->mode request_var('m''pf');

        switch (
$this->mode)
        {
            
// Post flags
            
case 'pf':
                
$this->_resync_pms_posts('posts');
            break;

            
// PM flags
            
case 'pmf':
                
$this->_resync_pms_posts('pms');
            break;

            
// Reports
            
case 'rf':
                
$this->_resync_reports();
            break;

            
// Topic flags
            
case 'tf':
                
$this->_resync_topics();
            break;

            case 
'finished':
                
trigger_error('RESYNC_REPORT_FLAGS_FINISHED');
            break;
        }
    }

    
/**
     * Reset report flags for pm's or posts
     *
     * @param String $type Resync posts|pms
     * @return void
     */
    
function _resync_pms_posts($type)
    {
        global 
$db;

        
// Fetch the report data
        
$reported $this->_get_reported($type);

        
// Anything to do at all?
        
if (!empty($reported))
        {
            
// Set some SQL stuff based upon the type
            
$sql_id        = ($type == 'posts') ? 'post_id' 'msg_id';
            
$sql_from    = ($type == 'posts') ? POSTS_TABLE PRIVMSGS_TABLE;
            
$sql_where    = ($type == 'posts') ? 'post_reported' 'message_reported';

            
$corrupted = array();
            
            
// Set all unflagged as flagged
            
$sql "SELECT {$sql_id}
                FROM 
{$sql_from}
                WHERE 
{$sql_where} = 0
                    AND " 
$db->sql_in_set($sql_id$reported);
            
$result    $db->sql_query($sql);
            while (
$row $db->sql_fetchrow($result))
            {
                
$corrupted[] = $row[$sql_id];
            }
            
$db->sql_freeresult($result);

            if (!empty(
$corrupted))
            {
                
// Well set them al to reported, switching the flag based on the report
                // status is handeled later
                
$sql "UPDATE {$sql_from}
                    SET 
{$sql_where} = 1
                    WHERE " 
$db->sql_in_set($sql_id$corrupted);
                
$db->sql_query($sql);
            }

            
// Reset and time for the other way around flag
            
$corrupted = array();
            
$sql "SELECT {$sql_id}
                FROM 
{$sql_from}
                WHERE 
{$sql_where} = 1
                    AND " 
$db->sql_in_set($sql_id$reportedtrue);
            
$result    $db->sql_query($sql);
            while (
$row $db->sql_fetchrow($result))
            {
                
$corrupted[] = $row[$sql_id];
            }
            
$db->sql_freeresult($result);

            if (!empty(
$corrupted))
            {
                
// Well set them al to reported, switching the flag based on the report
                // status is handeled later
                
$sql "UPDATE {$sql_from}
                    SET 
{$sql_where} = 0
                    WHERE " 
$db->sql_in_set($sql_id$corrupted);
                
$db->sql_query($sql);
            }
        }

        
// Next!
        
$this->_next_mode();
    }

    
/**
     * Get all reports for a given type
     *
     * @param  String $type The type that gets resynced
     * @return Array        All report data
     */
    
function _get_reported($type)
    {
        global 
$db;

        
$sql_id    = ($type == 'posts') ? 'post_id' 'pm_id';

        
$sql "SELECT {$sql_id}
            FROM " 
REPORTS_TABLE "
            WHERE 
{$sql_id} > 0";
        
$result    $db->sql_query($sql);
        
$set    = array();
        while (
$report $db->sql_fetchrow($result))
        {
            
$set[] = $report[$sql_id];
        }
        
$db->sql_freeresult($result);

        return 
$set;
    }

    
/**
     * Make sure that the post flags are correct, this will adjust
     * flags based upon the status of the report. This method
     * assumes that all pms/posts are correctly flagged as reported
     *
     * @return void
     */
    
function _resync_reports()
    {
        global 
$db;

        
// Fetch all the closed reports
        
$pms $posts = array();
        
$sql 'SELECT post_id, pm_id
            FROM ' 
REPORTS_TABLE '
            WHERE report_closed = 1'
;
        
$result    $db->sql_query($sql);
        while (
$row $db->sql_fetchrow($result))
        {
            if (!empty(
$row['post_id']))
            {
                
$posts[] = $row['post_id'];
            }
            else
            {
                
$pms[] = $row['pm_id'];
            }
        }
        
$db->sql_freeresult($result);

        
// Update all the posts
        
$queries = array();
        if (!empty(
$posts))
        {
            
$queries[] = 'UPDATE ' POSTS_TABLE '
                SET post_reported = 0
                WHERE ' 
$db->sql_in_set('post_id'$posts);
        }

        
// Then the pms
        
if (!empty($pms))
        {
            
$queries[] = 'UPDATE ' PRIVMSGS_TABLE '
                SET message_reported = 0
                WHERE ' 
$db->sql_in_set('msg_id'$pms);
        }

        
// Run them
        
if (!empty($queries))
        {
            foreach (
$queries as $q)
            {
                
$db->sql_query($q);
            }
        }

        
// Move on
        
$this->_next_mode();
    }

    
/**
     * Make sure that all topics have the appropriate flags set
     */
    
function _resync_topics()
    {
        global 
$db;

        
// Grep all the topics that should be flagged
        
$expected = array();
        
$sql_ary = array(
            
'SELECT'    => 't.topic_id',
            
'FROM'        => array(
                
POSTS_TABLE        => 'p',
                
TOPICS_TABLE    => 't',
            ),
            
'WHERE'        => 'p.post_reported = 1
                                AND t.topic_id = p.topic_id'
,
        );
        
$sql $db->sql_build_query('SELECT_DISTINCT'$sql_ary);
        
$result $db->sql_query($sql);
        while (
$topic $db->sql_fetchrow($result))
        {
            
$expected[] = $topic['topic_id'];
        }
        
$db->sql_freeresult($result);

        if (!empty(
$expected))
        {
            
// Trash the flags on topics not in expected
            
$sql 'UPDATE ' TOPICS_TABLE '
                SET topic_reported = 0
                WHERE ' 
$db->sql_in_set('topic_id'$expectedtrue) . '
                    AND topic_reported = 1'
;
            
$db->sql_query($sql);

            
// Now enable the flags where not set correctly
            
$sql 'UPDATE ' TOPICS_TABLE '
                SET topic_reported = 1
                WHERE ' 
$db->sql_in_set('topic_id'$expected) . '
                    AND topic_reported = 0'
;
            
$db->sql_query($sql);
        }

        
$this->_next_mode();
    }

    
/**
     * Switch modes
     */
    
function _next_mode()
    {
        global 
$template;

        
// These modes define the order in which the different checks
        // are ran. These *must* remain ordered this way as the different
        // steps make assumptions based upon the previous mode. If its
        // needed to change the oder or add/remove modes make sure that
        // the appropriate changes are made to the logic!
        //
        // First all the flags on pms and posts are set correctly, than 
        // they are flipped off if needed by the status of the report and
        // finally the topic flags are reset based upon whats left
        
$modes = array(
            
'pf'    => 'pmf',
            
'pmf'    => 'rf',
            
'rf'    => 'tf',
            
'tf'    => 'finished',
        );
        
$next $modes[$this->mode];

        
// Build the link
        
$redirect append_sid(STK_INDEX, array('c' => 'support''t' => 'resync_report_flags''m' => $next'submit' => true));
        
meta_refresh(3$redirect);
        
$template->assign_var('U_BACK_TOOL'false);
        
trigger_error('RESYNC_REPORT_FLAGS_NEXT');
    }
}
Онлайн: 1
Реклама