]> git.llucax.com Git - mecon/yatta.git/blob - lib/YATTA/Proceso.php
2838fd3e8c15a8fe38071b5f8191fd3a4bf6601b
[mecon/yatta.git] / lib / YATTA / Proceso.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_Proceso 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      *
112      * @var    int $status
113      * @access public
114      */
115     var $status = null;
116     
117     /**
118      * Identificador del usuario responsable por el proceso.
119      *
120      * @var    string $owner
121      * @access public
122      */
123     var $owner = null;
124     
125     /**
126      * Destinos para el resultado.
127      * array ('mmarre@mecon', 'gmeray@mecon')
128      *
129      * @var    array $destinos
130      * @access public
131      */
132     var $destinos = null;
133     
134     /**
135      * Prioridad el proceso.
136      *
137      * @var    int $prioridad
138      * @access public
139      */
140     var $prioridad = null;
141     
142     /**
143      * Fecha de ejecucion fijada.
144      *
145      * @var    string $scheduling
146      * @access public
147      */
148     var $scheduling = null;
149     
150     /**
151      * Indica si se debe notificar o no al owner sobre el resultado.
152      *
153      * @var    int $notificar
154      * @access public
155      */
156     var $notificar = null;
157     
158     /**
159      * Nombre del archivo resultado
160      *
161      * @var    string $resultado
162      * @access public
163      */
164     var $resultado = null;
165     
166     /**
167      * Nombre del archivo en el tacho
168      *
169      * @var    string $archivo
170      * @access public
171      */
172     var $archivo = null;
173     
174     /**
175      * Nota explicativa sobre el error producido o el motivo por el cual se
176      * aborto el proceso.
177      *
178      * @var    string $nota
179      * @access public
180      */
181     var $nota = null;
182
183     /**
184      * Descripcion del estado.
185      *
186      * @var    string $icono
187      * @access public
188      */
189     var $icono = null;
190     
191     /**
192      * Carga el objeto con los datos que se pasan por parametro.
193      * 
194      * @param  DB $db DB o DB_Result a usar para la carga.
195      *
196      * @return mixed
197      * @access public
198      */
199     function cargar($db = null)
200     {
201         // Si es un resultado, obtengo los elemento.
202         if (is_a($db, 'db_result')) {
203             $this->predefinirAtributos();
204             $res = $db->fetchRow(DB_FETCHMODE_ASSOC);
205             // Si hay error lo devuelve.
206             if (DB::isError($res)) {
207                 return $res;
208             }
209             elseif (!$res) {
210                 return false;
211             }
212             $this->id               = $res['id'];
213             $this->fecha            = $res['fecha']; 
214             $this->script           = $res['script'];
215             $this->id_sistema       = $res['id_sistema'];
216             $this->nombre_sistema   = $res['nombre_sistema'];
217             $this->descripcion      = $res['descripcion'];
218             $this->pid              = $res['pid'];
219             $this->server           = $res['server'];
220             $this->status           = $res['status'];
221             $this->owner            = $res['owner'];
222             $this->destinos         = split(',', $res['destinos']);
223             $this->prioridad        = $res['prioridad'];
224             $this->scheduling       = $res['scheduling'];
225             $this->notificar        = $res['notificar'];
226             $this->resultado        = $res['resultado'];
227             $this->archivo          = $res['archivo'];
228             $this->nota             = $res['nota'];
229             $this->icono            = $res['icono'];
230             return true;
231         }
232         return false; 
233     }
234
235     /**
236      * Borra el objeto de una base de datos.
237      *
238      * @param  DB $db Base de datos de donde borrar el objeto.
239      *
240      * @return mixed
241      * @access public
242      */
243     function borrar($db = null)
244     {
245         trigger_error('Not implemented!', E_USER_WARNING); 
246     }
247
248     /**
249      * Busca los datos en la base.
250      *
251      * @param  DB $db Conexion a la base de datos.
252      * @param  string $operador Indica como deben concatenarse las condiciones de busqueda
253      * @param  string $orden Indica de que manera deben ordenarse los resultados de la busqueda
254      *
255      * @return mixed
256      * @access public
257      */
258     function buscar($db = null, $operador = MECON_DBO_OR, $orden = null) 
259     {
260         // Armo el WHERE.
261         if (is_null($this->owner)) {
262             return new PEAR_Error ('Debe definirse el Owner del proceso.');
263         }
264         $where = array();
265         if (!is_null($this->id)) {
266             $where[] = 'p.id = '.$this->id;
267         }
268         if (!is_null($this->fecha)) {
269             if (is_object($this->fecha) ) {
270                 $fecha = $this->fecha->format("%Y-%m-%d");
271             }
272             else {
273                 list ($dia, $mes, $anio) = split ('[/.-]', $this->fecha);
274                 $fecha = $anio.'-'.$mes.'-'.$dia;
275             }
276             $where[] = 'p.fecha = '. $db->quote("$fecha");
277         }
278         if (!is_null($this->script)) {
279             $where[] = 'p.script LIKE '. $db->quote("%$this->script%");
280         }
281         if (!is_null($this->id_sistema)) {
282             $where[] = 'p.id_sistema = '. $this->id_sistema; 
283         }
284         if (!is_null($this->nombre_sistema)) {
285             $where[] = 's.nombre_sistema LIKE '. $db->quote("%$this->nombre_sistema%");
286         }
287         if (!is_null($this->descripcion)) {
288             $where[] = 'p.descripcion LIKE '. $db->quote("%$this->descripcion%");
289         }
290         if (!is_null($this->pid)) {
291             $where[] = 'p.pid = '.$this->pid;
292         }
293         if (!is_null($this->server)) {
294             $where[] = 'p.server = '.$this->server;
295         }
296         if (!is_null($this->status)) {
297             $where[] = 'p.status = '.$this->status;
298         }
299         if (!is_null($this->destinos)) {
300             if (is_array($this->destinos)) {
301                 foreach ($this->destinos as $destino) {
302                     $where[] = 'p.destinos LIKE '. $db->quote("%$destino");
303                 }
304             }
305             else {
306                 $where[] = 'p.destinos LIKE '. $db->quote("%$this->destinos%");
307             }
308         }
309         if (!is_null($this->prioridad)) {
310             $where[] = 'p.prioridad = '.$this->prioridad;
311         }
312         if (!is_null($this->scheduling)) {
313             $where[] = 'p.scheduling LIKE '. $db->quote("%$this->scheduling%");
314         } 
315         if (!is_null($this->notificar)) {
316             $where[] = 'p.notificar ='. $this->notificar;
317         } 
318         if (!is_null($this->resultado)) {
319             $where[] = 'p.resultado LIKE '. $db->quote("%$this->resultado%");
320         } 
321         if (!is_null($this->nota)) {
322             $where[] = 'p.nota LIKE '. $db->quote("%$this->nota%");
323         } 
324         if ($where) {
325             $where = 'WHERE p.owner = '. $db->quote("$this->owner").
326                 'AND p.id_sistema = s.id_sistema AND ('. join ("$operador
327                         ", $where).')';
328         } 
329         else {
330             $where = 'WHERE p.owner = '. $db->quote("$this->owner").
331                 'AND p.id_sistema = s.id_sistema';
332         }
333         // Armo el ORDER BY.
334         if (is_string($orden))
335         {
336             $orden = array($orden);
337         }
338         if ($orden) 
339         {
340             $orden = 'ORDER BY '.join(',',$orden);
341         }
342         else {
343             $orden = '';
344         }
345         
346         return $db->query("SELECT p.id AS id, 
347                 DATE_FORMAT(p.fecha, '%d-%m-%Y') AS fecha, 
348                 p.script AS
349                 script, p.id_sistema AS id_sistema, s.nombre_sistema AS
350                 nombre_sistema, p.descripcion AS descripcion, p.pid AS pid, 
351                 p.server AS server, p.status AS status, p.owner AS owner, 
352                 p.destinos AS destinos, p.prioridad AS prioridad, p.scheduling 
353                 AS scheduling, p.notificar AS notificar, p.resultado AS 
354                 resultado, p.nota AS nota, p.archivo AS archivo, ".
355                 "IF (p.status = 0, 'El proceso esta en cola. Aun no se ejecuto.".
356                 "', ".
357                 "IF(p.status = 1, 'El proceso se esta ejecutando en este momento.".
358                 "',".
359                 "IF(p.status = 2, 'El proceso ha finalizado. ".
360                 "',".
361                 "IF(p.status = 3, 'Se produjo un error durante la ejecucion".
362                 " del proceso.".
363                 "',".
364                 "'El proceso fue detenido por alguna persona (el responsable o".
365                 " el administrador).".
366                 "'".
367                 ")".
368                 ")".
369                 ")".
370                 ") AS icono               
371                 FROM yatta.procesos AS p, samurai.sistema AS s
372                 $where
373                 $orden");
374     }
375
376     /**
377      * Guarda los datos en la base.
378      *
379      * @param  DB $db Conexion a la base de datos.
380      * @param  bool $nuevo Indica si se trata de un nuevo registro en la base.
381      *
382      * @return mixed
383      * @access public
384      */
385     function guardar($db = null, $nuevo = true)
386     {
387
388         //@TODO PASAR ESTO A UNA CLASE SERVIDOR
389         //Busco el servidor
390         $res = $db->query('SELECT id, escala * procesos AS ponderacion
391                 FROM yatta.servidores 
392                 ORDER BY ponderacion, escala');
393         $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
394         // Si hay error lo devuelve.
395         if (DB::isError($res)) {
396             return $res;
397         }
398         $this->server = $res['id'];
399         //Asigno la fecha
400         if (@is_null($this->fecha)) {
401             $this->fecha = date ('Y-m-d');
402         }
403         
404         if ($nuevo) {
405             $datos = array (
406                         'fecha'         => $this->fecha,
407                         'script'        => $this->script,
408                         'id_sistema'    => $this->id_sistema,
409                         'descripcion'   => $this->descripcion,
410                         'pid'           => $this->pid,
411                         'server'        => $this->server,
412                         'status'        => $this->status,
413                         'owner'         => $this->owner,
414                         'destinos'      => $this->destinos,
415                         'prioridad'     => $this->prioridad,
416                         'scheduling'    => $this->scheduling,
417                         'notificar'     => $this->notificar,
418                         'resultado'     => $this->resultado,
419                         'archivo'       => $this->archivo,
420                         'nota'          => $this->nota
421                     );
422
423             $res = $db->autoExecute('yatta.procesos', $datos,
424                     DB_AUTOQUERY_INSERT);
425         }
426         else {
427             $datos = array (
428                         'fecha'         => $this->fecha,
429                         'script'        => $this->script,
430                         'id_sistema'    => $this->id_sistema,
431                         'descripcion'   => $this->descripcion,
432                         'pid'           => $this->pid,
433                         'server'        => $this->server,
434                         'status'        => $this->status,
435                         'owner'         => $this->owner,
436                         'destinos'      => $this->destinos,
437                         'prioridad'     => $this->prioridad,
438                         'scheduling'    => $this->scheduling,
439                         'notificar'     => $this->notificar,
440                         'resultado'     => $this->resultado,
441                         'archivo'       => $this->archivo,
442                         'nota'          => $this->nota
443                     );
444
445             $res = $db->autoExecute('yatta.procesos', $datos,
446                     DB_AUTOQUERY_UPDATE, 'id = '.$this->id);
447             
448         }
449
450         if (DB::isError($res)) {
451             return $res;
452         }
453
454         $res = $db->query('
455                 UPDATE yatta.servidores
456                 SET procesos = procesos + 1
457                 WHERE id = '. $this->server);
458         return $res;
459     }
460
461     /**
462      * Hace un reset de los atributos.
463      * 
464      * @return void
465      * @access public
466      */
467     function predefinirAtributos() {
468         $this->id = null;
469         $this->fecha = null;
470         $this->script = null;
471         $this->id_sistema = null;
472         $this->nombre_sistema = null;
473         $this->descripcion = null;
474         $this->pid = null;
475         $this->server = null;
476         $this->status = null;
477         $this->owner = null;
478         $this->destinos = null;
479         $this->prioridad = null;
480         $this->scheduling = null;
481         $this->notificar = null;
482         $this->resultado = null;
483         $this->archivo = null;
484         $this->nota = null;
485         $this->icono = null;
486     }
487     
488     /**
489      * Devuelve un array asociativo con los valores del proceso.
490      *
491      * @return array
492      * @access public
493      */
494     function obtenerDatos() {
495         return array (
496                         'script'        => $this->script,
497                         'id_sistema'    => $this->id_sistema,
498                         'descripcion'   => $this->descripcion,
499                         'owner'         => $this->owner,
500                         'destinos'      => $this->destinos,
501                         'prioridad'     => $this->prioridad,
502                         'scheduling'    => $this->scheduling,
503                         'notificar'     => $this->notificar,
504                 );
505     }
506 }
507 ?>