Seditio Source
Root |
./othercms/ips_4.3.4/applications/gallery/setup/upg_50000/upgrade.php
<?php
/**
 * @brief        4.0.0 Upgrade Code
 * @author        <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
 * @copyright    (c) Invision Power Services, Inc.
 * @license        https://www.invisioncommunity.com/legal/standards/
 * @package        Invision Community
 * @subpackage    Gallery
 * @since        24 Oct 2014
 */

namespace IPS\gallery\setup\upg_50000;

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
   
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
    exit;
}

/**
 * 4.0.0 Upgrade Code
 */
class _Upgrade
{
   
/**
     * Conversion from 3.0
     *
     * @return    array    If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
     */
   
public function step1()
    {
       
/* Clean up albums from previous versions */
       
if ( \IPS\Db::i()->checkForTable( 'gallery_albums' ) AND \IPS\Db::i()->checkForTable( 'gallery_albums_main' ) )
        {
            \
IPS\Db::i()->dropTable( 'gallery_albums' );
        }

       
/* Do we need to fix ratings table? */
       
if ( \IPS\Db::i()->checkForColumn( 'gallery_ratings', 'id' ) )
        {
            \
IPS\Db::i()->changeColumn( 'gallery_ratings', 'id', array(
               
'name'                => 'rate_id',
               
'type'                => 'bigint',
               
'length'            => 20,
               
'allow_null'        => false,
               
'default'            => 0,
               
'auto_increment'    => true
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_ratings', 'member_id', array(
               
'name'                => 'rate_member_id',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_ratings', 'rating_where', array(
               
'name'                => 'rate_type',
               
'type'                => 'varchar',
               
'length'            => 32,
               
'allow_null'        => false,
               
'default'            => 'image'
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_ratings', 'rating_foreign_id', array(
               
'name'                => 'rate_type_id',
               
'type'                => 'bigint',
               
'length'            => 20,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_ratings', 'rdate', array(
               
'name'                => 'rate_date',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_ratings', 'rate', array(
               
'name'                => 'rate_rate',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeIndex( 'gallery_ratings', 'rating_find_me', array(
               
'name'                => 'rating_find_me',
               
'type'                => 'key',
               
'columns'            => array( 'rate_member_id', 'rate_type', 'rate_type_id' )
            ) );
        }

       
/* Do we need to fix comments? */
       
if ( \IPS\Db::i()->checkForColumn( 'gallery_comments', 'pid' ) )
        {
            \
IPS\Db::i()->update( 'gallery_comments', array( 'edit_time' => 0 ), array( 'edit_time=? OR edit_time IS NULL', '' ) );

            \
IPS\Db::i()->changeColumn( 'gallery_comments', 'pid', array(
               
'name'                => 'comment_id',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0,
               
'auto_increment'    => true
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_comments', 'edit_time', array(
               
'name'                => 'comment_edit_time',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_comments', 'author_id', array(
               
'name'                => 'comment_author_id',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_comments', 'author_name', array(
               
'name'                => 'comment_author_name',
               
'type'                => 'varchar',
               
'length'            => 255,
               
'allow_null'        => true,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_comments', 'ip_address', array(
               
'name'                => 'comment_ip_address',
               
'type'                => 'varchar',
               
'length'            => 46,
               
'allow_null'        => true,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_comments', 'post_date', array(
               
'name'                => 'comment_post_date',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_comments', 'comment', array(
               
'name'                => 'comment_text',
               
'type'                => 'text',
               
'allow_null'        => true,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_comments', 'approved', array(
               
'name'                => 'comment_approved',
               
'type'                => 'tinyint',
               
'length'            => 1,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_comments', 'img_id', array(
               
'name'                => 'comment_img_id',
               
'type'                => 'bigint',
               
'length'            => 20,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->addIndex( 'gallery_comments', array(
               
'name'                => 'comment_ip_address',
               
'type'                => 'key',
               
'columns'            => array( 'comment_ip_address' )
            ) );

            \
IPS\Db::i()->changeIndex( 'gallery_comments', 'img_id', array(
               
'name'                => 'img_id',
               
'type'                => 'key',
               
'columns'            => array( 'comment_img_id', 'comment_post_date' )
            ) );
        }

       
/* Do we need to update the images table? This isn't hard, but there are a lot of changes. */
       
if ( \IPS\Db::i()->checkForColumn( 'gallery_images', 'id' ) )
        {
            \
IPS\Db::i()->changeColumn( 'gallery_images', 'id', array(
               
'name'                => 'image_id',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0,
               
'auto_increment'    => true
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'member_id', array(
               
'name'                => 'image_member_id',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->addColumn( 'gallery_images', array(
               
'name'                => 'image_category_id',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'img_album_id', array(
               
'name'                => 'image_album_id',
               
'type'                => 'bigint',
               
'length'            => 20,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'caption', array(
               
'name'                => 'image_caption',
               
'type'                => 'varchar',
               
'length'            => 255,
               
'allow_null'        => false,
               
'default'            => ''
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'description', array(
               
'name'                => 'image_description',
               
'type'                => 'text',
               
'length'            => null,
               
'allow_null'        => TRUE,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'directory', array(
               
'name'                => 'image_directory',
               
'type'                => 'varchar',
               
'length'            => 255,
               
'allow_null'        => true,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'masked_file_name', array(
               
'name'                => 'image_masked_file_name',
               
'type'                => 'varchar',
               
'length'            => 255,
               
'allow_null'        => true,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'file_name', array(
               
'name'                => 'image_file_name',
               
'type'                => 'varchar',
               
'length'            => 255,
               
'allow_null'        => true,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'medium_file_name', array(
               
'name'                => 'image_medium_file_name',
               
'type'                => 'varchar',
               
'length'            => 255,
               
'allow_null'        => true,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'original_file_name', array(
               
'name'                => 'image_original_file_name',
               
'type'                => 'varchar',
               
'length'            => 255,
               
'allow_null'        => true,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'file_size', array(
               
'name'                => 'image_file_size',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'file_type', array(
               
'name'                => 'image_file_type',
               
'type'                => 'varchar',
               
'length'            => 50,
               
'allow_null'        => true,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'approved', array(
               
'name'                => 'image_approved',
               
'type'                => 'tinyint',
               
'length'            => 1,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'thumbnail', array(
               
'name'                => 'image_thumbnail',
               
'type'                => 'tinyint',
               
'length'            => 1,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'views', array(
               
'name'                => 'image_views',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'comments', array(
               
'name'                => 'image_comments',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'comments_queued', array(
               
'name'                => 'image_comments_queued',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'idate', array(
               
'name'                => 'image_date',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'ratings_total', array(
               
'name'                => 'image_ratings_total',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'ratings_count', array(
               
'name'                => 'image_ratings_count',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'rating', array(
               
'name'                => 'image_rating',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'lastcomment', array(
               
'name'                => 'image_last_comment',
               
'type'                => 'int',
               
'length'            => 10,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'pinned', array(
               
'name'                => 'image_pinned',
               
'type'                => 'tinyint',
               
'length'            => 1,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'media', array(
               
'name'                => 'image_media',
               
'type'                => 'tinyint',
               
'length'            => 1,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'credit_info', array(
               
'name'                => 'image_credit_info',
               
'type'                => 'text',
               
'length'            => null,
               
'allow_null'        => TRUE,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'copyright', array(
               
'name'                => 'image_copyright',
               
'type'                => 'varchar',
               
'length'            => 255,
               
'allow_null'        => true,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'metadata', array(
               
'name'                => 'image_metadata',
               
'type'                => 'text',
               
'length'            => null,
               
'allow_null'        => TRUE,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'media_thumb', array(
               
'name'                => 'image_media_thumb',
               
'type'                => 'varchar',
               
'length'            => 255,
               
'allow_null'        => true,
               
'default'            => null
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'caption_seo', array(
               
'name'                => 'image_caption_seo',
               
'type'                => 'varchar',
               
'length'            => 255,
               
'allow_null'        => false,
               
'default'            => ''
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'image_feature_flag', array(
               
'name'                => 'image_feature_flag',
               
'type'                => 'tinyint',
               
'length'            => 1,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->changeColumn( 'gallery_images', 'image_gps_show', array(
               
'name'                => 'image_gps_show',
               
'type'                => 'tinyint',
               
'length'            => 1,
               
'allow_null'        => false,
               
'default'            => 0
           
) );

            \
IPS\Db::i()->addIndex( 'gallery_images', array(
               
'name'                => 'album_id',
               
'type'                => 'key',
               
'columns'            => array( 'image_album_id', 'image_approved', 'image_date' )
            ) );

            \
IPS\Db::i()->addIndex( 'gallery_images', array(
               
'name'                => 'image_feature_flag',
               
'type'                => 'key',
               
'columns'            => array( 'image_feature_flag', 'image_date' )
            ) );

            \
IPS\Db::i()->addIndex( 'gallery_images', array(
               
'name'                => 'gb_select',
               
'type'                => 'key',
               
'columns'            => array( 'image_approved', 'image_parent_permission', 'image_date' ),
               
'length'            => array( null, 100, null )
            ) );

            \
IPS\Db::i()->addIndex( 'gallery_images', array(
               
'name'                => 'lastcomment',
               
'type'                => 'key',
               
'columns'            => array( 'image_last_comment', 'image_date' )
            ) );
        }
       
        return
TRUE;
    }

   
/**
     * Convert members album amd categories
     *
     * @return    array    If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
     */
   
public function step2()
    {
        if ( !\
IPS\Db::i()->checkForColumn( 'gallery_albums_main', 'album_category_id' ) )
        {
            \
IPS\Db::i()->addColumn( 'gallery_albums_main', array( "name" => "album_category_id", "type" => "int", "length" => 40, "allow_null" => false, "default" => '0', "comment" => "", "auto_increment" => false, "binary" => false ) );
        }
       
        try
        {
           
$setting    = \IPS\Db::i()->select( '*', 'core_sys_conf_settings', array( 'conf_key=?', 'gallery_members_album' ) )->first();
        }
        catch( \
UnderflowException $e )
        {
           
$setting    = array(
               
'conf_key'            => 'gallery_members_album',
               
'conf_value'        => 0,
               
'conf_default'        => 0
           
);

            \
IPS\Db::i()->insert( 'core_sys_conf_settings', $setting );
            \
IPS\Settings::i()->gallery_members_album    = 0;
        }

        \
IPS\Settings::i()->clearCache();

       
//-----------------------------------------
        // Get global albums and loop
        //-----------------------------------------

       
$albumCatMap    = array();
       
$imagesOnly        = array();
       
$position        = 1;
       
$options        = null;

        foreach( \
IPS\Db::i()->select( '*', 'gallery_albums_main', "album_is_global=1", 'album_position ASC' ) as $album )
        {
           
//-----------------------------------------
            // Fix older sort options
            //-----------------------------------------

           
$options    = @unserialize( $album['album_sort_options'] );

            if(
$options['key'] )
            {
               
$options['key']    = ( $options['key'] == 'name' ) ? 'image_caption' : ( ( $options['key'] == 'idate' ) ? 'image_date' : ( ( $options['key'] == 'rating' ) ? 'image_rating' : ( ( $options['key'] == 'comments' ) ? 'image_comments' : ( ( $options['key'] == 'views' ) ? 'image_views' : $options['key'] ) ) ) );
               
$album['album_sort_options']    = serialize($options);
            }

           
$options    = null;

           
//-----------------------------------------
            // Insert new category
            //-----------------------------------------

           
$category    = array(
                               
'category_name'                => $album['album_name'],
                               
'category_name_seo'            => $album['album_name_seo'],
                               
'category_description'        => $album['album_description'],
                               
'category_cover_img_id'        => $album['album_cover_img_id'],
                               
'category_type'                => ( $album['album_g_container_only'] == 1 ) ? 1 : 2,
                               
'category_sort_options'        => $album['album_sort_options'],
                               
'category_allow_comments'    => $album['album_allow_comments'],
                               
'category_allow_rating'        => $album['album_allow_rating'],
                               
'category_approve_img'        => $album['album_g_approve_img'],
                               
'category_approve_com'        => $album['album_g_approve_com'],
                               
'category_rules'            => $album['album_g_rules'],
                               
'category_after_forum_id'    => $album['album_after_forum_id'],
                               
'category_watermark'        => ( !$album['album_watermark'] ) ? 0 : ( ( $album['album_watermark'] == 2 ) ? 2 : 1 ),
                               
'category_can_tag'            => $album['album_can_tag'],
                               
'category_preset_tags'        => $album['album_preset_tags'],
                               
'category_position'            => $position,
                                );

           
$category['category_id'] = \IPS\Db::i()->insert( 'gallery_categories', $category );

            if(
$album['album_g_perms_thumbs'] == 'member' )
            {
                \
IPS\Settings::i()->gallery_members_album    = $category['category_id'];
            }

           
//-----------------------------------------
            // Insert permissions
            //-----------------------------------------

           
$permissions    = array(
                                   
'app'            => 'gallery',
                                   
'perm_type'        => 'categories',
                                   
'perm_type_id'    => $category['category_id'],
                                   
'perm_view'        => $album['album_g_perms_view'] ?: '',
                                   
'perm_2'        => $album['album_g_perms_images'],
                                   
'perm_3'        => $album['album_g_perms_comments'],
                                   
'perm_4'        => $album['album_g_perms_comments'],
                                   
'perm_5'        => $album['album_g_perms_moderate'],
                                    );

            \
IPS\Db::i()->insert( 'core_permission_index', $permissions );

           
//-----------------------------------------
            // Update images in this category
            //-----------------------------------------

           
\IPS\Db::i()->update( 'gallery_images', array( 'image_category_id' => $category['category_id'], 'image_album_id' => 0, 'image_parent_permission' => $album['album_g_perms_view'], 'image_privacy' => 0 ), 'image_album_id=' . $album['album_id'] );

           
//-----------------------------------------
            // Store mapping
            //-----------------------------------------

           
$position++;

           
$albumCatMap[ $album['album_id'] ]    = array( 'album' => $album, 'category' => $category );

            if(
$category['category_type'] == 2 )
            {
               
$imagesOnly[]                    = $category['category_id'];
            }
        }

       
//-----------------------------------------
        // Fix album data
        //-----------------------------------------

       
$foundMembersGallery    = 0;

        foreach(
$albumCatMap as $albumId => $data )
        {
           
//-----------------------------------------
            // Set subcategory parent association if necessary
            //-----------------------------------------

           
if( $data['album']['album_parent_id'] )
            {
                \
IPS\Db::i()->update( 'gallery_categories', array( 'category_parent_id' => $albumCatMap[ $data['album']['album_parent_id'] ]['category']['category_id'] ), 'category_id=' . $data['category']['category_id'] );
            }

           
//-----------------------------------------
            // Move our child albums
            //-----------------------------------------

           
\IPS\Db::i()->update( 'gallery_albums_main', array( 'album_category_id' => $data['category']['category_id'], 'album_parent_id' => 0 ), 'album_parent_id=' . $albumId );

           
//-----------------------------------------
            // Fix members album cat association
            //-----------------------------------------

           
if( $albumId == \IPS\Settings::i()->gallery_members_album )
            {
                \
IPS\Settings::i()->gallery_members_album    = $data['category']['category_id'];
               
$foundMembersGallery    = $data['category']['category_id'];

                \
IPS\Db::i()->update( 'gallery_categories', array( 'category_type' => 1 ), 'category_id=' . $data['category']['category_id'] );
            }
        }

       
//-----------------------------------------
        // If we didn't find a members gallery, make one
        //-----------------------------------------

       
if( !$foundMembersGallery )
        {
           
$category    = array(
                               
'category_name'                => 'Temp global album for root member albums',
                               
'category_name_seo'            => 'temp-global-album-for-root-member-albums',
                               
'category_description'        => "This is a temporary global album that holds the member albums that didn't have the proper parent album set. This album has NO permissions and is not visible from the public side, please move the albums in the proper location.",
                               
'category_cover_img_id'        => 0,
                               
'category_type'                => 1,
                               
'category_sort_options'        => '',
                               
'category_allow_comments'    => 1,
                               
'category_allow_rating'        => 1,
                               
'category_approve_img'        => 0,
                               
'category_approve_com'        => 0,
                               
'category_rules'            => '',
                               
'category_after_forum_id'    => 0,
                               
'category_watermark'        => 0,
                               
'category_can_tag'            => 1,
                               
'category_preset_tags'        => '',
                               
'category_position'            => $position,
                                );

           
$category['category_id'] = \IPS\Db::i()->insert( 'gallery_categories', $category );

           
$foundMembersGallery        = $category['category_id'];
            \
IPS\Settings::i()->gallery_members_album    = $category['category_id'];
        }

       
//-----------------------------------------
        // Move any albums in a category with type 2 to members album cat
        //-----------------------------------------

       
if( count( $imagesOnly ) )
        {
            \
IPS\Db::i()->update( 'gallery_albums_main', array( 'album_category_id' => $foundMembersGallery ), 'album_category_id IN(' . implode( ',', $imagesOnly ) . ')' );
        }

       
//-----------------------------------------
        // Delete global albums
        //-----------------------------------------

       
\IPS\Db::i()->delete( 'gallery_albums_main', 'album_is_global=1' );

        \
IPS\Settings::i()->changeValues( array( 'gallery_members_album' => \IPS\Settings::i()->gallery_members_album ) );

        return
TRUE;
    }

   
/**
     * Clean up missing and extraneous fields and indexes
     *
     * @return    array    If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
     */
   
public function step3()
    {
       
//-----------------------------------------
        // No idea why, but sometimes this index disappears?
        //-----------------------------------------

       
if( !\IPS\Db::i()->checkForIndex( 'gallery_comments', 'img_id' ) )
        {
            if( \
IPS\Db::i()->checkForIndex( 'gallery_comments', 'comment_img_id' ) )
            {
                \
IPS\Db::i()->dropIndex( 'gallery_comments', 'comment_img_id' );
            }

            \
IPS\Db::i()->addIndex( 'gallery_comments', array(
               
'type'            => 'index',
               
'name'            => 'img_id',
               
'columns'        => array( 'comment_img_id', 'comment_post_date' )
            ) );
        }

       
//-----------------------------------------
        // Add new columns
        //-----------------------------------------

       
\IPS\Db::i()->addColumn( 'gallery_albums_main', array( "name" => "album_type", "type" => "INT", "length" => 10, "allow_null" => false, "default" => 0, "comment" => "", "auto_increment" => false, "binary" => false ) );
        \
IPS\Db::i()->addColumn( 'gallery_albums_main', array( "name" => "album_last_x_images", "type" => "TEXT", "length" => null, "allow_null" => true, "default" => null, "comment" => "", "auto_increment" => false, "binary" => false ) );

       
//-----------------------------------------
        // Change existing columns
        //-----------------------------------------

       
\IPS\Db::i()->changeColumn( 'gallery_albums_main', "album_allow_comments", array( "name" => "album_allow_comments", "type" => "TINYINT", "length" => 1, "allow_null" => false, "default" => 0, "comment" => "", "auto_increment" => false, "binary" => false ) );
        \
IPS\Db::i()->changeColumn( 'gallery_albums_main', "album_allow_rating", array( "name" => "album_allow_rating", "type" => "TINYINT", "length" => 1, "allow_null" => false, "default" => 0, "comment" => "", "auto_increment" => false, "binary" => false ) );
        \
IPS\Db::i()->changeColumn( 'gallery_albums_main', "album_watermark", array( "name" => "album_watermark", "type" => "TINYINT", "length" => 1, "allow_null" => false, "default" => 0, "comment" => "", "auto_increment" => false, "binary" => false ) );

       
//-----------------------------------------
        // Delete old columns
        //-----------------------------------------

       
\IPS\Db::i()->dropColumn( 'gallery_albums_main', array(
           
'album_is_global', 'album_is_profile', 'album_cache', 'album_node_level', 'album_node_left', 'album_preset_tags',
           
'album_node_right', 'album_g_approve_img', 'album_g_approve_com', 'album_g_bitwise', 'album_g_rules',
           
'album_g_container_only', 'album_g_perms_thumbs', 'album_g_perms_view', 'album_g_perms_images', 'album_g_perms_comments',
           
'album_g_perms_moderate', 'album_g_latest_imgs', 'album_detail_default', 'album_child_tree', 'album_parent_tree', 'album_can_tag'
       
) );
       
        return
TRUE;
    }

   
/**
     * Convert albums step 1
     *
     * @return    array    If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
     */
   
public function step4()
    {
       
$perCycle    = 100;
       
$did        = 0;
       
$limit        = intval( \IPS\Request::i()->extra );
       
       
//-----------------------------------------
        // Fetch albums that have a parent defined
        //-----------------------------------------

       
       
foreach( \IPS\Db::i()->select( '*', 'gallery_albums_main', NULL, 'album_id ASC', array( $limit, $perCycle ) ) as $row )
        {
           
$did++;
           
$update    = array();

           
//-----------------------------------------
            // Reset watermark
            //-----------------------------------------

           
if( $row['album_watermark'] )
            {
               
$update['album_watermark']    = 1;
            }

           
//-----------------------------------------
            // Reset public/private/friend-only
            //-----------------------------------------

           
if( $row['album_is_public'] == 1 )
            {
               
$update['album_type']    = 1;
            }
            else if(
$row['album_is_public'] == 2 )
            {
               
$update['album_type']    = 3;
            }
            else
            {
               
$update['album_type']    = 2;
            }

           
//-----------------------------------------
            // Get the parent (up to 4 levels deep..)
            //-----------------------------------------

           
if( $row['album_parent_id'] )
            {
                try
                {
                   
$parent    = \IPS\Db::i()->select( 'album_id, album_parent_id, album_category_id', 'gallery_albums_main', 'album_id=' . intval($row['album_parent_id']) )->first();
                }
                catch( \
UnderflowException $e )
                {
                   
$parent    = array( 'album_id' => 0 );    
                }

                if(
$parent['album_id'] )
                {
                    if(
$parent['album_category_id'] )
                    {
                       
$update['album_category_id']    = $parent['album_category_id'];
                    }
                    else if(
$parent['album_parent_id'] )
                    {
                        try
                        {
                           
$_parent    = \IPS\Db::i()->select( 'album_id, album_parent_id, album_category_id', 'gallery_albums_main', 'album_id=' . intval($parent['album_parent_id']) )->first();
                        }
                        catch( \
UnderflowException $e )
                        {
                           
$_parent    = array( 'album_id' => 0 );    
                        }

                        if(
$_parent['album_id'] )
                        {
                            if(
$_parent['album_category_id'] )
                            {
                               
$update['album_category_id']    = $_parent['album_category_id'];
                            }
                            else if(
$_parent['album_parent_id'] )
                            {
                                try
                                {
                                   
$__parent    = \IPS\Db::i()->select( 'album_id, album_parent_id, album_category_id', 'gallery_albums_main', 'album_id=' . intval($_parent['album_parent_id']) )->first();
                                }
                                catch( \
UnderflowException $e )
                                {
                                   
$__parent    = array( 'album_id' => 0 );    
                                }

                                if(
$__parent['album_id'] )
                                {
                                    if(
$__parent['album_category_id'] )
                                    {
                                       
$update['album_category_id']    = $__parent['album_category_id'];
                                    }
                                    else if(
$__parent['album_parent_id'] )
                                    {
                                        try
                                        {
                                           
$___parent    = \IPS\Db::i()->select( 'album_id, album_parent_id, album_category_id', 'gallery_albums_main', 'album_id=' . intval($__parent['album_parent_id']) )->first();
                                        }
                                        catch( \
UnderflowException $e )
                                        {
                                           
$___parent    = array( 'album_id' => 0 );    
                                        }

                                        if(
$___parent['album_category_id'] )
                                        {
                                           
$update['album_category_id']    = $___parent['album_category_id'];
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

           
//-----------------------------------------
            // If we didn't find cat, move to members albums cat
            //-----------------------------------------

           
if( !$update['album_category_id'] )
            {
               
$update['album_category_id']    = $row['album_category_id'] ? $row['album_category_id'] : (int) \IPS\Settings::i()->gallery_members_album;
            }

           
//-----------------------------------------
            // Save updates
            //-----------------------------------------

           
if( count($update) )
            {
                \
IPS\Db::i()->update( 'gallery_albums_main', $update, 'album_id=' . $row['album_id'] );
            }
        }
       
       
//-----------------------------------------
        // Got any more? .. redirect
        //-----------------------------------------

       
if( $did )
        {
            return (
$limit + $did );
        }
        else
        {
            return
TRUE;
        }
    }

   
/**
     * Convert albums step 2
     *
     * @return    array    If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
     */
   
public function step5()
    {
       
//-----------------------------------------
        // Move any lingering albums to member album cat
        //-----------------------------------------

       
\IPS\Db::i()->update( 'gallery_albums_main', array( 'album_category_id' => (int) \IPS\Settings::i()->gallery_members_album ), 'album_category_id=0' );

       
//-----------------------------------------
        // Delete old columns
        //-----------------------------------------

       
\IPS\Db::i()->dropColumn( 'gallery_albums_main', 'album_parent_id' );
        \
IPS\Db::i()->dropColumn( 'gallery_albums_main', 'album_is_public' );

       
//-----------------------------------------
        // Update indexes
        //-----------------------------------------

       
if( \IPS\Db::i()->checkForIndex( 'gallery_albums_main', 'album_nodes' ) )
        {
            \
IPS\Db::i()->dropIndex( 'gallery_albums_main', 'album_nodes' );
        }

        if( \
IPS\Db::i()->checkForIndex( 'gallery_albums_main', 'album_parent_id' ) )
        {
            \
IPS\Db::i()->dropIndex( 'gallery_albums_main', 'album_parent_id' );
        }

        if( \
IPS\Db::i()->checkForIndex( 'gallery_albums_main', 'album_owner_id' ) )
        {
            \
IPS\Db::i()->dropIndex( 'gallery_albums_main', 'album_owner_id' );
        }

        if( \
IPS\Db::i()->checkForIndex( 'gallery_albums_main', 'album_count_imgs' ) )
        {
            \
IPS\Db::i()->dropIndex( 'gallery_albums_main', 'album_count_imgs' );
        }

        if( \
IPS\Db::i()->checkForIndex( 'gallery_albums_main', 'album_has_a_perm' ) )
        {
            \
IPS\Db::i()->dropIndex( 'gallery_albums_main', 'album_has_a_perm' );
        }

        if( \
IPS\Db::i()->checkForIndex( 'gallery_albums_main', 'album_child_lup' ) )
        {
            \
IPS\Db::i()->dropIndex( 'gallery_albums_main', 'album_child_lup' );
        }

        \
IPS\Db::i()->addIndex( 'gallery_albums_main', array(
           
'type'            => 'index',
           
'name'            => 'album_owner_id',
           
'columns'        => array( 'album_owner_id', 'album_last_img_date' )
        ) );

        \
IPS\Db::i()->addIndex( 'gallery_albums_main', array(
           
'type'            => 'index',
           
'name'            => 'album_parent_id',
           
'columns'        => array( 'album_category_id', 'album_name_seo' )
        ) );

       
//-----------------------------------------
        // Rename the table
        //-----------------------------------------

       
\IPS\Db::i()->renameTable( 'gallery_albums_main', 'gallery_albums' );
       
        return
TRUE;
    }
}