]> git.llucax.com Git - mecon/yatta.git/blob - lib/YATTA/ProcesoDB.php
BugFix.
[mecon/yatta.git] / lib / YATTA / ProcesoDB.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                              Ministerio de Economía
4                                     YATTA!
5 -------------------------------------------------------------------------------
6 This file is part of YATTA!.
7
8 YATTA! is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2 of the License, or (at your option)
11 any later version.
12
13 YATTA! is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16  
17 You should have received a copy of the GNU General Public License; if not,
18 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 Boston, MA  02111-1307  USA
20 -------------------------------------------------------------------------------
21 Creado: lun dic  1 16:59:29 ART 2003
22 Autor:  Martin Marrese <mmarre@mecon.gov.ar>
23 -------------------------------------------------------------------------------
24 $Id$
25 -----------------------------------------------------------------------------*/
26
27 require_once 'MECON/DBO.php';
28 require_once 'PEAR.php';
29 require_once 'Date.php';
30
31 /**
32  * Clase para el manejo de los procesos.
33  *
34  * @access public
35  */
36 class YATTA_ProcesoDB extends MECON_DBO {
37
38     /**
39      * Identificador del proceso.
40      *
41      * @var    int $id
42      * @access public
43      */
44     var $id = null;
45      
46     /**
47      * Fecha cuando se agrego el proceso.
48      * Formato = DD/MM/YYYY
49      * Puede ser un objeto Date.
50      *
51      * @var    string $fecha
52      * @access public
53      */
54     var $fecha = null;
55      
56     /**
57      * Proceso a ejecutar.
58      *
59      * @var    string $script
60      * @access public
61      */
62     var $script = null;
63      
64     /**
65      * Identificador del sistema en el cual se lanzo el proceso.
66      *
67      * @var    int $id_sistema
68      * @access public
69      */
70     var $id_sistema = null;
71
72     /**
73      * Nombre del sistema en el cual se lanzo el proceso.
74      *
75      * @var    string $nombre_sistema
76      * @access public
77      */
78     var $nombre_sistema = null;
79      
80     /**
81      * Descripcion del proceso.
82      *
83      * @var    string $descripcion
84      * @access public
85      */
86     var $descripcion = null;
87     
88     /**
89      * PID del proceso en el servidor de proceso.
90      *
91      * @var    int $pid
92      * @access public
93      */
94     var $pid = null;
95     
96     /**
97      * Servidor en donde se ejecuto/a/ara el proceso.
98      *
99      * @var    int $server  
100      * @access public
101      */
102     var $server = null;
103     
104     /**
105      * Estado del proceso.       
106      * 0 = En Espera
107      * 1 = Procesando
108      * 2 = Finalizado
109      * 3 = Error
110      * 4 = Abortado
111      * 5 = Abortar
112      *
113      * @var    int $status
114      * @access public
115      */
116     var $status = null;
117     
118     /**
119      * Identificador del usuario responsable por el proceso.
120      *
121      * @var    string $owner
122      * @access public
123      */
124     var $owner = null;
125     
126     /**
127      * Destinos para el resultado.
128      * array ('mmarre@mecon', 'gmeray@mecon')
129      *
130      * @var    array $destinos
131      * @access public
132      */
133     var $destinos = null;
134     
135     /**
136      * Prioridad el proceso.
137      *
138      * @var    int $prioridad
139      * @access public
140      */
141     var $prioridad = null;
142     
143     /**
144      * Fecha de ejecucion fijada.
145      *
146      * @var    string $scheduling
147      * @access public
148      */
149     var $scheduling = null;
150     
151     /**
152      * Indica si se debe notificar o no al owner sobre el resultado.
153      *
154      * @var    int $notificar
155      * @access public
156      */
157     var $notificar = null;
158     
159     /**
160      * Nombre del archivo resultado
161      *
162      * @var    string $resultado
163      * @access public
164      */
165     var $resultado = null;
166     
167     /**
168      * Nombre del archivo en el tacho
169      *
170      * @var    string $archivo
171      * @access public
172      */
173     var $archivo = null;
174     
175     /**
176      * Nota explicativa sobre el error producido o el motivo por el cual se
177      * aborto el proceso.
178      *
179      * @var    string $nota
180      * @access public
181      */
182     var $nota = null;
183
184     /**
185      * Descripcion del estado.
186      *
187      * @var    string $icono
188      * @access public
189      */
190     var $icono = null;
191
192     /**
193      * Indica si el proceso esta activo (No fue borrado por el usuario).
194      *
195      * @var    int $activo
196      * @access public
197      */
198     var $activo = null;
199     
200     /**
201      * Carga el objeto con los datos que se pasan por parametro.
202      * 
203      * @param  DB $db DB o DB_Result a usar para la carga.
204      *
205      * @return mixed
206      * @access public
207      */
208     function cargar($db = null)
209     {
210         // Si es un resultado, obtengo los elemento.
211         if (is_a($db, 'db_result')) {
212             $this->predefinirAtributos();
213             $res = $db->fetchRow(DB_FETCHMODE_ASSOC);
214             // Si hay error lo devuelve.
215             if (DB::isError($res)) {
216                 return $res;
217             }
218             elseif (!$res) {
219                 return false;
220             }
221             $this->id               = $res['id'];
222             $this->fecha            = $res['fecha']; 
223             $this->script           = $res['script'];
224             $this->id_sistema       = $res['id_sistema'];
225             $this->nombre_sistema   = $res['nombre_sistema'];
226             $this->descripcion      = $res['descripcion'];
227             $this->pid              = $res['pid'];
228             $this->server           = $res['server'];
229             $this->status           = $res['status'];
230             $this->owner            = $res['owner'];
231             $this->destinos         = split(',', $res['destinos']);
232             $this->prioridad        = $res['prioridad'];
233             $this->scheduling       = $res['scheduling'];
234             $this->notificar        = $res['notificar'];
235             $this->resultado        = $res['resultado'];
236             $this->archivo          = $res['archivo'];
237             $this->nota             = $res['nota'];
238             $this->icono            = $res['icono'];
239             $this->activo           = $res['activo'];
240             return true;
241         }
242         return false; 
243     }
244
245     /**
246      * Borra el objeto de una base de datos.
247      *
248      * @param  DB $db Base de datos de donde borrar el objeto.
249      *
250      * @return mixed
251      * @access public
252      */
253     function borrar($db = null)
254     {
255         if (!is_null($this->id)) {
256             $res = $this->buscar($db);
257             if (DB::isError($res)) {
258                 return $res;
259             }
260             $this->cargar($res);
261
262             if (is_null($this->archivo) || is_null($this->resultado)) {
263                 return $db->query('DELETE FROM yatta.procesos WHERE id = '.
264                         $this->id);
265             }
266             else {
267                 return $db->query ('UPDATE yatta.procesos SET activo = 0'.
268                         ' WHERE id = '. $this->id);
269             }
270         }
271         else {
272             return new PEAR_Error('Debe definirse el id del proceso a borrar.');
273         }
274     }
275
276     /**
277      * Busca los datos en la base.
278      *
279      * @param  DB $db Conexion a la base de datos.
280      * @param  string $operador Indica como deben concatenarse las condiciones de busqueda
281      * @param  string $orden Indica de que manera deben ordenarse los resultados de la busqueda
282      *
283      * @return mixed
284      * @access public
285      */
286     function buscar($db = null, $operador = MECON_DBO_OR, $orden = null) 
287     {
288         // Armo el WHERE.
289         if (is_null($this->owner)) {
290             return new PEAR_Error ('Debe definirse el Owner del proceso.');
291         }
292         $where = array();
293         if (!is_null($this->id)) {
294             $where[] = 'p.id = '.$this->id;
295         }
296         if (!is_null($this->fecha)) {
297             if (is_object($this->fecha) ) {
298                 $fecha = $this->fecha->format("%Y-%m-%d");
299             }
300             else {
301                 list ($dia, $mes, $anio) = split ('[/.-]', $this->fecha);
302                 $fecha = $anio.'-'.$mes.'-'.$dia;
303             }
304             $where[] = 'p.fecha = '. $db->quote("$fecha");
305         }
306         if (!is_null($this->script)) {
307             $where[] = 'p.script LIKE '. $db->quote("%$this->script%");
308         }
309         if (!is_null($this->id_sistema)) {
310             $where[] = 'p.id_sistema = '. $this->id_sistema; 
311         }
312         if (!is_null($this->nombre_sistema)) {
313             $where[] = 's.nombre_sistema LIKE '. $db->quote("%$this->nombre_sistema%");
314         }
315         if (!is_null($this->descripcion)) {
316             $where[] = 'p.descripcion LIKE '. $db->quote("%$this->descripcion%");
317         }
318         if (!is_null($this->pid)) {
319             $where[] = 'p.pid = '.$this->pid;
320         }
321         if (!is_null($this->server)) {
322             $where[] = 'p.server = '.$this->server;
323         }
324         if (!is_null($this->status)) {
325             $where[] = 'p.status = '.$this->status;
326         }
327         if (!is_null($this->destinos)) {
328             if (is_array($this->destinos)) {
329                 foreach ($this->destinos as $destino) {
330                     $where[] = 'p.destinos LIKE '. $db->quote("%$destino");
331                 }
332             }
333             else {
334                 $where[] = 'p.destinos LIKE '. $db->quote("%$this->destinos%");
335             }
336         }
337         if (!is_null($this->prioridad)) {
338             $where[] = 'p.prioridad = '.$this->prioridad;
339         }
340         if (!is_null($this->scheduling)) {
341             $where[] = 'p.scheduling LIKE '. $db->quote("%$this->scheduling%");
342         } 
343         if (!is_null($this->notificar)) {
344             $where[] = 'p.notificar ='. $this->notificar;
345         } 
346         if (!is_null($this->resultado)) {
347             $where[] = 'p.resultado LIKE '. $db->quote("%$this->resultado%");
348         } 
349         if (!is_null($this->nota)) {
350             $where[] = 'p.nota LIKE '. $db->quote("%$this->nota%");
351         } 
352         if (!is_null($this->activo)) {
353             $where[] = 'p.activo =  '. $this->activo;
354         } 
355         if ($where) {
356             $where = 'WHERE p.owner = '. $db->quote("$this->owner").
357                 'AND p.id_sistema = s.id_sistema AND ('. join ("$operador
358                         ", $where).')';
359         } 
360         else {
361             $where = 'WHERE p.owner = '. $db->quote("$this->owner").
362                 'AND p.id_sistema = s.id_sistema';
363         }
364         // Armo el ORDER BY.
365         if (is_string($orden))
366         {
367             $orden = array($orden);
368         }
369         if ($orden) 
370         {
371             $orden = 'ORDER BY '.join(',',$orden);
372         }
373         else {
374             $orden = '';
375         }
376         
377         return $db->query("SELECT p.id AS id, 
378                 DATE_FORMAT(p.fecha, '%d-%m-%Y') AS fecha, 
379                 p.script AS
380                 script, p.id_sistema AS id_sistema, s.nombre_sistema AS
381                 nombre_sistema, p.descripcion AS descripcion, p.pid AS pid, 
382                 p.server AS server, p.status AS status, p.owner AS owner, 
383                 p.destinos AS destinos, p.prioridad AS prioridad, p.scheduling 
384                 AS scheduling, p.notificar AS notificar, p.resultado AS 
385                 resultado, p.nota AS nota, p.archivo AS archivo, ".
386                 "IF (p.status = 0, 'El proceso esta en cola. Aun no se ejecuto.".
387                 "', ".
388                 "IF(p.status = 1, 'El proceso se esta ejecutando en este momento.".
389                 "',".
390                 "IF(p.status = 2, 'El proceso ha finalizado. ".
391                 "',".
392                 "IF(p.status = 3, 'Se produjo un error durante la ejecucion".
393                 " del proceso.".
394                 "',".
395                 "'El proceso fue detenido por alguna persona (el responsable o".
396                 " el administrador).".
397                 "'".
398                 ")".
399                 ")".
400                 ")".
401                 ") AS icono, p.activo AS activo 
402                 FROM yatta.procesos AS p, samurai.sistema AS s
403                 $where
404                 $orden");
405     }
406
407     /**
408      * Guarda los datos en la base.
409      *
410      * @param  DB $db Conexion a la base de datos.
411      * @param  bool $nuevo Indica si se trata de un nuevo registro en la base.
412      *
413      * @return mixed
414      * @access public
415      */
416     function guardar($db = null, $nuevo = true)
417     {
418         return $db->query ('UPDATE yatta.procesos SET nota = \''.$this->nota.
419                 '\', status = '.$this->status.
420                 ' WHERE id = '. $this->id);
421     }
422
423     /**
424      * Hace un reset de los atributos.
425      * 
426      * @return void
427      * @access public
428      */
429     function predefinirAtributos() {
430         $this->id = null;
431         $this->fecha = null;
432         $this->script = null;
433         $this->id_sistema = null;
434         $this->nombre_sistema = null;
435         $this->descripcion = null;
436         $this->pid = null;
437         $this->server = null;
438         $this->status = null;
439         $this->owner = null;
440         $this->destinos = null;
441         $this->prioridad = null;
442         $this->scheduling = null;
443         $this->notificar = null;
444         $this->resultado = null;
445         $this->archivo = null;
446         $this->nota = null;
447         $this->icono = null;
448         $this->activo = null;
449     }
450     
451     /**
452      * Devuelve un array asociativo con los valores del proceso.
453      *
454      * @return array
455      * @access public
456      */
457     function obtenerDatos() {
458         return array (
459                         'script'        => $this->script,
460                         'id_sistema'    => $this->id_sistema,
461                         'descripcion'   => $this->descripcion,
462                         'owner'         => $this->owner,
463                         'destinos'      => $this->destinos,
464                         'prioridad'     => $this->prioridad,
465                         'scheduling'    => $this->scheduling,
466                         'notificar'     => $this->notificar,
467                         'resultado'     => $this->resultado,
468                         'activo'        => $this->activo,
469                 );
470     }
471 }
472 ?>