MediaWiki  REL1_20
SqlDataUpdate.php
Go to the documentation of this file.
00001 <?php
00033 abstract class SqlDataUpdate extends DataUpdate {
00034 
00035         protected $mDb;            
00036         protected $mOptions;       
00037 
00038         private   $mHasTransaction; 
00039         protected $mUseTransaction; 
00040 
00048         public function __construct( $withTransaction = true ) {
00049                 global $wgAntiLockFlags;
00050 
00051                 parent::__construct( );
00052 
00053                 if ( $wgAntiLockFlags & ALF_NO_LINK_LOCK ) {
00054                         $this->mOptions = array();
00055                 } else {
00056                         $this->mOptions = array( 'FOR UPDATE' );
00057                 }
00058 
00059                 // @todo: get connection only when it's needed? make sure that doesn't break anything, especially transactions!
00060                 $this->mDb = wfGetDB( DB_MASTER );
00061 
00062                 $this->mWithTransaction = $withTransaction;
00063                 $this->mHasTransaction = false;
00064         }
00065 
00072         public function beginTransaction() {
00073                 if ( !$this->mWithTransaction ) {
00074                         return;
00075                 }
00076 
00077                 // NOTE: nested transactions are not supported, only start a transaction if none is open
00078                 if ( $this->mDb->trxLevel() === 0 ) {
00079                         $this->mDb->begin( get_class( $this ) . '::beginTransaction'  );
00080                         $this->mHasTransaction = true;
00081                 }
00082         }
00083 
00087         public function commitTransaction() {
00088                 if ( $this->mHasTransaction ) {
00089                         $this->mDb->commit( get_class( $this ) . '::commitTransaction' );
00090                         $this->mHasTransaction = false;
00091                 }
00092         }
00093 
00097         public function abortTransaction() {
00098                 if ( $this->mHasTransaction ) {
00099                         $this->mDb->rollback( get_class( $this ) . '::abortTransaction' );
00100                         $this->mHasTransaction = false;
00101                 }
00102         }
00103 
00111         protected function invalidatePages( $namespace, Array $dbkeys ) {
00112                 if ( !count( $dbkeys ) ) {
00113                         return;
00114                 }
00115 
00121                 $now = $this->mDb->timestamp();
00122                 $ids = array();
00123                 $res = $this->mDb->select( 'page', array( 'page_id' ),
00124                         array(
00125                                 'page_namespace' => $namespace,
00126                                 'page_title' => $dbkeys,
00127                                 'page_touched < ' . $this->mDb->addQuotes( $now )
00128                         ), __METHOD__
00129                 );
00130                 foreach ( $res as $row ) {
00131                         $ids[] = $row->page_id;
00132                 }
00133                 if ( !count( $ids ) ) {
00134                         return;
00135                 }
00136 
00142                 $this->mDb->update( 'page', array( 'page_touched' => $now ),
00143                         array(
00144                                 'page_id' => $ids,
00145                                 'page_touched < ' . $this->mDb->addQuotes( $now )
00146                         ), __METHOD__
00147                 );
00148         }
00149 
00150 }