[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/includes/deferred/ -> DataUpdate.php (source)

   1  <?php
   2  /**
   3   * Base code for update jobs that do something with some secondary
   4   * data extracted from article.
   5   *
   6   * This program is free software; you can redistribute it and/or modify
   7   * it under the terms of the GNU General Public License as published by
   8   * the Free Software Foundation; either version 2 of the License, or
   9   * (at your option) any later version.
  10   *
  11   * This program is distributed in the hope that it will be useful,
  12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14   * GNU General Public License for more details.
  15   *
  16   * You should have received a copy of the GNU General Public License along
  17   * with this program; if not, write to the Free Software Foundation, Inc.,
  18   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19   * http://www.gnu.org/copyleft/gpl.html
  20   *
  21   * @file
  22   */
  23  
  24  /**
  25   * Abstract base class for update jobs that do something with some secondary
  26   * data extracted from article.
  27   *
  28   * @note subclasses should NOT start or commit transactions in their doUpdate() method,
  29   *       a transaction will automatically be wrapped around the update. If need be,
  30   *       subclasses can override the beginTransaction() and commitTransaction() methods.
  31   */
  32  abstract class DataUpdate implements DeferrableUpdate {
  33      /**
  34       * Constructor
  35       */
  36  	public function __construct() {
  37          # noop
  38      }
  39  
  40      /**
  41       * Begin an appropriate transaction, if any.
  42       * This default implementation does nothing.
  43       */
  44  	public function beginTransaction() {
  45          //noop
  46      }
  47  
  48      /**
  49       * Commit the transaction started via beginTransaction, if any.
  50       * This default implementation does nothing.
  51       */
  52  	public function commitTransaction() {
  53          //noop
  54      }
  55  
  56      /**
  57       * Abort / roll back the transaction started via beginTransaction, if any.
  58       * This default implementation does nothing.
  59       */
  60  	public function rollbackTransaction() {
  61          //noop
  62      }
  63  
  64      /**
  65       * Convenience method, calls doUpdate() on every DataUpdate in the array.
  66       *
  67       * This methods supports transactions logic by first calling beginTransaction()
  68       * on all updates in the array, then calling doUpdate() on each, and, if all goes well,
  69       * then calling commitTransaction() on each update. If an error occurs,
  70       * rollbackTransaction() will be called on any update object that had beginTransaction()
  71       * called but not yet commitTransaction().
  72       *
  73       * This allows for limited transactional logic across multiple backends for storing
  74       * secondary data.
  75       *
  76       * @param array $updates A list of DataUpdate instances
  77       * @throws Exception|null
  78       */
  79  	public static function runUpdates( $updates ) {
  80          if ( empty( $updates ) ) {
  81              return; # nothing to do
  82          }
  83  
  84          $open_transactions = array();
  85          $exception = null;
  86  
  87          /**
  88           * @var $update DataUpdate
  89           * @var $trans DataUpdate
  90           */
  91  
  92          try {
  93              // begin transactions
  94              foreach ( $updates as $update ) {
  95                  $update->beginTransaction();
  96                  $open_transactions[] = $update;
  97              }
  98  
  99              // do work
 100              foreach ( $updates as $update ) {
 101                  $update->doUpdate();
 102              }
 103  
 104              // commit transactions
 105              while ( count( $open_transactions ) > 0 ) {
 106                  $trans = array_pop( $open_transactions );
 107                  $trans->commitTransaction();
 108              }
 109          } catch ( Exception $ex ) {
 110              $exception = $ex;
 111              wfDebug( "Caught exception, will rethrow after rollback: " .
 112                  $ex->getMessage() . "\n" );
 113          }
 114  
 115          // rollback remaining transactions
 116          while ( count( $open_transactions ) > 0 ) {
 117              $trans = array_pop( $open_transactions );
 118              $trans->rollbackTransaction();
 119          }
 120  
 121          if ( $exception ) {
 122              throw $exception; // rethrow after cleanup
 123          }
 124      }
 125  }


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1