From 01ef30fcc4952560eaaf6d17567ff0b763c3586f Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Sat, 3 Oct 2015 16:30:13 -0700 Subject: [PATCH] Converted DatabaseBase::mTrxAtomicLevels to an array * This simplifies the code and cleans up __construct() a bit while also making it less likely to cause trouble with unit testing mocks. * Also add a sanity mTrxLevel check around usage of mTrxAtomicLevels in the one place it was missing Change-Id: Ia0a7f22f5c27b3d4d8b51e04629f42a1ed9c3993 --- includes/db/Database.php | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/includes/db/Database.php b/includes/db/Database.php index 4bbb4915a3..05d1934797 100644 --- a/includes/db/Database.php +++ b/includes/db/Database.php @@ -124,9 +124,9 @@ abstract class DatabaseBase implements IDatabase { /** * Array of levels of atomicity within transactions * - * @var SplStack + * @var array */ - private $mTrxAtomicLevels; + private $mTrxAtomicLevels = array(); /** * Record if the current transaction was started implicitly by DatabaseBase::startAtomic @@ -609,8 +609,6 @@ abstract class DatabaseBase implements IDatabase { function __construct( array $params ) { global $wgDBprefix, $wgDBmwschema, $wgCommandLineMode, $wgDebugDBTransactions; - $this->mTrxAtomicLevels = new SplStack; - $server = $params['host']; $user = $params['user']; $password = $params['password']; @@ -3395,7 +3393,7 @@ abstract class DatabaseBase implements IDatabase { } } - $this->mTrxAtomicLevels->push( $fname ); + $this->mTrxAtomicLevels[] = $fname; } /** @@ -3413,13 +3411,13 @@ abstract class DatabaseBase implements IDatabase { if ( !$this->mTrxLevel ) { throw new DBUnexpectedError( $this, 'No atomic transaction is open.' ); } - if ( $this->mTrxAtomicLevels->isEmpty() || - $this->mTrxAtomicLevels->pop() !== $fname + if ( !$this->mTrxAtomicLevels || + array_pop( $this->mTrxAtomicLevels ) !== $fname ) { throw new DBUnexpectedError( $this, 'Invalid atomic section ended.' ); } - if ( $this->mTrxAtomicLevels->isEmpty() && $this->mTrxAutomaticAtomic ) { + if ( !$this->mTrxAtomicLevels && $this->mTrxAutomaticAtomic ) { $this->commit( $fname, 'flush' ); } } @@ -3443,7 +3441,7 @@ abstract class DatabaseBase implements IDatabase { global $wgDebugDBTransactions; if ( $this->mTrxLevel ) { // implicit commit - if ( !$this->mTrxAtomicLevels->isEmpty() ) { + if ( $this->mTrxAtomicLevels ) { // If the current transaction was an automatic atomic one, then we definitely have // a problem. Same if there is any unclosed atomic level. throw new DBUnexpectedError( $this, @@ -3491,7 +3489,7 @@ abstract class DatabaseBase implements IDatabase { $this->mTrxDoneWrites = false; $this->mTrxAutomatic = false; $this->mTrxAutomaticAtomic = false; - $this->mTrxAtomicLevels = new SplStack; + $this->mTrxAtomicLevels = array(); $this->mTrxIdleCallbacks = array(); $this->mTrxPreCommitCallbacks = array(); $this->mTrxShortId = wfRandomString( 12 ); @@ -3524,7 +3522,7 @@ abstract class DatabaseBase implements IDatabase { * @throws DBUnexpectedError */ final public function commit( $fname = __METHOD__, $flush = '' ) { - if ( !$this->mTrxAtomicLevels->isEmpty() ) { + if ( $this->mTrxLevel && $this->mTrxAtomicLevels ) { // There are still atomic sections open. This cannot be ignored throw new DBUnexpectedError( $this, @@ -3610,7 +3608,7 @@ abstract class DatabaseBase implements IDatabase { $this->doRollback( $fname ); $this->mTrxIdleCallbacks = array(); // cancel $this->mTrxPreCommitCallbacks = array(); // cancel - $this->mTrxAtomicLevels = new SplStack; + $this->mTrxAtomicLevels = array(); if ( $this->mTrxDoneWrites ) { $this->getTransactionProfiler()->transactionWritingOut( $this->mServer, $this->mDBname, $this->mTrxShortId ); -- 2.20.1