Merge "rdbms: fix Sqlite::tableExists() method to avoid STATUS_TRX_ERROR"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 3 Jul 2018 05:40:03 +0000 (05:40 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 3 Jul 2018 05:40:03 +0000 (05:40 +0000)
1  2 
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseSqlite.php

@@@ -1214,13 -1214,13 +1214,13 @@@ abstract class Database implements IDat
  
                $startTime = microtime( true );
                if ( $this->profiler ) {
 -                      call_user_func( [ $this->profiler, 'profileIn' ], $queryProf );
 +                      $this->profiler->profileIn( $queryProf );
                }
                $this->affectedRowCount = null;
                $ret = $this->doQuery( $commentedSql );
                $this->affectedRowCount = $this->affectedRows();
                if ( $this->profiler ) {
 -                      call_user_func( [ $this->profiler, 'profileOut' ], $queryProf );
 +                      $this->profiler->profileOut( $queryProf );
                }
                $queryRuntime = max( microtime( true ) - $startTime, 0.0 );
  
                }
        }
  
-       public function tableExists( $table, $fname = __METHOD__ ) {
-               $tableRaw = $this->tableName( $table, 'raw' );
-               if ( isset( $this->sessionTempTables[$tableRaw] ) ) {
-                       return true; // already known to exist
-               }
-               $table = $this->tableName( $table );
-               $ignoreErrors = true;
-               $res = $this->query( "SELECT 1 FROM $table LIMIT 1", $fname, $ignoreErrors );
-               return (bool)$res;
-       }
+       abstract public function tableExists( $table, $fname = __METHOD__ );
  
        public function indexUnique( $table, $index ) {
                $indexInfo = $this->indexInfo( $table, $index );
                $e = null;
                do {
                        try {
 -                              $retVal = call_user_func_array( $function, $args );
 +                              $retVal = $function( ...$args );
                                break;
                        } catch ( DBQueryError $e ) {
                                if ( $this->wasDeadlock() ) {
                        // No transaction is active nor will start implicitly, so make one for this callback
                        $this->startAtomic( __METHOD__, self::ATOMIC_CANCELABLE );
                        try {
 -                              call_user_func( $callback, $this );
 +                              $callback( $this );
                                $this->endAtomic( __METHOD__ );
                        } catch ( Exception $e ) {
                                $this->cancelAtomic( __METHOD__ );
                                try {
                                        ++$count;
                                        list( $phpCallback ) = $callback;
 -                                      call_user_func( $phpCallback, $this );
 +                                      $phpCallback( $this );
                                } catch ( Exception $ex ) {
 -                                      call_user_func( $this->errorLogger, $ex );
 +                                      $this->errorLogger( $ex );
                                        $e = $e ?: $ex;
                                }
                        }
                        try {
                                $phpCallback( $trigger, $this );
                        } catch ( Exception $ex ) {
 -                              call_user_func( $this->errorLogger, $ex );
 +                              ( $this->errorLogger )( $ex );
                                $e = $e ?: $ex;
                        }
                }
        ) {
                $sectionId = $this->startAtomic( $fname, $cancelable );
                try {
 -                      $res = call_user_func_array( $callback, [ $this, $fname ] );
 +                      $res = $callback( $this, $fname );
                } catch ( Exception $e ) {
                        $this->cancelAtomic( $fname, $sectionId );
  
                                $cmd = $this->replaceVars( $cmd );
  
                                if ( $inputCallback ) {
 -                                      $callbackResult = call_user_func( $inputCallback, $cmd );
 +                                      $callbackResult = $inputCallback( $cmd );
  
                                        if ( is_string( $callbackResult ) || !$callbackResult ) {
                                                $cmd = $callbackResult;
                                        $res = $this->query( $cmd, $fname );
  
                                        if ( $resultCallback ) {
 -                                              call_user_func( $resultCallback, $res, $this );
 +                                              $resultCallback( $res, $this );
                                        }
  
                                        if ( false === $res ) {
@@@ -519,6 -519,19 +519,19 @@@ class DatabaseSqlite extends Database 
                return $this->lastAffectedRowCount;
        }
  
+       function tableExists( $table, $fname = __METHOD__ ) {
+               $tableRaw = $this->tableName( $table, 'raw' );
+               if ( isset( $this->sessionTempTables[$tableRaw] ) ) {
+                       return true; // already known to exist
+               }
+               $encTable = $this->addQuotes( $tableRaw );
+               $res = $this->query(
+                       "SELECT 1 FROM sqlite_master WHERE type='table' AND name=$encTable" );
+               return $res->numRows() ? true : false;
+       }
        /**
         * Returns information about an index
         * Returns false if the index does not exist
                $args = func_get_args();
                $function = array_shift( $args );
  
 -              return call_user_func_array( $function, $args );
 +              return $function( ...$args );
        }
  
        /**