]> git.llucax.com Git - mecon/yatta.git/blob - lib/YATTA/Proceso.php
YATTA_Proceso cuando asigna un servidor a un nuevo proceso lo hace ponderando.
[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
213             $this->id               = $res['id'];
214             $fecha                  =& new Date ($res['fecha'].' 00:00:00');
215             $this->fecha            = $fecha; 
216             $this->script           = $res['script'];
217             $this->id_sistema       = $res['id_sistema'];
218             $this->nombre_sistema   = $res['nombre_sistema'];
219             $this->descripcion      = $res['descripcion'];
220             $this->pid              = $res['pid'];
221             $this->server           = $res['server'];
222             $this->status           = $res['status'];
223             $this->owner            = $res['owner'];
224             $this->destinos         = split(',', $res['destinos']);
225             $this->prioridad        = $res['prioridad'];
226             $this->scheduling       = $res['scheduling'];
227             $this->notificar        = $res['notificar'];
228             $this->resultado        = $res['resultado'];
229             $this->archivo          = $res['archivo'];
230             $this->nota             = $res['nota'];
231             $this->icono            = $res['icono'];
232             return true;
233         }
234         return false; 
235     }
236
237     /**
238      * Borra el objeto de una base de datos.
239      *
240      * @param  DB $db Base de datos de donde borrar el objeto.
241      *
242      * @return mixed
243      * @access public
244      */
245     function borrar($db = null)
246     {
247         trigger_error('Not implemented!', E_USER_WARNING); 
248     }
249
250     /**
251      * Busca los datos en la base.
252      *
253      * @param  DB $db Conexion a la base de datos.
254      * @param  string $operador Indica como deben concatenarse las condiciones de busqueda
255      * @param  string $orden Indica de que manera deben ordenarse los resultados de la busqueda
256      *
257      * @return mixed
258      * @access public
259      */
260     function buscar($db = null, $operador = MECON_DBO_OR, $orden = null) 
261     {
262         // Armo el WHERE.
263         if (is_null($this->owner)) {
264             return new PEAR_Error ('Debe definirse el Owner del proceso.');
265         }
266         $where = array();
267         if (!is_null($this->id)) {
268             $where[] = 'p.id = '.$this->id;
269         }
270         if (!is_null($this->fecha)) {
271             if (is_object($this->fecha) ) {
272                 $fecha = $this->fecha->format("%Y-%m-%d");
273             }
274             else {
275                 list ($dia, $mes, $anio) = split ('[/.-]', $this->fecha);
276                 $fecha = $anio.'-'.$mes.'-'.$dia;
277             }
278             $where[] = 'p.fecha = '. $db->quote("$fecha");
279         }
280         if (!is_null($this->script)) {
281             $where[] = 'p.script LIKE '. $db->quote("%$this->script%");
282         }
283         if (!is_null($this->id_sistema)) {
284             $where[] = 'p.id_sistema = '. $this->id_sistema; 
285         }
286         if (!is_null($this->nombre_sistema)) {
287             $where[] = 's.nombre_sistema LIKE '. $db->quote("%$this->nombre_sistema%");
288         }
289         if (!is_null($this->descripcion)) {
290             $where[] = 'p.descripcion LIKE '. $db->quote("%$this->descripcion%");
291         }
292         if (!is_null($this->pid)) {
293             $where[] = 'p.pid = '.$this->pid;
294         }
295         if (!is_null($this->server)) {
296             $where[] = 'p.server = '.$this->server;
297         }
298         if (!is_null($this->status)) {
299             $where[] = 'p.status = '.$this->status;
300         }
301         if (!is_null($this->destinos)) {
302             if (is_array($this->destinos)) {
303                 foreach ($this->destinos as $destino) {
304                     $where[] = 'p.destinos LIKE '. $db->quote("%$destino");
305                 }
306             }
307             else {
308                 $where[] = 'p.destinos LIKE '. $db->quote("%$this->destinos%");
309             }
310         }
311         if (!is_null($this->prioridad)) {
312             $where[] = 'p.prioridad = '.$this->prioridad;
313         }
314         if (!is_null($this->scheduling)) {
315             $where[] = 'p.scheduling LIKE '. $db->quote("%$this->scheduling%");
316         } 
317         if (!is_null($this->notificar)) {
318             $where[] = 'p.notificar ='. $this->notificar;
319         } 
320         if (!is_null($this->resultado)) {
321             $where[] = 'p.resultado LIKE '. $db->quote("%$this->resultado%");
322         } 
323         if (!is_null($this->nota)) {
324             $where[] = 'p.nota LIKE '. $db->quote("%$this->nota%");
325         } 
326         if ($where) {
327             $where = 'WHERE p.owner = '. $db->quote("$this->owner").
328                 'AND p.id_sistema = s.id_sistema AND ('. join ("$operador
329                         ", $where).')';
330         } 
331         else {
332             $where = 'WHERE p.owner = '. $db->quote("$this->owner").
333                 'AND p.id_sistema = s.id_sistema';
334         }
335         // Armo el ORDER BY.
336         if (is_string($orden))
337         {
338             $orden = array($orden);
339         }
340         if ($orden) 
341         {
342             $orden = 'ORDER BY '.join(',',$orden);
343         }
344         else {
345             $orden = '';
346         }
347         
348         return $db->query("SELECT p.id AS id, 
349                 DATE_FORMAT(p.fecha, '%d-%m-%Y') AS fecha, 
350                 p.script AS
351                 script, p.id_sistema AS id_sistema, s.nombre_sistema AS
352                 nombre_sistema, p.descripcion AS descripcion, p.pid AS pid, 
353                 p.server AS server, p.status AS status, p.owner AS owner, 
354                 p.destinos AS destinos, p.prioridad AS prioridad, p.scheduling 
355                 AS scheduling, p.notificar AS notificar, p.resultado AS 
356                 resultado, p.nota AS nota, p.archivo AS archivo, ".
357                 "IF (p.status = 0, 'El proceso esta en cola. Aun no se ejecuto.".
358                 "', ".
359                 "IF(p.status = 1, 'El proceso se esta ejecutando en este momento.".
360                 "',".
361                 "IF(p.status = 2, 'El proceso ha finalizado. ".
362                 "',".
363                 "IF(p.status = 3, 'Se produjo un error durante la ejecucion".
364                 " del proceso.".
365                 "',".
366                 "'El proceso fue detenido por alguna persona (el responsable o".
367                 " el administrador).".
368                 "'".
369                 ")".
370                 ")".
371                 ")".
372                 ") AS icono               
373                 FROM yatta.procesos AS p, samurai.sistema AS s
374                 $where
375                 $orden");
376     }
377
378     /**
379      * Guarda los datos en la base.
380      *
381      * @param  DB $db Conexion a la base de datos.
382      * @param  bool $nuevo Indica si se trata de un nuevo registro en la base.
383      *
384      * @return mixed
385      * @access public
386      */
387     function guardar($db = null, $nuevo = true)
388     {
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 ?>