5use InvalidArgumentException;
10use Psr\Log\LoggerInterface;
22 private int $userLabelCount = 0;
26 private LoggerInterface $logger,
36 $dbw = $this->dbProvider->getPrimaryDatabase();
37 if ( $label->
getId() ) {
38 $dbw->newUpdateQueryBuilder()
39 ->table( self::TABLE_WATCHLIST_LABEL )
40 ->set( [
'wll_name' => $label->
getName() ] )
41 ->where( [
'wll_id' => $label->
getId() ] )
42 ->caller( __METHOD__ )
44 if ( $dbw->affectedRows() !== 1 ) {
45 $this->logger->notice(
46 __METHOD__ .
" Watchlist label not saved. ID: {0}; Name: {1}",
49 return Status::newFatal(
'unknown-error' );
52 $userId = $label->
getUser()->getId();
54 throw new InvalidArgumentException(
'user ID must not be zero' );
61 return Status::newFatal(
62 'watchlistlabels-limit-reached',
66 $dbw->newInsertQueryBuilder()
67 ->insertInto( self::TABLE_WATCHLIST_LABEL )
68 ->row( [
'wll_user' => $userId,
'wll_name' => $label->
getName() ] )
70 ->caller( __METHOD__ )
72 if ( $dbw->affectedRows() > 0 ) {
73 $label->
setId( $dbw->insertId() );
76 return Status::newGood();
91 $dbw = $this->dbProvider->getPrimaryDatabase();
92 $dbw->startAtomic( __METHOD__ );
95 $confirmedIdValues = $dbw->newSelectQueryBuilder()
96 ->from( self::TABLE_WATCHLIST_LABEL )
98 ->where( [
'wll_id' => $ids,
'wll_user' => $user->
getId() ] )
100 ->caller( __METHOD__ )
101 ->fetchFieldValues();
102 $confirmedIds = array_map(
'intval', $confirmedIdValues );
103 if ( $confirmedIds !== $ids ) {
104 $dbw->cancelAtomic( __METHOD__ );
107 $dbw->newDeleteQueryBuilder()
108 ->deleteFrom( self::TABLE_WATCHLIST_LABEL_MEMBER )
109 ->where( [
'wlm_label' => $confirmedIds ] )
110 ->caller( __METHOD__ )
112 $dbw->newDeleteQueryBuilder()
113 ->deleteFrom( self::TABLE_WATCHLIST_LABEL )
114 ->where( [
'wll_id' => $confirmedIds ] )
115 ->caller( __METHOD__ )
117 $dbw->endAtomic( __METHOD__ );
130 $select = $this->dbProvider->getReplicaDatabase()->newSelectQueryBuilder();
131 $result = $select->table( self::TABLE_WATCHLIST_LABEL )
132 ->fields( [
'wll_id',
'wll_name' ] )
134 ->where( [
'wll_id' => $id,
'wll_user' => $user->
getId() ] )
135 ->caller( __METHOD__ )
151 $select = $this->dbProvider->getReplicaDatabase()->newSelectQueryBuilder();
153 $result = $select->table( self::TABLE_WATCHLIST_LABEL )
154 ->fields( [
'wll_id',
'wll_name' ] )
155 ->where( [
'wll_user' => $label->
getUser()->getId(),
'wll_name' => $label->
getName() ] )
156 ->caller( __METHOD__ )
159 $label->
setId( $result->wll_id );
173 $dbr = $this->dbProvider->getReplicaDatabase();
174 $orderBy =
'wll_name';
175 if ( $dbr->getType() ===
'mysql' ) {
176 $orderBy =
'CONVERT(wll_name USING utf8mb4) COLLATE utf8mb4_general_ci';
177 } elseif ( $dbr->getType() ===
'sqlite' ) {
178 $orderBy =
'wll_name COLLATE NOCASE';
180 $select = $dbr->newSelectQueryBuilder();
181 $results = $select->table( self::TABLE_WATCHLIST_LABEL )
182 ->fields( [
'wll_id',
'wll_name' ] )
183 ->where( [
'wll_user' => $user->
getId() ] )
184 ->orderBy( $orderBy,
'ASC' )
185 ->caller( __METHOD__ )
188 foreach ( $results as $result ) {
189 $labels[ (int)$result->wll_id ] =
new WatchlistLabel( $user, $result->wll_name, $result->wll_id );
202 if ( count( $labelIds ) === 0 ) {
205 $select = $this->dbProvider->getReplicaDatabase()->newSelectQueryBuilder();
206 $results = $select->table( self::TABLE_WATCHLIST_LABEL_MEMBER )
207 ->fields( [
'wlm_label',
'item_count' =>
'COUNT(wlm_label)' ] )
208 ->where( [
'wlm_label' => $labelIds ] )
209 ->groupBy( [
'wlm_label' ] )
210 ->caller( __METHOD__ )
212 $counts = array_combine( $labelIds, array_fill( 0, count( $labelIds ), 0 ) );
213 foreach ( $results as $result ) {
214 $counts[ $result->wlm_label ] = (int)$result->item_count;
227 $select = $this->dbProvider->getReplicaDatabase()->newSelectQueryBuilder();
228 return (
int)$select->table( self::TABLE_WATCHLIST_LABEL )
229 ->field(
'COUNT(*)' )
230 ->where( [
'wll_user' => $user->
getId() ] )
231 ->caller( __METHOD__ )
if(!defined('MW_SETUP_CALLBACK'))
A class containing constants representing the names of configuration variables.
const WatchlistLabelsMaxPerUser
Name constant for the WatchlistLabelsMaxPerUser setting, for use with Config::get()