]> git.llucax.com Git - mecon/yatta.git/blob - lib/YATTA/ProcesoDB.php
Modificacion para que se haga mas ejecute mas rapido el script.
[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      * Parametros del proceso. Serializado.
202      *
203      * @var    string $parametros
204      * @access public
205      */
206     var $parametros = null;
207     
208     /**
209      * Carga el objeto con los datos que se pasan por parametro.
210      * 
211      * @param  DB $db DB o DB_Result a usar para la carga.
212      *
213      * @return mixed
214      * @access public
215      */
216     function cargar($db = null)
217     {
218         // Si es un resultado, obtengo los elemento.
219         if (is_a($db, 'db_result')) {
220             $this->predefinirAtributos();
221             $res = $db->fetchRow(DB_FETCHMODE_ASSOC);
222             // Si hay error lo devuelve.
223             if (DB::isError($res)) {
224                 return $res;
225             }
226             elseif (!$res) {
227                 return false;
228             }
229             $this->id               = $res['id'];
230             $this->fecha            = $res['fecha']; 
231             $this->script           = $res['script'];
232             $this->id_sistema       = $res['id_sistema'];
233             $this->nombre_sistema   = $res['nombre_sistema'];
234             $this->descripcion      = $res['descripcion'];
235             $this->pid              = $res['pid'];
236             $this->server           = $res['server'];
237             $this->status           = $res['status'];
238             $this->owner            = $res['owner'];
239             $this->destinos         = split(',', $res['destinos']);
240             $this->prioridad        = $res['prioridad'];
241             $this->scheduling       = $res['scheduling'];
242             $this->notificar        = $res['notificar'];
243             $this->resultado        = $res['resultado'];
244             $this->archivo          = $res['archivo'];
245             $this->nota             = $res['nota'];
246             $this->icono            = $res['icono'];
247             $this->activo           = $res['activo'];
248             $this->parametros       = $res['parametros'];
249             return true;
250         }
251         return false; 
252     }
253
254     /**
255      * Borra el objeto de una base de datos.
256      *
257      * @param  DB $db Base de datos de donde borrar el objeto.
258      *
259      * @return mixed
260      * @access public
261      */
262     function borrar($db = null)
263     {
264         if (!is_null($this->id)) {
265             $res = $this->buscar($db);
266             if (DB::isError($res)) {
267                 return $res;
268             }
269             $this->cargar($res);
270
271             if (is_null($this->archivo) || is_null($this->resultado)) {
272                 return $db->query('DELETE FROM yatta.procesos WHERE id = '.
273                         $this->id);
274             }
275             else {
276                 return $db->query ('UPDATE yatta.procesos SET activo = 0'.
277                         ' WHERE id = '. $this->id);
278             }
279         }
280         else {
281             return new PEAR_Error('Debe definirse el id del proceso a borrar.');
282         }
283     }
284
285     /**
286      * Busca los datos en la base.
287      *
288      * @param  DB $db Conexion a la base de datos.
289      * @param  string $operador Indica como deben concatenarse las condiciones de busqueda
290      * @param  string $orden Indica de que manera deben ordenarse los resultados de la busqueda
291      *
292      * @return mixed
293      * @access public
294      */
295     function buscar($db = null, $operador = MECON_DBO_OR, $orden = null) 
296     {
297         // Armo el WHERE.
298         if (is_null($this->owner)) {
299             return new PEAR_Error ('Debe definirse el Owner del proceso.');
300         }
301         $where = array();
302         if (!is_null($this->id)) {
303             $where[] = 'p.id = '.$this->id;
304         }
305         if (!is_null($this->fecha)) {
306             if (is_object($this->fecha) ) {
307                 $fecha = $this->fecha->format("%Y-%m-%d");
308             }
309             else {
310                 list ($dia, $mes, $anio) = split ('[/.-]', $this->fecha);
311                 $fecha = $anio.'-'.$mes.'-'.$dia;
312             }
313             $where[] = 'p.fecha = '. $db->quote("$fecha");
314         }
315         if (!is_null($this->script)) {
316             $where[] = 'p.script LIKE '. $db->quote("%$this->script%");
317         }
318         if (!is_null($this->id_sistema)) {
319             $where[] = 'p.id_sistema = '. $this->id_sistema; 
320         }
321         if (!is_null($this->nombre_sistema)) {
322             $where[] = 's.nombre_sistema LIKE '. $db->quote("%$this->nombre_sistema%");
323         }
324         if (!is_null($this->descripcion)) {
325             $where[] = 'p.descripcion LIKE '. $db->quote("%$this->descripcion%");
326         }
327         if (!is_null($this->pid)) {
328             $where[] = 'p.pid = '.$this->pid;
329         }
330         if (!is_null($this->server)) {
331             $where[] = 'p.server = '.$this->server;
332         }
333         if (!is_null($this->status)) {
334             $where[] = 'p.status = '.$this->status;
335         }
336         if (!is_null($this->destinos)) {
337             if (is_array($this->destinos)) {
338                 foreach ($this->destinos as $destino) {
339                     $where[] = 'p.destinos LIKE '. $db->quote("%$destino");
340                 }
341             }
342             else {
343                 $where[] = 'p.destinos LIKE '. $db->quote("%$this->destinos%");
344             }
345         }
346         if (!is_null($this->prioridad)) {
347             $where[] = 'p.prioridad = '.$this->prioridad;
348         }
349         if (!is_null($this->scheduling)) {
350             $where[] = 'p.scheduling LIKE '. $db->quote("%$this->scheduling%");
351         } 
352         if (!is_null($this->notificar)) {
353             $where[] = 'p.notificar ='. $this->notificar;
354         } 
355         if (!is_null($this->resultado)) {
356             $where[] = 'p.resultado LIKE '. $db->quote("%$this->resultado%");
357         } 
358         if (!is_null($this->nota)) {
359             $where[] = 'p.nota LIKE '. $db->quote("%$this->nota%");
360         } 
361         if (!is_null($this->activo)) {
362             $where[] = 'p.activo =  '. $this->activo;
363         } 
364         if (!is_null($this->parametros)) {
365             $where[] = 'p.parametros LIKE '. $db->quote("%$this->parametros%");
366         } 
367         if ($where) {
368             $where = 'WHERE p.owner = '. $db->quote("$this->owner").
369                 'AND p.id_sistema = s.id_sistema AND ('. join ("$operador
370                         ", $where).')';
371         } 
372         else {
373             $where = 'WHERE p.owner = '. $db->quote("$this->owner").
374                 'AND p.id_sistema = s.id_sistema';
375         }
376         // Armo el ORDER BY.
377         if (is_string($orden))
378         {
379             $orden = array($orden);
380         }
381         if ($orden) 
382         {
383             $orden = 'ORDER BY '.join(',',$orden);
384         }
385         else {
386             $orden = '';
387         }
388         
389         return $db->query("SELECT p.id AS id, 
390                 DATE_FORMAT(p.fecha, '%d-%m-%Y') AS fecha, 
391                 p.script AS
392                 script, p.id_sistema AS id_sistema, s.nombre_sistema AS
393                 nombre_sistema, p.descripcion AS descripcion, p.pid AS pid, 
394                 p.server AS server, p.status AS status, p.owner AS owner, 
395                 p.destinos AS destinos, p.prioridad AS prioridad, p.scheduling 
396                 AS scheduling, p.notificar AS notificar, p.resultado AS 
397                 resultado, p.nota AS nota, p.archivo AS archivo, ".
398                 "p.parametros AS parametros, ".
399                 "IF (p.status = 0, 'El proceso está en cola. Aún no se ejecutó.".
400                 "', ".
401                 "IF(p.status = 1, 'El proceso se está ejecutando en este momento.".
402                 "',".
403                 "IF(p.status = 2, 'El proceso ha finalizado. ".
404                 "',".
405                 "IF(p.status = 3, 'Se produjo un error durante la ejecución".
406                 " del proceso.".
407                 "',".
408                 "'El proceso fue detenido por alguna persona (el responsable o".
409                 " el administrador).".
410                 "'".
411                 ")".
412                 ")".
413                 ")".
414                 ") AS icono, p.activo AS activo 
415                 FROM yatta.procesos AS p, samurai.sistema AS s
416                 $where
417                 $orden");
418     }
419
420     /**
421      * Guarda los datos en la base.
422      *
423      * @param  DB $db Conexion a la base de datos.
424      * @param  bool $nuevo Indica si se trata de un nuevo registro en la base.
425      *
426      * @return mixed
427      * @access public
428      */
429     function guardar($db = null, $nuevo = true)
430     {
431         return $db->query ('UPDATE yatta.procesos SET nota = \''.$this->nota.
432                 '\', status = '.$this->status.
433                 ' WHERE id = '. $this->id);
434     }
435
436     /**
437      * Hace un reset de los atributos.
438      * 
439      * @return void
440      * @access public
441      */
442     function predefinirAtributos() {
443         $this->id = null;
444         $this->fecha = null;
445         $this->script = null;
446         $this->id_sistema = null;
447         $this->nombre_sistema = null;
448         $this->descripcion = null;
449         $this->pid = null;
450         $this->server = null;
451         $this->status = null;
452         $this->owner = null;
453         $this->destinos = null;
454         $this->prioridad = null;
455         $this->scheduling = null;
456         $this->notificar = null;
457         $this->resultado = null;
458         $this->archivo = null;
459         $this->nota = null;
460         $this->icono = null;
461         $this->activo = null;
462     }
463     
464     /**
465      * Devuelve un array asociativo con los valores del proceso.
466      *
467      * @return array
468      * @access public
469      */
470     function obtenerDatos() {
471         return array (
472                         'script'        => $this->script,
473                         'id_sistema'    => $this->id_sistema,
474                         'descripcion'   => $this->descripcion,
475                         'owner'         => $this->owner,
476                         'destinos'      => $this->destinos,
477                         'prioridad'     => $this->prioridad,
478                         'scheduling'    => $this->scheduling,
479                         'notificar'     => $this->notificar,
480                         'resultado'     => $this->resultado,
481                         'activo'        => $this->activo,
482                         'parametros'    => $this->parametros,
483                 );
484     }
485 }
486 ?>