MediaWiki REL1_34
GadgetDefinitionNamespaceRepo.php
Go to the documentation of this file.
1<?php
2
6
17 const CACHE_TTL = 86400;
18
22 private $wanCache;
23
24 public function __construct() {
25 $this->wanCache = MediaWikiServices::getInstance()->getMainWANObjectCache();
26 }
27
33 public function getGadgetIds() {
34 $key = $this->getGadgetIdsKey();
35
36 $fname = __METHOD__;
37 return $this->wanCache->getWithSetCallback(
38 $key,
39 self::CACHE_TTL,
40 function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
42 $setOpts += Database::getCacheSetOptions( $dbr );
43
44 return $dbr->selectFieldValues(
45 'page',
46 'page_title',
47 [ 'page_namespace' => NS_GADGET_DEFINITION ],
48 $fname
49 );
50 },
51 [
52 'checkKeys' => [ $key ],
53 'pcTTL' => WANObjectCache::TTL_PROC_SHORT,
54 'lockTSE' => 30
55 ]
56 );
57 }
58
62 public function handlePageUpdate( LinkTarget $target ) {
63 if ( $target->inNamespace( NS_GADGET_DEFINITION ) ) {
64 $this->purgeGadgetEntry( $target->getText() );
65 }
66 }
67
71 public function handlePageCreation( LinkTarget $target ) {
72 if ( $target->inNamespace( NS_GADGET_DEFINITION ) ) {
73 $this->purgeGadgetIdsList();
74 }
75 }
76
80 public function handlePageDeletion( LinkTarget $target ) {
81 if ( $target->inNamespace( NS_GADGET_DEFINITION ) ) {
82 $this->purgeGadgetIdsList();
83 $this->purgeGadgetEntry( $target->getText() );
84 }
85 }
86
90 public function purgeGadgetIdsList() {
91 $this->wanCache->touchCheckKey( $this->getGadgetIdsKey() );
92 }
93
99 public function getGadget( $id ) {
100 $key = $this->getGadgetCacheKey( $id );
101 $gadget = $this->wanCache->getWithSetCallback(
102 $key,
103 self::CACHE_TTL,
104 function ( $old, &$ttl, array &$setOpts ) use ( $id ) {
105 $setOpts += Database::getCacheSetOptions( wfGetDB( DB_REPLICA ) );
106 $title = Title::makeTitleSafe( NS_GADGET_DEFINITION, $id );
107 if ( !$title ) {
108 $ttl = WANObjectCache::TTL_UNCACHEABLE;
109 return null;
110 }
111
112 $rev = Revision::newFromTitle( $title );
113 if ( !$rev ) {
114 $ttl = WANObjectCache::TTL_UNCACHEABLE;
115 return null;
116 }
117
118 $content = $rev->getContent();
119 if ( !$content instanceof GadgetDefinitionContent ) {
120 // Uhm...
121 $ttl = WANObjectCache::TTL_UNCACHEABLE;
122 return null;
123 }
124
126 },
127 [
128 'checkKeys' => [ $key ],
129 'pcTTL' => WANObjectCache::TTL_PROC_SHORT,
130 'lockTSE' => 30
131 ]
132 );
133
134 if ( $gadget === null ) {
135 throw new InvalidArgumentException( "No gadget registered for '$id'" );
136 }
137
138 return $gadget;
139 }
140
146 public function purgeGadgetEntry( $id ) {
147 $this->wanCache->touchCheckKey( $this->getGadgetCacheKey( $id ) );
148 }
149
153 private function getGadgetIdsKey() {
154 return $this->wanCache->makeKey( 'gadgets', 'namespace', 'ids' );
155 }
156
161 private function getGadgetCacheKey( $id ) {
162 return $this->wanCache->makeKey(
163 'gadgets', 'object', md5( $id ), Gadget::GADGET_CLASS_VERSION );
164 }
165}
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
GadgetRepo implementation where each gadget has a page in the Gadget definition namespace,...
handlePageDeletion(LinkTarget $target)
Given that the provided page was updated, invalidate caches if necessary.void
const CACHE_TTL
How long in seconds the list of gadget ids and individual gadgets should be cached for (1 day)
getGadgetIds()
Get a list of gadget ids from cache/database.
handlePageCreation(LinkTarget $target)
Given that the provided page was created, invalidate caches if necessary.void
purgeGadgetEntry( $id)
Update the cache for a specific Gadget whenever it is updated.
purgeGadgetIdsList()
Purge the list of gadget ids when a page is deleted or if a new page is created.
handlePageUpdate(LinkTarget $target)
Given that the provided page was updated, invalidate caches if necessary.void
const GADGET_CLASS_VERSION
Increment this when changing class structure.
Definition Gadget.php:21
static newFromDefinitionContent( $id, GadgetDefinitionContent $content)
Create a object based on the metadata in a GadgetDefinitionContent object.
Definition Gadget.php:74
MediaWikiServices is the service locator for the application scope of MediaWiki.
Multi-datacenter aware caching interface.
Relational database abstraction object.
Definition Database.php:49
inNamespace( $ns)
Convenience function to test if it is in the namespace.
getText()
Returns the link in text form, without namespace prefix or fragment.
const DB_REPLICA
Definition defines.php:25
$content
Definition router.php:78