$upgrade->add_field(sprintf($upgrade_phrases['upgrade_300b3.php']['altering_x_table'], 'paymenttransaction', 4, 7), 'paymenttransaction', 'reversed', 'int', FIELD_DEFAULTS);
    $upgrade->add_index(sprintf($upgrade_phrases['upgrade_300b3.php']['altering_x_table'], 'paymenttransaction', 5, 7), 'paymenttransaction', 'dateline', 'dateline');
    $upgrade->add_index(sprintf($upgrade_phrases['upgrade_300b3.php']['altering_x_table'], 'paymenttransaction', 6, 7), 'paymenttransaction', 'transactionid', 'transactionid');
    $upgrade->add_index(sprintf($upgrade_phrases['upgrade_300b3.php']['altering_x_table'], 'paymenttransaction', 7, 7), 'paymenttransaction', 'paymentapiid', 'paymentapiid');
    $upgrade->add_index(sprintf($upgrade_phrases['upgrade_300b3.php']['altering_x_table'], 'subscriptionlog', 1, 2), 'subscriptionlog', 'userid', array('userid', 'subscriptionid'));
    $upgrade->add_index(sprintf($upgrade_phrases['upgrade_300b3.php']['altering_x_table'], 'subscriptionlog', 2, 2), 'subscriptionlog', 'subscriptionid', 'subscriptionid');
    $upgrade->add_index(sprintf($upgrade_phrases['upgrade_300b3.php']['altering_x_table'], 'attachmenttype', 1, 1), 'attachmenttype', 'enabled', 'enabled');
    $upgrade->run_query(sprintf($vbphrase['create_table'], TABLE_PREFIX . "attachmentpermission"), "CREATE TABLE " . TABLE_PREFIX . "attachmentpermission (\n\t\t\tattachmentpermissionid INT UNSIGNED NOT NULL AUTO_INCREMENT,\n\t\t\textension VARCHAR(20) BINARY NOT NULL DEFAULT '',\n\t\t\tusergroupid INT UNSIGNED NOT NULL,\n\t\t\tsize INT UNSIGNED NOT NULL,\n\t\t\twidth SMALLINT UNSIGNED NOT NULL,\n\t\t\theight SMALLINT UNSIGNED NOT NULL,\n\t\t\tattachmentpermissions INT UNSIGNED NOT NULL,\n\t\t\tPRIMARY KEY  (attachmentpermissionid),\n\t\t\tUNIQUE KEY extension (extension,usergroupid),\n\t\t\tKEY usergroupid (usergroupid)\n\t\t)", MYSQL_ERROR_TABLE_EXISTS);
    $upgrade->add_field(sprintf($upgrade_phrases['upgrade_300b3.php']['altering_x_table'], 'datastore', 1, 1), 'datastore', 'unserialize', 'smallint', array('attributes' => 'UNSIGNED', 'null' => false, 'default' => 2));
    // create rssfeed table
    $upgrade->run_query(sprintf($vbphrase['create_table'], TABLE_PREFIX . "rssfeed"), "CREATE TABLE " . TABLE_PREFIX . "rssfeed (\n\t\t\trssfeedid INT UNSIGNED NOT NULL AUTO_INCREMENT,\n\t\t\ttitle VARCHAR(250) NOT NULL,\n\t\t\turl VARCHAR(250) NOT NULL,\n\t\t\tport SMALLINT UNSIGNED NOT NULL DEFAULT '80',\n\t\t\tttl SMALLINT UNSIGNED NOT NULL DEFAULT '1500',\n\t\t\tmaxresults SMALLINT NOT NULL DEFAULT '0',\n\t\t\tuserid INT UNSIGNED NOT NULL,\n\t\t\tforumid SMALLINT UNSIGNED NOT NULL,\n\t\t\ticonid SMALLINT UNSIGNED NOT NULL,\n\t\t\ttitletemplate MEDIUMTEXT NOT NULL,\n\t\t\tbodytemplate MEDIUMTEXT NOT NULL,\n\t\t\tsearchwords MEDIUMTEXT NOT NULL,\n\t\t\titemtype ENUM('thread','announcement') NOT NULL DEFAULT 'thread',\n\t\t\tthreadactiondelay SMALLINT UNSIGNED NOT NULL,\n\t\t\tendannouncement INT UNSIGNED NOT NULL,\n\t\t\toptions INT UNSIGNED NOT NULL,\n\t\t\tlastrun INT UNSIGNED NOT NULL,\n\t\t\tPRIMARY KEY  (rssfeedid),\n\t\t\tKEY lastrun (lastrun)\n\t\t)", MYSQL_ERROR_TABLE_EXISTS);
    // create rsslog table
    $upgrade->run_query(sprintf($vbphrase['create_table'], TABLE_PREFIX . "rsslog"), "CREATE TABLE " . TABLE_PREFIX . "rsslog (\n\t\t\trssfeedid INT UNSIGNED NOT NULL,\n\t\t\titemid INT UNSIGNED NOT NULL,\n\t\t\titemtype ENUM('thread','announcement') NOT NULL DEFAULT 'thread',\n\t\t\tuniquehash CHAR(32) NOT NULL,\n\t\t\tcontenthash CHAR(32) NOT NULL,\n\t\t\tdateline INT UNSIGNED NOT NULL,\n\t\t\tthreadactiontime INT UNSIGNED NOT NULL,\n\t\t\tthreadactioncomplete TINYINT UNSIGNED NOT NULL,\n\t\t\tPRIMARY KEY (rssfeedid,itemid,itemtype),\n\t\t\tUNIQUE KEY uniquehash (uniquehash)\n\t\t)", MYSQL_ERROR_TABLE_EXISTS);
    // Update hidden profile cache to handle hidden AND required fields
    require_once DIR . '/includes/adminfunctions_profilefield.php';
    build_profilefield_cache();
    $db->query_write("DELETE FROM " . TABLE_PREFIX . "datastore WHERE title = 'hidprofilecache'");
    $upgrade->execute();
    $db->query_write("\n\t\tUPDATE " . TABLE_PREFIX . "datastore\n\t\tSET unserialize = 1\n\t\tWHERE title IN (\n\t\t\t'options', 'forumcache', 'languagecache', 'stylecache', 'bbcodecache',\n\t\t\t'smiliecache', 'wol_spiders', 'usergroupcache', 'attachmentcache',\n\t\t\t'maxloggedin', 'userstats', 'birthdaycache', 'eventcache', 'iconcache',\n\t\t\t'products', 'pluginlist', 'pluginlistadmin', 'bitfields', 'ranks',\n\t\t\t'noavatarperms', 'acpstats', 'profilefield'\n\t\t)\n\t");
}
// #############################################################################
// super moderator permissions updates
if ($vbulletin->GPC['step'] == 10) {
    $moderator_permissions = array_sum($vbulletin->bf_misc_moderatorpermissions) - ($vbulletin->bf_misc_moderatorpermissions['newthreademail'] + $vbulletin->bf_misc_moderatorpermissions['newpostemail']);
    $supergroups = $db->query_read("\n\t\tSELECT user.*, usergroup.usergroupid\n\t\tFROM " . TABLE_PREFIX . "usergroup AS usergroup\n\t\tINNER JOIN " . TABLE_PREFIX . "user AS user ON(user.usergroupid = usergroup.usergroupid OR FIND_IN_SET(usergroup.usergroupid, user.membergroupids))\n\t\tLEFT JOIN " . TABLE_PREFIX . "moderator AS moderator ON(moderator.userid = user.userid AND moderator.forumid = -1)\n\t\tWHERE (usergroup.adminpermissions & " . $vbulletin->bf_ugp_adminpermissions['ismoderator'] . ") AND moderator.forumid IS NULL\n\t\tGROUP BY user.userid\n\t");
    while ($supergroup = $db->fetch_array($supergroups)) {
        $upgrade->run_query(sprintf($upgrade_phrases['upgrade_360b1.php']['super_moderator_x_updated'], $supergroup['username']), "INSERT INTO " . TABLE_PREFIX . "moderator\n\t\t\t\t(userid, forumid, permissions)\n\t\t\tVALUES\n\t\t\t\t({$supergroup['userid']}, -1, {$moderator_permissions})");
    }
    $db->query_write("TRUNCATE TABLE " . TABLE_PREFIX . "postparsed");
    $upgrade->add_field(sprintf($upgrade_phrases['upgrade_300b3.php']['altering_x_table'], 'postparsed', 1, 8), 'postparsed', 'styleid', 'smallint', FIELD_DEFAULTS);
    $upgrade->add_field(sprintf($upgrade_phrases['upgrade_300b3.php']['altering_x_table'], 'postparsed', 2, 8), 'postparsed', 'languageid', 'smallint', FIELD_DEFAULTS);
 /**
  * Step #149
  *
  */
 function step_149()
 {
     $this->show_message($this->phrase['core']['cache_update']);
     // Update hidden profile cache to handle hidden AND required fields
     require_once DIR . '/includes/adminfunctions_profilefield.php';
     build_profilefield_cache();
     $this->db->query_write("DELETE FROM " . TABLE_PREFIX . "datastore WHERE title = 'hidprofilecache'");
     //require_once(DIR . '/includes/adminfunctions_attachment.php');
     //build_attachment_permissions();
     vBulletinHook::build_datastore($this->db);
     build_product_datastore();
 }