Merge "Memcached PECL: Allow using binary protocol"
[lhc/web/wiklou.git] / includes / db / Database.php
index 6ddc9f7..e07836b 100644 (file)
@@ -198,6 +198,9 @@ abstract class DatabaseBase implements IDatabase {
        /** @var float UNIX timestamp */
        protected $lastPing = 0.0;
 
+       /** @var int[] Prior mFlags values */
+       private $priorFlags = [];
+
        /** @var TransactionProfiler */
        protected $trxProfiler;
 
@@ -430,14 +433,33 @@ abstract class DatabaseBase implements IDatabase {
                return $this->mOpened;
        }
 
-       public function setFlag( $flag ) {
+       public function setFlag( $flag, $remember = self::REMEMBER_NOTHING ) {
+               if ( $remember === self::REMEMBER_PRIOR ) {
+                       array_push( $this->priorFlags, $this->mFlags );
+               }
                $this->mFlags |= $flag;
        }
 
-       public function clearFlag( $flag ) {
+       public function clearFlag( $flag, $remember = self::REMEMBER_NOTHING ) {
+               if ( $remember === self::REMEMBER_PRIOR ) {
+                       array_push( $this->priorFlags, $this->mFlags );
+               }
                $this->mFlags &= ~$flag;
        }
 
+       public function restoreFlags( $state = self::RESTORE_PRIOR ) {
+               if ( !$this->priorFlags ) {
+                       return;
+               }
+
+               if ( $state === self::RESTORE_INITIAL ) {
+                       $this->mFlags = reset( $this->priorFlags );
+                       $this->priorFlags = [];
+               } else {
+                       $this->mFlags = array_pop( $this->priorFlags );
+               }
+       }
+
        public function getFlag( $flag ) {
                return !!( $this->mFlags & $flag );
        }
@@ -2950,13 +2972,14 @@ abstract class DatabaseBase implements IDatabase {
                if ( $this->isOpen() && ( microtime( true ) - $this->lastPing ) < self::PING_TTL ) {
                        return true;
                }
-               try {
-                       // This will reconnect if possible, or error out if not
-                       $this->query( "SELECT 1 AS ping", __METHOD__ );
-                       return true;
-               } catch ( DBError $e ) {
-                       return false;
-               }
+
+               $ignoreErrors = true;
+               $this->clearFlag( DBO_TRX, self::REMEMBER_PRIOR );
+               // This will reconnect if possible or return false if not
+               $ok = (bool)$this->query( "SELECT 1 AS ping", __METHOD__, $ignoreErrors );
+               $this->restoreFlags( self::RESTORE_PRIOR );
+
+               return $ok;
        }
 
        /**