$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 );
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;
}
$newPrompt = '> ';
$prompt = $newPrompt;
$doDie = !Maintenance::posix_isatty( 0 );
+ $res = 1;
while ( ( $line = Maintenance::readconsole( $prompt ) ) !== false ) {
if ( !$line ) {
# User simply pressed return key
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 );
$this->error( $e );
}
}
+ return null;
}
/**
* Print the results, callback for $db->sourceStream()
* @param ResultWrapper|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;
+ return null;
} elseif ( is_object( $res ) ) {
$out = '';
$rows = [];
$out = 'Query OK, 0 row(s) affected';
}
$this->output( $out . "\n" );
+ return count( $rows );
} else {
$affected = $db->affectedRows();
if ( $this->hasOption( 'json' ) ) {
} else {
$this->output( "Query OK, $affected row(s) affected\n" );
}
+ return $affected;
}
}