use MediaWiki\Storage\MutableRevisionRecord;
use MediaWiki\Storage\RevisionAccessException;
+use MediaWiki\Storage\RevisionFactory;
+use MediaWiki\Storage\RevisionLookup;
use MediaWiki\Storage\RevisionRecord;
use MediaWiki\Storage\RevisionStore;
use MediaWiki\Storage\RevisionStoreRecord;
return MediaWikiServices::getInstance()->getRevisionStore();
}
+ /**
+ * @return RevisionLookup
+ */
+ protected static function getRevisionLookup() {
+ return MediaWikiServices::getInstance()->getRevisionLookup();
+ }
+
+ /**
+ * @return RevisionFactory
+ */
+ protected static function getRevisionFactory() {
+ return MediaWikiServices::getInstance()->getRevisionFactory();
+ }
+
/**
* @param bool|string $wiki The ID of the target wiki database. Use false for the local wiki.
*
* @return Revision|null
*/
public static function newFromId( $id, $flags = 0 ) {
- $rec = self::getRevisionStore()->getRevisionById( $id, $flags );
+ $rec = self::getRevisionLookup()->getRevisionById( $id, $flags );
return $rec === null ? null : new Revision( $rec, $flags );
}
* @return Revision|null
*/
public static function newFromTitle( LinkTarget $linkTarget, $id = 0, $flags = 0 ) {
- $rec = self::getRevisionStore()->getRevisionByTitle( $linkTarget, $id, $flags );
+ $rec = self::getRevisionLookup()->getRevisionByTitle( $linkTarget, $id, $flags );
return $rec === null ? null : new Revision( $rec, $flags );
}
* @return Revision|null
*/
public static function newFromPageId( $pageId, $revId = 0, $flags = 0 ) {
- $rec = self::getRevisionStore()->getRevisionByPageId( $pageId, $revId, $flags );
+ $rec = self::getRevisionLookup()->getRevisionByPageId( $pageId, $revId, $flags );
return $rec === null ? null : new Revision( $rec, $flags );
}
}
}
- $rec = self::getRevisionStore()->newRevisionFromArchiveRow( $row, 0, $title, $overrides );
+ $rec = self::getRevisionFactory()->newRevisionFromArchiveRow( $row, 0, $title, $overrides );
return new Revision( $rec, self::READ_NORMAL, $title );
}
*/
public static function newFromRow( $row ) {
if ( is_array( $row ) ) {
- $rec = self::getRevisionStore()->newMutableRevisionFromArray( $row );
+ $rec = self::getRevisionFactory()->newMutableRevisionFromArray( $row );
} else {
- $rec = self::getRevisionStore()->newRevisionFromRow( $row );
+ $rec = self::getRevisionFactory()->newRevisionFromRow( $row );
}
return new Revision( $rec );
'rev_sha1',
];
- $fields += CommentStore::newKey( 'rev_comment' )->getFields();
+ $fields += CommentStore::getStore()->getFields( 'rev_comment' );
if ( $wgContentHandlerUseDB ) {
$fields[] = 'rev_content_format';
'ar_sha1',
];
- $fields += CommentStore::newKey( 'ar_comment' )->getFields();
+ $fields += CommentStore::getStore()->getFields( 'ar_comment' );
if ( $wgContentHandlerUseDB ) {
$fields[] = 'ar_content_format';
$row['user'] = $wgUser;
}
- $this->mRecord = self::getRevisionStore()->newMutableRevisionFromArray(
+ $this->mRecord = self::getRevisionFactory()->newMutableRevisionFromArray(
$row,
$queryFlags,
- $title
+ $this->ensureTitle( $row, $queryFlags, $title )
);
} elseif ( is_object( $row ) ) {
- $this->mRecord = self::getRevisionStore()->newRevisionFromRow(
+ $this->mRecord = self::getRevisionFactory()->newRevisionFromRow(
$row,
$queryFlags,
- $title
+ $this->ensureTitle( $row, $queryFlags, $title )
);
} else {
throw new InvalidArgumentException(
}
}
+ /**
+ * Make sure we have *some* Title object for use by the constructor.
+ * For B/C, the constructor shouldn't fail even for a bad page ID or bad revision ID.
+ *
+ * @param array|object $row
+ * @param int $queryFlags
+ * @param Title|null $title
+ *
+ * @return Title $title if not null, or a Title constructed from information in $row.
+ */
+ private function ensureTitle( $row, $queryFlags, $title = null ) {
+ if ( $title ) {
+ return $title;
+ }
+
+ if ( is_array( $row ) ) {
+ if ( isset( $row['title'] ) ) {
+ if ( !( $row['title'] instanceof Title ) ) {
+ throw new MWException( 'title field must contain a Title object.' );
+ }
+
+ return $row['title'];
+ }
+
+ $pageId = isset( $row['page'] ) ? $row['page'] : 0;
+ $revId = isset( $row['id'] ) ? $row['id'] : 0;
+ } else {
+ $pageId = isset( $row->rev_page ) ? $row->rev_page : 0;
+ $revId = isset( $row->rev_id ) ? $row->rev_id : 0;
+ }
+
+ try {
+ $title = self::getRevisionStore()->getTitle( $pageId, $revId, $queryFlags );
+ } catch ( RevisionAccessException $ex ) {
+ // construct a dummy title!
+ wfLogWarning( __METHOD__ . ': ' . $ex->getMessage() );
+
+ // NOTE: this Title will only be used inside RevisionRecord
+ $title = Title::makeTitleSafe( NS_SPECIAL, "Badtitle/ID=$pageId" );
+ $title->resetArticleID( $pageId );
+ }
+
+ return $title;
+ }
+
/**
* @return RevisionRecord
*/
/**
* Returns the length of the text in this revision, or null if unknown.
*
- * @return int
+ * @return int|null
*/
public function getSize() {
- return $this->mRecord->getSize();
+ try {
+ return $this->mRecord->getSize();
+ } catch ( RevisionAccessException $ex ) {
+ return null;
+ }
}
/**
* Returns the base36 sha1 of the content in this revision, or null if unknown.
*
- * @return string
+ * @return string|null
*/
public function getSha1() {
- // XXX: we may want to drop all the hashing logic, it's not worth the overhead.
- return $this->mRecord->getSha1();
+ try {
+ return $this->mRecord->getSha1();
+ } catch ( RevisionAccessException $ex ) {
+ return null;
+ }
}
/**
return $this->mRecord->getContent( 'main', $audience, $user );
}
catch ( RevisionAccessException $e ) {
+ wfDebugLog(
+ 'T184670',
+ __METHOD__ . ": Cannot get content: " . $e->getMessage() .
+ "\n" . $e->getTraceAsString()
+ );
return null;
}
}
* @return Revision|null
*/
public function getPrevious() {
- $rec = self::getRevisionStore()->getPreviousRevision( $this->mRecord );
- return $rec === null ? null : new Revision( $rec );
+ $title = $this->getTitle();
+ $rec = self::getRevisionLookup()->getPreviousRevision( $this->mRecord, $title );
+ return $rec === null ? null : new Revision( $rec, self::READ_NORMAL, $title );
}
/**
* @return Revision|null
*/
public function getNext() {
- $rec = self::getRevisionStore()->getNextRevision( $this->mRecord );
- return $rec === null ? null : new Revision( $rec );
+ $title = $this->getTitle();
+ $rec = self::getRevisionLookup()->getNextRevision( $this->mRecord, $title );
+ return $rec === null ? null : new Revision( $rec, self::READ_NORMAL, $title );
}
/**
$comment = CommentStoreComment::newUnsavedComment( $summary, null );
- $title = Title::newFromID( $pageId );
+ $title = Title::newFromID( $pageId, Title::GAID_FOR_UPDATE );
+ if ( $title === null ) {
+ return null;
+ }
+
$rec = self::getRevisionStore()->newNullRevision( $dbw, $title, $comment, $minor, $user );
return new Revision( $rec );
return false;
}
- $record = self::getRevisionStore()->getKnownCurrentRevision( $title, $revId );
+ $record = self::getRevisionLookup()->getKnownCurrentRevision( $title, $revId );
return $record ? new Revision( $record ) : false;
}
}