]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - includes/libs/objectcache/HashBagOStuff.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / includes / libs / objectcache / HashBagOStuff.php
1 <?php
2 /**
3  * Per-process memory cache for storing items.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  * http://www.gnu.org/copyleft/gpl.html
19  *
20  * @file
21  * @ingroup Cache
22  */
23
24 /**
25  * Simple store for keeping values in an associative array for the current process.
26  *
27  * Data will not persist and is not shared with other processes.
28  *
29  * @ingroup Cache
30  */
31 class HashBagOStuff extends BagOStuff {
32         /** @var mixed[] */
33         protected $bag = [];
34         /** @var int Max entries allowed */
35         protected $maxCacheKeys;
36
37         const KEY_VAL = 0;
38         const KEY_EXP = 1;
39
40         /**
41          * @param array $params Additional parameters include:
42          *   - maxKeys : only allow this many keys (using oldest-first eviction)
43          */
44         function __construct( $params = [] ) {
45                 parent::__construct( $params );
46
47                 $this->maxCacheKeys = isset( $params['maxKeys'] ) ? $params['maxKeys'] : INF;
48                 if ( $this->maxCacheKeys <= 0 ) {
49                         throw new InvalidArgumentException( '$maxKeys parameter must be above zero' );
50                 }
51         }
52
53         protected function expire( $key ) {
54                 $et = $this->bag[$key][self::KEY_EXP];
55                 if ( $et == self::TTL_INDEFINITE || $et > time() ) {
56                         return false;
57                 }
58
59                 $this->delete( $key );
60
61                 return true;
62         }
63
64         /**
65          * Does this bag have a non-null value for the given key?
66          *
67          * @param string $key
68          * @return bool
69          * @since 1.27
70          */
71         protected function hasKey( $key ) {
72                 return isset( $this->bag[$key] );
73         }
74
75         protected function doGet( $key, $flags = 0 ) {
76                 if ( !$this->hasKey( $key ) ) {
77                         return false;
78                 }
79
80                 if ( $this->expire( $key ) ) {
81                         return false;
82                 }
83
84                 // Refresh key position for maxCacheKeys eviction
85                 $temp = $this->bag[$key];
86                 unset( $this->bag[$key] );
87                 $this->bag[$key] = $temp;
88
89                 return $this->bag[$key][self::KEY_VAL];
90         }
91
92         public function set( $key, $value, $exptime = 0, $flags = 0 ) {
93                 // Refresh key position for maxCacheKeys eviction
94                 unset( $this->bag[$key] );
95                 $this->bag[$key] = [
96                         self::KEY_VAL => $value,
97                         self::KEY_EXP => $this->convertExpiry( $exptime )
98                 ];
99
100                 if ( count( $this->bag ) > $this->maxCacheKeys ) {
101                         reset( $this->bag );
102                         $evictKey = key( $this->bag );
103                         unset( $this->bag[$evictKey] );
104                 }
105
106                 return true;
107         }
108
109         public function delete( $key ) {
110                 unset( $this->bag[$key] );
111
112                 return true;
113         }
114
115         public function clear() {
116                 $this->bag = [];
117         }
118 }