75 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\mapper\base;
 | |
| 
 | |
| use nur\b\io\IWriter;
 | |
| use nur\b\io\TmpfileWriter;
 | |
| use nur\writer;
 | |
| 
 | |
| trait Ttmpwriter {
 | |
|   protected $ppOutput;
 | |
| 
 | |
|   function pp_setOutput($output): void {
 | |
|     if ($output instanceof IWriter) $this->writer = $output;
 | |
|     else $this->ppOutput = $output;
 | |
|   }
 | |
| 
 | |
|   protected $useTmpfile;
 | |
| 
 | |
|   /**
 | |
|    * utiliser un fichier temporaire pour la sortie, puis créer $output en une
 | |
|    * seule fois à la fin, lors de la fermeture de l'objet.
 | |
|    *
 | |
|    * $useTmpfile peut être un booléen, mais aussi un nom de fichier: dans ce
 | |
|    * cas la fonctionnalité n'est activée que si $useTmpfile et $output
 | |
|    * désignent le même fichier
 | |
|    */
 | |
|   function setUseTmpfile($useTmpfile=true): self {
 | |
|     if (is_string($useTmpfile)) {
 | |
|       if (writer::is_file($useTmpfile)) {
 | |
|         $useTmpfile = realpath($useTmpfile) === realpath($this->ppOutput);
 | |
|       } else {
 | |
|         $useTmpfile = false;
 | |
|       }
 | |
|     }
 | |
|     $this->useTmpfile = boolval($useTmpfile);
 | |
|     return $this;
 | |
|   }
 | |
| 
 | |
|   /** @var IWriter */
 | |
|   protected $writer;
 | |
| 
 | |
|   protected function buildWriter(bool $appendFilters, ?string $mode): void {
 | |
|     if ($mode === null) $mode = "w+b";
 | |
|     $this->writer = writer::with($this->ppOutput, $mode);
 | |
|     if ($appendFilters) $this->_rwAppendFilters($this->writer);
 | |
|   }
 | |
| 
 | |
|   /** @var TmpfileWriter */
 | |
|   protected $tmpwriter;
 | |
| 
 | |
|   protected function getWriter() {
 | |
|     return $this->useTmpfile? $this->tmpwriter: $this->writer;
 | |
|   }
 | |
| 
 | |
|   protected function setupWriter(bool $useFilters, ?string $mode=null): void {
 | |
|     if ($this->useTmpfile) {
 | |
|       $this->tmpwriter = new TmpfileWriter();
 | |
|     } else if ($this->writer === null) {
 | |
|       $this->buildWriter($useFilters, $mode);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   protected function teardownWriter(bool $useFilters, ?string $mode=null): void {
 | |
|     if ($this->tmpwriter !== null) {
 | |
|       $this->tmpwriter->close();
 | |
|       $this->buildWriter($useFilters, $mode);
 | |
|       $this->tmpwriter->getReader()->copyTo($this->writer);
 | |
|       $this->tmpwriter = null;
 | |
|     }
 | |
|     if ($this->writer !== null) {
 | |
|       $this->writer->close();
 | |
|       $this->writer = null;
 | |
|     }
 | |
|   }
 | |
| }
 |