Fix sql.php --json behavior
authorGergő Tisza <tgr.huwiki@gmail.com>
Mon, 17 Dec 2018 05:06:32 +0000 (21:06 -0800)
committerGergő Tisza <tgr.huwiki@gmail.com>
Mon, 17 Dec 2018 05:09:17 +0000 (21:09 -0800)
* return empty array when the query had no result (instead of
  falling back into non-JSON mode)
* return JSON for write queries as well
* retain legacy behavior in non-JSON mode for empty SELECTs, just in
  case somebody relied on it

Change-Id: Iaefbb443650a395278d1cc9ab6aa668b13b217c9

maintenance/sql.php

index e8b7448..dba4a22 100644 (file)
@@ -177,19 +177,26 @@ class MwSql extends Maintenance {
                if ( !$res ) {
                        // Do nothing
                        return;
-               } elseif ( is_object( $res ) && $res->numRows() ) {
+               } 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" );
                } 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" );
+                       }
                }
        }