diff --git a/php/cli/CachectlApp.php b/php/cli/CachectlApp.php index 2773cee..91f8636 100644 --- a/php/cli/CachectlApp.php +++ b/php/cli/CachectlApp.php @@ -18,6 +18,9 @@ class CachectlApp extends Application { ["-r", "--read", "name" => "action", "value" => self::ACTION_READ, "help" => "Afficher le contenu d'un fichier cache", ], + ["-d::", "--data", + "help" => "Identifiant de la donnée à afficher", + ], ["-i", "--infos", "name" => "action", "value" => self::ACTION_INFOS, "help" => "Afficher des informations sur le fichier cache", ], @@ -43,6 +46,8 @@ class CachectlApp extends Application { protected $updateAction, $updateDuration; + protected $data = null; + function setActionUpdate(int $action, $updateDuration): void { $this->action = self::ACTION_UPDATE; switch ($action) { @@ -90,7 +95,7 @@ class CachectlApp extends Application { "duration" => "INF", "override_duration" => true, ]); - yaml::dump($cache->get()); + yaml::dump($cache->get($this->data)); break; case self::ACTION_INFOS: if ($showSection) msg::section($file); diff --git a/php/src/cache/CacheData.php b/php/src/cache/CacheData.php index 5ce5b83..5ad37c0 100644 --- a/php/src/cache/CacheData.php +++ b/php/src/cache/CacheData.php @@ -6,7 +6,7 @@ use nulib\php\func; use Traversable; /** - * Interface CacheData: gestion d'une donnée mise en cache + * Class CacheData: gestion d'une donnée mise en cache */ abstract class CacheData { function __construct(?string $name, $compute) { @@ -29,6 +29,12 @@ abstract class CacheData { return $data; } + /** + * le cache est-il externe? si non, utiliser {@link setDatafile()} pour + * spécifier le fichier destination de la valeur + */ + abstract function isExternal(): bool; + /** spécifier le chemin du cache à partir du fichier de base */ abstract function setDatafile(?string $basefile): void; diff --git a/php/src/cache/CacheFile.php b/php/src/cache/CacheFile.php index f40ed80..6107f9f 100644 --- a/php/src/cache/CacheFile.php +++ b/php/src/cache/CacheFile.php @@ -217,10 +217,12 @@ class CacheFile extends SharedFile { return null; } - protected function refreshData($data, bool $noCache) { - $source = $this->sources[$data] ?? null; + protected function refreshData($key, bool $noCache) { + $source = $this->sources[$key] ?? null; + $external = $source !== null && $source->isExternal(); + $updateMetadata = $this->shouldUpdate($noCache); - if ($source === null) $updateData = $this->data === null; + if (!$key && !$external) $updateData = $this->data === null; else $updateData = !$source->exists(); if (!$this->readonly && ($updateMetadata || $updateData)) { $this->lockWrite(); @@ -232,11 +234,12 @@ class CacheFile extends SharedFile { $this->data = null; $updateData = true; } - if ($source === null) { + if (!$key && !$external) { if ($updateData) { # calculer la valeur try { - $data = $this->compute(); + if ($source !== null) $data = $source->compute(); + else $data = $this->compute(); } catch (Exception $e) { # le fichier n'est pas mis à jour, mais ce n'est pas gênant: lors # des futurs appels, l'exception continuera d'être lancée ou la @@ -270,7 +273,7 @@ class CacheFile extends SharedFile { $data = null; } } - } elseif ($source === null) { + } elseif (!$key && !$external) { $data = $this->data; } elseif ($source->exists()) { $data = $source->load(); diff --git a/php/src/cache/CursorCacheData.php b/php/src/cache/CursorCacheData.php index bcfdd33..c0b402d 100644 --- a/php/src/cache/CursorCacheData.php +++ b/php/src/cache/CursorCacheData.php @@ -11,6 +11,10 @@ class CursorCacheData extends CacheData { $this->channel = $channel; } + function isExternal(): bool { + return true; + } + function setDatafile(?string $basefile): void { } diff --git a/php/src/cache/DataCacheData.php b/php/src/cache/DataCacheData.php index 7ada552..f3b4e26 100644 --- a/php/src/cache/DataCacheData.php +++ b/php/src/cache/DataCacheData.php @@ -27,6 +27,10 @@ class DataCacheData extends CacheData { return $data; } + function isExternal(): bool { + return false; + } + protected string $datafile; function setDatafile(?string $basefile): void {