]> git.llucax.com Git - mecon/yatta.git/commitdiff
Acomodando los nuevos objetos
authorMartín Marrese <marrese@gmail.com>
Mon, 12 Jan 2004 19:10:46 +0000 (19:10 +0000)
committerMartín Marrese <marrese@gmail.com>
Mon, 12 Jan 2004 19:10:46 +0000 (19:10 +0000)
lib/YATTA/Controlador.php
lib/YATTA/Proceso.php
lib/YATTA/ProcesoWeb.php [new file with mode: 0644]
lib/YATTA/Servidor.php

index 670ddd0271e48c7245330dbd5e45f83cf63c7a16..63ac16773e5097967e8c4b1848f7cacd36c6ca44 100644 (file)
@@ -25,6 +25,7 @@ $Id$
 -----------------------------------------------------------------------------*/
 
 require_once 'YATTA/Proceso.php';
+require_once 'YATTA/ProcesoWeb.php';
 require_once 'YATTA/Servidor.php';
 
 /**
@@ -34,6 +35,26 @@ require_once 'YATTA/Servidor.php';
  */
 class YATTA_Controlador {
 
+    /**
+     * Obtiene el nombre del servidor al cual asignar un nuevo proceso.
+     *
+     * @param DB $db Conexion a la base de datos.
+     *
+     * @return mixed
+     * @access private
+     */
+    function _obtenerServidor($db) {
+        $res = $db->query('SELECT s.id, s.escala * s.procesos AS ponderacion
+            FROM yatta.servidores AS s 
+            ORDER BY ponderacion ASC, s.escala DESC');
+        // Si hay error lo devuelve.
+        if (DB::isError($res)) {
+            return $res;
+        }
+        $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
+        return  $res['id'];
+    }
     /**
      * Agrega un proceso a la base de datos
      * Los datos obligatorios a pasar son: script, id_sistema, descripcion,
@@ -49,10 +70,18 @@ class YATTA_Controlador {
         //XXX Dentro de los datos puede estar el tiempo estimado de ejecucion
         //del proceso. Esta informacion podria ser utilizada en futuras
         //versiones para asignar servidores.
-        if (!is_array($datos)) {
+
+        //Si no es un array
+        if (is_object($datos) && is_a ($datos, 'YATTA_ProcesoDB')) {
             $datos = $datos->obtenerDatos();
         }
+        elseif (!is_array($datos)) {
+            return new PEAR_Error ("Error con los datos pasados. El segundo".
+                    " parametro debe ser un array asociativo o una instancia".
+                    " del objeto YATTA_Proceso.");
+        }
         $res = $this->_obtenerServidor($db);
+
         if (DB::isError($res)) {
             return $res;
         }
@@ -63,30 +92,9 @@ class YATTA_Controlador {
             return $res;
         }
         $SERVER =& new YATTA_Servidor;
-        $res = $SERVER->agregarProceso($db, $datos['server']);
-        return $res;
+        return $SERVER->agregarProceso($db, $datos['server']);
     }
 
-    /**
-     * Obtiene el nombre del servidor al cual asignar un nuevo proceso.
-     *
-     * @param DB $db Conexion a la base de datos.
-     *
-     * @return mixed
-     * @access private
-     */
-    function _obtenerServidor($db) {
-        $res = $db->query('SELECT s.id, s.escala * s.procesos AS ponderacion
-            FROM yatta.servidores AS s 
-            ORDER BY ponderacion DESC, s.escala DESC');
-        // Si hay error lo devuelve.
-        if (DB::isError($res)) {
-            return $res;
-        }
-        $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
-        return  $res['id'];
-    }
     /**
      * Obtiene los procesos de un usuario.
      *
@@ -98,7 +106,7 @@ class YATTA_Controlador {
      * @access public
      */
     function obtenerProcesosUsuario($db, $owner, $id = null) {
-        $proceso =& new YATTA_Proceso;
+        $proceso =& new YATTA_ProcesoDB;
         $proceso->owner = $owner;
         if (@$id) {
             $proceso->id = $id;
@@ -117,13 +125,12 @@ class YATTA_Controlador {
      * @access public
      */
     function obtenerProcesoUsuario($db, $owner, $id) {
-        $proceso =& new YATTA_Proceso;
+        $proceso =& new YATTA_ProcesoDB;
         $proceso->owner = $owner;
         $proceso->id = $id;
         $res = $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
-        $proceso->cargar($res);
+        $res = $proceso->cargar($res);
         return $proceso;
     }
-   
 }
 ?>
\ No newline at end of file
index 2838fd3e8c15a8fe38071b5f8191fd3a4bf6601b..c193787f9d7c97362fedb4263b7bd4062de8e080 100644 (file)
@@ -384,7 +384,7 @@ class YATTA_Proceso extends MECON_DBO {
      */
     function guardar($db = null, $nuevo = true)
     {
-
+/*
         //@TODO PASAR ESTO A UNA CLASE SERVIDOR
         //Busco el servidor
         $res = $db->query('SELECT id, escala * procesos AS ponderacion
@@ -451,11 +451,11 @@ class YATTA_Proceso extends MECON_DBO {
             return $res;
         }
 
-        $res = $db->query('
+        return  $db->query('
                 UPDATE yatta.servidores
                 SET procesos = procesos + 1
                 WHERE id = '. $this->server);
-        return $res;
+*/
     }
 
     /**
diff --git a/lib/YATTA/ProcesoWeb.php b/lib/YATTA/ProcesoWeb.php
new file mode 100644 (file)
index 0000000..f253b7a
--- /dev/null
@@ -0,0 +1,507 @@
+<?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
+-------------------------------------------------------------------------------
+                             Ministerio de Economía
+                                    YATTA!
+-------------------------------------------------------------------------------
+This file is part of YATTA!.
+
+YATTA! is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2 of the License, or (at your option)
+any later version.
+
+YATTA! is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+You should have received a copy of the GNU General Public License; if not,
+write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+Boston, MA  02111-1307  USA
+-------------------------------------------------------------------------------
+Creado: lun dic  1 16:59:29 ART 2003
+Autor:  Martin Marrese <mmarre@mecon.gov.ar>
+-------------------------------------------------------------------------------
+$Id$
+-----------------------------------------------------------------------------*/
+
+require_once 'MECON/DBO.php';
+require_once 'PEAR.php';
+require_once 'Date.php';
+
+/**
+ * Clase para el manejo de los procesos.
+ *
+ * @access public
+ */
+class YATTA_ProcesoWeb extends MECON_DBO {
+
+    /**
+     * Identificador del proceso.
+     *
+     * @var    int $id
+     * @access public
+     */
+    var $id = null;
+     
+    /**
+     * Fecha cuando se agrego el proceso.
+     * Formato = DD/MM/YYYY
+     * Puede ser un objeto Date.
+     *
+     * @var    string $fecha
+     * @access public
+     */
+    var $fecha = null;
+     
+    /**
+     * Proceso a ejecutar.
+     *
+     * @var    string $script
+     * @access public
+     */
+    var $script = null;
+     
+    /**
+     * Identificador del sistema en el cual se lanzo el proceso.
+     *
+     * @var    int $id_sistema
+     * @access public
+     */
+    var $id_sistema = null;
+
+    /**
+     * Nombre del sistema en el cual se lanzo el proceso.
+     *
+     * @var    string $nombre_sistema
+     * @access public
+     */
+    var $nombre_sistema = null;
+     
+    /**
+     * Descripcion del proceso.
+     *
+     * @var    string $descripcion
+     * @access public
+     */
+    var $descripcion = null;
+    
+    /**
+     * PID del proceso en el servidor de proceso.
+     *
+     * @var    int $pid
+     * @access public
+     */
+    var $pid = null;
+    
+    /**
+     * Servidor en donde se ejecuto/a/ara el proceso.
+     *
+     * @var    int $server  
+     * @access public
+     */
+    var $server = null;
+    
+    /**
+     * Estado del proceso.       
+     * 0 = En Espera
+     * 1 = Procesando
+     * 2 = Finalizado
+     * 3 = Error
+     * 4 = Abortado
+     *
+     * @var    int $status
+     * @access public
+     */
+    var $status = null;
+    
+    /**
+     * Identificador del usuario responsable por el proceso.
+     *
+     * @var    string $owner
+     * @access public
+     */
+    var $owner = null;
+    
+    /**
+     * Destinos para el resultado.
+     * array ('mmarre@mecon', 'gmeray@mecon')
+     *
+     * @var    array $destinos
+     * @access public
+     */
+    var $destinos = null;
+    
+    /**
+     * Prioridad el proceso.
+     *
+     * @var    int $prioridad
+     * @access public
+     */
+    var $prioridad = null;
+    
+    /**
+     * Fecha de ejecucion fijada.
+     *
+     * @var    string $scheduling
+     * @access public
+     */
+    var $scheduling = null;
+    
+    /**
+     * Indica si se debe notificar o no al owner sobre el resultado.
+     *
+     * @var    int $notificar
+     * @access public
+     */
+    var $notificar = null;
+    
+    /**
+     * Nombre del archivo resultado
+     *
+     * @var    string $resultado
+     * @access public
+     */
+    var $resultado = null;
+    
+    /**
+     * Nombre del archivo en el tacho
+     *
+     * @var    string $archivo
+     * @access public
+     */
+    var $archivo = null;
+    
+    /**
+     * Nota explicativa sobre el error producido o el motivo por el cual se
+     * aborto el proceso.
+     *
+     * @var    string $nota
+     * @access public
+     */
+    var $nota = null;
+
+    /**
+     * Descripcion del estado.
+     *
+     * @var    string $icono
+     * @access public
+     */
+    var $icono = null;
+    
+    /**
+     * Carga el objeto con los datos que se pasan por parametro.
+     * 
+     * @param  DB $db DB o DB_Result a usar para la carga.
+     *
+     * @return mixed
+     * @access public
+     */
+    function cargar($db = null)
+    {
+        // Si es un resultado, obtengo los elemento.
+        if (is_a($db, 'db_result')) {
+            $this->predefinirAtributos();
+            $res = $db->fetchRow(DB_FETCHMODE_ASSOC);
+            // Si hay error lo devuelve.
+            if (DB::isError($res)) {
+                return $res;
+            }
+            elseif (!$res) {
+                return false;
+            }
+            $this->id               = $res['id'];
+            $this->fecha            = $res['fecha']; 
+            $this->script           = $res['script'];
+            $this->id_sistema       = $res['id_sistema'];
+            $this->nombre_sistema   = $res['nombre_sistema'];
+            $this->descripcion      = $res['descripcion'];
+            $this->pid              = $res['pid'];
+            $this->server           = $res['server'];
+            $this->status           = $res['status'];
+            $this->owner            = $res['owner'];
+            $this->destinos         = split(',', $res['destinos']);
+            $this->prioridad        = $res['prioridad'];
+            $this->scheduling       = $res['scheduling'];
+            $this->notificar        = $res['notificar'];
+            $this->resultado        = $res['resultado'];
+            $this->archivo          = $res['archivo'];
+            $this->nota             = $res['nota'];
+            $this->icono            = $res['icono'];
+            return true;
+        }
+        return false; 
+    }
+
+    /**
+     * Borra el objeto de una base de datos.
+     *
+     * @param  DB $db Base de datos de donde borrar el objeto.
+     *
+     * @return mixed
+     * @access public
+     */
+    function borrar($db = null)
+    {
+        trigger_error('Not implemented!', E_USER_WARNING); 
+    }
+
+    /**
+     * Busca los datos en la base.
+     *
+     * @param  DB $db Conexion a la base de datos.
+     * @param  string $operador Indica como deben concatenarse las condiciones de busqueda
+     * @param  string $orden Indica de que manera deben ordenarse los resultados de la busqueda
+     *
+     * @return mixed
+     * @access public
+     */
+    function buscar($db = null, $operador = MECON_DBO_OR, $orden = null) 
+    {
+        // Armo el WHERE.
+        if (is_null($this->owner)) {
+            return new PEAR_Error ('Debe definirse el Owner del proceso.');
+        }
+        $where = array();
+        if (!is_null($this->id)) {
+            $where[] = 'p.id = '.$this->id;
+        }
+        if (!is_null($this->fecha)) {
+            if (is_object($this->fecha) ) {
+                $fecha = $this->fecha->format("%Y-%m-%d");
+            }
+            else {
+                list ($dia, $mes, $anio) = split ('[/.-]', $this->fecha);
+                $fecha = $anio.'-'.$mes.'-'.$dia;
+            }
+            $where[] = 'p.fecha = '. $db->quote("$fecha");
+        }
+        if (!is_null($this->script)) {
+            $where[] = 'p.script LIKE '. $db->quote("%$this->script%");
+        }
+        if (!is_null($this->id_sistema)) {
+            $where[] = 'p.id_sistema = '. $this->id_sistema; 
+        }
+        if (!is_null($this->nombre_sistema)) {
+            $where[] = 's.nombre_sistema LIKE '. $db->quote("%$this->nombre_sistema%");
+        }
+        if (!is_null($this->descripcion)) {
+            $where[] = 'p.descripcion LIKE '. $db->quote("%$this->descripcion%");
+        }
+        if (!is_null($this->pid)) {
+            $where[] = 'p.pid = '.$this->pid;
+        }
+        if (!is_null($this->server)) {
+            $where[] = 'p.server = '.$this->server;
+        }
+        if (!is_null($this->status)) {
+            $where[] = 'p.status = '.$this->status;
+        }
+        if (!is_null($this->destinos)) {
+            if (is_array($this->destinos)) {
+                foreach ($this->destinos as $destino) {
+                    $where[] = 'p.destinos LIKE '. $db->quote("%$destino");
+                }
+            }
+            else {
+                $where[] = 'p.destinos LIKE '. $db->quote("%$this->destinos%");
+            }
+        }
+        if (!is_null($this->prioridad)) {
+            $where[] = 'p.prioridad = '.$this->prioridad;
+        }
+        if (!is_null($this->scheduling)) {
+            $where[] = 'p.scheduling LIKE '. $db->quote("%$this->scheduling%");
+        } 
+        if (!is_null($this->notificar)) {
+            $where[] = 'p.notificar ='. $this->notificar;
+        } 
+        if (!is_null($this->resultado)) {
+            $where[] = 'p.resultado LIKE '. $db->quote("%$this->resultado%");
+        } 
+        if (!is_null($this->nota)) {
+            $where[] = 'p.nota LIKE '. $db->quote("%$this->nota%");
+        } 
+        if ($where) {
+            $where = 'WHERE p.owner = '. $db->quote("$this->owner").
+                'AND p.id_sistema = s.id_sistema AND ('. join ("$operador
+                        ", $where).')';
+        } 
+        else {
+            $where = 'WHERE p.owner = '. $db->quote("$this->owner").
+                'AND p.id_sistema = s.id_sistema';
+        }
+        // Armo el ORDER BY.
+        if (is_string($orden))
+        {
+            $orden = array($orden);
+        }
+        if ($orden) 
+        {
+            $orden = 'ORDER BY '.join(',',$orden);
+        }
+        else {
+            $orden = '';
+        }
+        
+        return $db->query("SELECT p.id AS id, 
+                DATE_FORMAT(p.fecha, '%d-%m-%Y') AS fecha, 
+                p.script AS
+                script, p.id_sistema AS id_sistema, s.nombre_sistema AS
+                nombre_sistema, p.descripcion AS descripcion, p.pid AS pid, 
+                p.server AS server, p.status AS status, p.owner AS owner, 
+                p.destinos AS destinos, p.prioridad AS prioridad, p.scheduling 
+                AS scheduling, p.notificar AS notificar, p.resultado AS 
+                resultado, p.nota AS nota, p.archivo AS archivo, ".
+                "IF (p.status = 0, 'El proceso esta en cola. Aun no se ejecuto.".
+                "', ".
+                "IF(p.status = 1, 'El proceso se esta ejecutando en este momento.".
+                "',".
+                "IF(p.status = 2, 'El proceso ha finalizado. ".
+                "',".
+                "IF(p.status = 3, 'Se produjo un error durante la ejecucion".
+                " del proceso.".
+                "',".
+                "'El proceso fue detenido por alguna persona (el responsable o".
+                " el administrador).".
+                "'".
+                ")".
+                ")".
+                ")".
+                ") AS icono               
+                FROM yatta.procesos AS p, samurai.sistema AS s
+                $where
+                $orden");
+    }
+
+    /**
+     * Guarda los datos en la base.
+     *
+     * @param  DB $db Conexion a la base de datos.
+     * @param  bool $nuevo Indica si se trata de un nuevo registro en la base.
+     *
+     * @return mixed
+     * @access public
+     */
+    function guardar($db = null, $nuevo = true)
+    {
+/*
+        //@TODO PASAR ESTO A UNA CLASE SERVIDOR
+        //Busco el servidor
+        $res = $db->query('SELECT id, escala * procesos AS ponderacion
+                FROM yatta.servidores 
+                ORDER BY ponderacion, escala');
+        $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
+        // Si hay error lo devuelve.
+        if (DB::isError($res)) {
+            return $res;
+        }
+        $this->server = $res['id'];
+        //Asigno la fecha
+        if (@is_null($this->fecha)) {
+            $this->fecha = date ('Y-m-d');
+        }
+        
+        if ($nuevo) {
+            $datos = array (
+                        'fecha'         => $this->fecha,
+                        'script'        => $this->script,
+                        'id_sistema'    => $this->id_sistema,
+                        'descripcion'   => $this->descripcion,
+                        'pid'           => $this->pid,
+                        'server'        => $this->server,
+                        'status'        => $this->status,
+                        'owner'         => $this->owner,
+                        'destinos'      => $this->destinos,
+                        'prioridad'     => $this->prioridad,
+                        'scheduling'    => $this->scheduling,
+                        'notificar'     => $this->notificar,
+                        'resultado'     => $this->resultado,
+                        'archivo'       => $this->archivo,
+                        'nota'          => $this->nota
+                    );
+
+            $res = $db->autoExecute('yatta.procesos', $datos,
+                    DB_AUTOQUERY_INSERT);
+        }
+        else {
+            $datos = array (
+                        'fecha'         => $this->fecha,
+                        'script'        => $this->script,
+                        'id_sistema'    => $this->id_sistema,
+                        'descripcion'   => $this->descripcion,
+                        'pid'           => $this->pid,
+                        'server'        => $this->server,
+                        'status'        => $this->status,
+                        'owner'         => $this->owner,
+                        'destinos'      => $this->destinos,
+                        'prioridad'     => $this->prioridad,
+                        'scheduling'    => $this->scheduling,
+                        'notificar'     => $this->notificar,
+                        'resultado'     => $this->resultado,
+                        'archivo'       => $this->archivo,
+                        'nota'          => $this->nota
+                    );
+
+            $res = $db->autoExecute('yatta.procesos', $datos,
+                    DB_AUTOQUERY_UPDATE, 'id = '.$this->id);
+            
+        }
+
+        if (DB::isError($res)) {
+            return $res;
+        }
+
+        return  $db->query('
+                UPDATE yatta.servidores
+                SET procesos = procesos + 1
+                WHERE id = '. $this->server);
+*/
+    }
+
+    /**
+     * Hace un reset de los atributos.
+     * 
+     * @return void
+     * @access public
+     */
+    function predefinirAtributos() {
+        $this->id = null;
+        $this->fecha = null;
+        $this->script = null;
+        $this->id_sistema = null;
+        $this->nombre_sistema = null;
+        $this->descripcion = null;
+        $this->pid = null;
+        $this->server = null;
+        $this->status = null;
+        $this->owner = null;
+        $this->destinos = null;
+        $this->prioridad = null;
+        $this->scheduling = null;
+        $this->notificar = null;
+        $this->resultado = null;
+        $this->archivo = null;
+        $this->nota = null;
+        $this->icono = null;
+    }
+    
+    /**
+     * Devuelve un array asociativo con los valores del proceso.
+     *
+     * @return array
+     * @access public
+     */
+    function obtenerDatos() {
+        return array (
+                        'script'        => $this->script,
+                        'id_sistema'    => $this->id_sistema,
+                        'descripcion'   => $this->descripcion,
+                        'owner'         => $this->owner,
+                        'destinos'      => $this->destinos,
+                        'prioridad'     => $this->prioridad,
+                        'scheduling'    => $this->scheduling,
+                        'notificar'     => $this->notificar,
+                );
+    }
+}
+?>
\ No newline at end of file
index d91ddd14070240b336b72b392dd8973cd184a302..e39876a632b75a2115baabb4f36f2727c0d7a0cd 100644 (file)
@@ -41,11 +41,45 @@ class YATTA_Servidor {
      * @access public
      */
     function agregarProceso($db, $id) {
-        $res = $db->query('
+        return  $db->query('
                 UPDATE yatta.servidores
                 SET procesos = procesos + 1
                 WHERE id = '. $id);
-        return $res;
     }
+
+    /**
+     * Devuelve el estado actual del servidor.
+     * -1 = Error (Mas de un proceso en ejecucion)
+     * 0 = Idle
+     * n = PID del proceso en ejecucion
+     *
+     * @param  DB $db Conexion a la base de datos.
+     * @param  string $nombre Nombre del servidor.
+     *
+     * @return mixed
+     * @access public
+     */
+    function obtenerEstado($db, $nombre) {
+        $res = $db->query("SELECT p.pid AS pid
+            FROM yatta.procesos AS p, yatta.servidores AS s 
+            WHERE s.nombre = '$nombre' AND p.server = s.id 
+            AND p.status = 1");
+        // Si hay error lo devuelve.
+        if (DB::isError($res)) {
+            return $res;
+        }
+        if ($res->numRows() > 1) {
+            return -1;
+        }
+        elseif ($res->numRows() == 0) {
+            return 0;
+        }
+        else {
+            $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
+            return $res['pid'];
+        }
+        
+    }
+
 }
 ?>
\ No newline at end of file