1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 // +----------------------------------------------------------------------+
4 // +----------------------------------------------------------------------+
5 // | Copyright (c) 1997-2003 The PHP Group |
6 // +----------------------------------------------------------------------+
7 // | This source file is subject to version 2.02 of the PHP license, |
8 // | that is bundled with this package in the file LICENSE, and is |
9 // | available at through the world-wide-web at |
10 // | http://www.php.net/license/2_02.txt. |
11 // | If you did not receive a copy of the PHP license and are unable to |
12 // | obtain it through the world-wide-web, please send a note to |
13 // | license@php.net so we can mail you a copy immediately. |
14 // +----------------------------------------------------------------------+
15 // | Created: jue mar 11 11:37:42 ART 2004 |
16 // | Author: Martin Marrese <mmarre@mecon.gov.ar |
17 // +----------------------------------------------------------------------+
22 require_once 'PEAR.php';
23 require_once 'DB.php';
25 require_once 'SAMURAI/Sistema.php';
26 require_once 'SAMURAI/Perfil.php';
27 require_once 'SAMURAI/Permiso.php';
28 require_once 'SAMURAI/Usuario.php';
32 * Clase para el manejo de la migracion de sistemas.
36 class SAMURAI_Migrar {
39 * Conexion al host origen
41 * @var SAMURAI_DB $db_source
44 var $_db_source = null;
47 * Conexion al host destino
55 * Sistema con el que se esta trabajando.
57 * @var SAMURAI_Sistema $sistema
63 * Login del responsable de la migracion.
65 * @var string $responsable
68 var $_responsable = null;
71 * Se encarga de migrar los datos del sistema.
76 function _migrarSistema() {
77 //Obtengo el id del sistema
78 $id_sistema = $this->_db_dest->nextId('sistema');
79 $fecha_inicio = $this->_sistema->getFechaInicio();
80 $fecha_fin = $this->_sistema->getFechaFin();
81 $fecha_implementacion = $this->_sistema->getFechaImplementacion();
84 'id_sistema' => $id_sistema,
85 'nombre_sistema' => $this->_sistema->getNombre(),
86 'desc_sistema' => $this->_sistema->getDescripcion(),
87 'fecha_inicio' => $fecha_inicio ?
88 $fecha_inicio->format("%Y-%m-%d") : null,
89 'fecha_fin' => $fecha_fin ?
90 $fecha_fin->format("%Y-%m-%d") : null,
91 'fecha_implementacion' => $fecha_implementacion ?
92 $fecha_implementacion->format("%Y-%m-%d") : null,
93 'contacto' => $this->_sistema->getContacto(),
94 'estado' => $this->_sistema->getEstado(),
95 'responsable' => $this->_responsable
97 $res = $this->_db_dest->autoExecute('samurai.sistema', $datos,
99 if (PEAR::isError($res)) {
106 * Se encarga de migrar los datos de los permisos asociados al sistema.
111 function _migrarPermisos() {
112 //Obtengo la lista de permisos del sistema origen.
113 $permisos_source = SAMURAI_Permiso::getArrayPermisos($this->_db_source,
114 $this->_sistema->getId());
115 $permisos_dest = SAMURAI_Permiso::getArrayPermisos($this->_db_dest);
116 foreach ($permisos_source as $key => $value) {
117 if (in_array($value, $permisos_dest)) {
118 //Existe. Guardo el ID.
119 $res[$key] = array_search($value, $permisos_dest);
122 //No existe. Lo agrego a la base y guardo el id.
123 //Obtengo el siguiente ID
124 $id_permiso = $this->_db_dest->nextId('permiso');
127 'id_permiso' => $id_permiso,
128 'desc_permiso' => $value,
129 'responsable' => $this->_responsable,
131 $tmp = $this->_db_dest->autoExecute('samurai.permiso', $datos, DB_AUTOQUERY_INSERT);
132 if (PEAR::isError($tmp)) {
135 $res[$key] = $id_permiso;
142 * Se encarga de migrar los datos de los perfiles asociados al sistema.
147 function _migrarPerfiles() {
148 //Obtengo la lista de perfiles del sistema origen.
149 $perfiles_source = SAMURAI_Perfil::getArrayPerfiles($this->_db_source,
150 null, $this->_sistema->getId());
151 $perfiles_dest = SAMURAI_Perfil::getArrayPerfiles($this->_db_dest);
152 foreach ($perfiles_source as $key => $value) {
153 if (in_array($value, $perfiles_dest)) {
154 //Existe. Guardo el ID.
155 $res[$key] = array_search($value, $perfiles_dest);
158 //No existe. Lo agrego a la base y guardo el id.
159 //Obtengo el siguiente ID
160 $id_perfil = $this->_db_dest->nextId('perfil');
163 'id_perfil' => $id_perfil,
164 'desc_perfil' => $value,
165 'responsable' => $this->_responsable,
167 $tmp = $this->_db_dest->autoExecute('samurai.perfil', $datos, DB_AUTOQUERY_INSERT);
168 if (PEAR::isError($tmp)) {
171 $res[$key] = $id_perfil;
179 * Se encarga de migrar los datos de los usuarios asociados al sistema.
184 function _migrarUsuarios() {
185 //No hago nada porque solamente tengo que armar las relaciones, si el
186 //usuario no existe tiene que loguearse al menos una vez en la intranet
187 //del host destino. Cuando se logue va a existir, por lo tanto va a
188 //tener el permiso dado.
189 $res = SAMURAI_Usuario::getArrayUsuarios($this->_db_source,
190 $this->_sistema->getId()) ;
195 * Se encarga de migrar las relaciones del sistema seleccionado.
197 * @param int $sistema Identificador del sistmea en el host destino.
198 * @param array $permisos Array $permiso[clave_source] = $clave_destino.
199 * @param array $perfiles Array $perfil[clave_source] = $clave_destino.
200 * @param array $usuarios Array $usuario[login] = nombre. Usuarios del
201 * sistema en el host source.
206 function _migrarRelaciones($sistema, $permisos, $perfiles, $usuarios) {
207 $sistema_source = $this->_sistema->getId();
208 //PERMISO - SISTEMA perm_sist (OBSERVACIONES)
209 $res = $this->_relacionPermisoSistema($sistema, $permisos);
210 if (PEAR::isError($res)) {
213 //PERFIL - SISTEMA perfil_sist
214 $res = $this->_relacionPerfilSistema($sistema, $perfiles);
215 if (PEAR::isError($res)) {
218 //PERMISO - PERFIL - SISTEMA perm_perfil_sist
219 $res = $this->_relacionPermisoPerfilSistema($sistema, $perfiles,
221 if (PEAR::isError($res)) {
224 //PERFIL - SISTEMA - USUARIO perfil_sist_usuario
225 $res = $this->_relacionPerfilSistemaUsuario($sistema, $perfiles,
227 if (PEAR::isError($res)) {
233 * Migra la relacion de los permisos del sistema de un host a otro.
235 * @param int $id_sistema Identificador del sistmea en el host destino.
236 * @param array $permisos Array $permiso[clave_source] = $clave_destino.
241 function _relacionPermisoSistema($id_sistema, $permisos) {
242 $sistema_source = $this->_sistema->getId();
244 SELECT id_permiso, observaciones
245 FROM samurai.perm_sist
246 WHERE id_sistema = $sistema_source
248 $res = $this->_db_source->getAssoc($sql);
249 if (PEAR::isError($res)) {
252 $sql = $this->_db_dest->prepare("
253 INSERT INTO samurai.perm_sist
254 (id_permiso, id_sistema, observaciones, responsable)
255 VALUES (?, ? , ? , ?)
257 foreach ($res as $key => $value) {
258 //Busco el nuevo id del permiso
259 if (array_key_exists($key, $permisos)) {
260 $id_permiso = $permisos[$key];
263 return new PEAR_Error ('Se estan realizando modificaciones en el
264 host source.', null, null, null, 'HTML');
266 //Agrego la info en la base
267 $res = $this->_db_dest->execute($sql, array ($id_permiso,
268 $id_sistema, $value, $this->_responsable));
269 if (PEAR::isError($res)) {
276 * Migra la relacion de los perfiles del sistema de un host a otro.
278 * @param int $id_sistema Identificador del sistmea en el host destino.
279 * @param array $perfiles Array $perfil[clave_source] = $clave_destino.
284 function _relacionPerfilSistema($id_sistema, $perfiles) {
285 $sistema_source = $this->_sistema->getId();
286 //Asocio los perfiles al sistema
289 FROM samurai.perfil_sist
290 WHERE id_sistema = $sistema_source
292 $res = $this->_db_source->getCol($sql);
293 if (PEAR::isError($res)) {
296 $sql = $this->_db_dest->prepare("
297 INSERT INTO samurai.perfil_sist
298 (id_perfil, id_sistema, responsable)
301 foreach ($res as $key) {
302 //Busco el nuevo id del perfil
303 if (array_key_exists($key, $perfiles)) {
304 $id_perfil = $perfiles[$key];
307 return new PEAR_Error ('Se estan realizando modificaciones en el
308 host source.', null, null, null, 'HTML');
310 //Agrego la info en la base
311 $res = $this->_db_dest->execute($sql, array ($id_perfil,
312 $id_sistema, $this->_responsable));
313 if (PEAR::isError($res)) {
320 * Migra la relacion de los perfiles del sistema con permisos de un host a
323 * @param int $id_sistema Identificador del sistmea en el host destino.
324 * @param array $perfiles Array $perfil[clave_source] = $clave_destino.
325 * @param array $permisos Array $permiso[clave_source] = $clave_destino.
330 function _relacionPermisoPerfilSistema($id_sistema, $perfiles, $permisos) {
331 $sistema_source = $this->_sistema->getId();
332 //Asocio los perfiles al sistema con permisos
334 SELECT id_permiso, id_perfil, id_sistema, observaciones
335 FROM samurai.perm_perfil_sist
336 WHERE id_sistema = $sistema_source
338 $res = $this->_db_source->getAll($sql);
339 if (PEAR::isError($res)) {
342 $sql = $this->_db_dest->prepare("
343 INSERT INTO samurai.perm_perfil_sist
344 (id_permiso, id_perfil, id_sistema, observaciones, responsable)
345 VALUES (?, ?, ?, ?, ?)
347 foreach ($res as $value) {
348 if (array_key_exists($value[0], $permisos)) {
349 $id_permiso = $permisos[$value[0]];
352 return new PEAR_Error ('Se estan realizando modificaciones en el
353 host source.', null, null, null, 'HTML');
355 if (array_key_exists($value[1], $perfiles)) {
356 $id_perfil = $perfiles[$value[1]];
359 return new PEAR_Error ('Se estan realizando modificaciones en el
360 host source.', null, null, null, 'HTML');
362 $res = $this->_db_dest->execute($sql, array ($id_permiso,
363 $id_perfil, $id_sistema, $value[2], $this->_responsable));
364 if (PEAR::isError($res)) {
371 * Migra la relacion de los usuarios con perfiles del sistema con permisos
374 * @param int $id_sistema Identificador del sistmea en el host destino.
375 * @param array $perfiles Array $perfil[clave_source] = $clave_destino.
376 * @param array $usuarios Array $usuario[login] = nombre.
381 function _relacionPerfilSistemaUsuario($id_sistema, $perfiles, $usuarios) {
382 $sistema_source = $this->_sistema->getId();
383 //Asocio los usuarios al perfil en le sistema
385 SELECT login, id_perfil, id_sistema
386 FROM samurai.perfil_sist_usuario
387 WHERE id_sistema = $sistema_source
389 $res = $this->_db_source->getAll($sql);
390 if (PEAR::isError($res)) {
393 $sql = $this->_db_dest->prepare("
394 INSERT INTO samurai.perfil_sist_usuario
395 (login, id_perfil, id_sistema, responsable)
398 foreach ($res as $value) {
399 if (array_key_exists($value[1], $perfiles)) {
400 $id_perfil = $perfiles[$value[1]];
403 return new PEAR_Error ('Se estan realizando modificaciones en el
404 host source.', null, null, null, 'HTML');
406 $res = $this->_db_dest->execute($sql, array ($value[0], $id_perfil,
407 $id_sistema, $this->_responsable));
408 if (PEAR::isError($res)) {
415 * Verifica si existe en el host destino un sistema con igual nombre.
420 function _verificarExisteSistema() {
422 SELECT count(*) AS cuenta
424 WHERE nombre_sistema = ".
425 $this->_db_dest->quote($this->_sistema->getNombre());
426 $res = $this->_db_dest->getCol($sql);
427 if (PEAR::isError($res)) {
430 elseif (array_shift($res)) {
431 return new PEAR_Error ('El sistema ya existe en el host
432 seleccionado.', null, null, null, 'HTML');
437 * Realiza la conexion con el host destino
439 * @param string $db_host Identificador del servidor MySQL.
440 * @param string $db_user Identificador del usuario MySQL con permisos en la
441 * base samurai en el host ingresado.
442 * @param string $db_pass Clave del usuario MySQL.
447 function _dbDestino($db_host, $db_user, $db_pass) {
449 "mysql://$db_user:$db_pass@$db_host/samurai"
457 * @param DB &$db_source Conexion a la base de datos.
458 * @param string $db_host Identificador del servidor MySQL.
459 * @param string $db_user Identificador del usuario MySQL con permisos en la
460 * base samurai en el host ingresado.
461 * @param string $db_pass Clave del usuario MySQL.
462 * @param string $responsable Login del responsable de la migracion.
467 function SAMURAI_Migrar(&$db_source, $db_host, $db_user, $db_pass,
469 $this->_db_source =& $db_source;
470 $this->_responsable = $responsable;
471 //Armo la conexion con el host destino
472 $this->_db_dest =& $this->_dbDestino($db_host, $db_user, $db_pass);
473 if (PEAR::isError($this->_db_dest)) {
474 trigger_error('Error: ' . $this->_db_dest->getMessage() . "\n", E_USER_ERROR);
479 * Se encarga de migrar el sistema, que se selecciono, completo (permisos,
480 * sistema, perfiles, usuarios) al destino ingresado.
482 * @param int $id_sistema Identificador del sistema.
487 function migrarSistema($id_sistema) {
489 //Lockear las tablas en el host source para escritura con la sentencia
491 $this->_sistema =& new SAMURAI_Sistema($this->_db_source, $id_sistema);
493 //Verifico si existe el sistema.
494 $res = $this->_verificarExisteSistema();
495 if (PEAR::isError($res)) {
498 //Migro los permisos.
499 $permisos = $this->_migrarPermisos();
500 if (PEAR::isError($permisos)) {
504 $sistema = $this->_migrarSistema();
505 if (PEAR::isError($sistema)) {
508 //Migro los perfiles.
509 $perfiles = $this->_migrarPerfiles();
510 if (PEAR::isError($perfiles)) {
513 //Migro los usuarios.
514 $usuarios = $this->_migrarUsuarios();
515 if (PEAR::isError($usuarios)) {
518 //Migro las relaciones
519 $relaciones = $this->_migrarRelaciones($sistema, $permisos, $perfiles,
521 if (PEAR::isError($relaciones)) {
524 //Deslockear las tablas en el host source para escritura con la sentencia