// Get the latest revision ID from the master
$dbw = wfGetDB( DB_MASTER );
$latest = $dbw->selectField( 'page', 'page_latest', $conds, __METHOD__ );
+ if ( $latest === false ) {
+ // Page does not exist
+ return null;
+ }
$conds['rev_id'] = $latest;
} else {
// Use a join to get the latest revision
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)
+ * @fixme: should be a subclass for RevisionDelete. [TS]
+ */
+ public static function newFromArchiveRow( $row, $overrides = array() ) {
+ $attribs = $overrides + array(
+ 'page' => isset( $row->page_id ) ? $row->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);
+ if ( isset( $row->ar_text ) && !$row->ar_text_id ) {
+ // Pre-1.5 ar_text row
+ $attribs['text'] = $row->ar_text;
+ }
+ return new self( $attribs );
+ }
+
/**
* Load a page revision from a given revision ID number.
* Returns null if no such revision can be found.
return $ret;
}
- /**
- * Return a wrapper for a series of database rows to
- * fetch all of a given page's revisions in turn.
- * Each row can be fed to the constructor to get objects.
- *
- * @param Title $title
- * @return ResultWrapper
- * @access public
- * @static
- */
- public static function fetchAllRevisions( $title ) {
- return Revision::fetchFromConds(
- wfGetDB( DB_SLAVE ),
- array( 'page_namespace' => $title->getNamespace(),
- 'page_title' => $title->getDBkey(),
- 'page_id=rev_page' ) );
- }
-
/**
* Return a wrapper for a series of database rows to
* fetch all of a given page's revisions in turn.
$this->mSize = intval( $row->rev_len );
if( isset( $row->page_latest ) ) {
- $this->mCurrent = ( $row->rev_id == $row->page_latest );
- $this->mTitle = Title::makeTitle( $row->page_namespace,
- $row->page_title );
+ $this->mCurrent = ( $row->rev_id == $row->page_latest );
+ $this->mTitle = Title::makeTitle( $row->page_namespace, $row->page_title );
+ $this->mTitle->resetArticleID( $this->mPage );
} else {
$this->mCurrent = false;
$this->mTitle = null;
} else {
throw new MWException( 'Revision constructor passed invalid row format.' );
}
+ $this->mUnpatrolled = NULL;
}
/**#@+
public function isMinor() {
return (bool)$this->mMinorEdit;
}
+
+ /**
+ * @return int rcid of the unpatrolled row, zero if there isn't one
+ */
+ public function isUnpatrolled() {
+ if( $this->mUnpatrolled !== NULL ) {
+ return $this->mUnpatrolled;
+ }
+ $dbr = wfGetDB( DB_SLAVE );
+ $this->mUnpatrolled = $dbr->selectField( 'recentchanges',
+ 'rc_id',
+ array( // Add redundant user,timestamp condition so we can use the existing index
+ 'rc_user_text' => $this->getRawUserText(),
+ 'rc_timestamp' => $dbr->timestamp( $this->getTimestamp() ),
+ 'rc_this_oldid' => $this->getId(),
+ 'rc_patrolled' => 0
+ ),
+ __METHOD__
+ );
+ return (int)$this->mUnpatrolled;
+ }
/**
* int $field one of DELETED_* bitfield constants
public function isDeleted( $field ) {
return ($this->mDeleted & $field) == $field;
}
+
+ /**
+ * Get the deletion bitfield of the revision
+ */
+ public function getVisibility() {
+ return (int)$this->mDeleted;
+ }
/**
* Fetch revision text if it's available to the specified audience.
* $row is usually an object from wfFetchRow(), both the flags and the text
* field must be included
*
- * @param integer $row Id of a row
+ * @param object $row The text data
* @param string $prefix table prefix (default 'old_')
* @return string $text|false the text requested
*/
}
global $wgLegacyEncoding;
- if( $wgLegacyEncoding && !in_array( 'utf-8', $flags ) ) {
+ if( $wgLegacyEncoding && !in_array( 'utf-8', $flags ) && !in_array( 'utf8', $flags ) ) {
# Old revisions kept around in a legacy encoding?
# Upconvert on demand.
+ # ("utf8" checked for compatibility with some broken
+ # conversion scripts 2008-12-30)
global $wgInputEncoding, $wgContLang;
$text = $wgContLang->iconv( $wgLegacyEncoding, $wgInputEncoding, $text );
}
'rev_timestamp' => $dbw->timestamp( $this->mTimestamp ),
'rev_deleted' => $this->mDeleted,
'rev_len' => $this->mSize,
- 'rev_parent_id' => $this->mParentId ? $this->mParentId : $this->getPreviousRevisionId( $dbw )
+ 'rev_parent_id' => is_null($this->mParentId) ?
+ $this->getPreviousRevisionId( $dbw ) : $this->mParentId
), __METHOD__
);
*
* @return string
*/
- private function loadText() {
+ protected function loadText() {
wfProfileIn( __METHOD__ );
// Caching may be beneficial for massive use of external storage
global $wgRevisionCacheExpiry, $wgMemc;
- $key = wfMemcKey( 'revisiontext', 'textid', $this->getTextId() );
+ $textId = $this->getTextId();
+ $key = wfMemcKey( 'revisiontext', 'textid', $textId );
if( $wgRevisionCacheExpiry ) {
$text = $wgMemc->get( $key );
if( is_string( $text ) ) {
+ wfDebug( __METHOD__. ": got id $textId from cache\n" );
wfProfileOut( __METHOD__ );
return $text;
}
$current = $dbw->selectRow(
array( 'page', 'revision' ),
- array( 'page_latest', 'rev_text_id' ),
+ array( 'page_latest', 'rev_text_id', 'rev_len' ),
array(
'page_id' => $pageId,
'page_latest=rev_id',
'comment' => $summary,
'minor_edit' => $minor,
'text_id' => $current->rev_text_id,
- 'parent_id' => $current->page_latest
+ 'parent_id' => $current->page_latest,
+ 'len' => $current->rev_len
) );
} else {
$revision = null;
/**
* Get rev_timestamp from rev_id, without loading the rest of the row
+ * @param Title $title
* @param integer $id
- * @param integer $pageid, optional
*/
- static function getTimestampFromId( $id, $pageId = 0 ) {
+ static function getTimestampFromId( $title, $id ) {
$dbr = wfGetDB( DB_SLAVE );
- $conds = array( 'rev_id' => $id );
- if( $pageId ) {
- $conds['rev_page'] = $pageId;
+ // Casting fix for DB2
+ if ($id == '') {
+ $id = 0;
}
+ $conds = array( 'rev_id' => $id );
+ $conds['rev_page'] = $title->getArticleId();
$timestamp = $dbr->selectField( 'revision', 'rev_timestamp', $conds, __METHOD__ );
if ( $timestamp === false && wfGetLB()->getServerCount() > 1 ) {
# Not in slave, try master