namespace Friendica\Core\Cache;
-use dba;
use Friendica\Core\Cache;
-use Friendica\Database\DBM;
+use Friendica\Database\DBA;
use Friendica\Util\DateTimeFormat;
/**
* Database Cache Driver
*
- * @author Hypolite Petovan <mrpetovan@gmail.com>
+ * @author Hypolite Petovan <hypolite@mrpetovan.com>
*/
-class DatabaseCacheDriver implements ICacheDriver
+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` >= ?', $key, DateTimeFormat::utcNow()]);
+ $cache = DBA::selectFirst('cache', ['v'], ['`k` = ? AND (`expires` >= ? OR `expires` = -1)', $key, DateTimeFormat::utcNow()]);
- if (DBM::is_result($cache)) {
+ if (DBA::isResult($cache)) {
$cached = $cache['v'];
$value = @unserialize($cached);
return null;
}
- public function set($key, $value, $duration = Cache::MONTH)
+ /**
+ * (@inheritdoc)
+ */
+ public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
{
- $fields = [
- 'v' => serialize($value),
- 'expires' => DateTimeFormat::utc('now + ' . $duration . ' seconds'),
- 'updated' => DateTimeFormat::utcNow()
- ];
+ 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);
+ return DBA::update('cache', $fields, ['k' => $key], true);
}
+ /**
+ * (@inheritdoc)
+ */
public function delete($key)
{
- return dba::delete('cache', ['k' => $key]);
+ return DBA::delete('cache', ['k' => $key]);
}
- public function clear()
+ /**
+ * (@inheritdoc)
+ */
+ public function clear($outdated = true)
{
- return dba::delete('cache', ['`expires` < NOW()']);
+ if ($outdated) {
+ return DBA::delete('cache', ['`expires` < NOW()']);
+ } else {
+ return DBA::delete('cache', ['`k` IS NOT NULL ']);
+ }
}
}