diff options
| author | 2014-01-04 01:47:07 +0100 | |
|---|---|---|
| committer | 2014-01-04 01:47:07 +0100 | |
| commit | d7c929e53b889460cd416d2864563e16200d2a01 (patch) | |
| tree | b91657455d48fa31aaa9b0bc6d8828db3622db1d /lib/Minz/ModelArray.php | |
| parent | cf8b3d080942ad682665569250038eda494d346b (diff) | |
| parent | c80ab2af7e0f6de4acf6dc02fab208d7b5baff45 (diff) | |
Merge remote-tracking branch 'origin/dev' into beta
Diffstat (limited to 'lib/Minz/ModelArray.php')
| -rw-r--r-- | lib/Minz/ModelArray.php | 147 |
1 files changed, 53 insertions, 94 deletions
diff --git a/lib/Minz/ModelArray.php b/lib/Minz/ModelArray.php index 4ba022143..ff23dbc83 100644 --- a/lib/Minz/ModelArray.php +++ b/lib/Minz/ModelArray.php @@ -1,5 +1,5 @@ <?php -/** +/** * MINZ - Copyright 2011 Marien Fressinaud * Sous licence AGPL3 <http://www.gnu.org/licenses/> */ @@ -7,116 +7,75 @@ /** * La classe Model_array représente le modèle interragissant avec les fichiers de type texte gérant des tableaux php */ -class Minz_ModelArray extends Minz_ModelTxt { +class Minz_ModelArray { /** - * $array Le tableau php contenu dans le fichier $nameFile + * $filename est le nom du fichier */ - protected $array = array (); - + protected $filename; + /** - * Ouvre le fichier indiqué, charge le tableau dans $array et le $nameFile - * @param $nameFile le nom du fichier à ouvrir contenant un tableau + * Ouvre le fichier indiqué, charge le tableau dans $array et le $filename + * @param $filename le nom du fichier à ouvrir contenant un tableau * Remarque : $array sera obligatoirement un tableau */ - public function __construct ($nameFile) { - parent::__construct ($nameFile); - - if (!$this->getLock ('read')) { - throw new Minz_PermissionDeniedException ($this->filename); + public function __construct ($filename) { + $this->filename = $filename; + } + + protected function loadArray() { + if (!file_exists($this->filename)) { + throw new Minz_FileNotExistException($this->filename, Minz_Exception::WARNING); + } + elseif (($handle = $this->getLock()) === false) { + throw new Minz_PermissionDeniedException($this->filename); } else { - $this->array = include ($this->filename); - $this->releaseLock (); - - if (!is_array ($this->array)) { - $this->array = array (); + $data = include($this->filename); + $this->releaseLock($handle); + + if ($data === false) { + throw new Minz_PermissionDeniedException($this->filename); + } elseif (!is_array($data)) { + $data = array(); } - - $this->array = $this->decodeArray ($this->array); + return $data; } - } - + } + /** - * Écrit un tableau dans le fichier $nameFile - * @param $array le tableau php à enregistrer + * Sauve le tableau $array dans le fichier $filename **/ - public function writeFile ($array) { - if (!$this->getLock ('write')) { - throw new Minz_PermissionDeniedException ($this->namefile); - } else { - $this->erase (); - - $this->writeLine ('<?php'); - $this->writeLine ('return ', false); - $this->writeArray ($array); - $this->writeLine (';'); - - $this->releaseLock (); - } - } - - private function writeArray ($array, $profondeur = 0) { - $tab = ''; - for ($i = 0; $i < $profondeur; $i++) { - $tab .= "\t"; - } - $this->writeLine ('array ('); - - foreach ($array as $key => $value) { - if (is_int ($key)) { - $this->writeLine ($tab . "\t" . $key . ' => ', false); - } else { - $this->writeLine ($tab . "\t" . '\'' . $key . '\'' . ' => ', false); - } - - if (is_array ($value)) { - $this->writeArray ($value, $profondeur + 1); - $this->writeLine (','); - } else { - if (is_numeric ($value)) { - $this->writeLine ($value . ','); - } else { - $this->writeLine ('\'' . addslashes ($value) . '\','); - } - } + protected function writeArray($array) { + if (file_put_contents($this->filename, "<?php\n return " . var_export($array, true) . ';', LOCK_EX) === false) { + throw new Minz_PermissionDeniedException($this->filename); } - - $this->writeLine ($tab . ')', false); - } - - private function decodeArray ($array) { - $new_array = array (); - - foreach ($array as $key => $value) { - if (is_array ($value)) { - $new_array[$key] = $this->decodeArray ($value); - } else { - $new_array[$key] = stripslashes ($value); - } + if (function_exists('opcache_invalidate')) { + opcache_invalidate($this->filename); //Clear PHP 5.5+ cache for include } - - return $new_array; + return true; } - - private function getLock ($type) { - if ($type == 'write') { - $lock = LOCK_EX; - } else { - $lock = LOCK_SH; + + private function getLock() { + $handle = fopen($this->filename, 'r'); + if ($handle === false) { + return false; } - - $count = 1; - while (!flock ($this->file, $lock) && $count <= 50) { - $count++; + + $count = 50; + while (!flock($handle, LOCK_SH) && $count > 0) { + $count--; + usleep(1000); } - - if ($count >= 50) { - return false; + + if ($count > 0) { + return $handle; } else { - return true; + fclose($handle); + return false; } } - - private function releaseLock () { - flock ($this->file, LOCK_UN); + + private function releaseLock($handle) { + flock($handle, LOCK_UN); + fclose($handle); } } |
