Merge "SkinApiTemplate: Remove <span dir="auto"> for firstHeading"
[lhc/web/wiklou.git] / maintenance / purgeList.php
index 850d032..2e19630 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once( __DIR__ . '/Maintenance.php' );
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script that sends purge requests for listed pages to squid.
@@ -34,20 +34,27 @@ class PurgeList extends Maintenance {
                $this->mDescription = "Send purge requests for listed pages to squid";
                $this->addOption( 'purge', 'Whether to update page_touched.', false, false );
                $this->addOption( 'namespace', 'Namespace number', false, true );
+               $this->addOption( 'all', 'Purge all pages', false, false );
+               $this->addOption( 'delay', 'Number of seconds to delay between each purge', false, true );
+               $this->addOption( 'verbose', 'Show more output', false, false, 'v' );
                $this->setBatchSize( 100 );
        }
 
        public function execute() {
-               if( $this->hasOption( 'namespace' ) ) {
-                       $this->purgeNamespace();
+               if ( $this->hasOption( 'all' ) ) {
+                       $this->purgeNamespace( false );
+               } elseif ( $this->hasOption( 'namespace' ) ) {
+                       $this->purgeNamespace( intval( $this->getOption( 'namespace' ) ) );
                } else {
-                       $this->purgeList();
+                       $this->doPurge();
                }
                $this->output( "Done!\n" );
        }
 
-       /** Purge URL coming from stdin */
-       private function purgeList() {
+       /**
+        * Purge URL coming from stdin
+        */
+       private function doPurge() {
                $stdin = $this->getStdin();
                $urls = array();
 
@@ -58,7 +65,7 @@ class PurgeList extends Maintenance {
                        } elseif ( $page !== '' ) {
                                $title = Title::newFromText( $page );
                                if ( $title ) {
-                                       $url = $title->getInternalUrl();
+                                       $url = $title->getInternalURL();
                                        $this->output( "$url\n" );
                                        $urls[] = $url;
                                        if ( $this->getOption( 'purge' ) ) {
@@ -69,70 +76,72 @@ class PurgeList extends Maintenance {
                                }
                        }
                }
+               $this->output( "Purging " . count( $urls ) . " urls\n" );
                $this->sendPurgeRequest( $urls );
        }
 
-       /** Purge a namespace given by --namespace */
-       private function purgeNamespace() {
+       /**
+        * Purge a namespace or all pages
+        *
+        * @param int|bool $namespace
+        */
+       private function purgeNamespace( $namespace = false ) {
                $dbr = wfGetDB( DB_SLAVE );
-               $ns = $dbr->addQuotes( $this->getOption( 'namespace') );
-
-               $result = $dbr->select(
-                       array( 'page' ),
-                       array( 'page_namespace', 'page_title' ),
-                       array( "page_namespace = $ns" ),
-                       __METHOD__,
-                       array( 'ORDER BY' => 'page_id' )
-               );
-
-               $start   = 0;
-               $end = $result->numRows();
-               $this->output( "Will purge $end pages from namespace $ns\n" );
-
-               # Do remaining chunk
-               $end += $this->mBatchSize - 1;
-               $blockStart = $start;
-               $blockEnd = $start + $this->mBatchSize - 1;
-
-               while( $blockEnd <= $end ) {
-                       # Select pages we will purge:
-                       $result = $dbr->select(
-                               array( 'page' ),
-                               array( 'page_namespace', 'page_title' ),
-                               array( "page_namespace = $ns" ),
+               $startId = 0;
+               if ( $namespace === false ) {
+                       $conds = array();
+               } else {
+                       $conds = array( 'page_namespace' => $namespace );
+               }
+               while ( true ) {
+                       $res = $dbr->select( 'page',
+                               array( 'page_id', 'page_namespace', 'page_title' ),
+                               $conds + array( 'page_id > ' . $dbr->addQuotes( $startId ) ),
                                __METHOD__,
-                               array( # conditions
-                                       'ORDER BY' => 'page_id',
-                                       'LIMIT'    => $this->mBatchSize,
-                                       'OFFSET'   => $blockStart,
+                               array(
+                                       'LIMIT' => $this->mBatchSize,
+                                       'ORDER BY' => 'page_id'
+
                                )
                        );
-                       # Initialize/reset URLs to be purged
+                       if ( !$res->numRows() ) {
+                               break;
+                       }
                        $urls = array();
-                       foreach( $result as $row ) {
+                       foreach ( $res as $row ) {
                                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                               $url = $title->getInternalUrl();
+                               $url = $title->getInternalURL();
                                $urls[] = $url;
+                               $startId = $row->page_id;
                        }
-
                        $this->sendPurgeRequest( $urls );
-
-                       $blockStart += $this->mBatchSize;
-                       $blockEnd   += $this->mBatchSize;
                }
        }
 
        /**
         * Helper to purge an array of $urls
-        * @param $urls array List of URLS to purge from squids
+        * @param array $urls List of URLS to purge from squids
         */
        private function sendPurgeRequest( $urls ) {
-               $this->output( "Purging " . count( $urls ). " urls\n" );
-               $u = new SquidUpdate( $urls );
-               $u->doUpdate();
+               if ( $this->hasOption( 'delay' ) ) {
+                       $delay = floatval( $this->getOption( 'delay' ) );
+                       foreach ( $urls as $url ) {
+                               if ( $this->hasOption( 'verbose' ) ) {
+                                       $this->output( $url . "\n" );
+                               }
+                               $u = new SquidUpdate( array( $url ) );
+                               $u->doUpdate();
+                               usleep( $delay * 1e6 );
+                       }
+               } else {
+                       if ( $this->hasOption( 'verbose' ) ) {
+                               $this->output( implode( "\n", $urls ) . "\n" );
+                       }
+                       $u = new SquidUpdate( $urls );
+                       $u->doUpdate();
+               }
        }
-
 }
 
 $maintClass = "PurgeList";
-require_once( RUN_MAINTENANCE_IF_MAIN );
+require_once RUN_MAINTENANCE_IF_MAIN;