Merge maintenance-work branch:
[lhc/web/wiklou.git] / maintenance / nextJobDB.php
index 6af5cbe..fde6b49 100644 (file)
@@ -6,55 +6,71 @@
  * @ingroup Maintenance
  */
 
-$options = array( 'type'  );
+require_once( "Maintenance.php" );
 
-require_once( 'commandLine.inc' );
-
-$type = isset($options['type'])
-               ? $options['type']
-               : false;
-
-$mckey = $type === false
-            ? "jobqueue:dbs"
-            : "jobqueue:dbs:$type";
-
-$pendingDBs = $wgMemc->get( $mckey );
-if ( !$pendingDBs ) {
-       $pendingDBs = array();
-       # Cross-reference DBs by master DB server
-       $dbsByMaster = array();
-       foreach ( $wgLocalDatabases as $db ) {
-               $lb = wfGetLB( $db );
-               $dbsByMaster[$lb->getServerName(0)][] = $db;
+class nextJobDB extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Pick a database that has pending jobs";
+               $this->addParam( 'type', "The type of job to search for", false, true );
        }
-
-       foreach ( $dbsByMaster as $master => $dbs ) {
-               $dbConn = wfGetDB( DB_MASTER, array(), $dbs[0] );
-               $stype = $dbConn->addQuotes($type);
-
-               # Padding row for MySQL bug
-               $sql = "(SELECT '-------------------------------------------')";
-               foreach ( $dbs as $dbName ) {
-                       if ( $sql != '' ) {
-                               $sql .= ' UNION ';
-                       }
-                       if ($type === false)
-                               $sql .= "(SELECT '$dbName' FROM `$dbName`.job LIMIT 1)";
-                       else
-                               $sql .= "(SELECT '$dbName' FROM `$dbName`.job WHERE job_cmd=$stype LIMIT 1)";
+       public function execute() {
+               global $wgMemc;
+               $type = $this->getParam( 'type', false );
+               $mckey = $type === false
+                                       ? "jobqueue:dbs"
+                                       : "jobqueue:dbs:$type";
+               $pendingDBs = $wgMemcKey->get( $mckey );
+               
+               # If we didn't get it from the cache
+               if( !$pendingDBs ) {
+                       $pendingDBs = $this->getPendingDbs( $type );
+                       $wgMemc->get( $mckey, $pendingDBs, 300 )
                }
-               $res = $dbConn->query( $sql, 'nextJobDB.php' );
-               $row = $dbConn->fetchRow( $res ); // discard padding row
-               while ( $row = $dbConn->fetchRow( $res ) ) {
-                       $pendingDBs[] = $row[0];
+               # If we've got a pending job in a db, display it. 
+               if ( $pendingDBs ) {
+                       $this->output( $pendingDBs[mt_rand(0, count( $pendingDBs ) - 1)] );
+               }
+       }
+       
+       /**
+        * Get all databases that have a pending job
+        * @param $type String Job type
+        * @return array
+        */
+       private function getPendingDbs( $type ) {
+               $pendingDBs = array();
+               # Cross-reference DBs by master DB server
+               $dbsByMaster = array();
+               foreach ( $wgLocalDatabases as $db ) {
+                       $lb = wfGetLB( $db );
+                       $dbsByMaster[$lb->getServerName(0)][] = $db;
+               }
+       
+               foreach ( $dbsByMaster as $master => $dbs ) {
+                       $dbConn = wfGetDB( DB_MASTER, array(), $dbs[0] );
+                       $stype = $dbConn->addQuotes($type);
+                       $jobTable = $dbConn->getTable( 'job' );
+       
+                       # Padding row for MySQL bug
+                       $sql = "(SELECT '-------------------------------------------')";
+                       foreach ( $dbs as $dbName ) {
+                               if ( $sql != '' ) {
+                                       $sql .= ' UNION ';
+                               }
+                               if ($type === false)
+                                       $sql .= "(SELECT '$dbName' FROM `$dbName`.$jobTable LIMIT 1)";
+                               else
+                                       $sql .= "(SELECT '$dbName' FROM `$dbName`.$jobTable WHERE job_cmd=$stype LIMIT 1)";
+                       }
+                       $res = $dbConn->query( $sql, __METHOD__ );
+                       $row = $dbConn->fetchRow( $res ); // discard padding row
+                       while ( $row = $dbConn->fetchRow( $res ) ) {
+                               $pendingDBs[] = $row[0];
+                       }
                }
        }
-
-       $wgMemc->set( $mckey, $pendingDBs, 300 );
-}
-
-if ( $pendingDBs ) {
-       echo $pendingDBs[mt_rand(0, count( $pendingDBs ) - 1)];
 }
 
-
+$maintClass = "nextJobDb";
+require_once( DO_MAINTENANCE );