modifs.mineures sans commentaires
This commit is contained in:
		
							parent
							
								
									3ea51e70b4
								
							
						
					
					
						commit
						66bd7ccf12
					
				| @ -1,5 +1,5 @@ | |||||||
| <?php | <?php | ||||||
| namespace nulib\db\cache; | namespace nulib\cache; | ||||||
| 
 | 
 | ||||||
| use nulib\cl; | use nulib\cl; | ||||||
| use nulib\db\CapacitorChannel; | use nulib\db\CapacitorChannel; | ||||||
| @ -1,5 +1,5 @@ | |||||||
| <?php | <?php | ||||||
| namespace nulib\file\cache; | namespace nulib\cache; | ||||||
| 
 | 
 | ||||||
| use nulib\cl; | use nulib\cl; | ||||||
| use nulib\php\func; | use nulib\php\func; | ||||||
| @ -1,13 +1,15 @@ | |||||||
| <?php | <?php | ||||||
| namespace nulib\db\cache; | namespace nulib\cache; | ||||||
| 
 | 
 | ||||||
| use Closure; | use Closure; | ||||||
| use IteratorAggregate; | use IteratorAggregate; | ||||||
|  | use nulib\cache\CacheChannel; | ||||||
|  | use nulib\cache\storage_cache; | ||||||
| use nulib\cl; | use nulib\cl; | ||||||
| use nulib\db\CapacitorChannel; | use nulib\db\CapacitorChannel; | ||||||
| use Traversable; | use Traversable; | ||||||
| 
 | 
 | ||||||
| class RowsChannel extends CapacitorChannel implements IteratorAggregate { | class CacheDataChannel extends CapacitorChannel implements IteratorAggregate { | ||||||
|   const COLUMN_DEFINITIONS = [ |   const COLUMN_DEFINITIONS = [ | ||||||
|     "key" => "varchar(128) primary key not null", |     "key" => "varchar(128) primary key not null", | ||||||
|     "all_values" => "mediumtext", |     "all_values" => "mediumtext", | ||||||
| @ -38,7 +40,7 @@ class RowsChannel extends CapacitorChannel implements IteratorAggregate { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   function getIterator(): Traversable { |   function getIterator(): Traversable { | ||||||
|     $cm = cache::get(); |     $cm = storage_cache::get(); | ||||||
|     if ($cm->shouldUpdate($this->cacheIds)) { |     if ($cm->shouldUpdate($this->cacheIds)) { | ||||||
|       $this->capacitor->reset(); |       $this->capacitor->reset(); | ||||||
|       foreach (($this->builder)() as $key => $row) { |       foreach (($this->builder)() as $key => $row) { | ||||||
| @ -1,12 +1,12 @@ | |||||||
| <?php | <?php | ||||||
| namespace nulib\file\cache; | namespace nulib\cache; | ||||||
| 
 | 
 | ||||||
| use Exception; | use Exception; | ||||||
| use nulib\cl; |  | ||||||
| use nulib\cv; | use nulib\cv; | ||||||
| use nulib\file; | use nulib\file; | ||||||
| use nulib\file\SharedFile; | use nulib\file\SharedFile; | ||||||
| use nulib\os\path; | use nulib\os\path; | ||||||
|  | use nulib\php\func; | ||||||
| use nulib\php\time\DateTime; | use nulib\php\time\DateTime; | ||||||
| use nulib\php\time\Delay; | use nulib\php\time\Delay; | ||||||
| use nulib\str; | use nulib\str; | ||||||
| @ -18,10 +18,17 @@ class CacheFile extends SharedFile { | |||||||
| 
 | 
 | ||||||
|   const EXT = ".cache"; |   const EXT = ".cache"; | ||||||
| 
 | 
 | ||||||
|  |   protected function ensure_source($source): CacheData { | ||||||
|  |     if ($source instanceof CacheData) return $source; | ||||||
|  |     if (cv::subclass_of($source, CacheData::class)) return new $source(); | ||||||
|  |     if (func::is_callable($source)) return new CacheData($source); | ||||||
|  |     throw ValueException::invalid_type($source, CacheData::class); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   function __construct($file, ?array $params=null) { |   function __construct($file, ?array $params=null) { | ||||||
|     if ($file === null) { |     if ($file === null) { | ||||||
|       $rand = bin2hex(random_bytes(8)); |       $rand = bin2hex(random_bytes(8)); | ||||||
|       $file = sys_get_temp_dir()."/$rand"; |       $file = path::join(sys_get_temp_dir(), $rand); | ||||||
|     } |     } | ||||||
|     $file = path::ensure_ext($file, self::EXT); |     $file = path::ensure_ext($file, self::EXT); | ||||||
|     $this->basedir = path::dirname($file); |     $this->basedir = path::dirname($file); | ||||||
| @ -32,34 +39,28 @@ class CacheFile extends SharedFile { | |||||||
|     $this->readonly = $params["readonly"] ?? false; |     $this->readonly = $params["readonly"] ?? false; | ||||||
|     $this->cacheNull = $params["cache_null"] ?? false; |     $this->cacheNull = $params["cache_null"] ?? false; | ||||||
|     $data = $params["data"] ?? null; |     $data = $params["data"] ?? null; | ||||||
|  |     $this->sources = null; | ||||||
|     if ($data === null) { |     if ($data === null) { | ||||||
|       $this->dataDefs = null; |       $this->source = null; | ||||||
|       $this->data = null; |  | ||||||
|     } elseif ($data instanceof CacheData) { |     } elseif ($data instanceof CacheData) { | ||||||
|       $this->dataDefs = null; |       $this->source = $data; | ||||||
|       $this->data = $data; |     } elseif (func::is_callable($data)) { | ||||||
|  |       $this->source = new CacheData($data); | ||||||
|     } elseif (!is_array($data)) { |     } elseif (!is_array($data)) { | ||||||
|       $this->dataDefs = null; |       $this->source = self::ensure_source($data); | ||||||
|       $this->data = $this->getData($data); |  | ||||||
|     } else { |     } else { | ||||||
|       $dataDefs = []; |       $sources = []; | ||||||
|       $tmpdefs = $data; |  | ||||||
|       $index = 0; |       $index = 0; | ||||||
|       foreach ($tmpdefs as $key => $data) { |       foreach ($data as $key => $source) { | ||||||
|         $odef = $data; |         $source = self::ensure_source($source); | ||||||
|         if ($data instanceof CacheData) { |  | ||||||
|         } elseif (cv::subclass_of($data, CacheData::class)) { |  | ||||||
|           $data = new $data(); |  | ||||||
|         } else { |  | ||||||
|           throw ValueException::invalid_type($odef, CacheData::class); |  | ||||||
|         } |  | ||||||
|         if ($key === $index) { |         if ($key === $index) { | ||||||
|           $index++; |           $index++; | ||||||
|           $key = $data->getName(); |           $key = $source->getName(); | ||||||
|         } |         } | ||||||
|         $dataDefs[$key] = $data; |         $sources[$key] = $source; | ||||||
|       } |       } | ||||||
|       $this->dataDefs = $dataDefs; |       $this->sources = $sources; | ||||||
|  |       $this->source = null; | ||||||
|     } |     } | ||||||
|     parent::__construct($file); |     parent::__construct($file); | ||||||
|   } |   } | ||||||
| @ -78,23 +79,23 @@ class CacheFile extends SharedFile { | |||||||
| 
 | 
 | ||||||
|   protected bool $cacheNull; |   protected bool $cacheNull; | ||||||
| 
 | 
 | ||||||
|   protected ?array $dataDefs; |   protected ?array $sources; | ||||||
| 
 | 
 | ||||||
|   protected ?CacheData $data; |   protected ?CacheData $source; | ||||||
| 
 | 
 | ||||||
|   protected function getData($data): CacheData { |   protected function getSource($data): CacheData { | ||||||
|     if ($data === null) { |     if ($data === null) { | ||||||
|       return $this->data ??= new CacheData(function() { |       return $this->source ??= new CacheData(function() { | ||||||
|         return $this->compute(); |         return $this->compute(); | ||||||
|       }); |       }); | ||||||
|     } |     } | ||||||
|     $odata = $data; |     $source = $data; | ||||||
|     if (is_string($data) || is_int($data)) { |     if (is_string($source) || is_int($source)) { | ||||||
|       $data = $this->dataDefs[$data] ?? null; |       $source = $this->sources[$source] ?? null; | ||||||
|       if ($data === null) throw ValueException::invalid_key($odata); |       if ($source === null) throw ValueException::invalid_key($data); | ||||||
|     } |     } | ||||||
|     if ($data instanceof CacheData) return $data; |     if ($source instanceof CacheData) return $source; | ||||||
|     throw ValueException::invalid_type($odata, CacheData::class); |     throw ValueException::invalid_type($data, CacheData::class); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
| @ -102,7 +103,7 @@ class CacheFile extends SharedFile { | |||||||
|    * |    * | ||||||
|    * on assume que le fichier existe, vu qu'il a été ouvert en c+b |    * on assume que le fichier existe, vu qu'il a été ouvert en c+b | ||||||
|    */ |    */ | ||||||
|   protected function isValid(): bool { |   function isValid(): bool { | ||||||
|     # considèrer que le fichier est invalide s'il est de taille nulle
 |     # considèrer que le fichier est invalide s'il est de taille nulle
 | ||||||
|     return $this->getSize() > 0; |     return $this->getSize() > 0; | ||||||
|   } |   } | ||||||
| @ -244,8 +245,8 @@ class CacheFile extends SharedFile { | |||||||
| 
 | 
 | ||||||
|   function get($data=null, bool $noCache=false) { |   function get($data=null, bool $noCache=false) { | ||||||
|     return $this->action(function () use ($data, $noCache) { |     return $this->action(function () use ($data, $noCache) { | ||||||
|       $data = $this->getData($data); |       $source = $this->getSource($data); | ||||||
|       $dataname = $data->getName(); |       $dataname = $source->getName(); | ||||||
|       $datafilename = ".{$this->basename}.{$dataname}".self::EXT; |       $datafilename = ".{$this->basename}.{$dataname}".self::EXT; | ||||||
|       $datafile = path::join($this->basedir, $datafilename); |       $datafile = path::join($this->basedir, $datafilename); | ||||||
| 
 | 
 | ||||||
| @ -256,12 +257,14 @@ class CacheFile extends SharedFile { | |||||||
|         if ($updateMetadata) { |         if ($updateMetadata) { | ||||||
|           # il faut refaire tout le cache
 |           # il faut refaire tout le cache
 | ||||||
|           $this->unlinkFiles(true); |           $this->unlinkFiles(true); | ||||||
|  |           $this->start = null; | ||||||
|  |           $this->duration = null; | ||||||
|           $updateData = true; |           $updateData = true; | ||||||
|         } |         } | ||||||
|         if ($updateData) { |         if ($updateData) { | ||||||
|           # calculer un fichier
 |           # calculer un fichier
 | ||||||
|           try { |           try { | ||||||
|             $data = $data->get(); |             $data = $source->get(); | ||||||
|           } catch (Exception $e) { |           } catch (Exception $e) { | ||||||
|             # ne pas garder le fichier en cas d'exception
 |             # ne pas garder le fichier en cas d'exception
 | ||||||
|             $this->unlinkDatafile($datafile); |             $this->unlinkDatafile($datafile); | ||||||
| @ -288,6 +291,19 @@ class CacheFile extends SharedFile { | |||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   function all($data=null, bool $noCache=false): ?iterable { | ||||||
|  |     $data = $this->get($data, $noCache); | ||||||
|  |     if ($data !== null && !is_iterable($data)) $data = [$data]; | ||||||
|  |     return $data; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   function delete($data=null): void { | ||||||
|  |     $source = $this->getSource($data); | ||||||
|  |     $dataname = $source->getName(); | ||||||
|  |     $datafilename = ".{$this->basename}.{$dataname}".self::EXT; | ||||||
|  |     $this->unlinkDatafile($datafilename); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   /** obtenir les informations sur le fichier */ |   /** obtenir les informations sur le fichier */ | ||||||
|   function getInfos(): array { |   function getInfos(): array { | ||||||
|     return $this->action(function () { |     return $this->action(function () { | ||||||
| @ -323,8 +339,12 @@ class CacheFile extends SharedFile { | |||||||
| 
 | 
 | ||||||
|   const UPDATE_SUB = -1, UPDATE_SET = 0, UPDATE_ADD = 1; |   const UPDATE_SUB = -1, UPDATE_SET = 0, UPDATE_ADD = 1; | ||||||
| 
 | 
 | ||||||
|   /** mettre à jour la durée de validité du fichier */ |   /** | ||||||
|   function updateDuration($nduration, int $action=1): void { |    * mettre à jour la durée de validité du fichier | ||||||
|  |    * | ||||||
|  |    * XXX UPDATE_SET n'est pas implémenté | ||||||
|  |    */ | ||||||
|  |   function updateDuration($nduration, int $action=self::UPDATE_ADD): void { | ||||||
|     if ($this->readonly) return; |     if ($this->readonly) return; | ||||||
|     $this->action(function () use ($nduration, $action) { |     $this->action(function () use ($nduration, $action) { | ||||||
|       if (!$this->isValid()) return; |       if (!$this->isValid()) return; | ||||||
| @ -1,11 +1,13 @@ | |||||||
| <?php | <?php | ||||||
| namespace nulib\db\cache; | namespace nulib\cache; | ||||||
| 
 | 
 | ||||||
|  | use nulib\cache\CacheChannel; | ||||||
|  | use nulib\cache\CacheDataChannel; | ||||||
| use nulib\db\Capacitor; | use nulib\db\Capacitor; | ||||||
| use nulib\db\CapacitorStorage; | use nulib\db\CapacitorStorage; | ||||||
| use nulib\db\sqlite\SqliteStorage; | use nulib\db\sqlite\SqliteStorage; | ||||||
| 
 | 
 | ||||||
| class cache { | class storage_cache { | ||||||
|   protected static ?CapacitorStorage $storage = null; |   protected static ?CapacitorStorage $storage = null; | ||||||
| 
 | 
 | ||||||
|   static function set_storage(CapacitorStorage $storage): CapacitorStorage { |   static function set_storage(CapacitorStorage $storage): CapacitorStorage { | ||||||
| @ -29,8 +31,8 @@ class cache { | |||||||
|     else return self::set(null); |     else return self::set(null); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   static function new(?RowsChannel $channel, $id=null, ?callable $builder=null): RowsChannel { |   static function new(?CacheDataChannel $channel, $id=null, ?callable $builder=null): CacheDataChannel { | ||||||
|     $channel ??= new RowsChannel($id, $builder); |     $channel ??= new CacheDataChannel($id, $builder); | ||||||
|     new Capacitor(self::get_storage(), $channel); |     new Capacitor(self::get_storage(), $channel); | ||||||
|     return $channel; |     return $channel; | ||||||
|   } |   } | ||||||
| @ -4,7 +4,7 @@ namespace nulib\tools; | |||||||
| use Exception; | use Exception; | ||||||
| use nulib\app\cli\Application; | use nulib\app\cli\Application; | ||||||
| use nulib\ext\yaml; | use nulib\ext\yaml; | ||||||
| use nulib\file\cache\CacheFile; | use nulib\cache\CacheFile; | ||||||
| use nulib\os\path; | use nulib\os\path; | ||||||
| use nulib\output\msg; | use nulib\output\msg; | ||||||
| 
 | 
 | ||||||
| @ -32,10 +32,11 @@ class NucacheApp extends Application { | |||||||
|       "action" => [null, "->setActionUpdate", self::ACTION_UPDATE_SUB], |       "action" => [null, "->setActionUpdate", self::ACTION_UPDATE_SUB], | ||||||
|       "help" => "Enlever le nombre de secondes spécifié à la durée du cache", |       "help" => "Enlever le nombre de secondes spécifié à la durée du cache", | ||||||
|     ], |     ], | ||||||
|     ["-s", "--set-duration", "args" => 1, |     #XXX pas encore implémenté
 | ||||||
|       "action" => [null, "->setActionUpdate", self::ACTION_UPDATE_SET], |     //["-s", "--set-duration", "args" => 1,
 | ||||||
|       "help" => "Mettre à jour la durée du cache à la valeur spécifiée", |     //  "action" => [null, "->setActionUpdate", self::ACTION_UPDATE_SET],
 | ||||||
|     ], |     //  "help" => "Mettre à jour la durée du cache à la valeur spécifiée",
 | ||||||
|  |     //],
 | ||||||
|   ]; |   ]; | ||||||
| 
 | 
 | ||||||
|   protected $action = self::ACTION_READ; |   protected $action = self::ACTION_READ; | ||||||
|  | |||||||
| @ -2,40 +2,54 @@ | |||||||
| <?php | <?php | ||||||
| require __DIR__.'/../vendor/autoload.php'; | require __DIR__.'/../vendor/autoload.php'; | ||||||
| 
 | 
 | ||||||
| use nulib\file\cache\CacheData; | use nulib\cache\CacheData; | ||||||
| use nulib\file\cache\CacheFile; | use nulib\cache\CacheFile; | ||||||
|  | use nulib\ext\yaml; | ||||||
| use nulib\os\sh; | use nulib\os\sh; | ||||||
| 
 | 
 | ||||||
|  | function show(string $prefix, CacheFile $cache, bool $dumpInfos=true): void { | ||||||
|  |   Txx("$prefix=", $cache->get()); | ||||||
|  |   if ($dumpInfos) { | ||||||
|  |     yaml::dump($cache->getInfos()); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| //system("rm -f *.cache .*.cache");
 | //system("rm -f *.cache .*.cache");
 | ||||||
| 
 | 
 | ||||||
| $what = [ | $what = [ | ||||||
|   "null", |   //"null",
 | ||||||
|   "one", |   "one", | ||||||
|   "two", |   //"two",
 | ||||||
|   "three", |   //"three",
 | ||||||
| ]; | ]; | ||||||
|  | $duration = 10; | ||||||
| 
 | 
 | ||||||
| if (in_array("null", $what)) { | if (in_array("null", $what)) { | ||||||
|   $null = new CacheFile("null"); |   $null = new CacheFile("null", [ | ||||||
|   Txx("null=", $null->get()); |     "duration" => $duration, | ||||||
|  |   ]); | ||||||
|  |   show("null", $null); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| if (in_array("one", $what)) { | if (in_array("one", $what)) { | ||||||
|   $one = new class("one") extends CacheFile { |   $one = new class("one", [ | ||||||
|  |     "duration" => $duration, | ||||||
|  |   ]) extends CacheFile { | ||||||
|     protected function compute() { |     protected function compute() { | ||||||
|       return 1; |       return 1; | ||||||
|     } |     } | ||||||
|   }; |   }; | ||||||
|   Txx("one=", $one->get()); |   show("one", $one); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| if (in_array("two", $what)) { | if (in_array("two", $what)) { | ||||||
|   $two = new CacheFile("two", [ |   $two = new CacheFile("two", [ | ||||||
|  |     "duration" => $duration, | ||||||
|     "data" => new CacheData(function () { |     "data" => new CacheData(function () { | ||||||
|       return 2; |       return 2; | ||||||
|     }), |     }), | ||||||
|   ]); |   ]); | ||||||
|   Txx("two=", $two->get()); |   show("two", $two); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| if (in_array("three", $what)) { | if (in_array("three", $what)) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user