X-Git-Url: https://git.cyclocoop.org/%7B%24www_url%7Dadmin/compta/exercices/journal.php?a=blobdiff_plain;f=includes%2Fchanges%2FRecentChange.php;h=3dacf6af0485e348ca164fce850cbfe9832d2cc5;hb=27c61fb1e94da9114314468fd00bcf129ec064b6;hp=fd789a6421fbf1561b86985ed04c1c458a384332;hpb=971a50c4f3c61fb3a4bec60cd712317bb8ddcb9a;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/changes/RecentChange.php b/includes/changes/RecentChange.php index fd789a6421..3dacf6af04 100644 --- a/includes/changes/RecentChange.php +++ b/includes/changes/RecentChange.php @@ -34,6 +34,7 @@ * 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) @@ -192,7 +193,10 @@ class RecentChange { $dbType = DB_REPLICA ) { $db = wfGetDB( $dbType ); - $row = $db->selectRow( 'recentchanges', self::selectFields(), $conds, $fname ); + $rcQuery = self::getQueryInfo(); + $row = $db->selectRow( + $rcQuery['tables'], $rcQuery['fields'], $conds, $fname, [], $rcQuery['joins'] + ); if ( $row !== false ) { return self::newFromRow( $row ); } else { @@ -203,16 +207,29 @@ class RecentChange { /** * Return the list of recentchanges fields that should be selected to create * a new recentchanges object. - * @todo Deprecate this in favor of a method that returns tables and joins - * as well, and use CommentStore::getJoin(). + * @deprecated since 1.31, use self::getQueryInfo() instead. * @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', @@ -232,7 +249,48 @@ class RecentChange { 'rc_log_type', 'rc_log_action', 'rc_params', - ] + CommentStore::newKey( 'rc_comment' )->getFields(); + ] + CommentStore::getStore()->getFields( 'rc_comment' ); + } + + /** + * Return the tables, fields, and join conditions to be selected to create + * a new recentchanges object. + * @since 1.31 + * @return array With three keys: + * - tables: (string[]) to include in the `$table` to `IDatabase->select()` + * - fields: (string[]) to include in the `$vars` to `IDatabase->select()` + * - joins: (array) to include in the `$join_conds` to `IDatabase->select()` + */ + public static function getQueryInfo() { + $commentQuery = CommentStore::getStore()->getJoin( 'rc_comment' ); + $actorQuery = ActorMigration::newMigration()->getJoin( 'rc_user' ); + return [ + 'tables' => [ 'recentchanges' ] + $commentQuery['tables'] + $actorQuery['tables'], + 'fields' => [ + 'rc_id', + 'rc_timestamp', + 'rc_namespace', + 'rc_title', + 'rc_minor', + 'rc_bot', + 'rc_new', + 'rc_cur_id', + 'rc_this_oldid', + 'rc_last_oldid', + 'rc_type', + 'rc_source', + 'rc_patrolled', + 'rc_ip', + 'rc_old_len', + 'rc_new_len', + 'rc_deleted', + 'rc_logid', + 'rc_log_type', + 'rc_log_action', + 'rc_params', + ] + $commentQuery['fields'] + $actorQuery['fields'], + 'joins' => $commentQuery['joins'] + $actorQuery['joins'], + ]; } # Accessors @@ -269,10 +327,14 @@ class RecentChange { */ 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' ); } } @@ -323,11 +385,21 @@ class RecentChange { 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. @@ -597,6 +669,7 @@ class RecentChange { '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, @@ -672,6 +745,7 @@ class RecentChange { '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, @@ -804,6 +878,7 @@ class RecentChange { '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, @@ -889,6 +964,7 @@ class RecentChange { '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, @@ -950,12 +1026,22 @@ class RecentChange { } } - $comment = CommentStore::newKey( 'rc_comment' ) - // Legacy because $row probably came from self::selectFields() - ->getCommentLegacy( wfGetDB( DB_REPLICA ), $row, true )->text; + $comment = CommentStore::getStore() + // Legacy because $row may have come from self::selectFields() + ->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(); } /** @@ -966,8 +1052,27 @@ class RecentChange { */ 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; } @@ -1063,9 +1168,9 @@ class RecentChange { public function parseParams() { $rcParams = $this->getAttribute( 'rc_params' ); - MediaWiki\suppressWarnings(); + Wikimedia\suppressWarnings(); $unserializedParams = unserialize( $rcParams ); - MediaWiki\restoreWarnings(); + Wikimedia\restoreWarnings(); return $unserializedParams; }