Invision Power Services, Inc. * @copyright (c) Invision Power Services, Inc. * @license https://www.invisioncommunity.com/legal/standards/ * @package Invision Community * @since 27 May 2014 */ namespace IPS\core\setup\upg_30001; /* 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; } /** * Upgrade steps */ class _Upgrade { /** * 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 step1() { \IPS\Db::i()->dropTable( 'sessions' ); \IPS\Db::i()->createTable( array( 'name' => 'sessions', 'columns' => array( array( 'name' => 'id', 'type' => 'varchar', 'length' => 60, 'allow_null' => false, 'default' => '0' ), array( 'name' => 'member_name', 'type' => 'varchar', 'length' => 64, 'allow_null' => true, 'default' => null ), array( 'name' => 'seo_name', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'member_id', 'type' => 'mediumint', 'length' => 8, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'ip_address', 'type' => 'varchar', 'length' => 16, 'allow_null' => true, 'default' => null ), array( 'name' => 'browser', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'running_time', 'type' => 'int', 'length' => 10, 'allow_null' => true, 'default' => null ), array( 'name' => 'login_type', 'type' => 'char', 'length' => 3, 'allow_null' => false, 'default' => '' ), array( 'name' => 'location', 'type' => 'varchar', 'length' => 40, 'allow_null' => true, 'default' => null ), array( 'name' => 'member_group', 'type' => 'smallint', 'length' => 3, 'allow_null' => true, 'default' => null ), array( 'name' => 'in_error', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'location_1_type', 'type' => 'varchar', 'length' => 10, 'allow_null' => false, 'default' => '' ), array( 'name' => 'location_1_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'location_2_type', 'type' => 'varchar', 'length' => 10, 'allow_null' => false, 'default' => '' ), array( 'name' => 'location_2_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'location_3_type', 'type' => 'varchar', 'length' => 10, 'allow_null' => false, 'default' => '' ), array( 'name' => 'location_3_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'current_appcomponent', 'type' => 'varchar', 'length' => 100, 'allow_null' => false, 'default' => '' ), array( 'name' => 'current_module', 'type' => 'varchar', 'length' => 100, 'allow_null' => false, 'default' => '' ), array( 'name' => 'current_section', 'type' => 'varchar', 'length' => 100, 'allow_null' => false, 'default' => '' ), array( 'name' => 'uagent_key', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'uagent_version', 'type' => 'varchar', 'length' => 100, 'allow_null' => false, 'default' => '' ), array( 'name' => 'uagent_type', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'uagent_bypass', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'search_thread_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'search_thread_time', 'type' => 'varchar', 'length' => 13, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'id' ) ), array( 'type' => 'key', 'name' => 'location1', 'columns' => array( 'location_1_type', 'location_1_id' ) ), array( 'type' => 'key', 'name' => 'location2', 'columns' => array( 'location_2_type', 'location_2_id' ) ), array( 'type' => 'key', 'name' => 'location3', 'columns' => array( 'location_3_type', 'location_3_id' ) ), array( 'type' => 'key', 'name' => 'running_time', 'columns' => array( 'running_time' ) ) ) ) ); \IPS\Db::i()->dropTable( 'custom_bbcode' ); \IPS\Db::i()->createTable( array( 'name' => 'custom_bbcode', 'columns' => array( array( 'name' => 'bbcode_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'bbcode_title', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'bbcode_desc', 'type' => 'text', 'length' => null, 'allow_null' => true, 'default' => null ), array( 'name' => 'bbcode_tag', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'bbcode_replace', 'type' => 'text', 'length' => null, 'allow_null' => true, 'default' => null ), array( 'name' => 'bbcode_useoption', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'bbcode_example', 'type' => 'text', 'length' => null, 'allow_null' => true, 'default' => null ), array( 'name' => 'bbcode_switch_option', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'bbcode_menu_option_text', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'bbcode_menu_content_text', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'bbcode_single_tag', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'bbcode_groups', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ), array( 'name' => 'bbcode_sections', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ), array( 'name' => 'bbcode_php_plugin', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ), array( 'name' => 'bbcode_parse', 'type' => 'smallint', 'length' => 2, 'allow_null' => false, 'default' => 1 ), array( 'name' => 'bbcode_no_parsing', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'bbcode_protected', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'bbcode_aliases', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ), array( 'name' => 'bbcode_optional_option', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'bbcode_image', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ), array( 'name' => 'bbcode_strip_search', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'bbcode_app', 'type' => 'varchar', 'length' => 50, 'allow_null' => false, 'default' => '' ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'bbcode_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'profile_friends_flood', 'columns' => array( array( 'name' => 'friends_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'friends_member_id', 'type' => 'int', 'unsigned' => true, 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'friends_friend_id', 'type' => 'int', 'unsigned' => true, 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'friends_removed', 'type' => 'int', 'unsigned' => true, 'length' => 10, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'friends_id' ) ), array( 'type' => 'key', 'name' => 'my_friends', 'columns' => array( 'friends_member_id', 'friends_friend_id' ) ), array( 'type' => 'key', 'name' => 'friends_member_id', 'columns' => array( 'friends_member_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_sys_cp_sessions', 'columns' => array( array( 'name' => 'session_id', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => '' ), array( 'name' => 'session_ip_address', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => '' ), array( 'name' => 'session_member_name', 'type' => 'varchar', 'length' => 250, 'allow_null' => false, 'default' => '' ), array( 'name' => 'session_member_id', 'type' => 'mediumint', 'length' => 8, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'session_member_login_key', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => '' ), array( 'name' => 'session_location', 'type' => 'varchar', 'length' => 64, 'allow_null' => false, 'default' => '' ), array( 'name' => 'session_log_in_time', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'session_running_time', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'session_url', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'session_app_data', 'type' => 'text', 'allow_null' => true, 'default' => null ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'session_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_sys_settings_titles', 'columns' => array( array( 'name' => 'conf_title_id', 'type' => 'smallint', 'length' => 3, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'conf_title_title', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'conf_title_desc', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'conf_title_count', 'type' => 'smallint', 'length' => 3, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'conf_title_noshow', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'conf_title_keyword', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'conf_title_module', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'conf_title_app', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'conf_title_tab', 'type' => 'varchar', 'length' => 32, 'allow_null' => true, 'default' => null ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'conf_title_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_sys_conf_settings', 'columns' => array( array( 'name' => 'conf_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'conf_title', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'conf_description', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'conf_group', 'type' => 'smallint', 'length' => 3, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'conf_type', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'conf_key', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'conf_value', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'conf_default', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'conf_extra', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'conf_evalphp', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'conf_protected', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'conf_position', 'type' => 'smallint', 'length' => 3, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'conf_start_group', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'conf_end_group', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'conf_add_cache', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 1 ), array( 'name' => 'conf_keywords', 'type' => 'text', 'allow_null' => true, 'default' => null ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'conf_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_item_markers', 'columns' => array( array( 'name' => 'item_key', 'type' => 'char', 'length' => 32, 'allow_null' => false, ), array( 'name' => 'item_member_id', 'type' => 'int', 'length' => 8, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'item_app', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => 'core' ), array( 'name' => 'item_last_update', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'item_last_saved', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'item_unread_count', 'type' => 'int', 'length' => 5, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'item_read_array', 'type' => 'mediumtext', 'allow_null' => true, 'default' => null ), array( 'name' => 'item_global_reset', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'item_app_key_1', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'item_app_key_2', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'item_app_key_3', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'unique', 'name' => 'combo_key', 'columns' => array( 'item_key', 'item_member_id' ) ), array( 'type' => 'key', 'name' => 'marker_index', 'columns' => array( 'item_member_id', 'item_app' ) ), array( 'type' => 'key', 'name' => 'item_member_id', 'columns' => array( 'item_member_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_item_markers_storage', 'columns' => array( array( 'name' => 'item_member_id', 'type' => 'int', 'length' => 8, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'item_markers', 'type' => 'mediumtext', 'length' => null, 'allow_null' => true, 'default' => null ), array( 'name' => 'item_last_updated', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'item_last_saved', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'item_member_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'template_sandr', 'columns' => array( array( 'name' => 'sandr_session_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'sandr_set_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'sandr_search_only', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'sandr_search_all', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'sandr_search_for', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'sandr_replace_with', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'sandr_is_regex', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'sandr_template_count', 'type' => 'int', 'length' => 5, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'sandr_template_processed', 'type' => 'int', 'length' => 5, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'sandr_results', 'type' => 'mediumtext', 'allow_null' => true, 'default' => null ), array( 'name' => 'sandr_updated', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'sandr_session_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'question_and_answer', 'columns' => array( array( 'name' => 'qa_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'qa_question', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'qa_answers', 'type' => 'text', 'allow_null' => true, 'default' => null ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'qa_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'mod_queued_items', 'columns' => array( array( 'name' => 'id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'type', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => 'post' ), array( 'name' => 'type_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'id' ) ), array( 'type' => 'key', 'name' => 'type_id', 'columns' => array( 'type_id' ) ), ) ) ); \IPS\Db::i()->addIndex( 'message_topics', array( 'type' => 'key', 'name' => 'mt_msg_id', 'columns' => array( 'mt_msg_id' ) ) ); \IPS\Db::i()->renameTable( 'message_topics', 'message_topics_old' ); \IPS\Db::i()->createTable( array( 'name' => 'message_topics', 'columns' => array( array( 'name' => 'mt_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'mt_date', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'mt_title', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'mt_hasattach', 'type' => 'smallint', 'length' => 5, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'mt_starter_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'mt_start_time', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'mt_last_post_time', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'mt_invited_members', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'mt_to_count', 'type' => 'int', 'length' => 3, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'mt_to_member_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'mt_replies', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'mt_last_msg_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'mt_first_msg_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'mt_is_draft', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'mt_is_deleted', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'mt_is_system', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'mt_id' ) ), array( 'type' => 'key', 'name' => 'mt_starter_id', 'columns' => array( 'mt_starter_id' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'message_topic_user_map', 'columns' => array( array( 'name' => 'map_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'map_user_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'map_topic_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'map_folder_id', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => '' ), array( 'name' => 'map_read_time', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'map_user_active', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'map_user_banned', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'map_has_unread', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'map_is_system', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'map_is_starter', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'map_left_time', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'map_ignore_notification', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'map_last_topic_reply', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'map_id' ) ), array( 'type' => 'unique', 'name' => 'map_main', 'columns' => array( 'map_user_id', 'map_topic_id' ) ), array( 'type' => 'key', 'name' => 'map_user', 'columns' => array( 'map_user_id', 'map_folder_id' ) ), array( 'type' => 'key', 'name' => 'map_topic_id', 'columns' => array( 'map_topic_id' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'message_posts', 'columns' => array( array( 'name' => 'msg_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'msg_topic_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'msg_date', 'type' => 'int', 'length' => 10, 'allow_null' => true, 'default' => null ), array( 'name' => 'msg_post', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'msg_post_key', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => '0' ), array( 'name' => 'msg_author_id', 'type' => 'mediumint', 'length' => 8, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'msg_ip_address', 'type' => 'varchar', 'length' => 16, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'msg_is_first_post', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'msg_id' ) ), array( 'type' => 'key', 'name' => 'msg_topic_id', 'columns' => array( 'msg_topic_id' ) ), array( 'type' => 'key', 'name' => 'msg_date', 'columns' => array( 'msg_date' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'error_logs', 'columns' => array( array( 'name' => 'log_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'log_member', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'log_date', 'type' => 'varchar', 'length' => 13, 'allow_null' => false, 'default' => '0' ), array( 'name' => 'log_error', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'log_error_code', 'type' => 'varchar', 'length' => 24, 'allow_null' => false, 'default' => '0' ), array( 'name' => 'log_ip_address', 'type' => 'varchar', 'length' => 32, 'allow_null' => true, 'default' => null ), array( 'name' => 'log_request_uri', 'type' => 'text', 'allow_null' => true, 'default' => null ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'log_id' ) ), array( 'type' => 'key', 'name' => 'log_date', 'columns' => array( 'log_date' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'pfields_groups', 'columns' => array( array( 'name' => 'pf_group_id', 'type' => 'mediumint', 'length' => 4, 'unsigned' => true, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'pf_group_name', 'type' => 'varchar', 'length' => 255, 'allow_null' => false ), array( 'name' => 'pf_group_key', 'type' => 'varchar', 'length' => 255, 'allow_null' => false ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'pf_group_id' ) ) ) ) ); \IPS\Db::i()->dropTable( 'rc_classes', TRUE ); \IPS\Db::i()->dropTable( 'rc_comments', TRUE ); \IPS\Db::i()->dropTable( 'rc_modpref', TRUE ); \IPS\Db::i()->dropTable( 'rc_reports', TRUE ); \IPS\Db::i()->dropTable( 'rc_reports_index', TRUE ); \IPS\Db::i()->dropTable( 'rc_status', TRUE ); \IPS\Db::i()->dropTable( 'rc_status_sev', TRUE ); \IPS\Db::i()->createTable( array( 'name' => 'rc_classes', 'columns' => array( array( 'name' => 'com_id', 'type' => 'smallint', 'length' => 4, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'onoff', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'class_title', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'class_desc', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'author', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'author_url', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'pversion', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'my_class', 'type' => 'varchar', 'length' => 100, 'allow_null' => false, 'default' => '' ), array( 'name' => 'group_can_report', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'mod_group_perm', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'extra_data', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'lockd', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'com_id' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'rc_comments', 'columns' => array( array( 'name' => 'id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'rid', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'comment', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'comment_by', 'type' => 'mediumint', 'length' => 8, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'comment_date', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'id' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'rc_modpref', 'columns' => array( array( 'name' => 'mem_id', 'type' => 'mediumint', 'length' => 8, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'by_pm', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'by_email', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'by_alert', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'rss_key', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => '' ), array( 'name' => 'max_points', 'type' => 'smallint', 'length' => 3, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'reports_pp', 'type' => 'smallint', 'length' => 3, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'rss_cache', 'type' => 'mediumtext', 'allow_null' => false ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'mem_id' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'rc_reports', 'columns' => array( array( 'name' => 'id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'rid', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'report', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'report_by', 'type' => 'mediumint', 'length' => 8, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'date_reported', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'id' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'rc_reports_index', 'columns' => array( array( 'name' => 'id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'uid', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => '' ), array( 'name' => 'title', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'status', 'type' => 'smallint', 'length' => 2, 'allow_null' => false, 'default' => 1 ), array( 'name' => 'url', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'img_preview', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'rc_class', 'type' => 'smallint', 'length' => 3, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'updated_by', 'type' => 'mediumint', 'length' => 8, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'date_updated', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'date_created', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'exdat1', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'exdat2', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'exdat3', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'num_reports', 'type' => 'smallint', 'length' => 4, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'num_comments', 'type' => 'smallint', 'length' => 4, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'seoname', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ), array( 'name' => 'seotemplate', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'id' ) ), array( 'type' => 'key', 'name' => 'uid', 'columns' => array( 'uid' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'rc_status', 'columns' => array( array( 'name' => 'status', 'type' => 'tinyint', 'length' => 2, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'title', 'type' => 'varchar', 'length' => 100, 'allow_null' => false, 'default' => '' ), array( 'name' => 'points_per_report', 'type' => 'smallint', 'length' => 4, 'allow_null' => false, 'default' => 1 ), array( 'name' => 'minutes_to_apoint', 'type' => 'double', 'allow_null' => false, 'default' => 5 ), array( 'name' => 'is_new', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'is_complete', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'is_active', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'rorder', 'type' => 'smallint', 'length' => 3, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'status' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'rc_status_sev', 'columns' => array( array( 'name' => 'id', 'type' => 'smallint', 'length' => 4, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'status', 'type' => 'tinyint', 'length' => 2, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'points', 'type' => 'smallint', 'length' => 4, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'img', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'is_png', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'width', 'type' => 'smallint', 'length' => 3, 'allow_null' => false, 'default' => 16 ), array( 'name' => 'height', 'type' => 'smallint', 'length' => 3, 'allow_null' => false, 'default' => 16 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'id' ) ), array( 'type' => 'key', 'name' => 'status', 'columns' => array( 'status', 'points' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'reputation_levels', 'columns' => array( array( 'name' => 'level_id', 'type' => 'mediumint', 'length' => 8, 'unsigned' => true, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'level_points', 'type' => 'int', 'length' => 10, 'allow_null' => false ), array( 'name' => 'level_title', 'type' => 'varchar', 'length' => 255, 'allow_null' => false ), array( 'name' => 'level_image', 'type' => 'varchar', 'length' => 255, 'allow_null' => false ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'level_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'reputation_cache', 'columns' => array( array( 'name' => 'id', 'type' => 'bigint', 'length' => 10, 'unsigned' => true, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'app', 'type' => 'varchar', 'length' => 32, 'allow_null' => false ), array( 'name' => 'type', 'type' => 'varchar', 'length' => 32, 'allow_null' => false ), array( 'name' => 'type_id', 'type' => 'int', 'length' => 10, 'unsigned' => true, 'allow_null' => false ), array( 'name' => 'rep_points', 'type' => 'int', 'length' => 10, 'unsigned' => true, 'allow_null' => false ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'level_id' ) ), array( 'type' => 'key', 'name' => 'app', 'columns' => array( 'app', 'type', 'type_id' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'reputation_index', 'columns' => array( array( 'name' => 'id', 'type' => 'bigint', 'length' => 10, 'unsigned' => true, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'member_id', 'type' => 'mediumint', 'length' => 8, 'unsigned' => true, 'allow_null' => false ), array( 'name' => 'app', 'type' => 'varchar', 'length' => 32, 'allow_null' => false ), array( 'name' => 'type', 'type' => 'varchar', 'length' => 32, 'allow_null' => false ), array( 'name' => 'type_id', 'type' => 'int', 'length' => 10, 'unsigned' => true, 'allow_null' => false ), array( 'name' => 'misc', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'rep_date', 'type' => 'int', 'length' => 10, 'unsigned' => true, 'allow_null' => false ), array( 'name' => 'rep_msg', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'rep_rating', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'id' ) ), array( 'type' => 'key', 'name' => 'app', 'columns' => array( 'app', 'type', 'type_id', 'member_id' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_hooks', 'columns' => array( array( 'name' => 'hook_id', 'type' => 'mediumint', 'length' => 4, 'unsigned' => true, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'hook_enabled', 'type' => 'tinyint', 'length' => 1, 'unsigned' => true, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'hook_name', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null, ), array( 'name' => 'hook_desc', 'type' => 'text', 'allow_null' => true ), array( 'name' => 'hook_author', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null, ), array( 'name' => 'hook_email', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null, ), array( 'name' => 'hook_website', 'type' => 'text', 'allow_null' => true ), array( 'name' => 'hook_update_check', 'type' => 'text', 'allow_null' => true ), array( 'name' => 'hook_requirements', 'type' => 'text', 'allow_null' => true ), array( 'name' => 'hook_version_human', 'type' => 'varchar', 'length' => 32, 'allow_null' => true, 'default' => null ), array( 'name' => 'hook_version_long', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => '0' ), array( 'name' => 'hook_installed', 'type' => 'varchar', 'length' => 13, 'allow_null' => false, 'default' => '0' ), array( 'name' => 'hook_updated', 'type' => 'varchar', 'length' => 13, 'allow_null' => false, 'default' => '0' ), array( 'name' => 'hook_position', 'type' => 'mediumint', 'length' => 8, 'allow_null' => false, 'default' => '0' ), array( 'name' => 'hook_extra_data', 'type' => 'text', 'allow_null' => true ), array( 'name' => 'hook_key', 'type' => 'varchar', 'length' => 32, 'allow_null' => true, 'default' => null ) ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'hook_id' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_hooks_files', 'columns' => array( array( 'name' => 'hook_file_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'hook_hook_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'hook_file_stored', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null, ), array( 'name' => 'hook_file_real', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null, ), array( 'name' => 'hook_type', 'type' => 'varchar', 'length' => 32, 'allow_null' => true, 'default' => null, ), array( 'name' => 'hook_classname', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null, ), array( 'name' => 'hook_data', 'type' => 'text', 'allow_null' => true ), array( 'name' => 'hooks_source', 'type' => 'longtext', 'allow_null' => true ) ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'hook_file_id' ) ), array( 'type' => 'key', 'name' => 'hook_hook_id', 'columns' => array( 'hook_hook_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'tags_index', 'columns' => array( array( 'name' => 'id', 'type' => 'bigint', 'length' => 10, 'unsigned' => true, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'app', 'type' => 'varchar', 'length' => 255, 'allow_null' => false ), array( 'name' => 'tag', 'type' => 'varchar', 'length' => 255, 'allow_null' => false ), array( 'name' => 'type', 'type' => 'varchar', 'length' => 32, 'allow_null' => false ), array( 'name' => 'type_id', 'type' => 'bigint', 'length' => 10, 'unsigned' => true, 'allow_null' => false ), array( 'name' => 'type_2', 'type' => 'varchar', 'length' => 32, 'allow_null' => false ), array( 'name' => 'type_id_2', 'type' => 'bigint', 'length' => 10, 'unsigned' => true, 'allow_null' => false ), array( 'name' => 'updated', 'type' => 'int', 'length' => 10, 'unsigned' => true, 'allow_null' => false ), array( 'name' => 'misc', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'member_id', 'type' => 'mediumint', 'length' => 8, 'unsigned' => true, 'allow_null' => false ) ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'id' ) ), array( 'type' => 'key', 'name' => 'app', 'columns' => array( 'app' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_uagents', 'columns' => array( array( 'name' => 'uagent_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'uagent_key', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'uagent_name', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'uagent_regex', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'uagent_regex_capture', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0, ), array( 'name' => 'uagent_type', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'uagent_position', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ) ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'uagent_id' ) ), array( 'type' => 'key', 'name' => 'uagent_key', 'columns' => array( 'uagent_key' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_uagent_groups', 'columns' => array( array( 'name' => 'ugroup_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'ugroup_title', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'ugroup_array', 'type' => 'mediumtext', 'allow_null' => false ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'ugroup_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'skin_replacements', 'columns' => array( array( 'name' => 'replacement_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'replacement_key', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'replacement_content', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'replacement_set_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'replacement_added_to', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'replacement_id' ) ), array( 'type' => 'key', 'name' => 'replacement_set_id', 'columns' => array( 'replacement_set_id' ) ), ) ) ); \IPS\Db::i()->dropTable( 'skin_templates' ); \IPS\Db::i()->createTable( array( 'name' => 'skin_templates', 'columns' => array( array( 'name' => 'template_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'template_set_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'template_group', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'template_content', 'type' => 'mediumtext', 'allow_null' => false ), array( 'name' => 'template_name', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'template_data', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'template_updated', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'template_removable', 'type' => 'int', 'length' => 4, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'template_added_to', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'template_user_added', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'template_user_edited', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'template_id' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'skin_collections', 'columns' => array( array( 'name' => 'set_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'set_name', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'set_key', 'type' => 'varchar', 'length' => 100, 'allow_null' => false, 'default' => '' ), array( 'name' => 'set_parent_id', 'type' => 'int', 'length' => 5, 'allow_null' => false, 'default' => -1 ), array( 'name' => 'set_parent_array', 'type' => 'mediumtext', 'allow_null' => false ), array( 'name' => 'set_child_array', 'type' => 'mediumtext', 'allow_null' => false ), array( 'name' => 'set_permissions', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'set_is_default', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'set_author_name', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'set_author_url', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'set_image_dir', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'set_emo_dir', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'set_css_inline', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'set_css_groups', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'set_added', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'set_updated', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'set_output_format', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => 'html' ), array( 'name' => 'set_locked_uagent', 'type' => 'mediumtext', 'allow_null' => false ), array( 'name' => 'set_hide_from_list', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'set_id' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'skin_css', 'columns' => array( array( 'name' => 'css_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'css_set_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'css_updated', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'css_group', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '0' ), array( 'name' => 'css_content', 'type' => 'mediumtext', 'allow_null' => false ), array( 'name' => 'css_position', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'css_added_to', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'css_app', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '0' ), array( 'name' => 'css_app_hide', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'css_attributes', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'css_removed', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'css_id' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'skin_cache', 'columns' => array( array( 'name' => 'cache_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'cache_updated', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'cache_type', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'cache_set_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'cache_key_1', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'cache_value_1', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'cache_key_2', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'cache_value_2', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'cache_key_3', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'cache_value_3', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'cache_key_4', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'cache_value_4', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'cache_key_5', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'cache_value_5', 'type' => 'varchar', 'length' => 200, 'allow_null' => false, 'default' => '' ), array( 'name' => 'cache_content', 'type' => 'mediumtext', 'allow_null' => false ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'cache_id' ) ), array( 'type' => 'key', 'name' => 'cache_type', 'columns' => array( 'cache_type' ) ), array( 'type' => 'key', 'name' => 'cache_set_id', 'columns' => array( 'cache_set_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'bbcode_mediatag', 'columns' => array( array( 'name' => 'mediatag_id', 'type' => 'smallint', 'length' => 10, 'unsigned' => true, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'mediatag_name', 'type' => 'varchar', 'length' => 255, 'allow_null' => false ), array( 'name' => 'mediatag_match', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'mediatag_replace', 'type' => 'text', 'allow_null' => false ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'mediatag_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'ignored_users', 'columns' => array( array( 'name' => 'ignore_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'ignore_owner_id', 'type' => 'int', 'length' => 8, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'ignore_ignore_id', 'type' => 'int', 'length' => 8, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'ignore_messages', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'ignore_topics', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'ignore_id' ) ), array( 'type' => 'key', 'name' => 'ignore_owner_id', 'columns' => array( 'ignore_owner_id' ) ), array( 'type' => 'key', 'name' => 'ignore_ignore_id', 'columns' => array( 'ignore_ignore_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'captcha', 'columns' => array( array( 'name' => 'captcha_unique_id', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => '' ), array( 'name' => 'captcha_string', 'type' => 'varchar', 'length' => 100, 'allow_null' => false, 'default' => '' ), array( 'name' => 'captcha_ipaddress', 'type' => 'varchar', 'length' => 16, 'allow_null' => false, 'default' => '' ), array( 'name' => 'captcha_date', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'captcha_unique_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'permission_index', 'columns' => array( array( 'name' => 'perm_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'unsigned' => true, 'auto_increment' => true ), array( 'name' => 'app', 'type' => 'varchar', 'length' => 32, 'allow_null' => false ), array( 'name' => 'perm_type', 'type' => 'varchar', 'length' => 32, 'allow_null' => false ), array( 'name' => 'perm_type_id', 'type' => 'int', 'unsigned' => true, 'length' => 10, 'allow_null' => false ), array( 'name' => 'perm_view', 'type' => 'text', 'allow_null' => false, ), array( 'name' => 'perm_2', 'type' => 'text', 'allow_null' => false, ), array( 'name' => 'perm_3', 'type' => 'text', 'allow_null' => false, ), array( 'name' => 'perm_4', 'type' => 'text', 'allow_null' => false, ), array( 'name' => 'perm_5', 'type' => 'text', 'allow_null' => false, ), array( 'name' => 'perm_6', 'type' => 'text', 'allow_null' => false, ), array( 'name' => 'perm_7', 'type' => 'text', 'allow_null' => false, ), array( 'name' => 'owner_only', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'friend_only', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'authorized_users', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'perm_id' ) ), array( 'type' => 'key', 'name' => 'perm_index', 'columns' => array( 'perm_type', 'perm_type_id' ) ), array( 'type' => 'key', 'name' => 'perm_type', 'columns' => array( 'app', 'perm_type', 'perm_type_id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'openid_temp', 'columns' => array( array( 'name' => 'id', 'type' => 'varchar', 'length' => 32, 'allow_null' => false ), array( 'name' => 'referrer', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'privacy', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'cookiedate', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'fullurl', 'type' => 'text', 'allow_null' => false ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'id' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_applications', 'columns' => array( array( 'name' => 'app_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'app_title', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'app_public_title', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'app_description', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'app_author', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'app_version', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'app_long_version', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 10000 ), array( 'name' => 'app_directory', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ), array( 'name' => 'app_added', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'app_position', 'type' => 'int', 'length' => 2, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'app_protected', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'app_enabled', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'app_location', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => '' ), array( 'name' => 'app_hide_tab', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'app_tab_groups', 'type' => 'text', 'allow_null' => true, 'default' => null ), array( 'name' => 'app_website', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ), array( 'name' => 'app_update_check', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ), array( 'name' => 'app_global_caches', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'app_id' ) ) ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_sys_module', 'columns' => array( array( 'name' => 'sys_module_id', 'type' => 'mediumint', 'length' => 4, 'unsigned' => true, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'sys_module_title', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => '' ), array( 'name' => 'sys_module_application', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => '' ), array( 'name' => 'sys_module_key', 'type' => 'varchar', 'length' => 32, 'allow_null' => false, 'default' => '' ), array( 'name' => 'sys_module_description', 'type' => 'varchar', 'length' => 100, 'allow_null' => false, 'default' => '' ), array( 'name' => 'sys_module_version', 'type' => 'varchar', 'length' => 10, 'allow_null' => false, 'default' => '' ), array( 'name' => 'sys_module_protected', 'type' => 'tinyint', 'length' => 1, 'unsigned' => true, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'sys_module_visible', 'type' => 'tinyint', 'length' => 1, 'unsigned' => true, 'allow_null' => false, 'default' => 1 ), array( 'name' => 'sys_module_position', 'type' => 'int', 'length' => 5, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'sys_module_admin', 'type' => 'int', 'length' => 1, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'sys_module_id' ) ), array( 'type' => 'key', 'name' => 'sys_module_application', 'columns' => array( 'sys_module_application' ) ), array( 'type' => 'key', 'name' => 'sys_module_visible', 'columns' => array( 'sys_module_visible' ) ), array( 'type' => 'key', 'name' => 'sys_module_key', 'columns' => array( 'sys_module_key' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_sys_lang', 'columns' => array( array( 'name' => 'lang_id', 'type' => 'mediumint', 'length' => 4, 'unsigned' => true, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'lang_short', 'type' => 'varchar', 'length' => 10, 'allow_null' => false, 'default' => '' ), array( 'name' => 'lang_title', 'type' => 'varchar', 'length' => 60, 'allow_null' => false, 'default' => '' ), array( 'name' => 'lang_currency_name', 'type' => 'varchar', 'length' => 4, 'allow_null' => false, 'default' => '' ), array( 'name' => 'lang_currency_symbol', 'type' => 'char', 'length' => 2, 'allow_null' => false, 'default' => '' ), array( 'name' => 'lang_decimal', 'type' => 'char', 'length' => 2, 'allow_null' => false, 'default' => '' ), array( 'name' => 'lang_comma', 'type' => 'char', 'length' => 2, 'allow_null' => false, 'default' => '' ), array( 'name' => 'lang_default', 'type' => 'tinyint', 'length' => 1, 'unsigned' => true, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'lang_isrtl', 'type' => 'tinyint', 'length' => 1, 'unsigned' => true, 'allow_null' => false, 'default' => 0 ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'lang_id' ) ), array( 'type' => 'key', 'name' => 'lang_short', 'columns' => array( 'lang_short' ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_sys_lang_words', 'columns' => array( array( 'name' => 'word_id', 'type' => 'int', 'length' => 10, 'unsigned' => true, 'allow_null' => false, 'auto_increment' => true ), array( 'name' => 'lang_id', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'unsigned' => true, ), array( 'name' => 'word_app', 'type' => 'varchar', 'length' => 255, 'allow_null' => false ), array( 'name' => 'word_pack', 'type' => 'varchar', 'length' => 255, 'allow_null' => false ), array( 'name' => 'word_key', 'type' => 'varchar', 'length' => 64, 'allow_null' => false ), array( 'name' => 'word_default', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'word_custom', 'type' => 'text', 'allow_null' => false ), array( 'name' => 'word_default_version', 'type' => 'varchar', 'length' => 10, 'allow_null' => false, 'default' => '1' ), array( 'name' => 'word_custom_version', 'type' => 'varchar', 'length' => 10, 'allow_null' => true, 'default' => null ), array( 'name' => 'word_js', 'type' => 'tinyint', 'length' => 1, 'unsigned' => true, 'allow_null' => false ) ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'word_id' ) ), array( 'type' => 'key', 'name' => 'word_js', 'columns' => array( 'word_js' ) ), array( 'type' => 'key', 'name' => 'word_find', 'columns' => array( 1=> 'lang_id', 2 => 'word_app', 3 => 'word_pack' ), 'length' => array( 1 => null, 2 => 32, 3 => 100 ) ), ) ) ); \IPS\Db::i()->createTable( array( 'name' => 'core_sys_login', 'columns' => array( array( 'name' => 'sys_login_id', 'type' => 'int', 'length' => 8, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'sys_login_skin', 'type' => 'int', 'length' => 5, 'allow_null' => true, 'default' => null ), array( 'name' => 'sys_login_language', 'type' => 'varchar', 'length' => 32, 'allow_null' => true, 'default' => null ), array( 'name' => 'sys_login_last_visit', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ), array( 'name' => 'sys_cookie', 'type' => 'mediumtext', 'allow_null' => false, ), ), 'indexes' => array( array( 'type' => 'primary', 'columns' => array( 'sys_login_id' ) ), ) ) ); /* @note Previously the upgrader would add fulltext indexes here if appropriate, however we'll just tackle that in the 4.0 upgrade routine now */ /* Finish */ return TRUE; } /** * 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 step2() { \IPS\Db::i()->delete( "members", "id=0" ); /* Groups */ \IPS\Db::i()->update( 'groups', "g_icon=REPLACE(g_icon,'style_images/<#IMG_DIR#>/folder_team_icons/admin.gif','public/style_extra/team_icons/admin.png')" ); \IPS\Db::i()->update( 'groups', "g_icon=REPLACE(g_icon,'style_images/<#IMG_DIR#>/folder_team_icons/','public/style_extra/team_icons/')" ); \IPS\Db::i()->addColumn( 'bbcode_mediatag', array( 'name' => 'mediatag_position', 'type' => 'smallint', 'length' => 3, 'allow_null' => false, 'default' => 0 ) ); \IPS\Db::i()->addColumn( 'custom_bbcode', array( 'name' => 'bbcode_custom_regex', 'type' => 'text', 'allow_null' => true, 'default' => null ) ); return TRUE; } /** * Step 3 * * @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() { $toRun = \IPS\core\Setup\Upgrade::runManualQueries( array( array( 'table' => 'members', 'query' => "ALTER TABLE " . \IPS\Db::i()->prefix . "members CHANGE COLUMN id member_id MEDIUMINT(8) NOT NULL AUTO_INCREMENT, CHANGE COLUMN mgroup member_group_id SMALLINT(3) NOT NULL DEFAULT 0, ADD COLUMN members_pass_hash VARCHAR(32) NOT NULL DEFAULT '', ADD COLUMN members_pass_salt VARCHAR(5) NOT NULL DEFAULT '', ADD COLUMN member_banned TINYINT(1) NOT NULL DEFAULT 0, ADD INDEX member_banned (member_banned), ADD COLUMN identity_url TEXT NULL DEFAULT NULL;" ), array( 'table' => 'members', 'query' => "UPDATE " . \IPS\Db::i()->prefix . "members SET new_msg=0 WHERE new_msg IS NULL;" ), array( 'table' => 'members', 'query' => "UPDATE " . \IPS\Db::i()->prefix . "members SET msg_total=0 WHERE msg_total IS NULL;" ), array( 'table' => 'members', 'query' => "UPDATE " . \IPS\Db::i()->prefix . "members SET show_popup=0 WHERE show_popup IS NULL;" ), array( 'table' => 'members', 'query' => "ALTER TABLE " . \IPS\Db::i()->prefix . "members CHANGE COLUMN new_msg msg_count_new INT(2) NOT NULL DEFAULT 0, CHANGE COLUMN msg_total msg_count_total INT(3) NOT NULL DEFAULT 0, ADD COLUMN msg_count_reset INT(1) NOT NULL DEFAULT 0, CHANGE COLUMN show_popup msg_show_notification INT(1) NOT NULL DEFAULT 0, ADD COLUMN member_uploader VARCHAR(32) NOT NULL DEFAULT 'default', DROP COLUMN members_markers, ADD COLUMN members_seo_name VARCHAR(255) NOT NULL DEFAULT '', ADD COLUMN members_bitoptions INT(10) UNSIGNED NOT NULL DEFAULT 0, ADD COLUMN fb_uid INT(10) UNSIGNED NOT NULL DEFAULT 0, ADD COLUMN fb_emailhash VARCHAR(60) NOT NULL DEFAULT '', ADD COLUMN fb_emailallow INT(1) NOT NULL DEFAULT 0, ADD COLUMN fb_lastsync INT(10) NOT NULL DEFAULT 0;" ), array( 'table' => 'profile_portal', 'query' => "ALTER TABLE " . \IPS\Db::i()->prefix . "profile_portal ADD COLUMN notes TEXT NULL DEFAULT NULL, ADD COLUMN links TEXT NULL DEFAULT NULL, ADD COLUMN bio TEXT NULL DEFAULT NULL, ADD COLUMN ta_size VARCHAR(3) NULL DEFAULT NULL, ADD COLUMN signature TEXT NULL DEFAULT NULL, ADD COLUMN avatar_location VARCHAR(255) NULL DEFAULT NULL, ADD COLUMN avatar_size VARCHAR(9) NOT NULL DEFAULT '0', ADD COLUMN avatar_type VARCHAR(15) NULL DEFAULT NULL, ADD COLUMN pconversation_filters TEXT NULL DEFAULT NULL, ADD COLUMN fb_photo TEXT NULL DEFAULT NULL, ADD COLUMN fb_photo_thumb TEXT NULL DEFAULT NULL, ADD COLUMN fb_bwoptions INT(1) UNSIGNED NOT NULL DEFAULT 0, ADD COLUMN pp_reputation_points INT(10) NOT NULL DEFAULT 0, ADD COLUMN pp_status TEXT NULL DEFAULT NULL, ADD COLUMN pp_status_update VARCHAR(13) NOT NULL DEFAULT '0';" ) ) ); if ( count( $toRun ) ) { \IPS\core\Setup\Upgrade::adjustMultipleRedirect( array( 1 => 'core', 'extra' => array( '_upgradeStep' => 4 ) ) ); /* Queries to run manually */ return array( 'html' => \IPS\Theme::i()->getTemplate( 'forms' )->queries( $toRun, \IPS\Http\Url::internal( 'controller=upgrade' )->setQueryString( array( 'key' => $_SESSION['uniqueKey'], 'mr_continue' => 1, 'mr' => \IPS\Request::i()->mr ) ) ) ); } return TRUE; } /** * Step 4 * * @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() { \IPS\Db::i()->update( 'forums', array( 'skin_id' => 0 ) ); $toRun = \IPS\core\Setup\Upgrade::runManualQueries( array( array( 'table' => 'topics', 'query' => "ALTER TABLE " . \IPS\Db::i()->prefix . "topics CHANGE COLUMN id member_id MEDIUMINT(8) NOT NULL AUTO_INCREMENT, ADD COLUMN seo_last_name VARCHAR(255) NOT NULL DEFAULT '', ADD COLUMN seo_first_name VARCHAR(255) NOT NULL DEFAULT '';" ), array( 'table' => 'members', 'query' => "ALTER TABLE " . \IPS\Db::i()->prefix . "members CHANGE COLUMN description description VARCHAR(250) NULL DEFAULT NULL;" ), array( 'table' => 'voters', 'query' => "ALTER TABLE " . \IPS\Db::i()->prefix . "voters CHANGE COLUMN member_id member_id INT(10) NOT NULL DEFAULT 0, ADD COLUMN member_choices TEXT NULL DEFAULT NULL;" ), array( 'table' => 'polls', 'query' => "ALTER TABLE " . \IPS\Db::i()->prefix . "polls ADD COLUMN poll_view_voters INT(1) NOT NULL DEFAULT 0;" ), array( 'table' => 'tracker', 'query' => "ALTER TABLE " . \IPS\Db::i()->prefix . "tracker ADD INDEX tm_id (topic_id, member_id);" ), array( 'table' => 'forum_tracker', 'query' => "ALTER TABLE " . \IPS\Db::i()->prefix . "forum_tracker ADD INDEX fm_id (member_id, forum_id);" ) ) ); if ( count( $toRun ) ) { \IPS\core\Setup\Upgrade::adjustMultipleRedirect( array( 1 => 'core', 'extra' => array( '_upgradeStep' => 5 ) ) ); /* Queries to run manually */ return array( 'html' => \IPS\Theme::i()->getTemplate( 'forms' )->queries( $toRun, \IPS\Http\Url::internal( 'controller=upgrade' )->setQueryString( array( 'key' => $_SESSION['uniqueKey'], 'mr_continue' => 1, 'mr' => \IPS\Request::i()->mr ) ) ) ); } return TRUE; } /** * Step 5 * * @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() { \IPS\Db::i()->dropColumn( 'admin_logs', array( 'act', 'code' ) ); \IPS\Db::i()->addColumn( 'admin_logs', array( 'name' => 'appcomponent', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ) ); \IPS\Db::i()->addColumn( 'admin_logs', array( 'name' => 'module', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ) ); \IPS\Db::i()->addColumn( 'admin_logs', array( 'name' => 'section', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ) ); \IPS\Db::i()->addColumn( 'admin_logs', array( 'name' => 'do', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ) ); \IPS\Db::i()->addIndex( 'task_logs', array( 'type' => 'key', 'name' => 'log_date', 'columns' => array( 'log_date' ) ) ); \IPS\Db::i()->addIndex( 'admin_logs', array( 'type' => 'key', 'name' => 'ctime', 'columns' => array( 'ctime' ) ) ); \IPS\Db::i()->addIndex( 'moderator_logs', array( 'type' => 'key', 'name' => 'ctime', 'columns' => array( 'ctime' ) ) ); return TRUE; } /** * Step 6 * * @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 step6() { \IPS\Db::i()->addColumn( 'pfields_data', array( 'name' => 'pf_group_id', 'type' => 'mediumint', 'length' => 4, 'unsigned' => true, 'allow_null' => false, 'default' => 0 ) ); \IPS\Db::i()->addColumn( 'pfields_data', array( 'name' => 'pf_icon', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ) ); \IPS\Db::i()->addColumn( 'pfields_data', array( 'name' => 'pf_key', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ) ); \IPS\Db::i()->changeColumn( 'pfields_data', 'pf_input_format', array( 'name' => 'pf_input_format', 'type' => 'text', 'allow_null' => true, 'default' => null ) ); \IPS\Db::i()->dropIndex( 'moderators', 'forum_id' ); \IPS\Db::i()->changeColumn( 'moderators', 'forum_id', array( 'name' => 'forum_id', 'type' => 'text', 'allow_null' => true, 'default' => null ) ); \IPS\Db::i()->addColumn( 'moderators', array( 'name' => 'mod_bitoptions', 'type' => 'int', 'length' => 10, 'unsigned' => true, 'allow_null' => false, 'default' => 0 ) ); \IPS\Db::i()->addColumn( 'groups', array( 'name' => 'g_rep_max_positive', 'type' => 'mediumint', 'length' => 8, 'unsigned' => true, 'allow_null' => false, 'default' => 0 ) ); \IPS\Db::i()->addColumn( 'groups', array( 'name' => 'g_rep_max_negative', 'type' => 'mediumint', 'length' => 8, 'unsigned' => true, 'allow_null' => false, 'default' => 0 ) ); \IPS\Db::i()->addColumn( 'groups', array( 'name' => 'g_mod_preview', 'type' => 'tinyint', 'length' => 1, 'unsigned' => true, 'allow_null' => false, 'default' => 0 ) ); \IPS\Db::i()->addColumn( 'groups', array( 'name' => 'g_signature_limits', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ) ); \IPS\Db::i()->addColumn( 'groups', array( 'name' => 'g_can_add_friends', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 1 ) ); \IPS\Db::i()->addColumn( 'groups', array( 'name' => 'g_hide_online_list', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ) ); \IPS\Db::i()->addColumn( 'groups', array( 'name' => 'g_bitoptions', 'type' => 'int', 'length' => 10, 'unsigned' => true, 'allow_null' => false, 'default' => 0 ) ); \IPS\Db::i()->addColumn( 'groups', array( 'name' => 'g_pm_perday', 'type' => 'smallint', 'length' => 3, 'allow_null' => false, 'default' => 0 ) ); \IPS\Db::i()->changeColumn( 'forums', 'id', array( 'name' => 'id', 'type' => 'smallint', 'length' => 5, 'allow_null' => false, 'auto_increment' => true ) ); \IPS\Db::i()->addColumn( 'forums', array( 'name' => 'can_view_others', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 1 ) ); \IPS\Db::i()->addColumn( 'forums', array( 'name' => 'min_posts_post', 'type' => 'int', 'length' => 10, 'unsigned' => true, 'allow_null' => false ) ); \IPS\Db::i()->addColumn( 'forums', array( 'name' => 'min_posts_view', 'type' => 'int', 'length' => 10, 'unsigned' => true, 'allow_null' => false ) ); \IPS\Db::i()->addColumn( 'forums', array( 'name' => 'hide_last_info', 'type' => 'tinyint', 'length' => 1, 'allow_null' => false, 'default' => 0 ) ); \IPS\Db::i()->addColumn( 'forums', array( 'name' => 'name_seo', 'type' => 'varchar', 'length' => 255, 'allow_null' => true, 'default' => null ) ); \IPS\Db::i()->addColumn( 'forums', array( 'name' => 'seo_last_title', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ) ); \IPS\Db::i()->addColumn( 'forums', array( 'name' => 'seo_last_name', 'type' => 'varchar', 'length' => 255, 'allow_null' => false, 'default' => '' ) ); \IPS\Db::i()->addColumn( 'forums', array( 'name' => 'last_x_topic_ids', 'type' => 'text', 'allow_null' => true, 'default' => null ) ); \IPS\Db::i()->addColumn( 'forums', array( 'name' => 'forums_bitoptions', 'type' => 'int', 'length' => 10, 'unsigned' => true, 'allow_null' => false, 'default' => 0 ) ); \IPS\Db::i()->addColumn( 'cache_store', array( 'name' => 'cs_updated', 'type' => 'int', 'length' => 10, 'allow_null' => false, 'default' => 0 ) ); \IPS\Db::i()->addColumn( 'task_manager', array( 'name' => 'task_application', 'type' => 'varchar', 'length' => 100, 'allow_null' => false ) ); \IPS\Db::i()->changeColumn( 'task_manager', 'task_week_day', array( 'name' => 'task_week_day', 'type' => 'smallint', 'length' => 1, 'allow_null' => false, 'default' => -1 ) ); \IPS\Db::i()->addColumn( 'admin_permission_rows', array( 'name' => 'row_id_type', 'type' => 'varchar', 'length' => 13, 'allow_null' => false, 'default' => 'member' ) ); \IPS\Db::i()->changeColumn( 'admin_permission_rows', 'row_member_id', array( 'name' => 'row_id', 'type' => 'int', 'length' => 8, 'allow_null' => false ) ); \IPS\Db::i()->dropIndex( 'admin_permission_rows', 'PRIMARY KEY' ); \IPS\Db::i()->addIndex( 'admin_permission_rows', array( 'type' => 'primary', 'columns' => array( 'row_id', 'row_id_type' ) ) ); \IPS\Db::i()->addColumn( 'login_methods', array( 'name' => 'login_alt_acp_html', 'type' => 'text', 'allow_null' => true, 'default' => null ) ); \IPS\Db::i()->addColumn( 'login_methods', array( 'name' => 'login_order', 'type' => 'smallint', 'length' => 3, 'allow_null' => false, 'default' => 0 ) ); \IPS\Db::i()->dropColumn( 'login_methods', array( 'login_installed', 'login_type', 'login_allow_create' ) ); return TRUE; } /** * Step 7 * * @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 step7() { /* Root admin reset? */ require( \IPS\ROOT_PATH . '/conf_global.php' ); foreach( \IPS\Db::i()->select( '*', 'groups', 'g_id != ' . $INFO['admin_group'] . ' AND g_access_cp=1' ) as $row ) { /* Insert blank perm row */ \IPS\Db::i()->insert( 'admin_permission_rows', array( 'row_id' => $row['g_id'], 'row_id_type' => 'group', 'row_perm_cache' => serialize( array() ), 'row_updated' => time() ) ); } \IPS\Db::i()->insert( 'core_sys_lang', array( 'lang_id' => 1, 'lang_short' => 'en_US', 'lang_title' => 'English (USA)', 'lang_currency_name' => 'USD', 'lang_currency_symbol' => '$', 'lang_decimal' => '.', 'lang_comma' => ',', 'lang_default' => 1, 'lang_isrtl' => 0 ) ); \IPS\Db::i()->insert( 'pfields_groups', array( 'pf_group_id' => 1, 'pf_group_name' => 'Contact Methods', 'pf_group_key' => 'contact' ) ); \IPS\Db::i()->insert( 'pfields_groups', array( 'pf_group_id' => 1, 'pf_group_name' => 'Profile Information', 'pf_group_key' => 'profile_info' ) ); \IPS\Db::i()->insert( 'pfields_groups', array( 'pf_group_id' => 1, 'pf_group_name' => 'Previous Fields', 'pf_group_key' => 'previous' ) ); \IPS\Db::i()->insert( 'pfields_data', array( 'pf_title' => 'AIM', 'pf_type' => 'input', 'pf_not_null' => 0, 'pf_member_hide' => 0, 'pf_max_input' => 0, 'pf_member_edit' => 1, 'pf_position' => 0, 'pf_input_format' => 0, 'pf_group_id' => 1, 'pf_icon' => 'style_extra/cprofile_icons/profile_aim.gif', 'pf_key' => 'aim' ) ); \IPS\Db::i()->insert( 'pfields_data', array( 'pf_title' => 'MSN', 'pf_type' => 'input', 'pf_not_null' => 0, 'pf_member_hide' => 0, 'pf_max_input' => 0, 'pf_member_edit' => 1, 'pf_position' => 0, 'pf_input_format' => 0, 'pf_group_id' => 1, 'pf_icon' => 'style_extra/cprofile_icons/profile_msn.gif', 'pf_key' => 'msn' ) ); \IPS\Db::i()->insert( 'pfields_data', array( 'pf_title' => 'Website URL', 'pf_type' => 'input', 'pf_not_null' => 0, 'pf_member_hide' => 0, 'pf_max_input' => 0, 'pf_member_edit' => 1, 'pf_position' => 0, 'pf_input_format' => 0, 'pf_group_id' => 1, 'pf_icon' => 'style_extra/cprofile_icons/profile_website.gif', 'pf_key' => 'website' ) ); \IPS\Db::i()->insert( 'pfields_data', array( 'pf_title' => 'ICQ', 'pf_type' => 'input', 'pf_not_null' => 0, 'pf_member_hide' => 0, 'pf_max_input' => 0, 'pf_member_edit' => 1, 'pf_position' => 0, 'pf_input_format' => 0, 'pf_group_id' => 1, 'pf_icon' => 'style_extra/cprofile_icons/profile_icq.gif', 'pf_key' => 'icq' ) ); \IPS\Db::i()->insert( 'pfields_data', array( 'pf_title' => 'Gender', 'pf_content' => 'm=Male|f=Female|u=Not Telling', 'pf_type' => 'drop', 'pf_not_null' => 0, 'pf_member_hide' => 0, 'pf_max_input' => 0, 'pf_member_edit' => 1, 'pf_position' => 0, 'pf_input_format' => 0, 'pf_group_id' => 1, 'pf_key' => 'gender', 'pf_topic_format' => '
{title}:
{content}
' ) ); \IPS\Db::i()->insert( 'pfields_data', array( 'pf_title' => 'Location', 'pf_type' => 'input', 'pf_not_null' => 0, 'pf_member_hide' => 0, 'pf_max_input' => 0, 'pf_member_edit' => 1, 'pf_position' => 0, 'pf_input_format' => 0, 'pf_group_id' => 1, 'pf_key' => 'location', 'pf_topic_format' => '
{title}:
{content}
' ) ); \IPS\Db::i()->insert( 'pfields_data', array( 'pf_title' => 'Interests', 'pf_type' => 'textarea', 'pf_not_null' => 0, 'pf_member_hide' => 0, 'pf_max_input' => 0, 'pf_member_edit' => 1, 'pf_position' => 0, 'pf_input_format' => 0, 'pf_group_id' => 1, 'pf_key' => 'interests', 'pf_topic_format' => '
{title}:
{content}
' ) ); \IPS\Db::i()->insert( 'pfields_data', array( 'pf_title' => 'Yahoo', 'pf_type' => 'input', 'pf_not_null' => 0, 'pf_member_hide' => 0, 'pf_max_input' => 0, 'pf_member_edit' => 1, 'pf_position' => 0, 'pf_input_format' => 0, 'pf_group_id' => 1, 'pf_icon' => 'style_extra/cprofile_icons/profile_yahoo.gif', 'pf_key' => 'yahoo' ) ); \IPS\Db::i()->insert( 'pfields_data', array( 'pf_title' => 'Jabber', 'pf_type' => 'input', 'pf_not_null' => 0, 'pf_member_hide' => 0, 'pf_max_input' => 0, 'pf_member_edit' => 1, 'pf_position' => 0, 'pf_input_format' => 0, 'pf_group_id' => 1, 'pf_icon' => 'style_extra/cprofile_icons/profile_jabber.gif', 'pf_key' => 'jabber' ) ); \IPS\Db::i()->insert( 'pfields_data', array( 'pf_title' => 'Skype', 'pf_type' => 'input', 'pf_not_null' => 0, 'pf_member_hide' => 0, 'pf_max_input' => 0, 'pf_member_edit' => 1, 'pf_position' => 0, 'pf_input_format' => 0, 'pf_group_id' => 1, 'pf_icon' => 'style_extra/cprofile_icons/profile_skype.gif', 'pf_key' => 'skype' ) ); \IPS\Db::i()->update( 'attachments_type', "atype_img=replace(atype_img,'folder_mime_types','style_extra/mime_types')" ); \IPS\Db::i()->update( 'login_methods', array( 'login_alt_acp_html' => " " ), array( 'login_folder_name=?', 'openid' ) ); \IPS\Db::i()->update( 'login_methods', array( 'login_enabled' => 1, 'login_order' => 7 ), array( 'login_folder_name=?', 'internal' ) ); \IPS\Db::i()->delete( 'skin_url_mapping' ); \IPS\Db::i()->delete( 'task_manager' ); \IPS\Db::i()->delete( 'cache_store', "cs_key='skin_id_cache'" ); \IPS\Db::i()->delete( 'cache_store', "cs_key='forum_cache'" ); \IPS\Db::i()->insert( 'reputation_levels', array( 'level_id' => 1, 'level_points' => '-20', 'level_title' => 'Bad' ) ); \IPS\Db::i()->insert( 'reputation_levels', array( 'level_id' => 2, 'level_points' => '-10', 'level_title' => 'Poor' ) ); \IPS\Db::i()->insert( 'reputation_levels', array( 'level_id' => 3, 'level_points' => '0', 'level_title' => 'Neutral' ) ); \IPS\Db::i()->insert( 'reputation_levels', array( 'level_id' => 4, 'level_points' => '10', 'level_title' => 'Good' ) ); \IPS\Db::i()->insert( 'reputation_levels', array( 'level_id' => 5, 'level_points' => '20', 'level_title' => 'Excellent' ) ); return TRUE; } /** * Step 8 * * @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 step8() { if( !\IPS\Db::i()->select( 'count(*)', 'profile_portal' )->first() ) { $queryType = 1; } else { $queryType = 2; } $toRun = \IPS\core\Setup\Upgrade::runManualQueries( array( array( 'table' => 'members', 'query' => "UPDATE " . \IPS\Db::i()->prefix . "members m, " . \IPS\Db::i()->prefix . "members_converge c SET m.members_pass_hash=c.converge_pass_hash WHERE c.converge_id=m.member_id;" ), array( 'table' => 'members', 'query' => "UPDATE " . \IPS\Db::i()->prefix . "members m, " . \IPS\Db::i()->prefix . "members_converge c SET m.members_pass_salt=c.converge_pass_salt WHERE c.converge_id=m.member_id;" ), array( 'table' => 'members', 'query' => "UPDATE " . \IPS\Db::i()->prefix . "members SET email=CONCAT( member_id, '-', UNIX_TIMESTAMP(), '@fakeemail.com' ) WHERE email='';" ), array( 'table' => 'profile_portal', 'query' => $queryType == 1 ? "INSERT INTO " . \IPS\Db::i()->prefix . "profile_portal (pp_member_id,notes,links,bio,ta_size,signature,avatar_location,avatar_size,avatar_type) SELECT id,notes,links,bio,ta_size,signature,avatar_location,avatar_size,avatar_type FROM " . \IPS\Db::i()->prefix . "member_extra;" : "UPDATE " . \IPS\Db::i()->prefix . "profile_portal p, " . \IPS\Db::i()->prefix . "member_extra e SET p.notes=e.notes, p.links=e.links, p.bio=e.bio, p.ta_size=e.ta_size, p.signature=e.signature, p.avatar_location=e.avatar_location, p.avatar_size=e.avatar_size, p.avatar_type=e.avatar_type WHERE p.pp_member_id=e.id;" ), array( 'table' => 'profile_portal', 'query' => "UPDATE " . \IPS\Db::i()->prefix . "profile_portal SET pp_setting_count_friends=5 WHERE pp_setting_count_friends=0;" ), array( 'table' => 'profile_portal', 'query' => "UPDATE " . \IPS\Db::i()->prefix . "profile_portal SET pp_setting_count_comments=10 WHERE pp_setting_count_comments=0;" ), array( 'table' => 'profile_portal', 'query' => "UPDATE " . \IPS\Db::i()->prefix . "profile_portal SET pp_setting_count_visitors=5 WHERE pp_setting_count_visitors=0;" ) ) ); if ( count( $toRun ) ) { \IPS\core\Setup\Upgrade::adjustMultipleRedirect( array( 1 => 'core', 'extra' => array( '_upgradeStep' => 9 ) ) ); /* Queries to run manually */ return array( 'html' => \IPS\Theme::i()->getTemplate( 'forms' )->queries( $toRun, \IPS\Http\Url::internal( 'controller=upgrade' )->setQueryString( array( 'key' => $_SESSION['uniqueKey'], 'mr_continue' => 1, 'mr' => \IPS\Request::i()->mr ) ) ) ); } return TRUE; } /** * Step 9 * * @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 step9() { $apps = array(); foreach( new \DirectoryIterator( \IPS\ROOT_PATH . '/applications' ) as $location ) { if( $location->isDir() AND !$location->isDot() ) { $information = $location->getPathname() . '/data/application.json'; if( file_exists( $information ) ) { $information = json_decode( file_get_contents( $information ), TRUE ); $apps[ $location->getFilename() ] = $information; } } } foreach( \IPS\Db::i()->select( '*', 'components' ) as $component ) { switch( $component['com_section'] ) { case 'gallery': if( \IPS\Db::i()->checkForTable( 'gallery_upgrade_history' ) ) { $version = \IPS\Db::i()->select( '*', 'gallery_upgrade_history', NULL, 'gallery_version_id DESC', array( 0, 1 ) )->first(); $apps['gallery']['_currentLong'] = $version['gallery_version_id']; $apps['gallery']['_currentHuman'] = $version['gallery_version_human']; } break; case 'blog': if( \IPS\Db::i()->checkForTable( 'blog_upgrade_history' ) ) { $version = \IPS\Db::i()->select( '*', 'blog_upgrade_history', NULL, 'blog_version_id DESC', array( 0, 1 ) )->first(); $apps['blog']['_currentLong'] = $version['blog_version_id']; $apps['blog']['_currentHuman'] = $version['blog_version_human']; } break; case 'downloads': if( \IPS\Db::i()->checkForTable( 'downloads_upgrade_history' ) ) { $version = \IPS\Db::i()->select( '*', 'downloads_upgrade_history', NULL, 'idm_version_id DESC', array( 0, 1 ) )->first(); $apps['downloads']['_currentLong'] = $version['idm_version_id']; $apps['downloads']['_currentHuman'] = $version['idm_version_human']; } break; } } $apps['forums']['_currentLong'] = '30001'; $apps['forums']['_currentHuman'] = '3.0.0'; $apps['core']['_currentLong'] = '30001'; $apps['core']['_currentHuman'] = '3.0.0'; $apps['members']['_currentLong'] = '30001'; $apps['members']['_currentHuman'] = '3.0.0'; $apps['portal']['_currentLong'] = '30003'; $apps['portal']['_currentHuman'] = '3.0.0'; /* If we are upgrading from 2.3 and did not upload the calendar files, we still need to insert the applications table entry, otherwise you won't be able to upgrade down the road. We will insert it as disabled, however, as calendar won't function since files are not available */ if( !isset($apps['calendar']['name']) ) { $apps['calendar'] = array( 'application_title' => 'Calendar', 'app_author' => "Invision Power Services, Inc.", 'app_directory' => 'calendar', ); } $apps['calendar']['_currentLong'] = '30003'; $apps['calendar']['_currentHuman'] = '3.0.0'; /* Now install them.. */ $num = 0; foreach( $apps as $dir => $appData ) { //----------------------------------------- // Had Gallery (e.g.) but didn't upload updated files //----------------------------------------- if( !$appData['name'] OR !$appData['_currentLong'] ) { continue; } $num++; $_protected = ( in_array( $dir, array( 'core', 'forums', 'members' ) ) ) ? 1 : 0; \IPS\Db::i()->insert( 'core_applications', array( 'app_title' => $appData['application_title'], 'app_public_title' => $appData['application_title'], 'app_author' => $appData['app_author'], 'app_version' => $appData['_currentHuman'], 'app_long_version' => $appData['_currentLong'], 'app_directory' => $appData['app_directory'], 'app_added' => time(), 'app_position' => $num, 'app_protected' => $_protected, 'app_location' => 'ips', 'app_enabled' => 1, 'app_website' => $appData['app_website'] ) ); } return TRUE; } /** * Step 10 * * @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 step10() { $fields = array(); /* First off, move all current profile fields to group ID 3 */ \IPS\Db::i()->update( 'pfields_data', array( 'pf_group_id' => 3 ), 'pf_group_id=0' ); /* Grab all custom fields */ foreach( \IPS\Db::i()->select( '*', 'pfields_data' ) as $field ) { $fields[ $field['pf_id'] ] = $field; } foreach( $fields as $id => $data ) { /* Now add any missing content fields */ if ( !\IPS\Db::i()->checkForColumn( 'pfields_content', "field_{$id}" ) ) { \IPS\Db::i()->addColumn( 'pfields_content', array( 'name' => "field_{$id}", 'type' => 'text', 'allow_null' => true, 'default' => null ) ); } } /* Now make add a key */ foreach( \IPS\Db::i()->select( '*', 'pfields_data', 'pf_group_id=3' ) as $row ) { /* Attempt basic conversion of data */ if ( $row['pf_topic_format'] ) { if ( $row['pf_topic_format'] == '{title}: {content}
' ) { $row['pf_topic_format'] = '{title}:{content}'; } else if ( $row['pf_topic_format'] == '{title}: {key}
' ) { $row['pf_topic_format'] = '{title}:{key}'; } } /* 2.3.x used 'text', 3.0.0 uses 'input'... */ $row['pf_type'] = ( $row['pf_type'] == 'text' ) ? 'input' : $row['pf_type']; \IPS\Db::i()->update( 'pfields_data', array( 'pf_type' => $row['pf_type'], 'pf_topic_format' => $row['pf_topic_format'], 'pf_key' => md5( $row['pf_title'] ) ), 'pf_id=' . $row['pf_id'] ); } /* Now, move profile data into the correct fields */ foreach( array( 'aim_name' => 'aim', 'icq_number' => 'icq', 'website' => 'website', 'yahoo' => 'yahoo', 'interests' => 'interests', 'msnname' => 'msn', 'location' => 'location' ) as $old => $new ) { $field = \IPS\Db::i()->select( '*', 'pfields_data', array( 'pf_key=?', $new ) )->first(); if( empty( $field ) ) { continue; } \IPS\Db::i()->query( "UPDATE " . \IPS\Db::i()->prefix . "pfields_content p, " . \IPS\Db::i()->prefix . "member_extra m SET p.field_{$field['pf_id']}=m.{$old} WHERE p.member_id=m.id" ); } /* Update gender */ $gender = \IPS\Db::i()->select( '*', 'pfields_data', array( 'pf_key=?', 'gender' ) )->first(); if ( $gender['pf_id'] ) { \IPS\Db::i()->query( "UPDATE " . \IPS\Db::i()->prefix . "profile_portal pp, " . \IPS\Db::i()->prefix . "pfields_content pfc SET pfc.field_{$gender['pf_id']}='f' WHERE pp.pp_gender='female' AND pp.pp_member_id=pfc.member_id" ); \IPS\Db::i()->query( "UPDATE " . \IPS\Db::i()->prefix . "profile_portal pp, " . \IPS\Db::i()->prefix . "pfields_content pfc SET pfc.field_{$gender['pf_id']}='m' WHERE pp.pp_gender='male' AND pp.pp_member_id=pfc.member_id" ); } return TRUE; } /** * Step 11 * * @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 step11() { /* And now calendars */ foreach( \IPS\Db::i()->select( '*', 'cal_calendars' ) as $row ) { if ( strstr( $row['cal_permissions'], 'a:' ) ) { $_perms = unserialize( stripslashes( $row['cal_permissions'] ) ); if ( is_array( $_perms ) ) { $_view = ( $_perms['perm_read'] ) ? ',' . implode( ',', explode( ',', $_perms['perm_read'] ) ) . ',' : ''; $_start = ( $_perms['perm_post'] ) ? ',' . implode( ',', explode( ',', $_perms['perm_post'] ) ) . ',' : ''; $_nomod = ( $_perms['perm_nomod'] ) ? ',' . implode( ',', explode( ',', $_perms['perm_nomod'] ) ). ',' : ''; \IPS\Db::i()->insert( 'permission_index', array( 'app' => 'calendar', 'perm_type' => 'calendar', 'perm_type_id' => $row['cal_id'], 'perm_view' => str_replace( ',*,', '*', $_view ), 'perm_2' => str_replace( ',*,', '*', $_start ), 'perm_3' => str_replace( ',*,', '*', $_nomod ), 'perm_4' => '', 'perm_5' => '', 'perm_6' => '', 'perm_7' => '' ) ); } else { \IPS\Db::i()->insert( 'permission_index', array( 'app' => 'calendar', 'perm_type' => 'calendar', 'perm_type_id' => $row['cal_id'], 'perm_view' => '', 'perm_2' => '', 'perm_3' => '', 'perm_4' => '', 'perm_5' => '', 'perm_6' => '', 'perm_7' => '' ) ); } } else { \IPS\Db::i()->insert( 'permission_index', array( 'app' => 'calendar', 'perm_type' => 'calendar', 'perm_type_id' => $row['cal_id'], 'perm_view' => '', 'perm_2' => '', 'perm_3' => '', 'perm_4' => '', 'perm_5' => '', 'perm_6' => '', 'perm_7' => '' ) ); } } /* And now forums */ foreach( \IPS\Db::i()->select( '*', 'forums' ) as $row ) { /* Do we need to tidy up the title? */ if ( strstr( $row['name'], '&' ) ) { $row['name'] = preg_replace( "#& #", "& ", $row['name'] ); \IPS\Db::i()->update( 'forums', array( 'name' => $row['name'] ), 'id=' . $row['id'] ); } if ( strstr( $row['permission_array'], 'a:' ) ) { $_perms = unserialize( stripslashes( $row['permission_array'] ) ); if ( is_array( $_perms ) ) { $_view = ( $_perms['show_perms'] ) ? ',' . implode( ',', explode( ',', $_perms['show_perms'] ) ) . ',' : ''; $_read = ( $_perms['read_perms'] ) ? ',' . implode( ',', explode( ',', $_perms['read_perms'] ) ) . ',' : ''; $_reply = ( $_perms['reply_perms'] ) ? ',' . implode( ',', explode( ',', $_perms['reply_perms'] ) ) . ',' : ''; $_start = ( $_perms['start_perms'] ) ? ',' . implode( ',', explode( ',', $_perms['start_perms'] ) ) . ',' : ''; $_upload = ( $_perms['upload_perms'] ) ? ',' . implode( ',', explode( ',', $_perms['upload_perms'] ) ) . ',' : ''; $_download = ( $_perms['download_perms'] ) ? ',' . implode( ',', explode( ',', $_perms['download_perms'] ) ) . ',' : ''; \IPS\Db::i()->insert( 'permission_index', array( 'app' => 'forums', 'perm_type' => 'forum', 'perm_type_id' => $row['id'], 'perm_view' => str_replace( ',*,', '*', $_view ), 'perm_2' => str_replace( ',*,', '*', $_read ), 'perm_3' => str_replace( ',*,', '*', $_reply ), 'perm_4' => str_replace( ',*,', '*', $_start ), 'perm_5' => str_replace( ',*,', '*', $_upload ), 'perm_6' => str_replace( ',*,', '*', $_download ), 'perm_7' => '' ) ); } else { \IPS\Db::i()->insert( 'permission_index', array( 'app' => 'forums', 'perm_type' => 'forum', 'perm_type_id' => $row['id'], 'perm_view' => '', 'perm_2' => '', 'perm_3' => '', 'perm_4' => '', 'perm_5' => '', 'perm_6' => '', 'perm_7' => '' ) ); } } else { \IPS\Db::i()->insert( 'permission_index', array( 'app' => 'forums', 'perm_type' => 'forum', 'perm_type_id' => $row['id'], 'perm_view' => '', 'perm_2' => '', 'perm_3' => '', 'perm_4' => '', 'perm_5' => '', 'perm_6' => '', 'perm_7' => '' ) ); } } /* Fix up forum moderators */ foreach( \IPS\Db::i()->select( '*', 'moderators' ) as $r ) { \IPS\Db::i()->update( 'moderators', array( 'forum_id' => ',' . trim( $r['forum_id'], ',' ) . ',' ), 'mid=' . $r['mid'] ); } /* Report center reset */ $canReport = array(); $canView = array(); foreach( \IPS\Db::i()->select( 'g_id, g_view_board, g_access_cp, g_is_supmod', 'groups' ) as $r ) { if( $r['g_access_cp'] OR $r['g_is_supmod'] ) { $canView[] = $r['g_id']; } if( $r['g_view_board'] AND $r['g_id'] != $INFO['guest_group'] ) { $canReport[] = $r['g_id']; } } \IPS\Db::i()->update( 'rc_classes', array( 'group_can_report' => ',' . implode( ',', $canReport ) . ',', 'mod_group_perm' => ',' . implode( ',', $canView ) . ',' ) ); return TRUE; } /** * Step 12 * * @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 step12() { /* Convert PMs */ $pergo = 200; $start = intval( \IPS\Request::i()->extra ); $converted = 0; $seen = 0; /* Select max topic ID thus far */ $_tmp = \IPS\Db::i()->select( 'MAX(mt_id)', 'message_topics' )->first(); $topicID = intval( $_tmp['max'] ); foreach( \IPS\Db::i()->select( '*', 'message_text', NULL, 'msg_id ASC', array( $start, $pergo ) ) as $post ) { $seen++; /* Make sure all data is valid */ if ( intval( $post['msg_sent_to_count'] ) < 1 ) { continue; } /* a little set up */ $oldTopics = array(); /* Now fetch all topics */ foreach( \IPS\Db::i()->select( '*', 'message_topics_old', array( 'mt_msg_id=?', intval( $post['msg_id'] ) ) ) as $topic ) { /* Got any data? */ if ( ! $topic['mt_from_id'] OR ! $topic['mt_to_id'] ) { continue; } $oldTopics[ $topic['mt_id'] ] = $topic; # Luke added that space. That's his first contribution to the code vaults at IPS. } /* Fail safe */ if ( ! count( $oldTopics ) ) { continue; } /* Increment number */ $topicID++; /* Add in the post */ $postID = \IPS\Db::i()->insert( 'message_posts', array( 'msg_topic_id' => $topicID, 'msg_date' => $post['msg_date'], 'msg_post' => $post['msg_post'], 'msg_post_key' => $post['msg_post_key'], 'msg_author_id' => $post['msg_author_id'], 'msg_ip_address' => $post['msg_ip_address'], 'msg_is_first_post' => 1 ) ); /* Update attachments */ \IPS\Db::i()->update( 'attachments', array( 'attach_rel_id' => $postID ), "attach_rel_module='msg' AND attach_rel_id=" . $post['msg_id'] ); /* Define some stuff. "To" member is added last in IPB 2 */ $_tmp = $oldTopics; ksort( $_tmp ); $topicData = array_pop( $_tmp ); $_invited = array(); $_seenOwner = array(); $_isDeleted = 0; /* Add the member rows */ foreach( $oldTopics as $mt_id => $data ) { /* Prevent SQL error with unique index: Seen the owner ID already? */ if ( $_seenOwner[ $data['mt_owner_id'] ] ) { continue; } $_seenOwner[ $data['mt_owner_id'] ] = $data['mt_owner_id']; /* Build invited - does not include 'to' person */ if ( $data['mt_owner_id'] AND ( $post['msg_author_id'] != $data['mt_owner_id'] ) AND ( $topicData['mt_to_id'] != $data['mt_owner_id'] ) ) { $_invited[ $data['mt_owner_id'] ] = $data['mt_owner_id']; } $_isSent = ( $data['mt_vid_folder'] == 'sent' ) ? 1 : 0; $_isDraft = ( $data['mt_vid_folder'] == 'unsent' ) ? 1 : 0; \IPS\Db::i()->insert( 'message_topic_user_map', array( 'map_user_id' => $data['mt_owner_id'], 'map_topic_id' => $topicID, 'map_folder_id' => ( $_isDraft ) ? 'drafts' : 'myconvo', 'map_read_time' => ( $data['mt_user_read'] ) ? $data['mt_user_read'] : ( $data['mt_read'] ? time() : 0 ), 'map_user_active' => 1, 'map_user_banned' => 0, 'map_has_unread' => 0, //( $data['mt_read'] ) ? 0 : 1, 'map_is_system' => 0, 'map_last_topic_reply' => $post['msg_date'], 'map_is_starter' => ( $data['mt_owner_id'] == $post['msg_author_id'] ) ? 1 : 0 ) ); } /* Now, did we see the author? If not, add them too but as inactive */ if ( ! $_seenOwner[ $post['msg_author_id'] ] ) { $_isDeleted = 1; } $_isSent = ( $topicData['mt_vid_folder'] == 'sent' ) ? 1 : 0; $_isDraft = ( $topicData['mt_vid_folder'] == 'unsent' ) ? 1 : 0; /* Add the topic */ \IPS\Db::i()->insert( 'message_topics', array( 'mt_id' => $topicID, 'mt_date' => $topicData['mt_date'], 'mt_title' => $topicData['mt_title'], 'mt_starter_id' => $post['msg_author_id'], 'mt_start_time' => $post['msg_date'], 'mt_last_post_time' => $post['msg_date'], 'mt_invited_members' => serialize( array_keys( $_invited ) ), 'mt_to_count' => count( array_keys( $_invited ) ) + 1, 'mt_to_member_id' => $topicData['mt_to_id'], 'mt_replies' => 0, 'mt_last_msg_id' => $postID, 'mt_first_msg_id' => $postID, 'mt_is_draft' => $_isDraft, 'mt_is_deleted' => $_isDeleted, 'mt_is_system' => 0 ) ); $converted++; } /* What to do? */ if ( $seen ) { return ( $start + $pergo ); } else { /* Update all members */ \IPS\Db::i()->update( 'members', array( 'msg_count_reset' => 1 ) ); /* Nope, nothing to do - we're done! */ return TRUE; } } /** * Step 13 * * @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 step13() { /* Convert block lists */ $pergo = 200; $start = intval( \IPS\Request::i()->extra ); $converted = 0; $seen = 0; foreach( \IPS\Db::i()->select( '*', 'members', "LENGTH(ignored_users) > 0", 'member_id ASC', array( $start, $pergo ) ) as $member ) { $seen++; /* Got anything? */ if ( strstr( $member['ignored_users'], ',' ) ) { $ignored = explode( ',', $member['ignored_users'] ); } if ( ! is_array( $ignored ) ) { continue; } /* Add it to the table */ foreach( $ignored as $iid ) { if ( ! $iid ) { continue; } \IPS\Db::i()->insert( 'ignored_users', array( 'ignore_owner_id' => $member['member_id'], 'ignore_ignore_id' => $iid, 'ignore_topics' => 1 ) ); } $converted++; } /* What to do? */ if ( $seen ) { return ( $start + $pergo ); } else { /* Nope, nothing to do - we're done! */ return TRUE; } } /** * Step 14 * * @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 step14() { /* Convert PM block lists */ $pergo = 200; $start = intval( \IPS\Request::i()->extra ); $converted = 0; $seen = 0; foreach( \IPS\Db::i()->select( '*', 'contacts', "allow_msg=0", 'id ASC', array( $start, $pergo ) ) as $contact ) { $seen++; /* Already got an entry for this contact? */ try { $test = \IPS\Db::i()->select( '*', 'ignored_users', array( "ignore_owner_id=?", intval( $contact['member_id'] ) ) )->first(); \IPS\Db::i()->update( 'ignored_users', array( 'ignore_messages' => 1 ), 'ignore_id=' . $test['ignore_id'] ); } catch( \UnderflowException $e ) { \IPS\Db::i()->insert( 'ignored_users', array( 'ignore_owner_id' => $contact['member_id'], 'ignore_ignore_id' => $contact['contact_id'], 'ignore_messages' => 1 ) ); } $converted++; } /* What to do? */ if ( $seen ) { return ( $start + $pergo ); } else { /* Nope, nothing to do - we're done! */ return TRUE; } } /** * Step 15 * * @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 step15() { /* Reset member languages and skins */ \IPS\Db::i()->update( 'members', array( 'language' => 0, 'skin' => 0 ) ); /* Empty caches */ \IPS\Db::i()->delete( 'cache_store', "cs_key='forum_cache'" ); \IPS\Db::i()->delete( 'cache_store', "cs_key='skin_id_cache'" ); /* Reset admin permissions */ \IPS\Db::i()->update( 'admin_permission_rows', array( 'row_perm_cache' => '' ) ); /* Drop Tables */ \IPS\Db::i()->dropTable( 'contacts' ); \IPS\Db::i()->dropTable( 'skin_macro' ); \IPS\Db::i()->dropTable( 'skin_template_links' ); \IPS\Db::i()->dropTable( 'skin_sets' ); \IPS\Db::i()->dropTable( 'languages' ); \IPS\Db::i()->dropTable( 'topics_read' ); \IPS\Db::i()->dropTable( 'topic_markers' ); \IPS\Db::i()->dropTable( 'acp_help' ); \IPS\Db::i()->dropTable( 'members_converge' ); \IPS\Db::i()->dropTable( 'member_extra' ); \IPS\Db::i()->dropTable( 'admin_sessions' ); \IPS\Db::i()->dropTable( 'components' ); \IPS\Db::i()->dropTable( 'admin_permission_keys' ); \IPS\Db::i()->dropTable( 'conf_settings' ); \IPS\Db::i()->dropTable( 'conf_settings_titles' ); \IPS\Db::i()->dropTable( 'reg_antispam' ); \IPS\Db::i()->dropTable( 'message_text' ); \IPS\Db::i()->dropTable( 'message_topics_old' ); return TRUE; } }