Merge "[FileBackend] Clear swift connection on invalid HTTP responses."
[lhc/web/wiklou.git] / maintenance / sql.php
index 64ddc7a..04e98d9 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
-require_once( "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,38 +36,65 @@ class MwSql extends Maintenance {
        }
 
        public function execute() {
+               $dbw = wfGetDB( DB_MASTER );
                if ( $this->hasArg() ) {
                        $fileName = $this->getArg();
                        $file = fopen( $fileName, 'r' );
-                       $promptCallback = false;
-               } else {
-                       $file = $this->getStdin();
-                       $promptObject = new SqlPromptPrinter( "> " );
-                       $promptCallback = $promptObject->cb();
+                       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 );
+                       }
                }
-       
-               if ( !$file )
-                       $this->error( "Unable to open input file", true );
 
-               $dbw = wfGetDB( DB_MASTER );
-               $error = $dbw->sourceStream( $file, $promptCallback, array( $this, 'sqlPrintResult' ) );
-               if ( $error !== true ) {
-                       $this->error( $error, true );
-               } else {
-                       exit( 0 );
+               $useReadline = function_exists( 'readline_add_history' )
+                               && Maintenance::posix_isatty( 0 /*STDIN*/ );
+
+               if ( $useReadline ) {
+                       global $IP;
+                       $historyFile = isset( $_ENV['HOME'] ) ?
+                                       "{$_ENV['HOME']}/.mwsql_history" : "$IP/maintenance/.mwsql_history";
+                       readline_read_history( $historyFile );
+               }
+
+               $wholeLine = '';
+               while ( ( $line = Maintenance::readconsole() ) !== false ) {
+                       $done = $dbw->streamStatementEnd( $wholeLine, $line );
+
+                       $wholeLine .= $line;
+
+                       if ( !$done ) {
+                               continue;
+                       }
+                       if ( $useReadline ) {
+                               readline_add_history( $wholeLine );
+                               readline_write_history( $historyFile );
+                       }
+                       try{
+                               $res = $dbw->query( $wholeLine );
+                               $this->sqlPrintResult( $res, $dbw );
+                               $wholeLine = '';
+                       } catch (DBQueryError $e) {
+                               $this->error( $e, true );
+                       }
                }
        }
 
        /**
         * Print the results, callback for $db->sourceStream()
-        * @param $res The results object
-        * @param $db Database object
+        * @param $res ResultWrapper The results object
+        * @param $db DatabaseBase object
         */
        public function sqlPrintResult( $res, $db ) {
                if ( !$res ) {
                        // Do nothing
                } elseif ( is_object( $res ) && $res->numRows() ) {
-                       while ( $row = $res->fetchObject() ) {
+                       foreach ( $res as $row ) {
                                $this->output( print_r( $row, true ) );
                        }
                } else {
@@ -69,21 +102,14 @@ class MwSql extends Maintenance {
                        $this->output( "Query OK, $affected row(s) affected\n" );
                }
        }
-}
 
-class SqlPromptPrinter {
-       function __construct( $prompt ) {
-               $this->prompt = $prompt;
-       }
-
-       function cb() {
-               return array( $this, 'printPrompt' );
-       }
-
-       function printPrompt() {
-               echo $this->prompt;
+       /**
+        * @return int DB_TYPE constant
+        */
+       public function getDbType() {
+               return Maintenance::DB_ADMIN;
        }
 }
 
 $maintClass = "MwSql";
-require_once( DO_MAINTENANCE );
+require_once( RUN_MAINTENANCE_IF_MAIN );