Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 31 additions & 25 deletions src/Cache/Adapters/DatabaseAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,21 +49,20 @@ protected function add(string $key_name, mixed $data, ?int $time = null): bool
return $this->update($key_name, $data, $time);
}

if (is_callable($data)) {
$content = $data();
} else {
$content = $data;
}

$current_time = time();

if (!is_null($time)) {
$time += $current_time;
} else {
$time = $current_time;
}

return $this->query->insert(['key_name' => $key_name, "data" => serialize($content), "expire" => date("Y-m-d H:i:s", $time)]);
$content = is_callable($data) ? $data() : $data;

// A null (or negative) TTL means the entry never expires, stored as a
// NULL expire column. Storing time() here instead would make the entry
// expire on the very next second, dropping freshly-set values.
$expire = (is_null($time) || $time < 0)
? null
: date("Y-m-d H:i:s", time() + $time);

return $this->query->insert([
'key_name' => $key_name,
"data" => serialize($content),
"expire" => $expire,
]);
}

/**
Expand All @@ -82,18 +81,17 @@ public function has(string $key_name): bool
*/
private function update(string $key, mixed $data, ?int $time = null): mixed
{
if (is_callable($data)) {
$content = $data();
} else {
$content = $data;
}
$content = is_callable($data) ? $data() : $data;

$result = $this->query->where("key_name", $key)->first();
$result->data = serialize($content);

if (!is_null($time)) {
$result->expire = date("Y-m-d H:i:s", strtotime($result->expire) + $time);
}
// Rewrite the expiry from scratch: a null/negative TTL clears it (never
// expires), otherwise it is now + TTL. Leaving the old value in place
// would let a stale, already-past timestamp survive a fresh set().
$result->expire = (is_null($time) || $time < 0)
? null
: date("Y-m-d H:i:s", time() + $time);

return $this->query->where("key_name", $key)->update((array) $result);
}
Expand Down Expand Up @@ -199,7 +197,9 @@ public function setTime(string $key, int $time): bool

$result = $this->query->where("key_name", $key)->first();

$result->expire = date("Y-m-d H:i:s", strtotime($result->expire) + $time);
// For a never-expiring entry, count the added time from now.
$base = is_null($result->expire) ? time() : strtotime($result->expire);
$result->expire = date("Y-m-d H:i:s", $base + $time);

return (bool) $this->query->where("key_name", $key)->update((array) $result);
}
Expand All @@ -217,6 +217,11 @@ public function timeOf(string $key): int|bool|string

$result = $this->query->where("key_name", $key)->first();

// No expiry set: the entry never expires, so it has no remaining time.
if (is_null($result->expire)) {
return 0;
}

$current_time = time();

return strtotime($result->expire, $current_time) - $current_time;
Expand Down Expand Up @@ -253,7 +258,8 @@ public function get(string $key, mixed $default = null): mixed

$result = $this->query->where("key_name", $key)->first();

if (strtotime($result->expire) < time()) {
// A NULL expire means the entry never expires.
if (!is_null($result->expire) && strtotime($result->expire) < time()) {
$this->forget($key);
return is_callable($default) ? $default() : $default;
}
Expand Down
Loading