Create CacheRepository for cache table

This commit is contained in:
Art4 2025-04-16 10:40:07 +00:00
parent 59ee2f34e7
commit a4ca74a3aa
2 changed files with 191 additions and 0 deletions

View file

@ -0,0 +1,94 @@
<?php
// Copyright (C) 2010-2024, the Friendica project
// SPDX-FileCopyrightText: 2010-2024 the Friendica project
//
// SPDX-License-Identifier: AGPL-3.0-or-later
declare(strict_types=1);
namespace Friendica\Database\Repository;
use Friendica\Database\Database;
use Friendica\Database\DatabaseException;
use Throwable;
/**
* Repository for cache table
*/
final class CacheRepository
{
private Database $database;
public function __construct(Database $database)
{
$this->database = $database;
}
/**
* @throws DatabaseException
*
* @return array<string>
*/
public function getAllKeysValidUntil(string $expires): array
{
$throw = $this->database->throwExceptionsOnErrors(true);
try {
return $this->getAllKeys($expires, null);
} catch (Throwable $th) {
if (! $th instanceof DatabaseException) {
$th = new DatabaseException('Cannot fetch all keys without prefix', 0, '', $th);
}
throw $th;
} finally {
$this->database->throwExceptionsOnErrors($throw);
}
}
/**
* @throws DatabaseException
*
* @return array<string>
*/
public function getAllKeysValidUntilWithPrefix(string $expires, string $prefix): array
{
$throw = $this->database->throwExceptionsOnErrors(true);
try {
return $this->getAllKeys($expires, $prefix);
} catch (Throwable $th) {
if (! $th instanceof DatabaseException) {
$th = new DatabaseException(sprintf('Cannot fetch all keys with prefix `%s`', $prefix), 0, '', $th);
}
throw $th;
} finally {
$this->database->throwExceptionsOnErrors($throw);
}
}
private function getAllKeys(string $expires, ?string $prefix = null): array
{
if ($prefix === null) {
$where = ['`expires` >= ?', $expires];
} else {
$where = ['`expires` >= ? AND `k` LIKE CONCAT(?, \'%\')', $expires, $prefix];
}
$stmt = $this->database->select('cache', ['k'], $where);
$keys = [];
try {
while ($key = $this->database->fetch($stmt)) {
array_push($keys, $key['k']);
}
} finally {
$this->database->close($stmt);
}
return $keys;
}
}

View file

@ -0,0 +1,97 @@
<?php
// Copyright (C) 2010-2024, the Friendica project
// SPDX-FileCopyrightText: 2010-2024 the Friendica project
//
// SPDX-License-Identifier: AGPL-3.0-or-later
declare(strict_types=1);
namespace Friendica\Test\Unit\Database\Repository;
use Friendica\Database\Database;
use Friendica\Database\DatabaseException;
use Friendica\Database\Repository\CacheRepository;
use PHPUnit\Framework\TestCase;
use Throwable;
class CacheRepositoryTest extends TestCase
{
public function testGetAllKeysValidUntilReturnsArray(): void
{
$stmt = new \stdClass;
$database = $this->createStub(Database::class);
$database->method('select')->willReturnMap([
['cache', ['k'], ['`expires` >= ?', '2025-04-16 10:12:01'], [], $stmt],
]);
$database->method('fetch')->willReturnOnConsecutiveCalls(
['k' => 'value1'],
['k' => 'value2'],
['k' => 'value3'],
false
);
$repo = new CacheRepository($database);
$this->assertSame(
[
'value1',
'value2',
'value3',
],
$repo->getAllKeysValidUntil('2025-04-16 10:12:01')
);
}
public function testGetAllKeysValidUntilThrowsException(): void
{
$database = $this->createStub(Database::class);
$database->method('select')->willThrowException($this->createStub(Throwable::class));
$repo = new CacheRepository($database);
$this->expectException(DatabaseException::class);
$repo->getAllKeysValidUntil('2025-04-16 10:12:01');
}
public function testGetAllKeysValidUntilWithPrefixReturnsArray(): void
{
$stmt = new \stdClass;
$database = $this->createStub(Database::class);
$database->method('select')->willReturnMap([
['cache', ['k'], ['`expires` >= ?', '2025-04-16 10:12:01'], [], $stmt],
]);
$database->method('fetch')->willReturnOnConsecutiveCalls(
['k' => 'value1'],
['k' => 'value2'],
['k' => 'value3'],
false
);
$repo = new CacheRepository($database);
$this->assertSame(
[
'value1',
'value2',
'value3',
],
$repo->getAllKeysValidUntilWithPrefix('2025-04-16 10:12:01', 'prefix')
);
}
public function testGetAllKeysValidUntilWithPrefixThrowsException(): void
{
$database = $this->createStub(Database::class);
$database->method('select')->willThrowException($this->createStub(Throwable::class));
$repo = new CacheRepository($database);
$this->expectException(DatabaseException::class);
$repo->getAllKeysValidUntilWithPrefix('2025-04-16 10:12:01', 'prefix');
}
}