X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FRevision.php;h=3604b135415fb172a1742ae7e9a8b7112dde83f8;hb=b5ff68b4d9da06b3b133cd5e9690656387815d2b;hp=8009b816fb2971a5399dab692443ebba4a6bdaab;hpb=bbf11e8cf0dc77b11ef203c394f8b796439fab9e;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Revision.php b/includes/Revision.php index 8009b816fb..3604b13541 100644 --- a/includes/Revision.php +++ b/includes/Revision.php @@ -4,6 +4,23 @@ * @todo document */ class Revision { + protected $mId; + protected $mPage; + protected $mUserText; + protected $mOrigUserText; + protected $mUser; + protected $mMinorEdit; + protected $mTimestamp; + protected $mDeleted; + protected $mSize; + protected $mSha1; + protected $mParentId; + protected $mComment; + protected $mText; + protected $mTextRow; + protected $mTitle; + protected $mCurrent; + const DELETED_TEXT = 1; const DELETED_COMMENT = 2; const DELETED_USER = 4; @@ -106,7 +123,8 @@ class Revision { 'minor_edit' => $row->ar_minor_edit, 'text_id' => isset( $row->ar_text_id ) ? $row->ar_text_id : null, 'deleted' => $row->ar_deleted, - 'len' => $row->ar_len + 'len' => $row->ar_len, + 'sha1' => $row->ar_sha1 ); if ( isset( $row->ar_text ) && !$row->ar_text_id ) { // Pre-1.5 ar_text row @@ -276,11 +294,28 @@ class Revision { $conditions, __METHOD__, array( 'LIMIT' => 1 ), - array( 'page' => array( 'INNER JOIN', 'page_id = rev_page' ), - 'user' => array( 'LEFT JOIN', 'user_id = rev_user' ) ) + array( 'page' => self::pageJoinCond(), 'user' => self::userJoinCond() ) ); } + /** + * Return the value of a select() JOIN conds array for the user table. + * This will get user table rows for logged-in users. + * @return Array + */ + public static function userJoinCond() { + return array( 'LEFT JOIN', array( 'rev_user != 0', 'user_id = rev_user' ) ); + } + + /** + * Return the value of a select() page conds array for the paeg table. + * This will assure that the revision(s) are not orphaned from live pages. + * @return Array + */ + public static function pageJoinCond() { + return array( 'INNER JOIN', array( 'page_id = rev_page' ) ); + } + /** * Return the list of revision fields that should be selected to create * a new revision. @@ -297,7 +332,8 @@ class Revision { 'rev_minor_edit', 'rev_deleted', 'rev_len', - 'rev_parent_id' + 'rev_parent_id', + 'rev_sha1' ); } @@ -305,7 +341,7 @@ class Revision { * Return the list of text fields that should be selected to read the * revision text */ - static function selectTextFields() { + public static function selectTextFields() { return array( 'old_text', 'old_flags' @@ -315,7 +351,7 @@ class Revision { /** * Return the list of page fields that should be selected from page table */ - static function selectPageFields() { + public static function selectPageFields() { return array( 'page_namespace', 'page_title', @@ -326,8 +362,8 @@ class Revision { /** * Return the list of user fields that should be selected from user table */ - static function selectUserFields() { - return array( 'COALESCE(user_name,rev_user_text) AS rev_user_name' ); + public static function selectUserFields() { + return array( 'user_name' ); } /** @@ -348,7 +384,7 @@ class Revision { $this->mDeleted = intval( $row->rev_deleted ); if( !isset( $row->rev_parent_id ) ) { - $this->mParentId = is_null($row->rev_parent_id) ? null : 0; + $this->mParentId = is_null( $row->rev_parent_id ) ? null : 0; } else { $this->mParentId = intval( $row->rev_parent_id ); } @@ -359,6 +395,12 @@ class Revision { $this->mSize = intval( $row->rev_len ); } + if ( !isset( $row->rev_sha1 ) ) { + $this->mSha1 = null; + } else { + $this->mSha1 = $row->rev_sha1; + } + if( isset( $row->page_latest ) ) { $this->mCurrent = ( $row->rev_id == $row->page_latest ); $this->mTitle = Title::newFromRow( $row ); @@ -376,14 +418,17 @@ class Revision { $this->mTextRow = null; } - if ( isset( $row->rev_user_name ) ) { - $this->mUserText = $row->rev_user_name; // current user name - } else { // fallback to rev_user_text - $this->mUserText = $row->rev_user_text; // de-normalized + // Use user_name for users and rev_user_text for IPs... + $this->mUserText = null; // lazy load if left null + if ( $this->mUser == 0 ) { + $this->mUserText = $row->rev_user_text; // IP user + } elseif ( isset( $row->user_name ) ) { + $this->mUserText = $row->user_name; // logged-in user } + $this->mOrigUserText = $row->rev_user_text; } elseif( is_array( $row ) ) { // Build a new revision to be saved... - global $wgUser; + global $wgUser; // ugh $this->mId = isset( $row['id'] ) ? intval( $row['id'] ) : null; $this->mPage = isset( $row['page'] ) ? intval( $row['page'] ) : null; @@ -395,6 +440,7 @@ class Revision { $this->mDeleted = isset( $row['deleted'] ) ? intval( $row['deleted'] ) : 0; $this->mSize = isset( $row['len'] ) ? intval( $row['len'] ) : null; $this->mParentId = isset( $row['parent_id'] ) ? intval( $row['parent_id'] ) : null; + $this->mSha1 = isset( $row['sha1'] ) ? strval( $row['sha1'] ) : null; // Enforce spacing trimming on supplied text $this->mComment = isset( $row['comment'] ) ? trim( strval( $row['comment'] ) ) : null; @@ -403,9 +449,13 @@ class Revision { $this->mTitle = null; # Load on demand if needed $this->mCurrent = false; - # If we still have no len_size, see it we have the text to figure it out + # If we still have no length, see it we have the text to figure it out if ( !$this->mSize ) { - $this->mSize = is_null( $this->mText ) ? null : strlen( $this->mText ); + $this->mSize = is_null( $this->mText ) ? null : strlen( $this->mText ); + } + # Same for sha1 + if ( $this->mSha1 === null ) { + $this->mSha1 = is_null( $this->mText ) ? null : self::base36Sha1( $this->mText ); } } else { throw new MWException( 'Revision constructor passed invalid row format.' ); @@ -449,6 +499,15 @@ class Revision { return $this->mSize; } + /** + * Returns the base36 sha1 of the text in this revision, or null if unknown. + * + * @return String + */ + public function getSha1() { + return $this->mSha1; + } + /** * Returns the title of the page associated with this entry. * @@ -540,7 +599,7 @@ class Revision { } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_USER, $user ) ) { return ''; } else { - return $this->mUserText; + return $this->getRawUserText(); } } @@ -550,6 +609,14 @@ class Revision { * @return String */ public function getRawUserText() { + if ( $this->mUserText === null ) { + $this->mUserText = User::whoIs( $this->mUser ); // load on demand + if ( $this->mUserText === false ) { + # This shouldn't happen, but it can if the wiki was recovered + # via importing revs and there is no user table entry yet. + $this->mUserText = $this->mOrigUserText; + } + } return $this->mUserText; } @@ -911,8 +978,12 @@ class Revision { 'rev_timestamp' => $dbw->timestamp( $this->mTimestamp ), 'rev_deleted' => $this->mDeleted, 'rev_len' => $this->mSize, - 'rev_parent_id' => is_null($this->mParentId) ? - $this->getPreviousRevisionId( $dbw ) : $this->mParentId + 'rev_parent_id' => is_null( $this->mParentId ) + ? $this->getPreviousRevisionId( $dbw ) + : $this->mParentId, + 'rev_sha1' => is_null( $this->mSha1 ) + ? Revision::base36Sha1( $this->mText ) + : $this->mSha1 ), __METHOD__ ); @@ -924,6 +995,15 @@ class Revision { return $this->mId; } + /** + * Get the base 36 SHA-1 value for a string of text + * @param $text String + * @return String + */ + public static function base36Sha1( $text ) { + return wfBaseConvert( sha1( $text ), 16, 36, 31 ); + } + /** * Lazy-load the revision's text. * Currently hardcoded to the 'text' table storage engine. @@ -1003,7 +1083,7 @@ class Revision { $current = $dbw->selectRow( array( 'page', 'revision' ), - array( 'page_latest', 'rev_text_id', 'rev_len' ), + array( 'page_latest', 'rev_text_id', 'rev_len', 'rev_sha1' ), array( 'page_id' => $pageId, 'page_latest=rev_id', @@ -1017,7 +1097,8 @@ class Revision { 'minor_edit' => $minor, 'text_id' => $current->rev_text_id, 'parent_id' => $current->page_latest, - 'len' => $current->rev_len + 'len' => $current->rev_len, + 'sha1' => $current->rev_sha1 ) ); } else { $revision = null;