// Update recentchanges
if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
// Mark as patrolled if the user can do so
- $patrolled = $wgUseRCPatrol && !count(
+ $autopatrolled = $wgUseRCPatrol && !count(
$this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
// Add RC row to the DB
RecentChange::notifyEdit(
$oldContent ? $oldContent->getSize() : 0,
$newsize,
$revisionId,
- $patrolled,
+ $autopatrolled ? RecentChange::PRC_AUTOPATROLLED :
+ RecentChange::PRC_UNPATROLLED,
$tags
);
}
// In the future, we may keep revisions and mark them with
// the rev_deleted field, which is reserved for this purpose.
+ // Lock rows in `revision` and its temp tables, but not any others.
+ // Note array_intersect() preserves keys from the first arg, and we're
+ // assuming $revQuery has `revision` primary and isn't using subtables
+ // for anything we care about.
+ $res = $dbw->select(
+ array_intersect(
+ $revQuery['tables'],
+ [ 'revision', 'revision_comment_temp', 'revision_actor_temp' ]
+ ),
+ '1',
+ [ 'rev_page' => $id ],
+ __METHOD__,
+ 'FOR UPDATE',
+ $revQuery['joins']
+ );
+ foreach ( $res as $row ) {
+ // Fetch all rows in case the DB needs that to properly lock them.
+ }
+
// Get all of the page revisions
$res = $dbw->select(
$revQuery['tables'],
$revQuery['fields'],
[ 'rev_page' => $id ],
__METHOD__,
- 'FOR UPDATE',
+ [],
$revQuery['joins']
);
'ar_rev_id' => $row->rev_id,
'ar_parent_id' => $row->rev_parent_id,
'ar_text_id' => $row->rev_text_id,
- 'ar_text' => '',
- 'ar_flags' => '',
'ar_len' => $row->rev_len,
'ar_page_id' => $id,
'ar_deleted' => $suppress ? $bitfield : $row->rev_deleted,
if ( $wgUseRCPatrol ) {
// Mark all reverted edits as patrolled
- $set['rc_patrolled'] = 1;
+ $set['rc_patrolled'] = RecentChange::PRC_PATROLLED;
}
if ( count( $set ) ) {