X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;ds=sidebyside;f=maintenance%2Fsql.php;h=dd05bbe4ad9d74e350082b23c6a6285f74a370c1;hb=fbc03474660e678e1e53705694f149d9ae32db6f;hp=a93e51fe5ace013278f008702b46dac388a35c18;hpb=0ea03a7f56070956838ab360a5dccc2a506fc4ff;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/sql.php b/maintenance/sql.php index a93e51fe5a..dd05bbe4ad 100644 --- a/maintenance/sql.php +++ b/maintenance/sql.php @@ -24,6 +24,10 @@ require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; +use Wikimedia\Rdbms\DBQueryError; + /** * Maintenance script that sends SQL queries from the specified file to the database. * @@ -32,59 +36,68 @@ require_once __DIR__ . '/Maintenance.php'; class MwSql extends Maintenance { public function __construct() { parent::__construct(); - $this->mDescription = "Send SQL queries to a MediaWiki database. " . - "Takes a file name containing SQL as argument or runs interactively."; - $this->addOption( 'query', 'Run a single query instead of running interactively', false, true ); + $this->addDescription( 'Send SQL queries to a MediaWiki database. ' . + 'Takes a file name containing SQL as argument or runs interactively.' ); + $this->addOption( 'query', + 'Run a single query instead of running interactively', false, true ); $this->addOption( 'cluster', 'Use an external cluster by name', false, true ); - $this->addOption( 'wikidb', 'The database wiki ID to use if not the current one', false, true ); - $this->addOption( 'slave', 'Use a slave server (either "any" or by name)', false, true ); + $this->addOption( 'wikidb', + 'The database wiki ID to use if not the current one', false, true ); + $this->addOption( 'replicadb', + 'Replica DB server to use instead of the master DB (can be "any")', false, true ); } public function execute() { + global $IP; + // We wan't to allow "" for the wikidb, meaning don't call select_db() $wiki = $this->hasOption( 'wikidb' ) ? $this->getOption( 'wikidb' ) : false; // Get the appropriate load balancer (for this wiki) if ( $this->hasOption( 'cluster' ) ) { - $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ), $wiki ); + $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ) ); } else { $lb = wfGetLB( $wiki ); } // Figure out which server to use - if ( $this->hasOption( 'slave' ) ) { - $server = $this->getOption( 'slave' ); - if ( $server === 'any' ) { - $index = DB_SLAVE; - } else { - $index = null; - $serverCount = $lb->getServerCount(); - for ( $i = 0; $i < $serverCount; ++$i ) { - if ( $lb->getServerName( $i ) === $server ) { - $index = $i; - break; - } - } - if ( $index === null ) { - $this->error( "No slave server configured with the name '$server'.", 1 ); + $replicaDB = $this->getOption( 'replicadb', $this->getOption( 'slave', '' ) ); + if ( $replicaDB === 'any' ) { + $index = DB_REPLICA; + } elseif ( $replicaDB != '' ) { + $index = null; + $serverCount = $lb->getServerCount(); + for ( $i = 0; $i < $serverCount; ++$i ) { + if ( $lb->getServerName( $i ) === $replicaDB ) { + $index = $i; + break; } } + if ( $index === null ) { + $this->fatalError( "No replica DB server configured with the name '$replicaDB'." ); + } } else { $index = DB_MASTER; } - // Get a DB handle (with this wiki's DB selected) from the appropriate load balancer - $db = $lb->getConnection( $index, array(), $wiki ); - if ( $this->hasOption( 'slave' ) && $db->getLBInfo( 'master' ) !== null ) { - $this->error( "The server selected ({$db->getServer()}) is not a slave.", 1 ); + + /** @var IDatabase $db DB handle for the appropriate cluster/wiki */ + $db = $lb->getConnection( $index, [], $wiki ); + if ( $replicaDB != '' && $db->getLBInfo( 'master' ) !== null ) { + $this->fatalError( "The server selected ({$db->getServer()}) is not a replica DB." ); + } + + if ( $index === DB_MASTER ) { + $updater = DatabaseUpdater::newForDB( $db, true, $this ); + $db->setSchemaVars( $updater->getSchemaVars() ); } if ( $this->hasArg( 0 ) ) { $file = fopen( $this->getArg( 0 ), 'r' ); if ( !$file ) { - $this->error( "Unable to open input file", true ); + $this->fatalError( "Unable to open input file" ); } - $error = $db->sourceStream( $file, false, array( $this, 'sqlPrintResult' ) ); + $error = $db->sourceStream( $file, null, [ $this, 'sqlPrintResult' ] ); if ( $error !== true ) { - $this->error( $error, true ); + $this->fatalError( $error ); } else { exit( 0 ); } @@ -97,14 +110,15 @@ class MwSql extends Maintenance { return; } - $useReadline = function_exists( 'readline_add_history' ) - && Maintenance::posix_isatty( 0 /*STDIN*/ ); - - if ( $useReadline ) { - global $IP; + if ( + function_exists( 'readline_add_history' ) && + Maintenance::posix_isatty( 0 /*STDIN*/ ) + ) { $historyFile = isset( $_ENV['HOME'] ) ? "{$_ENV['HOME']}/.mwsql_history" : "$IP/maintenance/.mwsql_history"; readline_read_history( $historyFile ); + } else { + $historyFile = null; } $wholeLine = ''; @@ -125,10 +139,10 @@ class MwSql extends Maintenance { $prompt = ' -> '; continue; } - if ( $useReadline ) { + if ( $historyFile ) { # Delimiter is eated by streamStatementEnd, we add it - # up in the history (bug 37020) - readline_add_history( $wholeLine . $db->getDelimiter() ); + # up in the history (T39020) + readline_add_history( $wholeLine . ';' ); readline_write_history( $historyFile ); } $this->sqlDoQuery( $db, $wholeLine, $doDie ); @@ -138,19 +152,23 @@ class MwSql extends Maintenance { wfWaitForSlaves(); } - protected function sqlDoQuery( $db, $line, $dieOnError ) { + protected function sqlDoQuery( IDatabase $db, $line, $dieOnError ) { try { $res = $db->query( $line ); $this->sqlPrintResult( $res, $db ); } catch ( DBQueryError $e ) { - $this->error( $e, $dieOnError ); + if ( $dieOnError ) { + $this->fatalError( $e ); + } else { + $this->error( $e ); + } } } /** * Print the results, callback for $db->sourceStream() - * @param ResultWrapper $res The results object - * @param DatabaseBase $db + * @param ResultWrapper|bool $res + * @param IDatabase $db */ public function sqlPrintResult( $res, $db ) { if ( !$res ) { @@ -174,5 +192,5 @@ class MwSql extends Maintenance { } } -$maintClass = "MwSql"; +$maintClass = MwSql::class; require_once RUN_MAINTENANCE_IF_MAIN;