Rev 142 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** Service permettant d'enregistrer une demande de traitement ou de consulter les infos sur les traitements.* Encodage en entrée : utf8* Encodage en sortie : utf8** @category Php 5.2* @package Referentiel* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>* @copyright 2010 Tela-Botanica* @version $Id$*/class Traitement extends Ref {/*** Méthode principale appelée avec une requête de type GET.*/public function getElement($params_url = array()) {// Initialisation des variables$info = null;// Nour recherchons le type de requête demandé$p = $this->traiterParametresUrl(array('type'), $params_url, false);extract($p);if (!is_null($type)) {$methode = 'getElement'.$type;if (method_exists($this, $methode)) {array_shift($params_url);$info = $this->$methode($params_url);} else {$this->messages[] = "Le type d'information demandé '$type' n'est pas disponible.";}} else {$this->messages[] = "Veuillez préciser le type de requête.";}// Envoie sur la sortie standard$this->envoyer($info);}/** Méthode pour récupérer les infos d'un traitement.* Appelée avec les paramêtres d'url suivant :* /Traitement/Info/id_traitement** @return mixed les infos du traitement ou false en cas d'échec.*/public function getElementInfo($params_url) {$p = $this->traiterParametresUrl(array('id'), $params_url);extract($p);$infos = false;if (!is_null($id)) {$requete = 'SELECT * '."FROM ref_traitement "."WHERE id_traitement = $id ";// Récupération des résultatstry {$infos = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);if ($infos === false) {$this->messages[] = "La requête a retourné aucun résultat.";}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());}} else {$this->messages[] = "Veuillez préciser l'identifinat du traitement comme premier paramêtre (ex. : 38).";}return $infos;}/*** Retourne les infos sur la dernière demande de traitement pour un projet donné.*/public function getElementDerniereDemande($params_url) {$p = $this->traiterParametresUrl(array('projet', 'script'), $params_url);extract($p);$donnees = false;if (isset($projet) && isset($script)) {$requete = ($this->distinct ? 'SELECT DISTINCT' : 'SELECT').' * '.'FROM ref_traitement '."WHERE ".(($projet == "'tout'") ? '' : 'referentiel_code = '.$projet.' AND ') ." script = $script ".' AND date_debut IS NULL '.' AND date_fin IS NULL '.'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'meta_date_creation DESC').' '.'LIMIT 0,1 ';// Récupération des résultatstry {$donnees = $this->bdd->query($requete)->fetch(PDO::FETCH_ASSOC);if ($donnees === false) {$this->messages[] = "La requête a retourné aucun résultat.";} else if (0 == count($donnees)) {$donnees = null;}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());}} else {$this->messages[] = "Veuillez préciser le nom de code du projet comme premier paramêtre (ex. : bdnff) "."et le code du script à lancer comme second paramêtre (ex. : tests ou versionnage).";}return $donnees;}/*** Retourne les infos sur les traitements en attente.*/public function getElementEnAttente($params_url) {$p = $this->traiterParametresUrl(array('projet', 'script'), $params_url);extract($p);$donnees = null;if (isset($projet) && isset($script)) {$requete = ($this->distinct ? 'SELECT DISTINCT' : 'SELECT').' * '.'FROM ref_traitement '."WHERE referentiel_code = $projet "." AND script = $script ".' AND date_debut IS NULL '.' AND date_fin IS NULL '.'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'meta_date_creation DESC').' ';// Récupération des résultatstry {$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);if ($donnees === false) {$this->messages[] = "La requête a retourné aucun résultat.";} else if (0 == count($donnees)) {$donnees = null;}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());}} else {$this->messages[] = "Veuillez préciser le nom de code du projet comme premier paramêtre (ex. : bdnff) "."et le code du script à lancer comme second paramêtre (ex. : tests ou versionnage).";}return $donnees;}/*** Retourne les infos sur les traitements en cours.*/public function getElementEnCours($params_url) {$p = $this->traiterParametresUrl(array('projet', 'script'), $params_url);extract($p);$donnees = null;if (isset($projet) && isset($script)) {$requete = ($this->distinct ? 'SELECT DISTINCT' : 'SELECT').' * '.'FROM ref_traitement '."WHERE referentiel_code = $projet "." AND script = $script ".' AND date_debut IS NOT NULL '.' AND date_fin IS NULL '.'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'meta_date_creation DESC').' ';// Récupération des résultatstry {$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);if ($donnees === false) {$this->messages[] = "La requête a retourné aucun résultat.";} else if (0 == count($donnees)) {$donnees = null;}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());}} else {$this->messages[] = "Veuillez préciser le nom de code du projet comme premier paramêtre (ex. : bdnff) "."et le code du script à lancer comme second paramêtre (ex. : tests ou versionnage).";}return $donnees;}/*** Retourne les id des demandes de traitements obsolètes.*/public function getElementObsolete($params_url) {$p = $this->traiterParametresUrl(array('projet', 'script'), $params_url);extract($p);$sortie = null;if (isset($projet) && isset($script)) {try {$requete = 'SELECT MAX(date_debut) '.'FROM ref_traitement '."WHERE referentiel_code = $projet "." AND script = $script ".' AND date_debut IS NOT NULL '.'GROUP BY referentiel_code ';$date_max = $this->bdd->query($requete)->fetchColumn();if ($date_max === false) {$this->messages[] = "La requête de récupération de la date de début max a échouée.";} else {$date_max = $this->bdd->quote($date_max);$requete = 'SELECT id_traitement '.'FROM ref_traitement '."WHERE referentiel_code = $projet "." AND script = $script ".' AND date_debut IS NULL '.' AND date_fin IS NULL '." AND meta_date_creation < $date_max ";$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);if ($donnees === false) {$this->messages[] = "La requête a retourné aucun résultat.";}}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());}// Pos-traitementif ($donnees != false) {foreach ($donnees as $donnee) {$sortie[] = $donnee['id_traitement'];}}} else {$this->messages[] = "Veuillez préciser le nom de code du projet comme premier paramêtre (ex. : bdnff) "."et le code du script à lancer comme second paramêtre (ex. : tests ou versionnage).";}return $sortie;}/*** Retourne les infos sur les traitements terminés.*/public function getElementTermines($params_url) {$p = $this->traiterParametresUrl(array('projet', 'script'), $params_url);extract($p);$donnees = null;if (isset($projet) && isset($script)) {$requete = ($this->distinct ? 'SELECT DISTINCT' : 'SELECT').' * '.'FROM ref_traitement '."WHERE referentiel_code = $projet "." AND script = $script ".' AND date_debut IS NOT NULL '.' AND date_fin IS NOT NULL '.'ORDER BY '.((!is_null($this->orderby)) ? $this->orderby : 'meta_date_creation DESC').' ';// Récupération des résultatstry {$donnees = $this->bdd->query($requete)->fetchAll(PDO::FETCH_ASSOC);if ($donnees === false) {$this->messages[] = "La requête a retourné aucun résultat.";} else if (0 == count($donnees)) {$donnees = null;}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage());}} else {$this->messages[] = "Veuillez préciser le nom de code du projet comme premier paramêtre (ex. : bdnff) "."et le code du script à lancer comme second paramêtre (ex. : tests ou versionnage).";}return $donnees;}/*** Méthode appelée pour ajouter un traitement.* Retour l'id du nouvel enregistrement ou false!*/public function createElement($params_post) {$params_proteges = $this->traiterParametresPost(array('referentiel_code', 'script', 'script_parametres'), $params_post);$meta_date_creation = date ('Y-m-d H:i:s');$nom = $this->bdd->quote("Traitement {$params_post['referentiel_code']} - $meta_date_creation");$meta_date_creation = $this->bdd->quote($meta_date_creation);try {$requete = "INSERT INTO ref_traitement ".' (referentiel_code, script, script_parametres, nom, meta_date_creation) '." VALUES ({$params_proteges['referentiel_code']}, {$params_proteges['script']}, {$params_proteges['script_parametres']}, $nom, $meta_date_creation) ";$resultat = $this->bdd->exec($requete);if ($resultat === false) {$id = false;$this->debug[] = "Traitement NON ajouté.";} else {$id = $this->bdd->lastInsertId();}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);}$this->envoyer($id);}/*** Méthode principale appelée avec une requête de type POST.*/public function updateElement($params_url, $params_post) {// Initialisation des variables$info = array();// Nour recherchons le type de requête demandéextract($this->traiterParametresUrl(array('id'), $params_url, true));extract($this->traiterParametresPost(array('action'), $params_post, false));if (!is_null($id)) {if (!is_null($action)) {$methode = 'updateElement'.$action;if (method_exists($this, $methode)) {//array_shift($param);$info = $this->$methode($id, $params_post);} else {$this->messages[] = "Le type de mise à jour demandé '$action' n'est pas disponible.";}} else {$this->messages[] = "Veuillez préciser le type de mise à jour à faire.";// TODO : coder une mise à jour générique dans une méthode updateElementDefaut($id, $params_post);}} else {$this->messages[] = "Veuillez préciser l'id du traitement comme premier paramêtre dans l'url.";}// Envoie sur la sortie standard$this->envoyer($info);}/*** Méthode pour indiquer le démarage d'un traitement.*/public function updateElementDebuter($id, $params_post) {$ok = true;try {$requete = 'UPDATE ref_traitement '.'SET date_debut = NOW() '."WHERE id_traitement = $id ";$this->debug[] = "$requete";$resultat = $this->bdd->exec($requete);if ($resultat === false) {$ok = false;$this->messages[] = "Traitement NON modifié.";}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);}return $ok;}/*** Méthode pour indiquer la fin d'un traitement.*/public function updateElementTerminer($id, $params_post) {$ok = true;try {$requete = 'UPDATE ref_traitement '.'SET date_fin = NOW(), duree = TIMEDIFF(NOW(), date_debut) '."WHERE id_traitement = $id ";$this->debug[] = "$requete";$resultat = $this->bdd->exec($requete);if ($resultat === false) {$ok = false;$this->messages[] = "Traitement NON modifié.";}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);}return $ok;}/*** Méthode principale appelée avec une requête de type DELETE.*/public function deleteElement($params_url) {// Initialisation des variables$ok = true;// Extraction des paramètres de l'urlextract($this->traiterParametresUrl(array('ids'), $params_url, true));if (!is_null($ids)) {try {$in_ids = $this->traiterBddClauseIn($ids);$requete = 'DELETE FROM ref_traitement '."WHERE id_traitement IN ($in_ids) ";$this->debug[] = "$requete";$resultat = $this->bdd->exec($requete);if ($resultat === false) {$ok = false;$this->messages[] = "Traitement(s) NON supprimé(s).";}} catch (PDOException $e) {$this->messages[] = sprintf($this->getTxt('sql_erreur'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete);}} else {$this->messages[] = "Veuillez préciser un ou plusieurs id de traitement séparés par des virgules comme premier paramètre dans l'url.";}// Envoie sur la sortie standard$this->envoyer($ok);}}?>