113 $perItemStatus = isset(
$params[
'perItemStatus'] ) ?
$params[
'perItemStatus'] :
false;
118 $this->res = $this->
doQuery( $dbw );
125 $dbw->startAtomic( __METHOD__ );
126 $dbw->onTransactionResolution(
134 $missing = array_flip( $this->ids );
137 $authorIds = $authorIPs = [];
139 if ( $perItemStatus ) {
152 $visibilityChangeMap = [];
155 foreach ( $this
as $item ) {
156 unset( $missing[$item->getId()] );
158 if ( $perItemStatus ) {
159 $itemStatus = Status::newGood();
160 $status->itemStatuses[$item->getId()] = $itemStatus;
165 $oldBits = $item->getBits();
169 if ( $oldBits == $newBits ) {
170 $itemStatus->warning(
171 'revdelete-no-change', $item->formatDate(), $item->formatTime() );
174 } elseif ( $oldBits == 0 && $newBits != 0 ) {
176 } elseif ( $oldBits != 0 && $newBits == 0 ) {
182 if ( $item->isHideCurrentOp( $newBits ) ) {
185 'revdelete-hide-current', $item->formatDate(), $item->formatTime() );
188 } elseif ( !$item->canView() ) {
190 $msg = ( $opType ==
'show' ) ?
191 'revdelete-show-no-access' :
'revdelete-modify-no-access';
192 $itemStatus->error( $msg, $item->formatDate(), $item->formatTime() );
197 $itemStatus->warning(
198 'revdelete-only-restricted', $item->formatDate(), $item->formatTime() );
204 $ok = $item->setBits( $newBits );
207 $idsForLog[] = $item->getId();
210 $logType =
'suppress';
213 $addedBits = ( $oldBits ^ $newBits ) & $newBits;
214 $removedBits = ( $oldBits ^ $newBits ) & $oldBits;
215 $virtualNewBits |= $addedBits;
216 $virtualOldBits |= $removedBits;
219 if ( $item->getAuthorId() > 0 ) {
220 $authorIds[] = $item->getAuthorId();
221 } elseif ( IP::isIPAddress( $item->getAuthorName() ) ) {
222 $authorIPs[] = $item->getAuthorName();
227 $visibilityChangeMap[$item->getId()] = [
228 'oldBits' => $oldBits,
229 'newBits' => $newBits,
233 'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() );
239 foreach ( $missing
as $id => $unused ) {
240 if ( $perItemStatus ) {
241 $status->itemStatuses[$id] = Status::newFatal(
'revdelete-modify-missing', $id );
243 $status->error(
'revdelete-modify-missing', $id );
248 if (
$status->successCount == 0 ) {
249 $dbw->endAtomic( __METHOD__ );
254 $successCount =
$status->successCount;
260 $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
261 $lbFactory->rollbackMasterChanges( __METHOD__ );
269 'title' => $this->
title,
270 'count' => $successCount,
271 'newBits' => $virtualNewBits,
272 'oldBits' => $virtualOldBits,
273 'comment' => $comment,
275 'authorIds' => $authorIds,
276 'authorIPs' => $authorIPs,
282 DeferredUpdates::addCallableUpdate(
283 function ()
use ( $visibilityChangeMap ) {
286 DeferredUpdates::PRESEND,
290 $dbw->endAtomic( __METHOD__ );