39 private static function setUsernameBitfields( $name, $userId, $op, ?
IDatabase $dbw =
null ) {
40 if ( !$userId || ( $op !==
'|' && $op !==
'&' ) ) {
47 # To suppress, we OR the current bitfields with RevisionRecord::DELETED_USER
48 # to put a 1 in the username *_deleted bit. To unsuppress we AND the
49 # current bitfields with the inverse of RevisionRecord::DELETED_USER. The
50 # username bit is made to 0 (x & 0 = 0), while others are unchanged (x & 1 = x).
51 # The same goes for the sysop-restricted *_deleted bit.
52 $delUser = RevisionRecord::DELETED_USER | RevisionRecord::DELETED_RESTRICTED;
53 $delAction = LogPage::DELETED_ACTION | RevisionRecord::DELETED_RESTRICTED;
55 $delUser = $dbw->bitNot( $delUser );
56 $delAction = $dbw->bitNot( $delAction );
60 $userTitle = Title::makeTitleSafe(
NS_USER, $name );
61 $userDbKey = $userTitle->getDBkey();
63 $actorId = $dbw->newSelectQueryBuilder()
64 ->select(
'actor_id' )
66 ->where( [
'actor_name' => $name ] )
67 ->caller( __METHOD__ )->fetchField();
69 # Hide name from live edits
70 $dbw->newUpdateQueryBuilder()
71 ->update(
'revision' )
72 ->set( self::buildSetBitDeletedField(
'rev_deleted', $op, $delUser, $dbw ) )
73 ->where( [
'rev_actor' => $actorId ] )
74 ->caller( __METHOD__ )->execute();
76 # Hide name from deleted edits
77 $dbw->newUpdateQueryBuilder()
79 ->set( self::buildSetBitDeletedField(
'ar_deleted', $op, $delUser, $dbw ) )
80 ->where( [
'ar_actor' => $actorId ] )
81 ->caller( __METHOD__ )->execute();
84 $dbw->newUpdateQueryBuilder()
86 ->set( self::buildSetBitDeletedField(
'log_deleted', $op, $delUser, $dbw ) )
87 ->where( [
'log_actor' => $actorId, $dbw->expr(
'log_type',
'!=',
'suppress' ) ] )
88 ->caller( __METHOD__ )->execute();
91 $dbw->newUpdateQueryBuilder()
92 ->update(
'recentchanges' )
93 ->set( self::buildSetBitDeletedField(
'rc_deleted', $op, $delUser, $dbw ) )
94 ->where( [
'rc_actor' => $actorId ] )
95 ->caller( __METHOD__ )->execute();
102 $dbw->newUpdateQueryBuilder()
103 ->update(
'oldimage' )
104 ->set( self::buildSetBitDeletedField(
'oi_deleted', $op, $delUser, $dbw ) )
105 ->where( [
'oi_actor' => $actorId ] )
106 ->caller( __METHOD__ )->execute();
110 $dbw->newUpdateQueryBuilder()
111 ->update(
'filerevision' )
112 ->set( self::buildSetBitDeletedField(
'fr_deleted', $op, $delUser, $dbw ) )
113 ->where( [
'fr_actor' => $actorId ] )
114 ->caller( __METHOD__ )->execute();
118 $dbw->newUpdateQueryBuilder()
119 ->update(
'filearchive' )
120 ->set( self::buildSetBitDeletedField(
'fa_deleted', $op, $delUser, $dbw ) )
121 ->where( [
'fa_actor' => $actorId ] )
122 ->caller( __METHOD__ )->execute();
125 # Hide log entries pointing to the user page
126 $dbw->newUpdateQueryBuilder()
127 ->update(
'logging' )
128 ->set( self::buildSetBitDeletedField(
'log_deleted', $op, $delAction, $dbw ) )
131 'log_title' => $userDbKey,
132 $dbw->expr(
'log_type',
'!=',
'suppress' )
134 ->caller( __METHOD__ )->execute();
136 # Hide RC entries pointing to the user page
137 $dbw->newUpdateQueryBuilder()
138 ->update(
'recentchanges' )
139 ->set( self::buildSetBitDeletedField(
'rc_deleted', $op, $delAction, $dbw ) )
140 ->where( [
'rc_namespace' =>
NS_USER,
'rc_title' => $userDbKey, $dbw->expr(
'rc_logid',
'>', 0 ) ] )
141 ->caller( __METHOD__ )->execute();
152 private static function buildSetBitDeletedField(
153 string $field,
string $op, $value,
IDatabase $dbw
156 ? $dbw->
bitAnd( $field, $value )
157 : $dbw->
bitOr( $field, $value )
168 return self::setUsernameBitfields( $name, $userId,
'|', $dbw );
178 return self::setUsernameBitfields( $name, $userId,
'&', $dbw );