}
/**
- * @param bool|string $wikiId The ID of the target wiki database. Use false for the local wiki.
+ * @param bool|string $wiki The ID of the target wiki database. Use false for the local wiki.
*
* @return SqlBlobStore
*/
*
* @param int $id
* @param int $flags (optional)
- * @param Title $title (optional) If known you can pass the Title in here.
- * Passing no Title may result in another DB query if there are recent writes.
* @return Revision|null
*/
- public static function newFromId( $id, $flags = 0, Title $title = null ) {
- /**
- * MCR RevisionStore Compat
- *
- * If the title is not passed in as a param (already known) then select it here.
- *
- * Do the selection with MASTER if $flags includes READ_LATEST or recent changes
- * have happened on our load balancer.
- *
- * If we select the title here and pass it down it will results in fewer queries
- * further down the stack.
- */
- if ( !$title ) {
- if (
- $flags & self::READ_LATEST ||
- wfGetLB()->hasOrMadeRecentMasterChanges()
- ) {
- $dbr = wfGetDB( DB_MASTER );
- } else {
- $dbr = wfGetDB( DB_REPLICA );
- }
- $row = $dbr->selectRow(
- [ 'revision', 'page' ],
- [
- 'page_namespace',
- 'page_title',
- 'page_id',
- 'page_latest',
- 'page_is_redirect',
- 'page_len',
- ],
- [ 'rev_id' => $id ],
- __METHOD__,
- [],
- [ 'page' => [ 'JOIN', 'page_id=rev_page' ] ]
- );
- if ( $row ) {
- $title = Title::newFromRow( $row );
- }
- wfGetLB()->reuseConnection( $dbr );
- }
-
- $rec = self::getRevisionStore()->getRevisionById( $id, $flags, $title );
- return $rec === null ? null : new Revision( $rec, $flags, $title );
+ public static function newFromId( $id, $flags = 0 ) {
+ $rec = self::getRevisionStore()->getRevisionById( $id, $flags );
+ return $rec === null ? null : new Revision( $rec, $flags );
}
/**
*
* @param object $row
* @param array $overrides
- * @param Title $title (optional)
*
* @throws MWException
* @return Revision
*/
- public static function newFromArchiveRow( $row, $overrides = [], Title $title = null ) {
+ public static function newFromArchiveRow( $row, $overrides = [] ) {
/**
* MCR Migration: https://phabricator.wikimedia.org/T183564
* This method used to overwrite attributes, then passed to Revision::__construct
unset( $overrides['page'] );
}
+ /**
+ * We require a Title for both the Revision object and the RevisionRecord.
+ * Below is duplicated logic from RevisionStore::newRevisionFromArchiveRow
+ * to fetch a title in order pass it into the Revision object.
+ */
+ $title = null;
+ if ( isset( $overrides['title'] ) ) {
+ if ( !( $overrides['title'] instanceof Title ) ) {
+ throw new MWException( 'title field override must contain a Title object.' );
+ }
+
+ $title = $overrides['title'];
+ }
+ if ( $title !== null ) {
+ if ( isset( $row->ar_namespace ) && isset( $row->ar_title ) ) {
+ $title = Title::makeTitle( $row->ar_namespace, $row->ar_title );
+ } else {
+ throw new InvalidArgumentException(
+ 'A Title or ar_namespace and ar_title must be given'
+ );
+ }
+ }
+
$rec = self::getRevisionStore()->newRevisionFromArchiveRow( $row, 0, $title, $overrides );
return new Revision( $rec, self::READ_NORMAL, $title );
}
*
* MCR migration note: replaced by RevisionStore::newRevisionFromRow(). Note that
* newFromRow() also accepts arrays, while newRevisionFromRow() does not. Instead,
- * a MutableRevisionRecord should be constructed directly. RevisionStore::newRevisionFromArray()
- * can be used as a temporary replacement, but should be avoided.
+ * a MutableRevisionRecord should be constructed directly.
+ * RevisionStore::newMutableRevisionFromArray() can be used as a temporary replacement,
+ * but should be avoided.
*
* @param object|array $row
* @return Revision
* WARNING: Timestamps may in some circumstances not be unique,
* so this isn't the best key to use.
*
- * @deprecated since 1.31, use RevisionStore::loadRevisionFromTimestamp() instead.
+ * @deprecated since 1.31, use RevisionStore::getRevisionByTimestamp()
+ * or RevisionStore::loadRevisionFromTimestamp() instead.
*
* @param IDatabase $db
* @param Title $title
* @return Revision|null
*/
public static function loadFromTimestamp( $db, $title, $timestamp ) {
- // XXX: replace loadRevisionFromTimestamp by getRevisionByTimestamp?
$rec = self::getRevisionStore()->loadRevisionFromTimestamp( $db, $title, $timestamp );
return $rec === null ? null : new Revision( $rec );
}
/**
* Do a batched query to get the parent revision lengths
+ *
+ * @deprecated in 1.31, use RevisionStore::getRevisionSizes instead.
+ *
* @param IDatabase $db
* @param array $revIds
* @return array
if ( $row instanceof RevisionRecord ) {
$this->mRecord = $row;
} elseif ( is_array( $row ) ) {
+ // If no user is specified, fall back to using the global user object, to stay
+ // compatible with pre-1.31 behavior.
if ( !isset( $row['user'] ) && !isset( $row['user_text'] ) ) {
$row['user'] = $wgUser;
}
/**
* 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 int Rcid of the unpatrolled row, zero if there isn't one
*/
public function isUnpatrolled() {
- return self::getRevisionStore()->isUnpatrolled( $this->mRecord );
+ return self::getRevisionStore()->getRcIdIfUnpatrolled( $this->mRecord );
}
/**
* @return Revision|null
*/
public function getPrevious() {
- $rec = self::getRevisionStore()->getPreviousRevision( $this->mRecord, $this->getTitle() );
- return $rec === null
- ? null
- : new Revision( $rec, self::READ_NORMAL, $this->getTitle() );
+ $title = $this->getTitle();
+ $rec = self::getRevisionStore()->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, $this->getTitle() );
- return $rec === null
- ? null
- : new Revision( $rec, self::READ_NORMAL, $this->getTitle() );
+ $title = $this->getTitle();
+ $rec = self::getRevisionStore()->getNextRevision( $this->mRecord, $title );
+ return $rec === null ? null : new Revision( $rec, self::READ_NORMAL, $title );
}
/**
? $pageIdOrTitle
: Title::newFromID( $pageIdOrTitle );
+ if ( !$title ) {
+ return false;
+ }
+
$record = self::getRevisionStore()->getKnownCurrentRevision( $title, $revId );
return $record ? new Revision( $record ) : false;
}