aboutsummaryrefslogtreecommitdiff
path: root/lib/classes/cache/Proxy.php
diff options
context:
space:
mode:
authorPhilipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de>2024-09-24 10:53:31 +0200
committerPhilipp Schüttlöffel <schuettloeffel@zqs.uni-hannover.de>2024-09-24 10:53:31 +0200
commit4459dd7917f4d1c34f40bb68f0e991e9c3d53e4c (patch)
tree5c07151ae61276d334e88f6309c30d439a85c12e /lib/classes/cache/Proxy.php
parentda0022e5c1abbf9825ae76debaabdff7e8623bb4 (diff)
parent97a188592c679890a25c37ab78463add76a52ff7 (diff)
Merge branch 'main' into issue-3911issue-3911
Diffstat (limited to 'lib/classes/cache/Proxy.php')
-rw-r--r--lib/classes/cache/Proxy.php123
1 files changed, 123 insertions, 0 deletions
diff --git a/lib/classes/cache/Proxy.php b/lib/classes/cache/Proxy.php
new file mode 100644
index 0000000..fef034d
--- /dev/null
+++ b/lib/classes/cache/Proxy.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace Studip\Cache;
+
+use Psr\Cache\CacheItemInterface;
+use StudipCacheOperation;
+
+/**
+ * Proxies a StudipCache and stores the expire operation in the database.
+ * These operations are lateron applied to the cache they should have
+ * been applied to in the beginning.
+ *
+ * @author Jan-Hendrik Willms <tleilax+studip@gmail.com>
+ * @license GPL2 or any later version
+ * @since Stud.IP 3.3
+ */
+class Proxy extends Cache
+{
+ protected Cache $actual_cache;
+ protected array $proxy_these;
+
+ /**
+ * @param Cache $cache The actual cache object
+ * @param mixed $proxy_these List of operations to proxy (should be an
+ * array but a space seperated string is also
+ * valid)
+ */
+ public function __construct(Cache $cache, $proxy_these = ['expire'])
+ {
+ if (!is_array($proxy_these)) {
+ $proxy_these = words($proxy_these);
+ }
+
+ $this->actual_cache = $cache;
+ $this->proxy_these = is_array($proxy_these)
+ ? $proxy_these
+ : words($proxy_these);
+ }
+
+ /**
+ * Expires just a single key.
+ *
+ * @param string $arg The item's key
+ */
+ public function expire($arg)
+ {
+ if (in_array('expire', $this->proxy_these)) {
+ try {
+ $operation = new StudipCacheOperation([$arg, 'expire']);
+ $operation->parameters = serialize([]);
+ $operation->store();
+ } catch (\Exception) {
+ }
+ }
+
+ return $this->actual_cache->expire($arg);
+ }
+
+ /**
+ * Expire all items from the cache.
+ */
+ public function flush()
+ {
+ if (in_array('flush', $this->proxy_these)) {
+ try {
+ $operation = new StudipCacheOperation(['', 'flush']);
+ $operation->parameters = serialize([]);
+ $operation->store();
+ } catch (\Exception) {
+ }
+ }
+
+ return $this->actual_cache->flush();
+ }
+
+ public static function getDisplayName(): string
+ {
+ return static::class;
+ }
+
+ public function getStats(): array
+ {
+ return $this->actual_cache->getStats();
+ }
+
+ public static function getConfig(): array
+ {
+ return [];
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getItem(string $key): CacheItemInterface
+ {
+ return $this->actual_cache->getItem($key);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function hasItem(string $key): bool
+ {
+ return $this->actual_cache->hasItem($key);
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function save(CacheItemInterface $item): bool
+ {
+ if (in_array('save', $this->proxy_these)) {
+ try {
+ $operation = new StudipCacheOperation([$item->getKey(), 'save']);
+ $operation->parameters = serialize([$item]);
+ $operation->store();
+ } catch (\Exception) {
+ }
+ }
+
+ return $this->actual_cache->save($item);
+ }
+}