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 $res = $this->_db->autoExecute('samurai.permiso', $datos, DB_AUTOQUERY_INSERT);
132 if (PEAR::isError($res)) {
135 $res[$key] = $id_permiso;
143 * Se encarga de migrar los datos de los perfiles asociados al sistema.
148 function _migrarPerfiles() {
149 //Obtengo la lista de perfiles del sistema origen.
150 $perfiles_source = SAMURAI_Perfil::getArrayPerfiles($this->_db_source,
151 null, $this->_sistema->getId());
152 $perfiles_dest = SAMURAI_Perfil::getArrayPerfiles($this->_db_dest);
153 foreach ($perfiles_source as $key => $value) {
154 if (in_array($value, $perfiles_dest)) {
155 //Existe. Guardo el ID.
156 $res[$key] = array_search($value, $perfiles_dest);
159 //No existe. Lo agrego a la base y guardo el id.
160 //Obtengo el siguiente ID
161 $id_perfil = $this->_db->nextId('perfil');
164 'id_perfil' => $id_perfil,
165 'desc_perfil' => $value,
166 'responsable' => $this->_responsable,
168 $res = $this->_db->autoExecute('samurai.perfil', $datos, DB_AUTOQUERY_INSERT);
169 if (PEAR::isError($res)) {
172 $res[$key] = $id_perfil;
180 * Se encarga de migrar los datos de los usuarios asociados al sistema.
185 function _migrarUsuarios() {
186 //No hago nada porque solamente tengo que armar las relaciones, si el
187 //usuario no existe tiene que loguearse al menos una vez en la intranet
188 //del host destino. Cuando se logue va a existir, por lo tanto va a
189 //tener el permiso dado.
190 $res = SAMURAI_Usuario::getArrayUsuarios($this->_db_source,
191 $this->_sistema->getId()) ;
196 * Se encarga de migrar las relaciones del sistema seleccionado.
198 * @param int $sistema Identificador del sistmea en el host destino.
199 * @param array $permisos Array $permiso[clave_source] = $clave_destino.
200 * @param array $perfiles Array $perfil[clave_source] = $clave_destino.
201 * @param array $usuarios Array $usuario[login] = nombre. Usuarios del
202 * sistema en el host source.
207 function _migrarRelaciones($sistema, $permisos, $perfiles, $usuarios) {
208 $sistema_source = $this->_sistema->getId();
209 //PERMISO - SISTEMA perm_sist (OBSERVACIONES)
210 $res = $this->_relacionPermisoSistema($sistema, $permisos);
211 if (PEAR::isError($res)) {
214 //PERFIL - SISTEMA perfil_sist
215 $res = $this->_relacionPerfilSistema($sistema, $perfiles);
216 if (PEAR::isError($res)) {
219 //PERMISO - PERFIL - SISTEMA perm_perfil_sist
220 $res = $this->_relacionPermisoPerfilSistema($sistema, $perfiles,
222 if (PEAR::isError($res)) {
225 //PERFIL - SISTEMA - USUARIO perfil_sist_usuario
226 $res = $this->_relacionPerfilSistemaUsuario($sistema, $perfiles,
228 if (PEAR::isError($res)) {
234 * Migra la relacion de los permisos del sistema de un host a otro.
236 * @param int $id_sistema Identificador del sistmea en el host destino.
237 * @param array $permisos Array $permiso[clave_source] = $clave_destino.
242 function _relacionPermisoSistema($id_sistema, $permisos) {
243 $sistema_source = $this->_sistema->getId();
245 SELECT id_permiso, observaciones
246 FROM samurai.perm_sist
247 WHERE id_sistema = $sistema_source
249 $res = $this->_db_source->getAssoc($sql);
250 if (PEAR::isError($res)) {
253 $sql = $this->_db_dest->prepare("
254 INSERT INTO samurai.perm_sist
255 (id_permiso, id_sistema, observaciones, responsable)
256 VALUES (?, ? , ? , ?)
258 foreach ($res as $key => $value) {
259 //Busco el nuevo id del permiso
260 if (array_key_exists($key, $permisos)) {
261 $id_permiso = $permisos[$key];
264 return new PEAR_Error ('Se estan realizando modificaciones en el
265 host source.', null, null, null, 'HTML');
267 //Agrego la info en la base
268 $res = $this->_db_dest->execute($sql, array ($id_permiso,
269 $id_sistema, $value, $this->_responsable));
270 if (PEAR::isError($res)) {
277 * Migra la relacion de los perfiles del sistema de un host a otro.
279 * @param int $id_sistema Identificador del sistmea en el host destino.
280 * @param array $perfiles Array $perfil[clave_source] = $clave_destino.
285 function _relacionPerfilSistema($id_sistema, $perfiles) {
286 $sistema_source = $this->_sistema->getId();
287 //Asocio los perfiles al sistema
290 FROM samurai.perfil_sist
291 WHERE id_sistema = $sistema_source
293 $res = $this->_db_source->getCol($sql);
294 if (PEAR::isError($res)) {
297 $sql = $this->_db_dest->prepare("
298 INSERT INTO samurai.perfil_sist
299 (id_perfil, id_sistema, responsable)
302 foreach ($res as $key) {
303 //Busco el nuevo id del perfil
304 if (array_key_exists($key, $perfiles)) {
305 $id_perfil = $perfiles[$key];
308 return new PEAR_Error ('Se estan realizando modificaciones en el
309 host source.', null, null, null, 'HTML');
311 //Agrego la info en la base
312 $res = $this->_db_dest->execute($sql, array ($id_perfil,
313 $id_sistema, $this->_responsable));
314 if (PEAR::isError($res)) {
321 * Migra la relacion de los perfiles del sistema con permisos de un host a
324 * @param int $id_sistema Identificador del sistmea en el host destino.
325 * @param array $perfiles Array $perfil[clave_source] = $clave_destino.
326 * @param array $permisos Array $permiso[clave_source] = $clave_destino.
331 function _relacionPermisoPerfilSistema($id_sistema, $perfiles, $permisos) {
332 $sistema_source = $this->_sistema->getId();
333 //Asocio los perfiles al sistema con permisos
335 SELECT id_permiso, id_perfil, id_sistema, observaciones
336 FROM samurai.perm_perfil_sist
337 WHERE id_sistema = $sistema_source
339 $res = $this->_db_source->getAll($sql);
340 if (PEAR::isError($res)) {
343 $sql = $this->_db_dest->prepare("
344 INSERT INTO samurai.perm_perfil_sist
345 (id_permiso, id_perfil, id_sistema, observaciones, responsable)
346 VALUES (?, ?, ?, ?, ?)
348 foreach ($res as $value) {
349 if (array_key_exists($value[0], $permisos)) {
350 $id_permiso = $permisos[$value[0]];
353 return new PEAR_Error ('Se estan realizando modificaciones en el
354 host source.', null, null, null, 'HTML');
356 if (array_key_exists($value[1], $perfiles)) {
357 $id_perfil = $perfiles[$value[1]];
360 return new PEAR_Error ('Se estan realizando modificaciones en el
361 host source.', null, null, null, 'HTML');
363 $res = $this->_db_dest->execute($sql, array ($id_permiso,
364 $id_perfil, $id_sistema, $value[2], $this->_responsable));
365 if (PEAR::isError($res)) {
372 * Migra la relacion de los usuarios con perfiles del sistema con permisos
375 * @param int $id_sistema Identificador del sistmea en el host destino.
376 * @param array $perfiles Array $perfil[clave_source] = $clave_destino.
377 * @param array $usuarios Array $usuario[login] = nombre.
382 function _relacionPerfilSistemaUsuarios($id_sistema, $perfiles, $usuarios) {
383 $sistema_source = $this->_sistema->getId();
384 //Asocio los usuarios al perfil en le sistema
386 SELECT login, id_perfil, id_sistema
387 FROM samurai.perfil_sist_usuario
388 WHERE id_sistema = $sistema_source
390 $res = $this->_db_source->getAll($sql);
391 if (PEAR::isError($res)) {
394 $sql = $this->_db_dest->prepare("
395 INSERT INTO samurai.perfil_sist_usuario
396 (login, id_perfil, id_sistema, responsable)
399 foreach ($res as $value) {
400 if (array_key_exists($value[1], $perfiles)) {
401 $id_perfil = $perfiles[$value[1]];
404 return new PEAR_Error ('Se estan realizando modificaciones en el
405 host source.', null, null, null, 'HTML');
407 $res = $this->_db_dest->execute($sql, array ($value[0], $id_perfil,
408 $id_sistema, $this->_responsable));
409 if (PEAR::isError($res)) {
416 * Verifica si existe en el host destino un sistema con igual nombre.
421 function _verificarExisteSistema() {
423 SELECT count(*) AS cuenta
425 WHERE nombre_sistema = ".
426 $this->_db_dest->quote($this->_sistema->getNombre());
427 $res = $this->_db_dest->getCol($sql);
428 if (PEAR::isError($res)) {
431 elseif (array_shift($res)) {
432 return new PEAR_Error ('El sistema ya existe en el host
433 seleccionado.', null, null, null, 'HTML');
438 * Realiza la conexion con el host destino
440 * @param string $db_host Identificador del servidor MySQL.
441 * @param string $db_user Identificador del usuario MySQL con permisos en la
442 * base samurai en el host ingresado.
443 * @param string $db_pass Clave del usuario MySQL.
448 function _dbDestino($db_host, $db_user, $db_pass) {
450 "mysql://$db_user:$db_pass@$db_host/samurai"
458 * @param DB &$db_source Conexion a la base de datos.
459 * @param string $db_host Identificador del servidor MySQL.
460 * @param string $db_user Identificador del usuario MySQL con permisos en la
461 * base samurai en el host ingresado.
462 * @param string $db_pass Clave del usuario MySQL.
463 * @param string $responsable Login del responsable de la migracion.
468 function SAMURAI_Migrar(&$db_source, $db_host, $db_user, $db_pass,
470 $this->_db_source =& $db_source;
471 $this->_responsable = $responsable;
472 //Armo la conexion con el host destino
473 $this->_db_dest =& $this->_dbDestino($db_host, $db_user, $db_pass);
474 if (PEAR::isError($this->_db_dest)) {
475 trigger_error('Error: ' . $this->_db_dest->getMessage() . "\n", E_USER_ERROR);
480 * Se encarga de migrar el sistema, que se selecciono, completo (permisos,
481 * sistema, perfiles, usuarios) al destino ingresado.
483 * @param int $id_sistema Identificador del sistema.
488 function migrarSistema($id_sistema) {
490 //Lockear las tablas en el host source para escritura con la sentencia
493 $this->_sistema =& new SAMURAI_Sistema($this->_db_source, $id_sistema);
495 //Verifico si existe el sistema.
496 $res = $this->_verificarExisteSistema();
497 if (PEAR::isError($res)) {
500 //Migro los permisos.
501 $permisos = $this->_migrarPermisos();
502 if (PEAR::isError($permisos)) {
506 $sistema = $this->_migrarSistema();
507 if (PEAR::isError($sistema)) {
510 //Migro los perfiles.
511 $perfiles = $this->_migrarPerfiles();
512 if (PEAR::isError($perfiles)) {
515 //Migro los usuarios.
516 $usuarios = $this->_migrarUsuarios();
517 if (PEAR::isError($usuarios)) {
520 //Migro las relaciones
521 $relaciones = $this->_migrarRelaciones($sistema, $permisos, $perfiles,
523 if (PEAR::isError($relaciones)) {
526 //Deslockear las tablas en el host source para escritura con la sentencia