public static function upgrade() { // 2.2.2 Beta 1 if (version_compare(self::$existing_version, '2.2.2 Beta 1', '<=')) { Symphony::Configuration()->set('version', '2.2.2 Beta 1', 'symphony'); // Rename old variations of the query_caching configuration setting if (Symphony::Configuration()->get('disable_query_caching', 'database')) { $value = Symphony::Configuration()->get('disable_query_caching', 'database') == "no" ? "on" : "off"; Symphony::Configuration()->set('query_caching', $value, 'database'); Symphony::Configuration()->remove('disable_query_caching', 'database'); } // Add Session GC collection as a configuration parameter Symphony::Configuration()->set('session_gc_divisor', '10', 'symphony'); // Save the manifest changes Symphony::Configuration()->write(); } // 2.2.2 Beta 2 if (version_compare(self::$existing_version, '2.2.2 Beta 2', '<=')) { Symphony::Configuration()->set('version', '2.2.2 Beta 2', 'symphony'); try { // Change Textareas to be MEDIUMTEXT columns $textarea_tables = Symphony::Database()->fetchCol("field_id", "SELECT `field_id` FROM `tbl_fields_textarea`"); foreach ($textarea_tables as $field) { Symphony::Database()->query(sprintf("ALTER TABLE `tbl_entries_data_%d` CHANGE `value` `value` MEDIUMTEXT, CHANGE `value_formatted` `value_formatted` MEDIUMTEXT", $field)); Symphony::Database()->query(sprintf('OPTIMIZE TABLE `tbl_entries_data_%d`', $field)); } } catch (Exception $ex) { } // Save the manifest changes Symphony::Configuration()->write(); } // Update the version information return parent::upgrade(); }
public static function upgrade() { if (version_compare(self::$existing_version, '2.3.4beta1', '<=')) { // Detect mod_rewrite #1808 try { $htaccess = file_get_contents(DOCROOT . '/.htaccess'); if ($htaccess !== false && !preg_match('/SetEnv HTTP_MOD_REWRITE No/', $htaccess)) { $rewrite = ' <IfModule !mod_rewrite.c> SetEnv HTTP_MOD_REWRITE No </IfModule> <IfModule mod_rewrite.c>'; $htaccess = str_replace('<IfModule mod_rewrite.c>', $rewrite, $htaccess); file_put_contents(DOCROOT . '/.htaccess', $htaccess); } } catch (Exception $ex) { } // Extend token field to enable more secure tokens try { Symphony::Database()->query('ALTER TABLE `tbl_forgotpass` CHANGE `token` `token` VARCHAR(16);'); } catch (Exception $ex) { } } if (version_compare(self::$existing_version, '2.3.4beta2', '<=')) { // Extend session_id field for default Suhosin installs try { Symphony::Database()->query('ALTER TABLE `tbl_sessions` CHANGE `session` `session` VARCHAR(128);'); } catch (Exception $ex) { } } // Update the version information return parent::upgrade(); }
public static function upgrade() { // Add date field options try { Symphony::Database()->query(' ALTER TABLE `tbl_fields_date` ADD `calendar` enum("yes","no") COLLATE utf8_unicode_ci NOT NULL DEFAULT "no", ADD `time` enum("yes","no") COLLATE utf8_unicode_ci NOT NULL DEFAULT "yes"; '); } catch (Exception $ex) { } // Add namespace field to the cache table. RE: #2162 try { Symphony::Database()->query(' ALTER TABLE `tbl_cache` ADD `namespace` VARCHAR(255) COLLATE utf8_unicode_ci; '); } catch (Exception $ex) { } // Add UNIQUE key constraint to the `hash` RE: #2163 try { Symphony::Database()->import(' ALTER TABLE `tbl_cache` DROP INDEX `hash`; ALTER TABLE `tbl_cache` ADD UNIQUE INDEX `hash` (`hash`) '); } catch (Exception $ex) { } // Update the version information return parent::upgrade(); }
public static function upgrade() { // 2.3.1dev if (version_compare(self::$existing_version, '2.3.1dev', '<=')) { // Remove unused setting from the Author field $author_table = 'tbl_fields_author'; if (Symphony::Database()->tableContainsField($author_table, 'allow_author_change')) { Symphony::Database()->query("ALTER TABLE `{$author_table}` DROP `allow_author_change`;"); } // Author Types [#1219] if (!Symphony::Database()->tableContainsField($author_table, 'author_types')) { Symphony::Database()->query("ALTER TABLE `{$author_table}` ADD `author_types` VARCHAR(255) DEFAULT NULL;"); } // Entries Modification Date [#983] if (!Symphony::Database()->tableContainsField('tbl_entries', 'modification_date')) { Symphony::Database()->query("ALTER TABLE `tbl_entries` ADD `modification_date` DATETIME NOT NULL;"); Symphony::Database()->query("ALTER TABLE `tbl_entries` ADD KEY `modification_date` (`modification_date`)"); Symphony::Database()->query("UPDATE `tbl_entries` SET modification_date = creation_date;"); } if (!Symphony::Database()->tableContainsField('tbl_entries', 'modification_date_gmt')) { Symphony::Database()->query("ALTER TABLE `tbl_entries` ADD `modification_date_gmt` DATETIME NOT NULL;"); Symphony::Database()->query("ALTER TABLE `tbl_entries` ADD KEY `modification_date_gmt` (`modification_date_gmt`)"); Symphony::Database()->query("UPDATE `tbl_entries` SET modification_date_gmt = creation_date_gmt;"); } // Cleanup #977, remove `entry_order` & `entry_order_direction` from `tbl_sections` if (Symphony::Database()->tableContainsField('tbl_sections', 'entry_order')) { Symphony::Database()->query("ALTER TABLE `tbl_sections` DROP `entry_order`;"); } if (Symphony::Database()->tableContainsField('tbl_sections', 'entry_order_direction')) { Symphony::Database()->query("ALTER TABLE `tbl_sections` DROP `entry_order_direction`;"); } } if (version_compare(self::$existing_version, '2.3.1RC1', '<=')) { // Add Security Rules from 2.2 to .htaccess try { $htaccess = file_get_contents(DOCROOT . '/.htaccess'); if ($htaccess !== false && preg_match('/### SECURITY - Protect crucial files/', $htaccess)) { $security = ' ### SECURITY - Protect crucial files RewriteRule ^manifest/(.*)$ - [F] RewriteRule ^workspace/(pages|utilities)/(.*)\\.xsl$ - [F] RewriteRule ^(.*)\\.sql$ - [F] RewriteRule (^|/)\\. - [F] ### DO NOT APPLY RULES WHEN REQUESTING "favicon.ico"'; $htaccess = str_replace('### SECURITY - Protect crucial files.*### DO NOT APPLY RULES WHEN REQUESTING "favicon.ico"', $security, $htaccess); file_put_contents(DOCROOT . '/.htaccess', $htaccess); } } catch (Exception $ex) { } // Increase length of password field to accomodate longer hashes Symphony::Database()->query("ALTER TABLE `tbl_authors` CHANGE `password` `password` VARCHAR( 150 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL"); } // Update the version information return parent::upgrade(); }
public static function upgrade() { // Add the upload blacklist (see c763e6a) $blacklist = Symphony::Configuration()->get('upload_blacklist', 'admin'); if (empty($blacklist)) { Symphony::Configuration()->set('upload_blacklist', '/\\.(?:php[34567s]?|phtml)$/i', 'admin'); } // Update the version information return parent::upgrade(); }
static function upgrade() { // [#702] Update to include Admin Path configuration if (version_compare(self::$existing_version, '2.4beta2', '<=')) { // Add missing config value for index view string length Symphony::Configuration()->set('cell_truncation_length', '75', 'symphony'); // Add admin-path to configuration Symphony::Configuration()->set('admin-path', 'symphony', 'symphony'); } // [#1626] Update all tables to be UTF-8 encoding/collation // @link https://gist.github.com/michael-e/5789168 $tables = Symphony::Database()->fetch("SHOW TABLES"); if (is_array($tables) && !empty($tables)) { foreach ($tables as $table) { $table = current($table); // If it's not a Symphony table, ignore it if (!preg_match('/^' . Symphony::Database()->getPrefix() . '/', $table)) { continue; } Symphony::Database()->query(sprintf("ALTER TABLE `%s` CHARACTER SET utf8 COLLATE utf8_unicode_ci", $table)); Symphony::Database()->query(sprintf("ALTER TABLE `%s` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci", $table)); } } // [#1420] Change date field to be a varchar instead of an ENUM to support prepopulation try { Symphony::Database()->query(' ALTER TABLE `tbl_fields_date` CHANGE `pre_populate` `pre_populate` varchar(80) COLLATE utf8_unicode_ci DEFAULT NULL; '); } catch (Exception $ex) { } // [#1997] Add filtering column to the Sections table if (!Symphony::Database()->tableContainsField('tbl_sections', 'filter')) { Symphony::Database()->query("\n\t\t\t\t\tALTER TABLE `tbl_sections`\n\t\t\t\t\tADD `filter` enum('yes','no') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'yes';\n\t\t\t\t"); } $installed_extensions = Symphony::ExtensionManager()->listInstalledHandles(); if (in_array('publishfiltering', $installed_extensions)) { Symphony::ExtensionManager()->uninstall('publishfiltering'); self::$publish_filtering_disabled = true; } // [#1874] XSRF/CRSF options if (version_compare(self::$existing_version, '2.4beta3', '<=')) { // How long should a XSRF token be valid Symphony::Configuration()->set('token_lifetime', '15 minutes', 'symphony'); // Should the token be removed as soon as it has been used? Symphony::Configuration()->set('invalidate_tokens_on_request', false, 'symphony'); } // [#1874] XSRF/CRSF options if (version_compare(self::$existing_version, '2.4RC1', '<=')) { // On update, disable XSRF for compatibility purposes Symphony::Configuration()->set('enable_xsrf', 'no', 'symphony'); } // Update the version information return parent::upgrade(); }
public static function upgrade() { // 2.2.0dev if (version_compare(self::$existing_version, '2.2.0dev', '<=')) { Symphony::Configuration()->set('version', '2.2dev', 'symphony'); if (Symphony::Database()->tableContainsField('tbl_sections_association', 'cascading_deletion')) { Symphony::Database()->query('ALTER TABLE `tbl_sections_association` CHANGE `cascading_deletion` `hide_association` enum("yes","no") COLLATE utf8_unicode_ci NOT NULL DEFAULT "no";'); // Update Select table to include the new association field Symphony::Database()->query('ALTER TABLE `tbl_fields_select` ADD `show_association` ENUM( "yes", "no" ) COLLATE utf8_unicode_ci NOT NULL DEFAULT "yes"'); } if (Symphony::Database()->tableContainsField('tbl_authors', 'default_section')) { // Allow Authors to be set to any area in the backend. Symphony::Database()->query('ALTER TABLE `tbl_authors` CHANGE `default_section` `default_area` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL;'); } Symphony::Configuration()->write(); } // 2.2.0 if (version_compare(self::$existing_version, '2.2', '<=')) { Symphony::Configuration()->set('version', '2.2', 'symphony'); Symphony::Configuration()->set('datetime_separator', ' ', 'region'); Symphony::Configuration()->set('strict_error_handling', 'yes', 'symphony'); // We've added UNIQUE KEY indexes to the Author, Checkbox, Date, Input, Textarea and Upload Fields // Time to go through the entry tables and make this change as well. $author = Symphony::Database()->fetchCol("field_id", "SELECT `field_id` FROM `tbl_fields_author`"); $checkbox = Symphony::Database()->fetchCol("field_id", "SELECT `field_id` FROM `tbl_fields_checkbox`"); $date = Symphony::Database()->fetchCol("field_id", "SELECT `field_id` FROM `tbl_fields_date`"); $input = Symphony::Database()->fetchCol("field_id", "SELECT `field_id` FROM `tbl_fields_input`"); $textarea = Symphony::Database()->fetchCol("field_id", "SELECT `field_id` FROM `tbl_fields_textarea`"); $upload = Symphony::Database()->fetchCol("field_id", "SELECT `field_id` FROM `tbl_fields_upload`"); $field_ids = array_merge($author, $checkbox, $date, $input, $textarea, $upload); foreach ($field_ids as $id) { $table = '`tbl_entries_data_' . $id . '`'; try { Symphony::Database()->query("ALTER TABLE " . $table . " DROP INDEX `entry_id`"); } catch (Exception $ex) { } try { Symphony::Database()->query("CREATE UNIQUE INDEX `entry_id` ON " . $table . " (`entry_id`)"); Symphony::Database()->query("OPTIMIZE TABLE " . $table); } catch (Exception $ex) { } } } // Update the version information return parent::upgrade(); }
static function upgrade() { // Update DB for the new Mime-type length. #1534 if (version_compare(self::$existing_version, '2.3.2beta1', '<=')) { $upload_entry_tables = Symphony::Database()->fetchCol("field_id", "SELECT `field_id` FROM `tbl_fields_upload`"); if (is_array($upload_entry_tables) && !empty($upload_entry_tables)) { foreach ($upload_entry_tables as $field) { Symphony::Database()->query(sprintf("ALTER TABLE `tbl_entries_data_%d` CHANGE `mimetype` `mimetype` varchar(100) DEFAULT NULL", $field)); } } } // Reapply increase length of password field to accomodate longer hashes // fix as it looks like we created an error in the 2.3.1 migration. RE #1648 Symphony::Database()->query("ALTER TABLE `tbl_authors` CHANGE `password` `password` VARCHAR( 150 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL"); // Update the version information return parent::upgrade(); }
public static function upgrade() { if (version_compare(self::$existing_version, '2.3.3beta1', '<=')) { // Update DB for the new author role #1692 Symphony::Database()->query("ALTER TABLE `tbl_authors` CHANGE `user_type` `user_type` enum('author', 'manager', 'developer') DEFAULT 'author'"); // Remove directory from the upload fields, #1719 $upload_tables = Symphony::Database()->fetchCol("field_id", "SELECT `field_id` FROM `tbl_fields_upload`"); if (is_array($upload_tables) && !empty($upload_tables)) { foreach ($upload_tables as $field) { Symphony::Database()->query(sprintf("UPDATE tbl_entries_data_%d SET file = substring_index(file, '/', -1)", $field)); } } } if (version_compare(self::$existing_version, '2.3.3beta2', '<=')) { // Update rows for associations if (!Symphony::Configuration()->get('association_maximum_rows', 'symphony')) { Symphony::Configuration()->set('association_maximum_rows', '5', 'symphony'); } } // Update the version information return parent::upgrade(); }
public static function upgrade() { // Add association interfaces try { Symphony::Database()->query(' ALTER TABLE `tbl_sections_association` ADD `interface` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, ADD `editor` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL; '); } catch (Exception $ex) { } // Remove show_association #2082 try { Symphony::Database()->query(' ALTER TABLE `tbl_fields_select` DROP COLUMN show_association; '); } catch (Exception $ex) { } // Remove XSRF configuration options #2118 Symphony::Configuration()->remove('token_lifetime', 'symphony'); Symphony::Configuration()->remove('invalidate_tokens_on_request', 'symphony'); // Update the version information return parent::upgrade(); }
public static function upgrade() { // 2.2.1 Beta 1 if (version_compare(self::$existing_version, '2.2.1 Beta 1', '<=')) { Symphony::Configuration()->set('version', '2.2.1 Beta 1', 'symphony'); try { Symphony::Database()->query('CREATE INDEX `session_expires` ON `tbl_sessions` (`session_expires`)'); Symphony::Database()->query('OPTIMIZE TABLE `tbl_sessions`'); } catch (Exception $ex) { } Symphony::Configuration()->write(); } // 2.2.1 Beta 2 if (version_compare(self::$existing_version, '2.2.1 Beta 2', '<=')) { Symphony::Configuration()->set('version', '2.2.1 Beta 2', 'symphony'); // Add Security Rules from 2.2 to .htaccess try { $htaccess = file_get_contents(DOCROOT . '/.htaccess'); if ($htaccess !== false && !preg_match('/### SECURITY - Protect crucial files/', $htaccess)) { $security = ' ### SECURITY - Protect crucial files RewriteRule ^manifest/(.*)$ - [F] RewriteRule ^workspace/(pages|utilities)/(.*)\\.xsl$ - [F] RewriteRule ^(.*)\\.sql$ - [F] RewriteRule (^|/)\\. - [F] ### DO NOT APPLY RULES WHEN REQUESTING "favicon.ico"'; $htaccess = str_replace('### DO NOT APPLY RULES WHEN REQUESTING "favicon.ico"', $security, $htaccess); file_put_contents(DOCROOT . '/.htaccess', $htaccess); } } catch (Exception $ex) { } // Add correct index to the `tbl_cache` try { Symphony::Database()->query('ALTER TABLE `tbl_cache` DROP INDEX `creation`'); Symphony::Database()->query('CREATE INDEX `expiry` ON `tbl_cache` (`expiry`)'); Symphony::Database()->query('OPTIMIZE TABLE `tbl_cache`'); } catch (Exception $ex) { } // Remove Hide Association field from Select Data tables $select_tables = Symphony::Database()->fetchCol("field_id", "SELECT `field_id` FROM `tbl_fields_select`"); if (is_array($select_tables) && !empty($select_tables)) { foreach ($select_tables as $field) { if (Symphony::Database()->tableContainsField('tbl_entries_data_' . $field, 'show_association')) { Symphony::Database()->query(sprintf("ALTER TABLE `tbl_entries_data_%d` DROP `show_association`", $field)); } } } // Update Select table to include the sorting option if (!Symphony::Database()->tableContainsField('tbl_fields_select', 'sort_options')) { Symphony::Database()->query('ALTER TABLE `tbl_fields_select` ADD `sort_options` ENUM( "yes", "no" ) COLLATE utf8_unicode_ci NOT NULL DEFAULT "no"'); } // Remove the 'driver' from the Config Symphony::Configuration()->remove('driver', 'database'); Symphony::Configuration()->write(); // Remove the NOT NULL from the Author tables try { $author = Symphony::Database()->fetchCol("field_id", "SELECT `field_id` FROM `tbl_fields_author`"); foreach ($author as $id) { $table = '`tbl_entries_data_' . $id . '`'; Symphony::Database()->query('ALTER TABLE ' . $table . ' CHANGE `author_id` `author_id` int(11) unsigned NULL'); } } catch (Exception $ex) { } Symphony::Configuration()->write(); } // Update the version information return parent::upgrade(); }
public static function upgrade() { // 2.3dev if (version_compare(self::$existing_version, '2.3dev', '<=')) { Symphony::Configuration()->set('version', '2.3dev', 'symphony'); Symphony::Configuration()->set('useragent', 'Symphony/2.3dev', 'general'); // Add Publish Label to `tbl_fields` if (!Symphony::Database()->tableContainsField('tbl_fields', 'publish_label')) { Symphony::Database()->query('ALTER TABLE `tbl_fields` ADD `publish_label` VARCHAR(255) DEFAULT NULL'); } // Migrate any Checkbox's Long Description to Publish Label try { $checkboxes = Symphony::Database()->fetch("SELECT `field_id`, `description` FROM `tbl_fields_checkbox`"); foreach ($checkboxes as $field) { if (!isset($field['description'])) { continue; } Symphony::Database()->query(sprintf("\n UPDATE `tbl_fields`\n SET `publish_label` = '%s'\n WHERE `id` = %d\n LIMIT 1;\n ", $field['description'], $field['field_id'])); } Symphony::Database()->query("ALTER TABLE `tbl_fields_checkbox` DROP `description`"); } catch (Exception $ex) { } // Removing unused settings Symphony::Configuration()->remove('allow_page_subscription', 'symphony'); Symphony::Configuration()->remove('strict_error_handling', 'symphony'); Symphony::Configuration()->remove('character_set', 'database'); Symphony::Configuration()->remove('character_encoding', 'database'); Symphony::Configuration()->remove('runtime_character_set_alter', 'database'); if (Symphony::Configuration()->get('pagination_maximum_rows', 'symphony') == '17') { Symphony::Configuration()->set('pagination_maximum_rows', '20', 'symphony'); } Symphony::Configuration()->write(); } // 2.3 Beta 1 if (version_compare(self::$existing_version, '2.3beta1', '<=')) { Symphony::Configuration()->set('version', '2.3beta1', 'symphony'); Symphony::Configuration()->set('useragent', 'Symphony/2.3 Beta 1', 'general'); Symphony::Configuration()->write(); } // 2.3 Beta 2 if (version_compare(self::$existing_version, '2.3beta2', '<=')) { // Migrate Publish Labels (if created) to the Label field // Then drop Publish Label, we're going to use element_name and label // to take care of the same functionality! try { if (Symphony::Database()->tableContainsField('tbl_fields', 'publish_label')) { $fields = Symphony::Database()->fetch('SELECT `publish_label`, `label`, `id` FROM `tbl_fields`'); foreach ($fields as $field) { if (!$field['publish_label']) { continue; } Symphony::Database()->query(sprintf("\n UPDATE `tbl_fields`\n SET `label` = '%s'\n WHERE `id` = %d\n LIMIT 1;\n ", $field['publish_label'], $field['id'])); } Symphony::Database()->query("ALTER TABLE `tbl_fields` DROP `publish_label`"); } } catch (Exception $ex) { Symphony::Log()->pushToLog($ex->getMessage(), E_NOTICE, true); } // Add uniqueness constraint for the Authors table. #937 try { Symphony::Database()->query("ALTER TABLE `tbl_authors` ADD UNIQUE KEY `email` (`email`)"); } catch (DatabaseException $ex) { // 1061 will be 'duplicate key', which is fine (means key was added earlier) // 1062 means the key failed to apply, which is bad. // @see http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html if ($ex->getDatabaseErrorCode() === 1062) { Symphony::Log()->pushToLog(__("You have multiple Authors with the same email address, which can cause issues with password retrieval. Please ensure all Authors have unique email addresses before updating. " . $ex->getMessage()), E_USER_ERROR, true); return false; } } // Update the version information Symphony::Configuration()->set('version', '2.3beta2', 'symphony'); Symphony::Configuration()->set('useragent', 'Symphony/2.3 Beta 2', 'general'); Symphony::Configuration()->write(); } // 2.3 Beta 3 if (version_compare(self::$existing_version, '2.3beta3', '<=')) { // Refresh indexes on existing Author field tables $author_fields = Symphony::Database()->fetchCol("field_id", "SELECT `field_id` FROM `tbl_fields_author`"); foreach ($author_fields as $id) { $table = 'tbl_entries_data_' . $id; // MySQL doesn't support DROP IF EXISTS, so we'll try and catch. try { Symphony::Database()->query("ALTER TABLE `" . $table . "` DROP INDEX `entry_id`"); } catch (Exception $ex) { } try { Symphony::Database()->query("CREATE UNIQUE INDEX `author` ON `" . $table . "` (`entry_id`, `author_id`)"); Symphony::Database()->query("OPTIMIZE TABLE " . $table); } catch (Exception $ex) { } } // Move section sorting data from the database to the filesystem. #977 if (Symphony::Database()->tableContainsField('tbl_sections', 'entry_order')) { $sections = Symphony::Database()->fetch("SELECT `handle`, `entry_order`, `entry_order_direction` FROM `tbl_sections`"); foreach ($sections as $s) { Symphony::Configuration()->set('section_' . $s['handle'] . '_sortby', $s['entry_order'], 'sorting'); Symphony::Configuration()->set('section_' . $s['handle'] . '_order', $s['entry_order_direction'], 'sorting'); } } // Drop `local`/`gmt` from Date fields, add `date` column. #693 $date_fields = Symphony::Database()->fetchCol("field_id", "SELECT `field_id` FROM `tbl_fields_date`"); foreach ($date_fields as $id) { $table = 'tbl_entries_data_' . $id; // Don't catch an Exception, we should halt updating if something goes wrong here // Add the new `date` column for Date fields if (!Symphony::Database()->tableContainsField($table, 'date')) { Symphony::Database()->query("ALTER TABLE `" . $table . "` ADD `date` DATETIME DEFAULT NULL"); Symphony::Database()->query("CREATE INDEX `date` ON `" . $table . "` (`date`)"); } if (Symphony::Database()->tableContainsField($table, 'date')) { // Populate new Date column if (Symphony::Database()->query("UPDATE `" . $table . "` SET date = CONVERT_TZ(SUBSTRING(value, 1, 19), SUBSTRING(value, -6), '+00:00')")) { // Drop the `local`/`gmt` columns from Date fields if (Symphony::Database()->tableContainsField($table, 'local')) { Symphony::Database()->query("ALTER TABLE `" . $table . "` DROP `local`;"); } if (Symphony::Database()->tableContainsField($table, 'gmt')) { Symphony::Database()->query("ALTER TABLE `" . $table . "` DROP `gmt`;"); } } } Symphony::Database()->query("OPTIMIZE TABLE " . $table); } } // Update the version information return parent::upgrade(); }