48 private static function setUsernameBitfields( $name, $userId, $op,
IDatabase $dbw =
null ) {
49 if ( !$userId || ( $op !==
'|' && $op !==
'&' ) ) {
53 $dbw = MediaWikiServices::getInstance()->getConnectionProvider()->getPrimaryDatabase();
56 # To suppress, we OR the current bitfields with RevisionRecord::DELETED_USER
57 # to put a 1 in the username *_deleted bit. To unsuppress we AND the
58 # current bitfields with the inverse of RevisionRecord::DELETED_USER. The
59 # username bit is made to 0 (x & 0 = 0), while others are unchanged (x & 1 = x).
60 # The same goes for the sysop-restricted *_deleted bit.
61 $delUser = RevisionRecord::DELETED_USER | RevisionRecord::DELETED_RESTRICTED;
62 $delAction = LogPage::DELETED_ACTION | RevisionRecord::DELETED_RESTRICTED;
64 $delUser = $dbw->bitNot( $delUser );
65 $delAction = $dbw->bitNot( $delAction );
69 $userTitle = Title::makeTitleSafe(
NS_USER, $name );
70 $userDbKey = $userTitle->getDBkey();
72 $actorId = $dbw->newSelectQueryBuilder()
73 ->select(
'actor_id' )
75 ->where( [
'actor_name' => $name ] )
76 ->caller( __METHOD__ )->fetchField();
78 # Hide name from live edits
79 $dbw->newUpdateQueryBuilder()
80 ->update(
'revision' )
81 ->set( [ self::buildSetBitDeletedField(
'rev_deleted', $op, $delUser, $dbw ) ] )
82 ->where( [
'rev_actor' => $actorId ] )
83 ->caller( __METHOD__ )->execute();
85 # Hide name from deleted edits
86 $dbw->newUpdateQueryBuilder()
88 ->set( [ self::buildSetBitDeletedField(
'ar_deleted', $op, $delUser, $dbw ) ] )
89 ->where( [
'ar_actor' => $actorId ] )
90 ->caller( __METHOD__ )->execute();
93 $dbw->newUpdateQueryBuilder()
95 ->set( [ self::buildSetBitDeletedField(
'log_deleted', $op, $delUser, $dbw ) ] )
96 ->where( [
'log_actor' => $actorId, $dbw->expr(
'log_type',
'!=',
'suppress' ) ] )
97 ->caller( __METHOD__ )->execute();
100 $dbw->newUpdateQueryBuilder()
101 ->update(
'recentchanges' )
102 ->set( [ self::buildSetBitDeletedField(
'rc_deleted', $op, $delUser, $dbw ) ] )
103 ->where( [
'rc_actor' => $actorId ] )
104 ->caller( __METHOD__ )->execute();
106 # Hide name from live images
107 $dbw->newUpdateQueryBuilder()
108 ->update(
'oldimage' )
109 ->set( [ self::buildSetBitDeletedField(
'oi_deleted', $op, $delUser, $dbw ) ] )
110 ->where( [
'oi_actor' => $actorId ] )
111 ->caller( __METHOD__ )->execute();
113 # Hide name from deleted images
114 $dbw->newUpdateQueryBuilder()
115 ->update(
'filearchive' )
116 ->set( [ self::buildSetBitDeletedField(
'fa_deleted', $op, $delUser, $dbw ) ] )
117 ->where( [
'fa_actor' => $actorId ] )
118 ->caller( __METHOD__ )->execute();
121 # Hide log entries pointing to the user page
122 $dbw->newUpdateQueryBuilder()
123 ->update(
'logging' )
124 ->set( [ self::buildSetBitDeletedField(
'log_deleted', $op, $delAction, $dbw ) ] )
127 'log_title' => $userDbKey,
128 $dbw->expr(
'log_type',
'!=',
'suppress' )
130 ->caller( __METHOD__ )->execute();
132 # Hide RC entries pointing to the user page
133 $dbw->newUpdateQueryBuilder()
134 ->update(
'recentchanges' )
135 ->set( [ self::buildSetBitDeletedField(
'rc_deleted', $op, $delAction, $dbw ) ] )
136 ->where( [
'rc_namespace' =>
NS_USER,
'rc_title' => $userDbKey,
'rc_logid > 0' ] )
137 ->caller( __METHOD__ )->execute();
142 private static function buildSetBitDeletedField( $field, $op, $value,
IDatabase $dbw ) {
143 return $field .
' = ' . ( $op ===
'&'
144 ? $dbw->
bitAnd( $field, $value )
145 : $dbw->
bitOr( $field, $value ) );
155 return self::setUsernameBitfields( $name, $userId,
'|', $dbw );
165 return self::setUsernameBitfields( $name, $userId,
'&', $dbw );