'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' => $row->ar_sha1
- );
+ 'len' => $row->ar_len);
if ( isset( $row->ar_text ) && !$row->ar_text_id ) {
// Pre-1.5 ar_text row
$attribs['text'] = self::getRevisionText( $row, 'ar_' );
return Revision::loadFromConds( $db, $conds );
}
+ /**
+ * Stores the origin wiki of a revision in case it is a foreign wiki
+ */
+ function setWikiID( $wikiID ) {
+ $this->mWikiID = $wikiID;
+ }
+
+ /**
+ * Load the current revision of a given page of a foreign wiki.
+ * The WikiID is stored for further use, such as loadText() and getTimestampFromId()
+ */
+ public static function loadFromTitleForeignWiki( $wikiID, $title ) {
+ $dbr = wfGetDB( DB_SLAVE, array(), $wikiID );
+
+ $revision = self::loadFromTitle( $dbr, $title );
+
+ if( $revision ) {
+ $revision->setWikiID( $wikiID );
+ }
+
+ return $revision;
+
+ }
+
/**
* Load either the current, or a specified, revision
* that's attached to a given page. If not attached
'rev_minor_edit',
'rev_deleted',
'rev_len',
- 'rev_parent_id',
- 'rev_sha1'
+ 'rev_parent_id'
);
}
$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 );
}
} elseif( is_array( $row ) ) {
// Build a new revision to be saved...
- global $wgUser; // ugh
+ global $wgUser;
$this->mId = isset( $row['id'] ) ? intval( $row['id'] ) : null;
$this->mPage = isset( $row['page'] ) ? intval( $row['page'] ) : null;
$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;
throw new MWException( 'Revision constructor passed invalid row format.' );
}
$this->mUnpatrolled = null;
+ $this->mWikiID = false;
}
/**
if( isset( $this->mTitle ) ) {
return $this->mTitle;
}
- $dbr = wfGetDB( DB_SLAVE );
+ $dbr = wfGetDB( DB_SLAVE, array(), $this->mWikiID );
+
$row = $dbr->selectRow(
array( 'page', 'revision' ),
array( 'page_namespace', 'page_title' ),
if( $this->mUnpatrolled !== null ) {
return $this->mUnpatrolled;
}
- $dbr = wfGetDB( DB_SLAVE );
+ $dbr = wfGetDB( DB_SLAVE, array(), $this->mWikiID );
$this->mUnpatrolled = $dbr->selectField( 'recentchanges',
'rc_id',
array( // Add redundant user,timestamp condition so we can use the existing index
'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_sha1' => is_null( $this->mSha1 )
- ? Revision::base36Sha1( $this->mText )
- : $this->mSha1
+ 'rev_parent_id' => is_null($this->mParentId) ?
+ $this->getPreviousRevisionId( $dbw ) : $this->mParentId
), __METHOD__
);
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.
// Caching may be beneficial for massive use of external storage
global $wgRevisionCacheExpiry, $wgMemc;
$textId = $this->getTextId();
+ if( isset( $this->mWikiID ) && $this->mWikiID !== false ) {
+ $key = wfForeignMemcKey( $this->mWikiID, null, 'revisiontext', 'textid', $textId );
+ } else {
$key = wfMemcKey( 'revisiontext', 'textid', $textId );
+ }
if( $wgRevisionCacheExpiry ) {
$text = $wgMemc->get( $key );
if( is_string( $text ) ) {
if( !$row ) {
// Text data is immutable; check slaves first.
- $dbr = wfGetDB( DB_SLAVE );
+ $dbr = wfGetDB( DB_SLAVE, array(), $this->mWikiID );
$row = $dbr->selectRow( 'text',
array( 'old_text', 'old_flags' ),
array( 'old_id' => $this->getTextId() ),
if( !$row && wfGetLB()->getServerCount() > 1 ) {
// Possible slave lag!
- $dbw = wfGetDB( DB_MASTER );
+ $dbw = wfGetDB( DB_MASTER, array(), $this->mWikiID );
$row = $dbw->selectRow( 'text',
array( 'old_text', 'old_flags' ),
array( 'old_id' => $this->getTextId() ),
* @return String
*/
static function getTimestampFromId( $title, $id ) {
- $dbr = wfGetDB( DB_SLAVE );
+ $wikiId = wfWikiID();
+ $dbr = wfGetDB( DB_SLAVE, array(), $wikiId );
// Casting fix for DB2
if ( $id == '' ) {
$id = 0;
$timestamp = $dbr->selectField( 'revision', 'rev_timestamp', $conds, __METHOD__ );
if ( $timestamp === false && wfGetLB()->getServerCount() > 1 ) {
# Not in slave, try master
- $dbw = wfGetDB( DB_MASTER );
+ $dbw = wfGetDB( DB_MASTER, array(), $wikiId );
$timestamp = $dbw->selectField( 'revision', 'rev_timestamp', $conds, __METHOD__ );
}
return wfTimestamp( TS_MW, $timestamp );