]> git.mxchange.org Git - friendica.git/blobdiff - src/Core/Cache/DatabaseCacheDriver.php
Merge pull request #7255 from annando/issue-7223
[friendica.git] / src / Core / Cache / DatabaseCacheDriver.php
index 9703208d7b48888024f4082b5417630a51332ca5..f6f5b6486cb6b7c3d02d4af991a84cc955758da5 100644 (file)
-<?php\r
-\r
-namespace Friendica\Core\Cache;\r
-\r
-use dba;\r
-use Friendica\Core\Cache;\r
-use Friendica\Database\DBM;\r
-use Friendica\Util\DateTimeFormat;\r
-\r
-/**\r
- * Database Cache Driver\r
- *\r
- * @author Hypolite Petovan <mrpetovan@gmail.com>\r
- */\r
-class DatabaseCacheDriver implements ICacheDriver\r
-{\r
-       public function get($key)\r
-       {\r
-               $cache = dba::selectFirst('cache', ['v'], ['`k` = ? AND `expires` >= ?', $key, DateTimeFormat::utcNow()]);\r
-\r
-               if (DBM::is_result($cache)) {\r
-                       $cached = $cache['v'];\r
-                       $value = @unserialize($cached);\r
-\r
-                       // Only return a value if the serialized value is valid.\r
-                       // We also check if the db entry is a serialized\r
-                       // boolean 'false' value (which we want to return).\r
-                       if ($cached === serialize(false) || $value !== false) {\r
-                               return $value;\r
-                       }\r
-               }\r
-\r
-               return null;\r
-       }\r
-\r
-       public function set($key, $value, $duration = Cache::MONTH)\r
-       {\r
-               $fields = [\r
-                       'v'       => serialize($value),\r
-                       'expires' => DateTimeFormat::utc('now + ' . Cache::duration($duration) . ' seconds'),\r
-                       'updated' => DateTimeFormat::utcNow()\r
-               ];\r
-\r
-               return dba::update('cache', $fields, ['k' => $key], true);\r
-       }\r
-\r
-       public function delete($key)\r
-       {\r
-               return dba::delete('cache', ['k' => $key]);\r
-       }\r
-\r
-       public function clear()\r
-       {\r
-               return dba::delete('cache', ['`expires` < NOW()']);\r
-       }\r
-}\r
+<?php
+
+namespace Friendica\Core\Cache;
+
+use Friendica\Core\Cache;
+use Friendica\Database\DBA;
+use Friendica\Util\DateTimeFormat;
+
+/**
+ * Database Cache Driver
+ *
+ * @author Hypolite Petovan <hypolite@mrpetovan.com>
+ */
+class DatabaseCacheDriver extends AbstractCacheDriver implements ICacheDriver
+{
+       /**
+        * (@inheritdoc)
+        */
+       public function getAllKeys($prefix = null)
+       {
+               if (empty($prefix)) {
+                       $where = ['`expires` >= ?', DateTimeFormat::utcNow()];
+               } else {
+                       $where = ['`expires` >= ? AND `k` LIKE CONCAT(?, \'%\')', DateTimeFormat::utcNow(), $prefix];
+               }
+
+               $stmt = DBA::select('cache', ['k'], $where);
+
+               $keys = [];
+               while ($key = DBA::fetch($stmt)) {
+                       array_push($keys, $key['k']);
+               }
+               DBA::close($stmt);
+
+               return $keys;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function get($key)
+       {
+               $cache = DBA::selectFirst('cache', ['v'], ['`k` = ? AND (`expires` >= ? OR `expires` = -1)', $key, DateTimeFormat::utcNow()]);
+
+               if (DBA::isResult($cache)) {
+                       $cached = $cache['v'];
+                       $value = @unserialize($cached);
+
+                       // Only return a value if the serialized value is valid.
+                       // We also check if the db entry is a serialized
+                       // boolean 'false' value (which we want to return).
+                       if ($cached === serialize(false) || $value !== false) {
+                               return $value;
+                       }
+               }
+
+               return null;
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
+       {
+               if ($ttl > 0) {
+                       $fields = [
+                               'v' => serialize($value),
+                               'expires' => DateTimeFormat::utc('now + ' . $ttl . 'seconds'),
+                               'updated' => DateTimeFormat::utcNow()
+                       ];
+               } else {
+                       $fields = [
+                               'v' => serialize($value),
+                               'expires' => -1,
+                               'updated' => DateTimeFormat::utcNow()
+                       ];
+               }
+
+               return DBA::update('cache', $fields, ['k' => $key], true);
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function delete($key)
+       {
+               return DBA::delete('cache', ['k' => $key]);
+       }
+
+       /**
+        * (@inheritdoc)
+        */
+       public function clear($outdated = true)
+       {
+               if ($outdated) {
+                       return DBA::delete('cache', ['`expires` < NOW()']);
+               } else {
+                       return DBA::delete('cache', ['`k` IS NOT NULL ']);
+               }
+       }
+}