Файл: admin/applications/core/setup/versions/upg_33000/version_upgrade.php
Строк: 232
<?php
/**
*
* @class version_upgrade
* @brief 3.2.0 Alpha 1 Upgrade Logic
*
*/
class version_upgrade
{
/**
* Custom HTML to show
*
* @var string
*/
private $_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':
case 'sql1':
default:
$this->upgradeSql(1);
break;
case 'sql2':
$this->upgradeSql(2);
break;
case 'logs':
$this->convertLogs();
break;
case 'frules':
$this->fixForumRules();
break;
case 'ban':
$this->banUpdate();
break;
case 'posts':
$this->updatePostsTable();
break;
case 'groups':
$this->fixGroups();
break;
}
/* Workact is set in the function, so if it has not been set, then we're done. The last function should unset it. */
if ( $this->request['workact'] )
{
return false;
}
else
{
return true;
}
}
/**
* Run SQL files
*
* @param int
* @return @e void
*/
public function upgradeSql( $id=1 )
{
$cnt = 0;
$file = '_updates_'.$id.'.php';
$output = "";
$path = IPSLib::getAppDir( 'core' ) . '/setup/versions/upg_33000/' . strtolower( $this->registry->dbFunctions()->getDriverType() ) . $file;
$prefix = $this->registry->dbFunctions()->getPrefix();
$sourceFile = '';
$options = IPSSetUp::getSavedData('custom_options');
if ( is_file( $path ) )
{
$SQL = array();
require( $path );/*noLibHook*/
/* Set DB driver to return any errors */
$this->DB->return_die = 1;
foreach( $SQL as $query )
{
$this->DB->allow_sub_select = 1;
$this->DB->error = '';
$query = str_replace( "<%time%>", time(), $query );
if ( $this->settings['mysql_tbl_type'] )
{
if ( preg_match( "/^create table(.+?)/i", $query ) )
{
$query = preg_replace( "/^(.+?));$/is", "\1) ENGINE={$this->settings['mysql_tbl_type']};", $query );
}
}
/* Need to tack on a prefix? */
if ( $prefix )
{
$query = IPSSetUp::addPrefixToQuery( $query, $prefix );
}
if( IPSSetUp::getSavedData('man') OR ( $id == 6 AND $postTable ) )
{
$query = trim( $query );
/* Ensure the last character is a semi-colon */
if ( substr( $query, -1 ) != ';' )
{
$query .= ';';
}
$output .= $query . "nn";
}
else
{
$this->DB->query( $query );
if ( $this->DB->error )
{
$this->registry->output->addError( "<br />" . $query . "<br />" . $this->DB->error );
}
else
{
$cnt++;
}
}
}
$this->registry->output->addMessage("{$cnt} запросов выполнено... ");
}
/* Next Page */
if ( $id < 2 )
{
$nextid = $id + 1;
$this->request['workact'] = 'sql' . $nextid;
}
else
{
$this->request['workact'] = 'logs';
}
if ( $output )
{
/* Create source file */
if ( $this->registry->dbFunctions()->getDriverType() == 'mysql' )
{
$sourceFile = IPSSetUp::createSqlSourceFile( $output, '33000', $id );
}
$this->_output = $this->registry->output->template()->upgrade_manual_queries( $output, $sourceFile );
}
}
/**
* Execute selected method
*
* @param object Registry object
* @return @e void
*/
public function convertLogs()
{
/* Init */
$pergo = 100;
$start = intval( $this->request['st'] );
/* Get them */
$total = ipsRegistry::DB()->buildAndFetch( array( 'select' => 'count(*) as count', 'from' => 'warn_logs', 'where' => "wlog_type<>'pos'" ) );
ipsRegistry::DB()->build( array(
'select' => '*',
'from' => 'warn_logs',
'where' => "wlog_type<>'pos'",
'order' => 'wlog_id ASC',
'limit' => array( $start, $pergo )
) );
$e = ipsRegistry::DB()->execute();
/* Are you leeeeeeeeaving? */
if ( !ipsRegistry::DB()->getTotalRows( $e ) )
{
// We probably should delete the old warn_logs table here, but I'm not going to in case any bugs come up with this converter
$this->request['workact'] = 'frules';
return true;
}
/* Nope, let's do some converting! */
while ( $row = ipsRegistry::DB()->fetch( $e ) )
{
//-----------------------------------------
// Get the PM / EMail we sent to the member
// This will now be our "note for member"
//-----------------------------------------
preg_match( "#<content>(.+?)</content>#is", $row['wlog_contact_content'], $content );
$noteForMember = $content[1];
//-----------------------------------------
// Work out what punishment we gave
//-----------------------------------------
$noteForMods = '';
$mq = 0;
$mqUnit = '';
$rpa = 0;
$rpaUnit = '';
$suspend = 0;
$suspendUnit = '';
$unserialized = unserialize( $row['wlog_notes'] );
/* Old style */
if ( $unserialized == FALSE )
{
preg_match( "#<content>(.+?)</content>#is", $row['wlog_notes'], $content );
$noteForMods = $content[1];
foreach ( array( 'mod' => 'mq', 'post' => 'rpa', 'susp' => 'suspend' ) as $k => $v )
{
$data = array();
preg_match( "#<{$k}>(.+?)</{$k}>#is", $row['wlog_notes'], $data );
if ( $data[1] )
{
$data = explode( ',', $data[1] );
if ( $data[2] == 1 || $data[0] > 999999 )
{
$$v = -1;
}
else
{
$$v = $data[0];
$unitVar = "{$v}Unit";
$$unitVar = $data[1];
}
}
}
}
/* New style */
else
{
$noteForMods = $unserialized['content'];
foreach ( array( 'mod' => 'mq', 'post' => 'rpa', 'susp' => 'suspend' ) as $k => $v )
{
if ( $unserialized[ $k . '_indef' ] == 1 || $unserialized[ $k ] > 999999 )
{
$$v = -1;
}
else
{
$$v = $unserialized[ $k ];
$unitVar = "{$v}Unit";
$$unitVar = $unserialized[ $k . '_unit' ];
}
}
}
//-----------------------------------------
// Save
//-----------------------------------------
ipsRegistry::DB()->insert( 'members_warn_logs', array(
'wl_member' => $row['wlog_mid'],
'wl_moderator' => $row['wlog_addedby'],
'wl_date' => $row['wlog_date'],
'wl_reason' => 0,
'wl_points' => ( $row['wlog_type'] == 'neg' ) ? 1 : 0,
'wl_note_member' => $noteForMember,
'wl_note_mods' => $noteForMods,
'wl_mq' => intval( $mq ),
'wl_mq_unit' => $mqUnit,
'wl_rpa' => intval( $rpa ),
'wl_rpa_unit' => $rpaUnit,
'wl_suspend' => intval( $suspend ),
'wl_suspend_unit' => $suspendUnit,
'wl_ban_group' => 0,
'wl_expire' => 0,
'wl_expire_unit' => '',
'wl_acknowledged' => 1,
'wl_content_app' => '',
'wl_content_id1' => '',
'wl_content_id2' => ''
) );
}
/* Next! */
$percent = round( ( 100 / $total['count'] ) * $start );
$this->request['st'] = $start + $pergo;
$this->registry->output->addMessage( "Обновление записей... ( {$percent}% готово )" );
$this->request['workact'] = 'logs';
}
/**
* Execute selected method
*
* @param object Registry object
* @return @e void
*/
public function fixForumRules()
{
$this->DB->build( array( 'select' => '*',
'from' => 'forums',
'where' => "rules_text LIKE '%&%'" ) );
$o = $this->DB->execute();
while( $row = $this->DB->fetch( $o ) )
{
$this->DB->update( 'forums', array( 'rules_text' => IPSText::UNhtmlspecialchars( $row['rules_text'] ) ), 'id=' . $row['id'] );
}
$this->registry->output->addMessage( "Правила форумов обновлены" );
$this->request['workact'] = 'groups';
}
/**
* Execute selected method
*
* @param object Registry object
* @return @e void
*/
public function fixGroups()
{
$this->DB->build( array( 'select' => '*',
'from' => 'groups' ) );
$o = $this->DB->execute();
while( $row = $this->DB->fetch( $o ) )
{
$row['gbw_view_last_info'] = 1;
$row['gbw_view_online_lists'] = 1;
$row['gbw_hide_leaders_page'] = 0;
$g_bitoptions = IPSBWOPtions::freeze( $row, 'groups', 'global' );
$this->DB->update( 'groups', array( 'g_bitoptions' => $g_bitoptions ), 'g_id=' . $row['g_id'] );
}
$this->registry->output->addMessage( "Groups updated" );
$this->request['workact'] = 'posts';
}
/**
* Fix posts table
*
* @param int
* @return @e void
*/
public function updatePostsTable()
{
$doManual = $options['core'][33000]['manualPostsTableQuery'];
$prefix = $this->registry->dbFunctions()->getPrefix();
$output = '';
if ( $doManual && ! $this->DB->checkForField( 'post_field_int', 'posts' ) )
{
foreach( array( 'ALTER TABLE posts ADD post_field_int INT(10) DEFAULT 0',
'ALTER TABLE posts ADD post_field_t1 TEXT NULL DEFAULT NULL',
'ALTER TABLE posts ADD post_field_t2 TEXT NULL DEFAULT NULL' ) as $query )
{
$query = trim( $query );
/* Need to tack on a prefix? */
if ( $prefix )
{
$query = IPSSetUp::addPrefixToQuery( $query, $prefix );
}
/* Ensure the last character is a semi-colon */
if ( substr( $query, -1 ) != ';' )
{
$query .= ';';
}
$output .= $query . "nn";
}
}
else
{
if ( ! $this->DB->checkForField( 'post_field_int', 'posts' ) )
{
$this->DB->addField( 'posts', 'post_field_int', 'INT(10)', '0' );
}
if ( !$this->DB->checkForField( 'post_field_t1', 'posts' ) )
{
$this->DB->addField( 'posts', 'post_field_t1', 'TEXT' );
}
if ( !$this->DB->checkForField( 'post_field_t2', 'posts' ) )
{
$this->DB->addField( 'posts', 'post_field_t2', 'TEXT' );
}
}
if ( $output )
{
/* Create source file */
if ( $this->registry->dbFunctions()->getDriverType() == 'mysql' )
{
$sourceFile = IPSSetUp::createSqlSourceFile( $output, '33000', 'posts' );
}
$this->_output = $this->registry->output->template()->upgrade_manual_queries( $output, $sourceFile );
}
$this->registry->output->addMessage( "Таблица сообщений обновлена" );
$this->request['workact'] = 'ban';
}
/**
* Execute selected method
*
* @param object Registry object
* @return @e void
*/
public function banUpdate()
{
$options = IPSSetUp::getSavedData('custom_options');
$flagBanned = $options['core'][33000]['flagBanned'];
if ( $flagBanned )
{
if ( ! empty( ipsRegistry::$settings['banned_group'] ) )
{
$this->DB->update( 'members', array( 'member_banned' => 1 ), "member_group_id=" . intval( ipsRegistry::$settings['banned_group'] ) );
}
}
$this->registry->output->addMessage( "Заблокированные пользователи перенесены" );
$this->request['workact'] = '';
}
}