Use a combined script to drop columns
authorAlexander Ebert <ebert@woltlab.com>
Sun, 20 Nov 2016 19:30:09 +0000 (20:30 +0100)
committerAlexander Ebert <ebert@woltlab.com>
Sun, 20 Nov 2016 21:13:43 +0000 (22:13 +0100)
com.woltlab.wcf/package.xml
com.woltlab.wcf/update_2.sql
com.woltlab.wcf/update_3.sql
com.woltlab.wcf/update_4.sql
wcfsetup/install/files/acp/update_com.woltlab.wcf_3.0_dropColumns.php [new file with mode: 0644]

index bf79a4b854273d70c70980d5ea6a5a273882216a..5e60ae8caf7d48b9375d774fcfd24ca7ed1e3f9c 100644 (file)
@@ -60,6 +60,7 @@
                <instruction type="script" run="standalone" flushCache="false">acp/update_com.woltlab.wcf_3.0_columnLength.php</instruction>
                <instruction type="sql" run="standalone">update_1.sql</instruction>
                <instruction type="sql" run="standalone">update_2.sql</instruction>
+               <instruction type="script" run="standalone" flushCache="false">acp/update_com.woltlab.wcf_3.0_dropColumns.php</instruction>
                <instruction type="sql" run="standalone">update_3.sql</instruction>
                <instruction type="sql" run="standalone">update_4.sql</instruction>
                <instruction type="sql" run="standalone">update_5.sql</instruction>
index 45175cf42851d0a15ee512d7c59e57dd40e39070..9c6a1573a525929489123b9c2e45d8e1bd235676 100644 (file)
@@ -77,31 +77,3 @@ ALTER TABLE wcf1_modification_log ADD parentObjectID INT(10);
 ALTER TABLE wcf1_package_update_version DROP COLUMN isCritical;
 
 DROP TABLE IF EXISTS wcf1_page_menu_item;
-
-ALTER TABLE wcf1_session DROP COLUMN controller;
-ALTER TABLE wcf1_session DROP COLUMN parentObjectType;
-ALTER TABLE wcf1_session DROP COLUMN parentObjectID;
-ALTER TABLE wcf1_session DROP COLUMN objectType;
-ALTER TABLE wcf1_session DROP COLUMN objectID;
-ALTER TABLE wcf1_session DROP COLUMN sessionVariables;
-
-ALTER TABLE wcf1_session ADD pageID INT(10);
-ALTER TABLE wcf1_session ADD pageObjectID INT(10);
-ALTER TABLE wcf1_session ADD parentPageID INT(10);
-ALTER TABLE wcf1_session ADD parentPageObjectID INT(10);
-ALTER TABLE wcf1_session ADD KEY pageID (pageID, pageObjectID);
-ALTER TABLE wcf1_session ADD KEY parentPageID (parentPageID, parentPageObjectID);
-
-ALTER TABLE wcf1_session_virtual ADD sessionVariables MEDIUMTEXT;
-
-DROP TABLE IF EXISTS wcf1_sitemap;
-
-ALTER TABLE wcf1_smiley ADD smileyPath2x VARCHAR(255) NOT NULL DEFAULT '';
-
-ALTER TABLE wcf1_style ADD packageName VARCHAR(255) NOT NULL DEFAULT '';
-ALTER TABLE wcf1_style ADD isTainted TINYINT(1) NOT NULL DEFAULT 0;
-
-ALTER TABLE wcf1_template_listener ADD permissions TEXT;
-ALTER TABLE wcf1_template_listener ADD options TEXT;
-
-ALTER TABLE wcf1_user CHANGE lostPasswordKey lostPasswordKey CHAR(40) DEFAULT NULL;
\ No newline at end of file
index 0d6ddcc823f1bd2f25cabaa17c3c5f1872d843ed..9d98bf1a1256a316fd39301b13a3d978ec550b56 100644 (file)
@@ -1,3 +1,20 @@
-ALTER TABLE wcf1_user DROP COLUMN signatureEnableBBCodes;
-ALTER TABLE wcf1_user DROP COLUMN signatureEnableSmilies;
-ALTER TABLE wcf1_user DROP COLUMN socialNetworkPrivacySettings;
+ALTER TABLE wcf1_session ADD pageID INT(10);
+ALTER TABLE wcf1_session ADD pageObjectID INT(10);
+ALTER TABLE wcf1_session ADD parentPageID INT(10);
+ALTER TABLE wcf1_session ADD parentPageObjectID INT(10);
+ALTER TABLE wcf1_session ADD KEY pageID (pageID, pageObjectID);
+ALTER TABLE wcf1_session ADD KEY parentPageID (parentPageID, parentPageObjectID);
+
+ALTER TABLE wcf1_session_virtual ADD sessionVariables MEDIUMTEXT;
+
+DROP TABLE IF EXISTS wcf1_sitemap;
+
+ALTER TABLE wcf1_smiley ADD smileyPath2x VARCHAR(255) NOT NULL DEFAULT '';
+
+ALTER TABLE wcf1_style ADD packageName VARCHAR(255) NOT NULL DEFAULT '';
+ALTER TABLE wcf1_style ADD isTainted TINYINT(1) NOT NULL DEFAULT 0;
+
+ALTER TABLE wcf1_template_listener ADD permissions TEXT;
+ALTER TABLE wcf1_template_listener ADD options TEXT;
+
+ALTER TABLE wcf1_user CHANGE lostPasswordKey lostPasswordKey CHAR(40) DEFAULT NULL;
index c48729f00458f3918976d64726338a8b9c68f9df..4414a25f8b67c8f4732ef6c367815756ea410671 100644 (file)
@@ -1,6 +1,3 @@
-ALTER TABLE wcf1_user_avatar DROP COLUMN cropX;
-ALTER TABLE wcf1_user_avatar DROP COLUMN cropY;
-
 ALTER TABLE wcf1_user_notification ADD KEY (confirmTime);
 
 DELETE FROM wcf1_user_profile_visitor WHERE userID IS NULL OR ownerID IS NULL;
diff --git a/wcfsetup/install/files/acp/update_com.woltlab.wcf_3.0_dropColumns.php b/wcfsetup/install/files/acp/update_com.woltlab.wcf_3.0_dropColumns.php
new file mode 100644 (file)
index 0000000..cac9ea3
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+use wcf\system\package\SplitNodeException;
+use wcf\system\WCF;
+use wcf\util\StringUtil;
+
+/**
+ * @author     Alexander Ebert
+ * @copyright  2001-2015 WoltLab GmbH
+ * @license    GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package    WoltLabSuite\Core
+ */
+$data = <<<DATA
+ALTER TABLE wcf1_session DROP COLUMN controller, DROP COLUMN parentObjectType, DROP COLUMN parentObjectID, DROP COLUMN objectType, DROP COLUMN objectID, DROP COLUMN sessionVariables;
+ALTER TABLE wcf1_user DROP COLUMN signatureEnableBBCodes, DROP COLUMN signatureEnableSmilies, DROP COLUMN socialNetworkPrivacySettings;
+ALTER TABLE wcf1_user_avatar DROP COLUMN cropX, DROP COLUMN cropY;
+DATA;
+
+$lines = explode("\n", StringUtil::trim($data));
+
+$rebuildData = WCF::getSession()->getVar('__wcfUpdateDropColumns');
+if ($rebuildData === null) {
+       $rebuildData = [
+               'i' => 0,
+               'max' => count($lines)
+       ];
+}
+
+// MySQL drops a column by creating a new table in the
+// background, copying over all data except from the
+// deleted column and uses this table afterwards.
+// 
+// Using a single `ALTER TABLE` to drop multiple columns
+// results in the same runtime, because copying the table
+// is what actually takes ages.
+$statement = WCF::getDB()->prepareStatement($lines[$rebuildData['i']]);
+$statement->execute();
+
+$rebuildData['i']++;
+
+if ($rebuildData['i'] === $rebuildData['max']) {
+       WCF::getSession()->unregister('__wcfUpdateDropColumns');
+}
+else {
+       WCF::getSession()->register('__wcfUpdateDropColumns', $rebuildData);
+       
+       // call this script again
+       throw new SplitNodeException();
+}