From: Martín Marrese Date: Mon, 12 Jan 2004 19:10:46 +0000 (+0000) Subject: Acomodando los nuevos objetos X-Git-Tag: svn_import~66 X-Git-Url: https://git.llucax.com/mecon/yatta.git/commitdiff_plain/855e52d23917114954f97ad0066f51c89ff7aa1a Acomodando los nuevos objetos --- diff --git a/lib/YATTA/Controlador.php b/lib/YATTA/Controlador.php index 670ddd0..63ac167 100644 --- a/lib/YATTA/Controlador.php +++ b/lib/YATTA/Controlador.php @@ -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 diff --git a/lib/YATTA/Proceso.php b/lib/YATTA/Proceso.php index 2838fd3..c193787 100644 --- a/lib/YATTA/Proceso.php +++ b/lib/YATTA/Proceso.php @@ -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 index 0000000..f253b7a --- /dev/null +++ b/lib/YATTA/ProcesoWeb.php @@ -0,0 +1,507 @@ + +------------------------------------------------------------------------------- +$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 diff --git a/lib/YATTA/Servidor.php b/lib/YATTA/Servidor.php index d91ddd1..e39876a 100644 --- a/lib/YATTA/Servidor.php +++ b/lib/YATTA/Servidor.php @@ -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