+ return Revision::newFromConds( $conds );
+ }
+
+ /**
+ * Load either the current, or a specified, revision
+ * that's attached to a given page ID.
+ * Returns null if no such revision can be found.
+ *
+ * @param $revId Integer
+ * @param $pageId Integer (optional)
+ * @return Revision or null
+ */
+ public static function newFromPageId( $pageId, $revId = 0 ) {
+ $conds = array( 'page_id' => $pageId );
+ if ( $revId ) {
+ $conds['rev_id'] = $revId;
+ } elseif ( wfGetLB()->getServerCount() > 1 ) {
+ // Get the latest revision ID from the master
+ $dbw = wfGetDB( DB_MASTER );
+ $latest = $dbw->selectField( 'page', 'page_latest', $conds, __METHOD__ );
+ if ( $latest === false ) {
+ return null; // page does not exist
+ }
+ $conds['rev_id'] = $latest;
+ } else {
+ $conds[] = 'rev_id = page_latest';
+ }
+ return Revision::newFromConds( $conds );
+ }
+
+ /**
+ * Make a fake revision object from an archive table row. This is queried
+ * for permissions or even inserted (as in Special:Undelete)
+ * @todo FIXME: Should be a subclass for RevisionDelete. [TS]
+ *
+ * @param $row
+ * @param $overrides array
+ *
+ * @return Revision
+ */
+ public static function newFromArchiveRow( $row, $overrides = array() ) {
+ $attribs = $overrides + array(
+ 'page' => isset( $row->ar_page_id ) ? $row->ar_page_id : null,
+ 'id' => isset( $row->ar_rev_id ) ? $row->ar_rev_id : null,
+ 'comment' => $row->ar_comment,
+ 'user' => $row->ar_user,
+ 'user_text' => $row->ar_user_text,
+ 'timestamp' => $row->ar_timestamp,
+ '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,
+ 'sha1' => isset( $row->ar_sha1 ) ? $row->ar_sha1 : null,
+ );
+ if ( isset( $row->ar_text ) && !$row->ar_text_id ) {
+ // Pre-1.5 ar_text row
+ $attribs['text'] = self::getRevisionText( $row, 'ar_' );
+ if ( $attribs['text'] === false ) {
+ throw new MWException( 'Unable to load text from archive row (possibly bug 22624)' );
+ }
+ }
+ return new self( $attribs );
+ }
+
+ /**
+ * @since 1.19
+ *
+ * @param $row
+ * @return Revision
+ */
+ public static function newFromRow( $row ) {
+ return new self( $row );