public static function canAddTagsAccompanyingChange( array $tags,
User $user = null ) {
- if ( !is_null( $user ) && !$user->isAllowed( 'applychangetags' ) ) {
- return Status::newFatal( 'tags-apply-no-permission' );
+ if ( !is_null( $user ) ) {
+ if ( !$user->isAllowed( 'applychangetags' ) ) {
+ return Status::newFatal( 'tags-apply-no-permission' );
+ } elseif ( $user->isBlocked() ) {
+ return Status::newFatal( 'tags-apply-blocked' );
+ }
}
// to be applied, a tag has to be explicitly defined
public static function canUpdateTags( array $tagsToAdd, array $tagsToRemove,
User $user = null ) {
- if ( !is_null( $user ) && !$user->isAllowed( 'changetags' ) ) {
- return Status::newFatal( 'tags-update-no-permission' );
+ if ( !is_null( $user ) ) {
+ if ( !$user->isAllowed( 'changetags' ) ) {
+ return Status::newFatal( 'tags-update-no-permission' );
+ } elseif ( $user->isBlocked() ) {
+ return Status::newFatal( 'tags-update-blocked' );
+ }
}
if ( $tagsToAdd ) {
* @since 1.25
*/
public static function canActivateTag( $tag, User $user = null ) {
- if ( !is_null( $user ) && !$user->isAllowed( 'managechangetags' ) ) {
- return Status::newFatal( 'tags-manage-no-permission' );
+ if ( !is_null( $user ) ) {
+ if ( !$user->isAllowed( 'managechangetags' ) ) {
+ return Status::newFatal( 'tags-manage-no-permission' );
+ } elseif ( $user->isBlocked() ) {
+ return Status::newFatal( 'tags-manage-blocked' );
+ }
}
// defined tags cannot be activated (a defined tag is either extension-
* @since 1.25
*/
public static function canDeactivateTag( $tag, User $user = null ) {
- if ( !is_null( $user ) && !$user->isAllowed( 'managechangetags' ) ) {
- return Status::newFatal( 'tags-manage-no-permission' );
+ if ( !is_null( $user ) ) {
+ if ( !$user->isAllowed( 'managechangetags' ) ) {
+ return Status::newFatal( 'tags-manage-no-permission' );
+ } elseif ( $user->isBlocked() ) {
+ return Status::newFatal( 'tags-manage-blocked' );
+ }
}
// only explicitly-defined tags can be deactivated
* @since 1.25
*/
public static function canCreateTag( $tag, User $user = null ) {
- if ( !is_null( $user ) && !$user->isAllowed( 'managechangetags' ) ) {
- return Status::newFatal( 'tags-manage-no-permission' );
+ if ( !is_null( $user ) ) {
+ if ( !$user->isAllowed( 'managechangetags' ) ) {
+ return Status::newFatal( 'tags-manage-no-permission' );
+ } elseif ( $user->isBlocked() ) {
+ return Status::newFatal( 'tags-manage-blocked' );
+ }
}
// no empty tags
public static function canDeleteTag( $tag, User $user = null ) {
$tagUsage = self::tagUsageStatistics();
- if ( !is_null( $user ) && !$user->isAllowed( 'managechangetags' ) ) {
- return Status::newFatal( 'tags-manage-no-permission' );
+ if ( !is_null( $user ) ) {
+ if ( !$user->isAllowed( 'managechangetags' ) ) {
+ return Status::newFatal( 'tags-manage-no-permission' );
+ } elseif ( $user->isBlocked() ) {
+ return Status::newFatal( 'tags-manage-blocked' );
+ }
}
if ( !isset( $tagUsage[$tag] ) && !in_array( $tag, self::listDefinedTags() ) ) {
public static function listExtensionActivatedTags() {
return ObjectCache::getMainWANInstance()->getWithSetCallback(
wfMemcKey( 'active-tags' ),
- function() {
+ 300,
+ function ( $oldValue, &$ttl, array &$setOpts ) {
+ $setOpts += Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
+
// Ask extensions which tags they consider active
$extensionActive = array();
Hooks::run( 'ChangeTagsListActive', array( &$extensionActive ) );
return $extensionActive;
},
- 300,
- array( wfMemcKey( 'active-tags' ) ),
- array( 'lockTSE' => INF )
+ array(
+ 'checkKeys' => array( wfMemcKey( 'active-tags' ) ),
+ 'lockTSE' => 300,
+ 'pcTTL' => 30
+ )
);
}
return ObjectCache::getMainWANInstance()->getWithSetCallback(
wfMemcKey( 'valid-tags-db' ),
- function() use ( $fname ) {
+ 300,
+ function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
$dbr = wfGetDB( DB_SLAVE );
- $tags = $dbr->selectFieldValues(
- 'valid_tag', 'vt_tag', array(), $fname );
+
+ $setOpts += Database::getCacheSetOptions( $dbr );
+
+ $tags = $dbr->selectFieldValues( 'valid_tag', 'vt_tag', array(), $fname );
return array_filter( array_unique( $tags ) );
},
- 300,
- array( wfMemcKey( 'valid-tags-db' ) ),
- array( 'lockTSE' => INF )
+ array(
+ 'checkKeys' => array( wfMemcKey( 'valid-tags-db' ) ),
+ 'lockTSE' => 300,
+ 'pcTTL' => 30
+ )
);
}
public static function listExtensionDefinedTags() {
return ObjectCache::getMainWANInstance()->getWithSetCallback(
wfMemcKey( 'valid-tags-hook' ),
- function() {
+ 300,
+ function ( $oldValue, &$ttl, array &$setOpts ) {
+ $setOpts += Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
+
$tags = array();
Hooks::run( 'ListDefinedTags', array( &$tags ) );
return array_filter( array_unique( $tags ) );
},
- 300,
- array( wfMemcKey( 'valid-tags-hook' ) ),
- array( 'lockTSE' => INF )
+ array(
+ 'checkKeys' => array( wfMemcKey( 'valid-tags-hook' ) ),
+ 'lockTSE' => 300,
+ 'pcTTL' => 30
+ )
);
}
* @return array Array of string => int
*/
public static function tagUsageStatistics() {
- static $cachedStats = null;
-
- // Process cache to avoid I/O and repeated regens during holdoff
- if ( $cachedStats !== null ) {
- return $cachedStats;
- }
-
$fname = __METHOD__;
- $cachedStats = ObjectCache::getMainWANInstance()->getWithSetCallback(
+ return ObjectCache::getMainWANInstance()->getWithSetCallback(
wfMemcKey( 'change-tag-statistics' ),
- function() use ( $fname ) {
- $out = array();
-
+ 300,
+ function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
$dbr = wfGetDB( DB_SLAVE, 'vslow' );
+
+ $setOpts += Database::getCacheSetOptions( $dbr );
+
$res = $dbr->select(
'change_tag',
array( 'ct_tag', 'hitcount' => 'count(*)' ),
array( 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' )
);
+ $out = array();
foreach ( $res as $row ) {
$out[$row->ct_tag] = $row->hitcount;
}
return $out;
},
- 300,
- array( wfMemcKey( 'change-tag-statistics' ) ),
- array( 'lockTSE' => INF )
+ array(
+ 'checkKeys' => array( wfMemcKey( 'change-tag-statistics' ) ),
+ 'lockTSE' => 300,
+ 'pcTTL' => 30
+ )
);
-
- return $cachedStats;
}
/**