X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=maintenance%2Fsql.php;h=3b0607f5fcbc8f1fed878d34d9f0f1e40e19f636;hp=e8b744810461913cfada845a0f7d97aff7480306;hb=e90012d5581801045910f31ddefa9aee52e39d39;hpb=e626f8266eca6729e16fdac9e616c1e441d3013d diff --git a/maintenance/sql.php b/maintenance/sql.php index e8b7448104..3b0607f5fc 100644 --- a/maintenance/sql.php +++ b/maintenance/sql.php @@ -25,7 +25,7 @@ require_once __DIR__ . '/Maintenance.php'; use MediaWiki\MediaWikiServices; -use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IResultWrapper; use Wikimedia\Rdbms\IDatabase; use Wikimedia\Rdbms\DBQueryError; @@ -42,6 +42,8 @@ class MwSql extends Maintenance { $this->addOption( 'query', 'Run a single query instead of running interactively', false, true ); $this->addOption( 'json', 'Output the results as JSON instead of PHP objects' ); + $this->addOption( 'status', 'Return successful exit status only if the query succeeded ' + . '(selected or altered rows), otherwise 1 for errors, 2 for no rows' ); $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 ); @@ -108,8 +110,11 @@ class MwSql extends Maintenance { if ( $this->hasOption( 'query' ) ) { $query = $this->getOption( 'query' ); - $this->sqlDoQuery( $db, $query, /* dieOnError */ true ); + $res = $this->sqlDoQuery( $db, $query, /* dieOnError */ true ); wfWaitForSlaves(); + if ( $this->hasOption( 'status' ) ) { + exit( $res ? 0 : 2 ); + } return; } @@ -128,6 +133,7 @@ class MwSql extends Maintenance { $newPrompt = '> '; $prompt = $newPrompt; $doDie = !Maintenance::posix_isatty( 0 ); + $res = 1; while ( ( $line = Maintenance::readconsole( $prompt ) ) !== false ) { if ( !$line ) { # User simply pressed return key @@ -148,17 +154,26 @@ class MwSql extends Maintenance { readline_add_history( $wholeLine . ';' ); readline_write_history( $historyFile ); } - $this->sqlDoQuery( $db, $wholeLine, $doDie ); + $res = $this->sqlDoQuery( $db, $wholeLine, $doDie ); $prompt = $newPrompt; $wholeLine = ''; } wfWaitForSlaves(); + if ( $this->hasOption( 'status' ) ) { + exit( $res ? 0 : 2 ); + } } + /** + * @param IDatabase $db + * @param string $line The SQL text of the query + * @param bool $dieOnError + * @return int|null Number of rows selected or updated, or null if the query was unsuccessful. + */ protected function sqlDoQuery( IDatabase $db, $line, $dieOnError ) { try { $res = $db->query( $line ); - $this->sqlPrintResult( $res, $db ); + return $this->sqlPrintResult( $res, $db ); } catch ( DBQueryError $e ) { if ( $dieOnError ) { $this->fatalError( $e ); @@ -166,30 +181,41 @@ class MwSql extends Maintenance { $this->error( $e ); } } + return null; } /** * Print the results, callback for $db->sourceStream() - * @param ResultWrapper|bool $res + * @param IResultWrapper|bool $res * @param IDatabase $db + * @return int|null Number of rows selected or updated, or null if the query was unsuccessful. */ public function sqlPrintResult( $res, $db ) { if ( !$res ) { // Do nothing - return; - } elseif ( is_object( $res ) && $res->numRows() ) { + return null; + } elseif ( is_object( $res ) ) { $out = ''; + $rows = []; foreach ( $res as $row ) { $out .= print_r( $row, true ); $rows[] = $row; } if ( $this->hasOption( 'json' ) ) { $out = json_encode( $rows, JSON_PRETTY_PRINT ); + } elseif ( !$rows ) { + $out = 'Query OK, 0 row(s) affected'; } $this->output( $out . "\n" ); + return count( $rows ); } else { $affected = $db->affectedRows(); - $this->output( "Query OK, $affected row(s) affected\n" ); + if ( $this->hasOption( 'json' ) ) { + $this->output( json_encode( [ 'affected' => $affected ], JSON_PRETTY_PRINT ) . "\n" ); + } else { + $this->output( "Query OK, $affected row(s) affected\n" ); + } + return $affected; } }