Merge "worthwhile tests in testTitleObjectStringConversion"
[lhc/web/wiklou.git] / maintenance / sql.php
index a5c7314..72e6775 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+require_once( __DIR__ . '/Maintenance.php' );
 
+/**
+ * Maintenance script that sends SQL queries from the specified file to the database.
+ *
+ * @ingroup Maintenance
+ */
 class MwSql extends Maintenance {
        public function __construct() {
                parent::__construct();
@@ -30,15 +36,20 @@ class MwSql extends Maintenance {
        }
 
        public function execute() {
+               $dbw = wfGetDB( DB_MASTER );
                if ( $this->hasArg() ) {
                        $fileName = $this->getArg();
                        $file = fopen( $fileName, 'r' );
-               } else {
-                       $file = $this->getStdin();
-               }
+                       if ( !$file ) {
+                               $this->error( "Unable to open input file", true );
+                       }
 
-               if ( !$file ) {
-                       $this->error( "Unable to open input file", true );
+                       $error = $dbw->sourceStream( $file, false, array( $this, 'sqlPrintResult' ) );
+                       if ( $error !== true ) {
+                               $this->error( $error, true );
+                       } else {
+                               exit( 0 );
+                       }
                }
 
                $useReadline = function_exists( 'readline_add_history' )
@@ -51,26 +62,37 @@ class MwSql extends Maintenance {
                        readline_read_history( $historyFile );
                }
 
-               $dbw = wfGetDB( DB_MASTER );
                $wholeLine = '';
-               while ( ( $line = Maintenance::readconsole() ) !== false ) {
+               $newPrompt = '> ';
+               $prompt    = $newPrompt;
+               while ( ( $line = Maintenance::readconsole( $prompt ) ) !== false ) {
+                       if( !$line ) {
+                               # User simply pressed return key
+                               continue;
+                       }
                        $done = $dbw->streamStatementEnd( $wholeLine, $line );
 
                        $wholeLine .= $line;
 
                        if ( !$done ) {
+                               $wholeLine .= ' ';
+                               $prompt = '    -> ';
                                continue;
                        }
                        if ( $useReadline ) {
-                               readline_add_history( $wholeLine );
+                               # Delimiter is eated by streamStatementEnd, we add it
+                               # up in the history (bug 37020)
+                               readline_add_history( $wholeLine . $dbw->getDelimiter() );
                                readline_write_history( $historyFile );
                        }
                        try{
                                $res = $dbw->query( $wholeLine );
                                $this->sqlPrintResult( $res, $dbw );
+                               $prompt    = $newPrompt;
                                $wholeLine = '';
                        } catch (DBQueryError $e) {
-                               $this->error( $e, true );
+                               $doDie = ! Maintenance::posix_isatty( 0 );
+                               $this->error( $e, $doDie );
                        }
                }
        }