Вход Регистрация
Файл: admin/applications/core/setup/versions/upg_21003/version_upgrade.php
Строк: 233
<?php

/*
+--------------------------------------------------------------------------
|   IP.Board v3.3.3
|   ========================================
|   by Matthew Mecham
|   (c) 2001 - 2004 Invision Power Services
|   http://www.invisionpower.com
|   ========================================
|   Web: http://www.invisionboard.com
|   Email: matt@invisionpower.com
|   Licence Info: http://www.invisionboard.com/?license
+---------------------------------------------------------------------------
|
|   > IPB UPGRADE MODULE:: IPB 2.0.2 -> IPB 2.0.3
|   > Script written by Matt Mecham
|   > Date started: 23rd April 2004
|   > "So what, pop is dead - it's no great loss.
       So many facelifts, it's face flew off"
+--------------------------------------------------------------------------
*/

if ( ! defined( 'IN_IPB' ) )
{
    print 
"<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files.";
    exit();
}

class 
version_upgrade
{
    
/**
     * Custom HTML to show
     *
     * @var        string
     */
    
protected $_output = '';
    
    
/**
     * fetchs output
     * 
     * @return    string
     */
    
public function fetchOutput()
    {
        return 
$this->_output;
    }
        
    
/**
     * Execute selected method
     *
     * @param    object        Registry object
     * @return    @e void
     */
    
public function doExecute( ipsRegistry $registry ) 
    {
        
/* Make object */
        
$this->registry =  $registry;
        
$this->DB       =  $this->registry->DB();
        
$this->settings =& $this->registry->fetchSettings();
        
$this->request  =& $this->registry->fetchRequest();
        
$this->cache    =  $this->registry->cache();
        
$this->caches   =& $this->registry->cache()->fetchCaches();
        
        
//--------------------------------
        // What are we doing?
        //--------------------------------

        
switch( $this->request['workact'] )
        {
            case 
'sql':
                
$this->upgrade_sql(1);
                break;
            case 
'sql1':
                
$this->upgrade_sql(1);
                break;
            case 
'sql2':
                
$this->upgrade_sql(2);
                break;
            case 
'sql3':
                
$this->upgrade_sql(3);
                break;
            case 
'sql4':
                
$this->upgrade_sql(4);
                break;
            case 
'polls':
                
$this->convert_polls();
                break;
            case 
'calevents':
                
$this->convert_calevents();
                break;
            case 
'skin':
                
$this->add_skin();
                break;                
            
            default:
                
$this->upgrade_sql(1);
                break;
        }
        
        if ( 
$this->request['workact'] )
        {
            return 
false;
        }
        else
        {
            return 
true;
        }
    }
    
    
    
/*-------------------------------------------------------------------------*/
    // SQL: 0
    /*-------------------------------------------------------------------------*/
    
    
function upgrade_sql( $id=1 )
    {
        
$man     = 0; // Manual upgrade ? intval( $this->request['man'] );
        
$cnt     = 0;
        
$SQL     = array();
        
$file    = '_updates_'.$id.'.php';
        
$output  = "";
        
$path    = IPSLib::getAppDir( 'core' ) . '/setup/versions/upg_21003/' . strtolower( $this->registry->dbFunctions()->getDriverType() ) . $file;
        
$prefix  = $this->registry->dbFunctions()->getPrefix();
    
        if ( 
is_file( $path ) )
        {
            require( 
$path );/*noLibHook*/
        
            
$this->error   = array();
            
$this->sqlcount         = 0;
            
$output                    = "";
            
            
$this->DB->return_die = 1;
            
            foreach( 
$SQL as $query )
            {
                
$this->DB->allow_sub_select     = 1;
                
$this->DB->error                = '';
                
                
$query = str_replace( "<%time%>", time(), $query );
                            
                
/* Need to tack on a prefix? */
                
if ( $prefix )
                {
                    
$query = IPSSetUp::addPrefixToQuery( $query, $prefix );
                }
                
                if ( 
IPSSetUp::getSavedData('man') )
                {
                    
$output .= preg_replace( "/s{1,}/", " ", $query ) . "nn";
                }
                else
                {
                    if( ! 
$query )
                    {
                        continue;
                    }
    
                    
$this->DB->query( $query );

                    if ( 
$this->DB->error )
                    {
                        
$this->registry->output->addError( $query."<br /><br />".$this->DB->error );
                    }
                    else
                    {
                        
$this->sqlcount++;
                    }
                }
            }
        
            
$this->registry->output->addMessage("{$this->sqlcount} запросов выполнено....");
        }
        
        
//--------------------------------
        // Next page...
        //--------------------------------
        
        
$this->request['st'] = 0;
        
        if ( 
$id != 4 )
        {
            
$nextid = $id + 1;
            
$this->request['workact'] = 'sql'.$nextid;    
        }
        else
        {
            
$this->request['workact'] = 'polls';    
        }
        
        if ( 
IPSSetUp::getSavedData('man') AND $output )
        {
            
/* Create source file */
            
if ( $this->registry->dbFunctions()->getDriverType() == 'mysql' )
            {
                
$sourceFile = IPSSetUp::createSqlSourceFile( $output, '21003', $id );
            }
            
            
$this->_output = $this->registry->output->template()->upgrade_manual_queries( $output, $sourceFile );
        }    
    }    
    
    
    
/*-------------------------------------------------------------------------*/
    // POLLS
    /*-------------------------------------------------------------------------*/
    
    
function convert_polls()
    {
        
$start     = intval($this->request['st']) > 0 ? intval($this->request['st']) : 0;
        
$lend      = 50;
        
$end       = $start + $lend;
        
$max       = intval(IPSSetUp::getSavedData('max'));
        
$converted = intval(IPSSetUp::getSavedData('conv'));
        
        
//-----------------------------------------
        // First off.. grab number of polls to convert
        //-----------------------------------------
        
        
if ( ! $max )
        {
            
$total = $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as max',
                                                                       
'from'   => 'topics',
                                                                       
'where'  => "poll_state IN ('open', 'close', 'closed')" ) );
                                                                       
            
$max   = $total['max'];
        }
        
        
//-----------------------------------------
        // In steps...
        //-----------------------------------------
        
        
$this->DB->build( array( 'select' => '*',
                                                      
'from'   => 'topics',
                                                      
'where'  => "poll_state IN ('open', 'close', 'closed' )",
                                                      
'limit'  => array( 0, $lend ) ) );
        
$o = $this->DB->execute();
    
        
//-----------------------------------------
        // Do it...
        //-----------------------------------------
        
        
if ( $this->DB->getTotalRows($o) )
        {
            
//-----------------------------------------
            // Got some to convert!
            //-----------------------------------------
            
            
while ( $r = $this->DB->fetch($o) )
            {
                
$converted++;
                
                
//-----------------------------------------
                // All done?
                //-----------------------------------------
                
                
if ( $converted >= $max )
                {
                    
$done = 1;
                }                
                
                
$new_poll  = array( 1 => array() );
                
                
$poll_data = $this->DB->buildAndFetch( array( 'select' => '*',
                                                                               
'from'   => 'polls',
                                                                               
'where'  => "tid=".$r['tid']
                                                                      )      );
                if ( ! 
$poll_data['pid'] )
                {
                    continue;
                }
                
                if ( ! 
$poll_data['poll_question'] )
                {
                    
$poll_data['poll_question'] = $r['title'];
                }
                
                
//-----------------------------------------
                // Kick start new poll
                //-----------------------------------------
                
                
$new_poll[1]['question'] = $poll_data['poll_question'];
        
                
//-----------------------------------------
                // Get OLD polls
                //-----------------------------------------
                
                
$poll_answers = unserialize( stripslashes( $poll_data['choices'] ) );
            
                
reset($poll_answers);
                
                foreach ( 
$poll_answers as $entry )
                {
                    
$id     = $entry[0];
                    
$choice = $entry[1];
                    
$votes  = $entry[2];
                    
                    
$total_votes += $votes;
                    
                    if ( 
strlen($choice) < 1 )
                    {
                        continue;
                    }
                    
                    
$new_poll[ 1 ]['choice'][ $id ] = $choice;
                    
$new_poll[ 1 ]['votes'][ $id  ] = $votes;
                }
                
                
//-----------------------------------------
                // Got something?
                //-----------------------------------------
                
                
if ( count( $new_poll[1]['choice'] ) )
                {
                    
$this->DB->update( 'polls' , array( 'choices'    => serialize( $new_poll ) ), 'tid='.$r['tid'] );
                    
$this->DB->update( 'topics', array( 'poll_state' => 1 ), 'tid='.$r['tid'] );
                }
            }
        }
        else
        {
            
$done = 1;
        }
        
        
        if ( ! 
$done )
        {
            
$this->registry->output->addMessage("Опрос: $start по $end сконвертированы....");
            
$this->request['workact']     = 'polls';    
            
$this->request['st']         = $end;
            
IPSSetUp::setSavedData('max', $max);
            
IPSSetUp::setSavedData('conv', $converted);
            return 
FALSE;            
        }
        else
        {
            
$this->registry->output->addMessage("Опросы сконвертированы, переходим к событиям календаря...");
            
$this->request['workact']     = 'calevents';    
            
$this->request['st']         = '0';    
            return 
FALSE;                        
        }
    }
    
    
    
/*-------------------------------------------------------------------------*/
    // CALENDAR EVENTS
    /*-------------------------------------------------------------------------*/
    
    
function convert_calevents()
    {
        
$start     = intval($this->request['st']) > 0 ? intval($this->request['st']) : 0;
        
$lend      = 50;
        
$end       = $start + $lend;
    
        
//-----------------------------------------
        // In steps...
        //-----------------------------------------
        
        
$this->DB->build( array( 'select' => '*',
                                                      
'from'   => 'calendar_events',
                                                      
'limit'  => array( $start, $lend ) ) );
        
$o = $this->DB->execute();
    
        
//-----------------------------------------
        // Do it...
        //-----------------------------------------
        
        
if ( $this->DB->getTotalRows($o) )
        {
            
//-----------------------------------------
            // Got some to convert!
            //-----------------------------------------
            
            
while ( $r = $this->DB->fetch($o) )
            {
                
$recur_remap = array( 'w' => 1,
                                      
'm' => 2,
                                      
'y' => 3 );
                
                
$begin_date        = IPSTime::date_getgmdate( $r['unix_stamp']     );
                
$end_date          = IPSTime::date_getgmdate( $r['end_unix_stamp'] );
                
                if ( ! 
$begin_date OR ! $end_date )
                {
                    continue;
                }
                
                
$day               = $begin_date['mday'];
                
$month             = $begin_date['mon'];
                
$year              = $begin_date['year'];
                
                
$end_day           = $end_date['mday'];
                
$end_month         = $end_date['mon'];
                
$end_year          = $end_date['year'];
        
                
$_final_unix_from  = gmmktime(0, 0, 0, $month, $day, $year );
                
                
//-----------------------------------------
                // Recur or ranged...
                //-----------------------------------------
                
                
if ( $r['event_repeat'] OR $r['event_ranged'] )
                {
                    
$_final_unix_to = gmmktime(11, 59, 59, $end_month, $end_day, $end_year);
                }
                else
                {
                    
$_final_unix_to = 0;
                }
                
                
$new_event = array( 'event_calendar_id' => 1,
                                    
'event_member_id'   => $r['userid'],
                                    
'event_content'     => $r['event_text'],
                                    
'event_title'       => $r['title'],
                                    
'event_smilies'     => $r['show_emoticons'],
                                    
'event_perms'       => $r['read_perms'],
                                    
'event_private'     => $r['priv_event'],
                                    
'event_approved'    => 1,
                                    
'event_unixstamp'   => $r['unix_stamp'],
                                    
'event_recurring'   => ( $r['event_repeat'] && $recur_remap[ $r['repeat_unit'] ] ) ? $recur_remap[ $r['repeat_unit'] ] : 0,
                                    
'event_tz'          => 0,
                                    
'event_unix_from'   => $_final_unix_from,
                                    
'event_unix_to'     => $_final_unix_to );
                
                
//-----------------------------------------
                // INSERT
                //-----------------------------------------
                
                
$this->DB->insert( 'cal_events', $new_event );
            }
            
            
$this->registry->output->addMessage("События календаря: $start по $end сконвертированы....");
            
$this->request['workact']     = 'calevents';    
            
$this->request['st']         = $end;
            return 
FALSE;        
        }
        else
        {
            
$this->registry->output->addMessage("События календаря сконвертированы,  переходим к созданию стиля IPB 2.1...");
            
$this->request['workact']     = 'skin';    
            return 
FALSE;        
        }
    }
        
        
    
    
/*-------------------------------------------------------------------------*/
    // CALENDAR EVENTS
    /*-------------------------------------------------------------------------*/
    
    
function add_skin()
    {
        
$this->registry->output->addMessage("Пропускаем создание стиля 2.1...");
        unset(
$this->request['workact']);
        return 
TRUE;
    }
}
Онлайн: 2
Реклама