Crear/actualizar el esquema auditoria desde el instalador

Hola!

Les comento la idea y luego el problema: estoy queriendo hacer que en el instalador de nuestra aplicación se dispare, al finalizar, la actualización del esquema de auditoría y realizar una migración de datos.

Actualización: ver solución Crear/actualizar el esquema auditoria desde el instalador - nº 5 por svier - Toba - Desarrollo - Foro Comunidad SIU

Algunas consideraciones:

  • existe en el proyecto la clase diaguita_modelo con la función “diaguita_crear_auditoria” (para manejar las peculiaridades de nuestro esquema de auditoría):

	function diaguita_crear_auditoria()
	{
		// si queremos que la tabla este auditada con logs, incluir su prefijo acá.
		$prefijos = array(
			'anx_',
			'mcc_',
			'mme_',
			'par_',
			'sau_',
			'scp_',
		);
		$mensaje = "(Tablas a procesar: " . implode(', ', $prefijos) . ")";
		$this->get_manejador_interface()->mensaje($mensaje, true);
		foreach ($prefijos as $prefijo) {
			$this->crear_auditoria(null, $prefijo);
		}
	}

  • se modificó momentaneamente la clase toba_lib (para acceder a ciertas funciones) y se agregó el método

	function regenerar_esquema_auditoria($proyecto)
	{
		$this->cargar_entorno_toba();
		$proyecto = $this->entorno_toba->get_instancia('produccion')->get_proyecto($proyecto);
		$proyecto->get_aplicacion_modelo()->diaguita_crear_auditoria();
	}

  • existe en el proyecto la clase diaguita_manejador_instalacion en la cual existe la función “migrar_negocio” que contiene

	function migrar_negocio($version, $es_base_nueva)
	{
        .....
			try{
				db_manager::abrir_transaccion($this->conexion);

				$toba_lib = new toba_lib();
				$proyecto = inst::configuracion()->get('proyecto', 'id');
				$toba_lib->regenerar_esquema_auditoria($proyecto);

				db_manager::cerrar_transaccion($this->conexion);
			}catch(Exception $e){
				db_manager::abortar_transaccion($this->conexion);
				throw new Exception('Error en la migración de datos.'.$e->getMessage());
			}
       }

Como se ve, intento acceder desde el instalador de toba a la instancia personalizada para el proyecto de la clase “toba_aplicacion_modelo_base”. Todo parece funcionar bien, excepto que al depurar, llego a la línea


$proyecto->get_aplicacion_modelo()->diaguita_crear_auditoria();

y me arroja el siguiente error:

Error en la migración de datos.SQLSTATE[42P01]: Undefined table: 7 ERROR: no existe la relación «apex_fuente_datos» LINE 9: FROM apex_fuente_datos ^

y con mas detalles del PostgreSQL:

2013-01-10 10:43:39 ART ERROR: no existe la relación «apex_fuente_datos» en carácter 187 2013-01-10 10:43:39 ART SENTENCIA: SELECT proyecto, fuente_datos, descripcion as descripcion_corta, descripcion, schema, permisos_por_tabla, tiene_auditoria FROM apex_fuente_datos WHERE ( proyecto = 'diaguita' ) ORDER BY 2

Depurando, se detecta que “toba_info_editores::get_fuentes_datos()” es la función que intenta ejecutar la consulta que falla. En el instalador, el schema activo de la conexión resulta ser “toba_diaguita” al momento de instanciar toba_lib, pero al momento de llegar a esta función parece que no…

¿Sugerencias?

Hola Sergio,

dejame que lo miro un poco y te cuento, justo estoy tocando el instalador y me encontre con un mensaje similar, aunque haciendo otra cosa distinta.

Saludos

Ricardo,

estuve haciendo unas pruebas y mirá al agregar intencionalmente el schema diaguita_auditoria al path:


db_manager::ejecutar($this->conexion, "set search_path=diaguita,toba_diaguita;");

resulta que logré pasar el problema, al menos momentaneamente, con ese cambio. Al continuar con el intento de llamar al método “crear_auditoria” de la clase “toba_aplicacion_modelo_base” arroja el siguente error:

Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'db_manager' does not have a method 'get_manejador_auditoria' in /home/sergio/workspace/siu/instalador_diaguita/1.12.0/lib/toba_lib.php on line 22

Y el problema es que la clase para la conexión a la base de datos usada en el instalador es “db_manager” y la que espera la auditoría es “toba_db_postgres7”. Sigue siendo un problema de como cargar el entorno de la aplicación en produccion… en el instalador.

¿Servirá si creo mi propia instancia de conexion a la base, usando “toba_db_postgres7” e inyectandola donde corresponda?

Sergio,

pudiste probar lo que te comente de las transacciones anidadas?.

Saludos

Richard,

adjunto la solución lograda hasta el momento para poder crear/actualizar el esquema de auditoría desde el instalador (sin necesidad de realizar estos cambios en forma manual).

Previamente estuve trabajando para poder acceder al entorno toba desde el mismo instalador, lo que no es posible. En vez de eso, la solución que logré desarrollar la adjunto y consiste en agregar :

[ol]- en el proyecto del instalador ]agregar una clase nueva (toba_auditoria_tablas) que implementa la gestión del esquema de auditoria.

  • agregar algunos métodos faltantes en la clase de conexión db_manager, también propia del instalador.
  • instanciar adecuadamente la nueva clase en la clase de manejador de instalación del proyecto (diaguita_manejador_instalación en mi caso).[/ol]

Para generar/actualizar el esquema de auditoria, se puede usar de la siguiente forma dentro del manejador de instalación:


$auditoria = new toba_auditoria_tablas($this->conexion);
// generar soporta prefijos de tabla...
$auditoria->generar();

Se debe colocar esa lógica en los métodos crear_negocio() como en migrar_negocio() para tener en instalaciones nuevas y existentes el esquema de auditoría.

Espero a alguno le sirva esta solución como a nosotros, al menos para evitarse actualizar el esquema de auditoría a mano!


auditoria.zip (8.71 KB)

Hola Sergio,

gracias por la contribucion :), en cuanto pueda lo miro y lo agrego al instalador asi ya queda la funcionalidad.

Saludos