* rc_cur_id page_id of associated page entry
* rc_user user id who made the entry
* rc_user_text user name who made the entry
+ * rc_actor actor id who made the entry
* rc_comment edit summary
* rc_this_oldid rev_id associated with this entry (or zero)
* rc_last_oldid rev_id associated with the entry before this one (or zero)
const SRC_EXTERNAL = 'mw.external'; // obsolete
const SRC_CATEGORIZE = 'mw.categorize';
+ const PRC_UNPATROLLED = 0;
+ const PRC_PATROLLED = 1;
+ const PRC_AUTOPATROLLED = 2;
+
public $mAttribs = [];
public $mExtra = [];
* @return array
*/
public static function selectFields() {
+ global $wgActorTableSchemaMigrationStage;
+
wfDeprecated( __METHOD__, '1.31' );
+ if ( $wgActorTableSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
+ // If code is using this instead of self::getQueryInfo(), there's a
+ // decent chance it's going to try to directly access
+ // $row->rc_user or $row->rc_user_text and we can't give it
+ // useful values here once those aren't being written anymore.
+ throw new BadMethodCallException(
+ 'Cannot use ' . __METHOD__ . ' when $wgActorTableSchemaMigrationStage > MIGRATION_WRITE_BOTH'
+ );
+ }
+
return [
'rc_id',
'rc_timestamp',
'rc_user',
'rc_user_text',
+ 'rc_actor' => 'NULL',
'rc_namespace',
'rc_title',
'rc_minor',
'rc_log_type',
'rc_log_action',
'rc_params',
- ] + CommentStore::newKey( 'rc_comment' )->getFields();
+ ] + CommentStore::getStore()->getFields( 'rc_comment' );
}
/**
* - joins: (array) to include in the `$join_conds` to `IDatabase->select()`
*/
public static function getQueryInfo() {
- $commentQuery = CommentStore::newKey( 'rc_comment' )->getJoin();
+ $commentQuery = CommentStore::getStore()->getJoin( 'rc_comment' );
+ $actorQuery = ActorMigration::newMigration()->getJoin( 'rc_user' );
return [
- 'tables' => [ 'recentchanges' ] + $commentQuery['tables'],
+ 'tables' => [ 'recentchanges' ] + $commentQuery['tables'] + $actorQuery['tables'],
'fields' => [
'rc_id',
'rc_timestamp',
- 'rc_user',
- 'rc_user_text',
'rc_namespace',
'rc_title',
'rc_minor',
'rc_log_type',
'rc_log_action',
'rc_params',
- ] + $commentQuery['fields'],
- 'joins' => $commentQuery['joins'],
+ ] + $commentQuery['fields'] + $actorQuery['fields'],
+ 'joins' => $commentQuery['joins'] + $actorQuery['joins'],
];
}
*/
public function getPerformer() {
if ( $this->mPerformer === false ) {
- if ( $this->mAttribs['rc_user'] ) {
+ if ( !empty( $this->mAttribs['rc_actor'] ) ) {
+ $this->mPerformer = User::newFromActorId( $this->mAttribs['rc_actor'] );
+ } elseif ( !empty( $this->mAttribs['rc_user'] ) ) {
$this->mPerformer = User::newFromId( $this->mAttribs['rc_user'] );
- } else {
+ } elseif ( !empty( $this->mAttribs['rc_user_text'] ) ) {
$this->mPerformer = User::newFromName( $this->mAttribs['rc_user_text'], false );
+ } else {
+ throw new MWException( 'RecentChange object lacks rc_actor, rc_user, and rc_user_text' );
}
}
unset( $this->mAttribs['rc_cur_id'] );
}
- # Convert mAttribs['rc_comment'] for CommentStore
$row = $this->mAttribs;
+
+ # Convert mAttribs['rc_comment'] for CommentStore
$comment = $row['rc_comment'];
unset( $row['rc_comment'], $row['rc_comment_text'], $row['rc_comment_data'] );
- $row += CommentStore::newKey( 'rc_comment' )->insert( $dbw, $comment );
+ $row += CommentStore::getStore()->insert( $dbw, 'rc_comment', $comment );
+
+ # Convert mAttribs['rc_user'] etc for ActorMigration
+ $user = User::newFromAnyId(
+ isset( $row['rc_user'] ) ? $row['rc_user'] : null,
+ isset( $row['rc_user_text'] ) ? $row['rc_user_text'] : null,
+ isset( $row['rc_actor'] ) ? $row['rc_actor'] : null
+ );
+ unset( $row['rc_user'], $row['rc_user_text'], $row['rc_actor'] );
+ $row += ActorMigration::newMigration()->getInsertValues( $dbw, 'rc_user', $user );
# Don't reuse an existing rc_id for the new row, if one happens to be
# set for some reason.
$dbw->update(
'recentchanges',
[
- 'rc_patrolled' => 1
+ 'rc_patrolled' => self::PRC_PATROLLED
],
[
'rc_id' => $this->getAttribute( 'rc_id' )
'rc_cur_id' => $title->getArticleID(),
'rc_user' => $user->getId(),
'rc_user_text' => $user->getName(),
+ 'rc_actor' => $user->getActorId(),
'rc_comment' => &$comment,
'rc_comment_text' => &$comment,
'rc_comment_data' => null,
function () use ( $rc, $tags ) {
$rc->addTags( $tags );
$rc->save();
- if ( $rc->mAttribs['rc_patrolled'] ) {
- PatrolLog::record( $rc, true, $rc->getPerformer() );
- }
},
DeferredUpdates::POSTSEND,
wfGetDB( DB_MASTER )
'rc_cur_id' => $title->getArticleID(),
'rc_user' => $user->getId(),
'rc_user_text' => $user->getName(),
+ 'rc_actor' => $user->getActorId(),
'rc_comment' => &$comment,
'rc_comment_text' => &$comment,
'rc_comment_data' => null,
function () use ( $rc, $tags ) {
$rc->addTags( $tags );
$rc->save();
- if ( $rc->mAttribs['rc_patrolled'] ) {
- PatrolLog::record( $rc, true, $rc->getPerformer() );
- }
},
DeferredUpdates::POSTSEND,
wfGetDB( DB_MASTER )
'rc_cur_id' => $target->getArticleID(),
'rc_user' => $user->getId(),
'rc_user_text' => $user->getName(),
+ 'rc_actor' => $user->getActorId(),
'rc_comment' => &$logComment,
'rc_comment_text' => &$logComment,
'rc_comment_data' => null,
'rc_last_oldid' => 0,
'rc_bot' => $user->isAllowed( 'bot' ) ? (int)$wgRequest->getBool( 'bot', true ) : 0,
'rc_ip' => self::checkIPAddress( $ip ),
- 'rc_patrolled' => $markPatrolled ? 1 : 0,
+ 'rc_patrolled' => $markPatrolled ? self::PRC_PATROLLED : self::PRC_UNPATROLLED,
'rc_new' => 0, # obsolete
'rc_old_len' => null,
'rc_new_len' => null,
'rc_cur_id' => $pageTitle->getArticleID(),
'rc_user' => $user ? $user->getId() : 0,
'rc_user_text' => $user ? $user->getName() : '',
+ 'rc_actor' => $user ? $user->getActorId() : null,
'rc_comment' => &$comment,
'rc_comment_text' => &$comment,
'rc_comment_data' => null,
'rc_last_oldid' => $oldRevId,
'rc_bot' => $bot ? 1 : 0,
'rc_ip' => self::checkIPAddress( $ip ),
- 'rc_patrolled' => 1, // Always patrolled, just like log entries
+ 'rc_patrolled' => self::PRC_PATROLLED, // Always patrolled, just like log entries
'rc_new' => 0, # obsolete
'rc_old_len' => null,
'rc_new_len' => null,
}
}
- $comment = CommentStore::newKey( 'rc_comment' )
+ $comment = CommentStore::getStore()
// Legacy because $row may have come from self::selectFields()
- ->getCommentLegacy( wfGetDB( DB_REPLICA ), $row, true )->text;
+ ->getCommentLegacy( wfGetDB( DB_REPLICA ), 'rc_comment', $row, true )
+ ->text;
$this->mAttribs['rc_comment'] = &$comment;
$this->mAttribs['rc_comment_text'] = &$comment;
$this->mAttribs['rc_comment_data'] = null;
+
+ $user = User::newFromAnyId(
+ isset( $this->mAttribs['rc_user'] ) ? $this->mAttribs['rc_user'] : null,
+ isset( $this->mAttribs['rc_user_text'] ) ? $this->mAttribs['rc_user_text'] : null,
+ isset( $this->mAttribs['rc_actor'] ) ? $this->mAttribs['rc_actor'] : null
+ );
+ $this->mAttribs['rc_user'] = $user->getId();
+ $this->mAttribs['rc_user_text'] = $user->getName();
+ $this->mAttribs['rc_actor'] = $user->getActorId();
}
/**
*/
public function getAttribute( $name ) {
if ( $name === 'rc_comment' ) {
- return CommentStore::newKey( 'rc_comment' )->getComment( $this->mAttribs, true )->text;
+ return CommentStore::getStore()
+ ->getComment( 'rc_comment', $this->mAttribs, true )->text;
}
+
+ if ( $name === 'rc_user' || $name === 'rc_user_text' || $name === 'rc_actor' ) {
+ $user = User::newFromAnyId(
+ isset( $this->mAttribs['rc_user'] ) ? $this->mAttribs['rc_user'] : null,
+ isset( $this->mAttribs['rc_user_text'] ) ? $this->mAttribs['rc_user_text'] : null,
+ isset( $this->mAttribs['rc_actor'] ) ? $this->mAttribs['rc_actor'] : null
+ );
+ if ( $name === 'rc_user' ) {
+ return $user->getId();
+ }
+ if ( $name === 'rc_user_text' ) {
+ return $user->getName();
+ }
+ if ( $name === 'rc_actor' ) {
+ return $user->getActorId();
+ }
+ }
+
return isset( $this->mAttribs[$name] ) ? $this->mAttribs[$name] : null;
}
public function parseParams() {
$rcParams = $this->getAttribute( 'rc_params' );
- MediaWiki\suppressWarnings();
+ Wikimedia\suppressWarnings();
$unserializedParams = unserialize( $rcParams );
- MediaWiki\restoreWarnings();
+ Wikimedia\restoreWarnings();
return $unserializedParams;
}