Re-add maintenance script from r75555, not totally broken this time
authorRoan Kattouw <catrope@users.mediawiki.org>
Wed, 27 Oct 2010 20:08:04 +0000 (20:08 +0000)
committerRoan Kattouw <catrope@users.mediawiki.org>
Wed, 27 Oct 2010 20:08:04 +0000 (20:08 +0000)
maintenance/cleanupRemovedModules.php [new file with mode: 0644]

diff --git a/maintenance/cleanupRemovedModules.php b/maintenance/cleanupRemovedModules.php
new file mode 100644 (file)
index 0000000..68a6613
--- /dev/null
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Maintenance script to create an account and grant it administrator rights
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ * @author Rob Church <robchur@gmail.com>
+ */
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+class CleanupRemovedModules extends Maintenance {
+
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Remove cache entries for removed ResourceLoader modules from the database';
+               $this->addOption( 'batchsize', 'Delete rows in batches of this size. Default: 500', false, true );
+               $this->addOption( 'max-slave-lag', 'If the slave lag exceeds this many seconds, wait until it drops below this value. Default: 5', false, true );
+       }
+
+       public function execute() {
+               $dbw = wfGetDB( DB_MASTER );
+               $rl = new ResourceLoader();
+               $moduleNames = array_keys( $rl->getModules() );
+               $moduleList = implode( ', ', array_map( array( $dbw, 'addQuotes' ), $moduleNames ) );
+               $limit = max( 1, intval( $this->getOption( 'batchsize', 500 ) ) );
+               $maxlag = intval( $this->getOption( 'max-slave-lag', 5 ) );
+               
+               $this->output( "Cleaning up module_deps table...\n" );
+               $i = 1;
+               do {
+                       // $dbw->delete() doesn't support LIMIT :(
+                       $where = $moduleList ? "md_module NOT IN ($moduleList)" : '1=1';
+                       $dbw->query( "DELETE FROM module_deps WHERE $where LIMIT $limit", __METHOD__ );
+                       $numRows = $dbw->affectedRows();
+                       $this->output( "Batch $i: $numRows rows\n" );
+                       $i++;
+                       wfWaitForSlaves( $maxlag );
+               } while( $numRows > 0 );
+               $this->output( "done\n" );
+               
+               $this->output( "Cleaning up msg_resource table...\n" );
+               $i = 1;
+               do {
+                       $where = $moduleList ? "mr_resource NOT IN ($moduleList)" : '1=1';
+                       $dbw->query( "DELETE FROM msg_resource WHERE $where LIMIT $limit", __METHOD__ );
+                       $numRows = $dbw->affectedRows();
+                       $this->output( "Batch $i: $numRows rows\n" );
+                       $i++;
+                       wfWaitForSlaves( $maxlag );
+               } while( $numRows > 0 );
+               $this->output( "done\n" );
+               
+               $this->output( "Cleaning up msg_resource_links table...\n" );
+               $i = 1;
+               do {
+                       $where = $moduleList ? "mrl_resource NOT IN ($moduleList)" : '1=1';
+                       $dbw->query( "DELETE FROM msg_resource_links WHERE $where LIMIT $limit", __METHOD__ );
+                       $numRows = $dbw->affectedRows();
+                       $this->output( "Batch $i: $numRows rows\n" );
+                       $i++;
+                       wfWaitForSlaves( $maxlag );
+               } while( $numRows > 0 );
+               $this->output( "done\n" );
+       }
+}
+
+$maintClass = "CleanupRemovedModules";
+require_once( DO_MAINTENANCE );
\ No newline at end of file