aboutsummaryrefslogtreecommitdiff
path: root/lib/Minz/ModelArray.php
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2013-12-28 17:29:38 +0100
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2013-12-28 17:29:38 +0100
commit01a1dd09a8ee02250905a80d2662bfe811c09f09 (patch)
tree9cfdd9c26f3f3b9b3d3ce44d36110c6ed41d0d9f /lib/Minz/ModelArray.php
parent9ac1496d63da32524a33696187342ce061e9ef28 (diff)
Minz : refactorisation ModelArray et Log
Utilisation de fonctions natives de PHP comme file_put_contents et var_export Évite de garder un descripteur de fichier ouvert tout le temps Et ModelTxt n'est plus utilisé
Diffstat (limited to 'lib/Minz/ModelArray.php')
-rw-r--r--lib/Minz/ModelArray.php139
1 files changed, 57 insertions, 82 deletions
diff --git a/lib/Minz/ModelArray.php b/lib/Minz/ModelArray.php
index 4ba022143..bf2c4cb40 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,85 +7,58 @@
/**
* 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
+ * $array Le tableau php contenu dans le fichier $filename
*/
protected $array = array ();
-
+
+ /**
+ * $filename est le nom du fichier
+ */
+ 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;
+
+ 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 = include($this->filename);
+ $this->releaseLock($handle);
+
+ if ($this->array === false) {
+ throw new Minz_PermissionDeniedException($this->filename);
+ } elseif (is_array($this->array)) {
+ $this->array = $this->decodeArray($this->array);
+ } else {
$this->array = array ();
}
-
- $this->array = $this->decodeArray ($this->array);
}
- }
-
+ }
+
/**
- * É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 writeFile() {
+ if (!file_put_contents($this->filename, "<?php\n return " . var_export($this->array, true) . ';', LOCK_EX)) {
+ throw new Minz_PermissionDeniedException($this->filename);
}
-
- $this->writeLine ($tab . ')', false);
+ return true;
}
-
+
+ //TODO: check if still useful, and if yes, use a native function such as array_map
private function decodeArray ($array) {
$new_array = array ();
-
+
foreach ($array as $key => $value) {
if (is_array ($value)) {
$new_array[$key] = $this->decodeArray ($value);
@@ -93,30 +66,32 @@ class Minz_ModelArray extends Minz_ModelTxt {
$new_array[$key] = stripslashes ($value);
}
}
-
+
return $new_array;
}
-
- 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);
}
}