-<?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 ']);
+ }
+ }
+}