!C99Shell v. 2.1 [PHP 8 Update] [02.02.2022]!

Software: Apache/2.4.53 (Unix) OpenSSL/1.1.1o PHP/7.4.29 mod_perl/2.0.12 Perl/v5.34.1. PHP/7.4.29 

uname -a: Linux vps-2738122-x 4.15.0-213-generic #224-Ubuntu SMP Mon Jun 19 13:30:12 UTC 2023 x86_64 

uid=1(daemon) gid=1(daemon) grupos=1(daemon) 

Safe-mode: OFF (not secure)

/opt/apex_tdfonline/php/modelo/   drwxr-xr-x
Free 14.92 GB of 61.93 GB (24.08%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     toba_modelo_instancia.php (56.19 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
/**
*    @todo
*        - Falta un parametrizar en el ini de la instancia si la base toba es independiente o adosada al negocio
*            ( se eliminan las tablas o la base en la regeneracion? )
*/
class toba_modelo_instancia extends toba_modelo_elemento
{
    const 
dir_prefijo 'i__';
    const 
toba_instancia 'instancia.ini';
    const 
toba_instancia_titulo 'Configuracion de la INSTANCIA';
    const 
prefijo_dir_proyecto 'p__';
    const 
dir_datos_globales 'global';
    const 
archivo_datos 'datos.sql';
    const 
archivo_usuarios 'usuarios.sql';
    const 
archivo_logs 'logs_acceso.sql';
    const 
cantidad_seq_grupo 1000000;
    const 
ddl_archivo_tablas_log 'pgsql_a04_tablas_log_instancia';
    protected 
$proyectos_ya_migrados = array('toba_testing''toba_referencia''toba_editor');    
    private 
$instalacion;                    // Referencia a la instalacion en la que esta metida la instancia
    
private $identificador;                    // Identificador de la instancia
    
private $dir;                            // Directorio raiz de la instancia
    
private $ini_base;                        // ID de la BASE donde reside la instancia
    
private $ini_proyectos_vinculados;        // IDs de proyectos vinculados (a nivel FS)
    
private $db null;                        // Referencia a la CONEXION con la DB de la instancia
    
private $sincro_archivos;                // Sincronizador de archivos.
    
private $nombre_log;                    // Nombre que llevan los archivos de LOG
    
private $datos_ini;
    
    function 
__constructtoba_modelo_instalacion $instalacion$identificador )
    {
        
$this->identificador $identificador;
        
$this->instalacion $instalacion;
        
$this->dir $this->instalacion->get_dir() . '/' self::dir_prefijo $this->identificador;
        if( ! 
is_dir$this->dir ) ) {
            throw new 
toba_error("INSTANCIA: La instancia '{$this->identificador}' es invalida. (la carpeta '{$this->dir}' no existe)");
        }
        
//Solo se sincronizan los SQLs
        
$this->cargar_info_ini();
        
$this->nombre_log self::archivo_logs;
        
toba_logger::instancia()->debug('INSTANCIA "'.$this->identificador.'"');        
    }

    function 
get_sincronizador()
    {
        if ( ! isset( 
$this->sincro_archivos ) ) {
            
$regex "#datos.sql|$this->nombre_log|usuarios.sql#"// No hay que interferir con archivos de otras celulas
            
$this->sincro_archivos = new toba_sincronizador_archivos$this->dir$regex );
        }
        return 
$this->sincro_archivos;
    }
    
    
/**
     * @return toba_modelo_instalacion
     */
    
function get_instalacion()
    {
        return 
$this->instalacion;
    }

    function 
cargar_info_ini()
    {
        
$archivo_ini $this->dir '/' self::toba_instancia;
        if ( ! 
is_file$archivo_ini ) ) {
            throw new 
toba_error("INSTANCIA: La instancia '{$this->identificador}' es invalida. (El archivo de configuracion '$archivo_ini' no existe)");
        } else {
            
//--- Levanto la CONFIGURACION de la instancia
            //  BASE
            
$this->datos_ini parse_ini_file$archivo_initrue );
            
toba_logger::instancia()->debug("Parametros instancia {$this->identificador}: ".var_export($this->datos_initrue));
            if ( ! isset( 
$this->datos_ini['base'] ) ) {
                throw new 
toba_error("INSTANCIA: La instancia '{$this->identificador}' es invalida. (El archivo de configuracion '$archivo_ini' no posee una entrada 'base')");
            }
            
$this->ini_base $this->datos_ini['base'];
            
// PROYECTOS
            
if ( ! isset( $this->datos_ini['proyectos'] ) ) {
                throw new 
toba_error("INSTANCIA: La instancia '{$this->identificador}' es invalida. (El archivo de configuracion '$archivo_ini' no posee una entrada 'proyectos')");
            }
            
$lista_proyectos = array();
            if (
trim($this->datos_ini['proyectos']) != '') {
                
$lista_proyectos explode(','$this->datos_ini['proyectos'] );
                
$lista_proyectos array_map('trim',$lista_proyectos);
                if ( 
count$lista_proyectos ) == ) {
                    throw new 
toba_error("INSTANCIA: La instancia '{$this->identificador}' es invalida. (El archivo de configuracion '$archivo_ini' no posee proyectos asociados. La entrada 'proyectos' debe estar constituida por una lista de proyectos separados por comas)");
                }
            }
            
sort($lista_proyectos);
            
$this->ini_proyectos_vinculados $lista_proyectos;
        }
    }
    
    
//-----------------------------------------------------------
    //    Manejo de subcomponentes
    //-----------------------------------------------------------

    /**
     * @return toba_modelo_proyecto
     */
    
function get_proyecto($id)
    {
        return 
toba_modelo_catalogo::instanciacion()->get_proyecto$this->get_id(), 
                                        
$id$this->manejador_interface);
                
    }

    
//-----------------------------------------------------------
    //    Relacion con la base de datos donde reside la instancia
    //-----------------------------------------------------------

    /**
    *    Creacion de la conexion con la DB donde reside la instancia
    * @return toba_db
    */
    
function get_db($forzar_recarga=false)
    {
        if (
$forzar_recarga || ! isset( $this->db ) ) {
            
$this->db $this->instalacion->conectar_base$this->ini_base );
        }
        return 
$this->db;
    }
    
    
    
/**
    *    Eliminaciond e la conexion con la instancia
    */
    
function desconectar_db()
    {
        
$this->get_db()->destruir();
        unset( 
$this->db );
    }

    
/**
     *    Recuperacion de los parametros de la DB donde reside la instancia
    */
    
function get_parametros_db()
    {
        return 
$this->instalacion->get_parametros_base$this->ini_base );
    }
    
    function 
get_schema_db()
    {
        
$parametros $this->instalacion->get_parametros_base($this->ini_base);
        if (isset(
$parametros['schema'])) {
            return 
$parametros['schema'];
        } else {
            return 
'public';
        }
    }

    
//-----------------------------------------------------------
    //    Informacion BASICA
    //-----------------------------------------------------------

    
function get_id()
    {
        return 
$this->identificador;
    }

    function 
get_dir()
    {
        return 
$this->dir;        
    }
    
    
/**
     * Retorna el path del proyecto dentro de la carpeta instalacion
     */
    
function get_dir_instalacion_proyecto($id_proyecto)
    {
        return 
$this->get_dir() . '/' self::prefijo_dir_proyecto $id_proyecto;
    }
    
    
/**
     * Retorna el id de la base que representa la instancia
     */
    
function get_ini_base()
    {
         return 
$this->ini_base;
    }
    
    function 
get_path_proyecto($proyecto)
    {
        if (isset(
$this->datos_ini[$proyecto]['path'])) {
            
$path $this->datos_ini[$proyecto]['path'];
            if (
substr($path01) == '.') { 
                return 
realpath(toba_dir().'/'.$path); 
            } else { 
                return 
$path
            }        
        } else {
            
$listado toba_modelo_proyecto::get_lista();
            foreach (
$listado as $path => $id) {
                if (
$proyecto == $id) {
                    return 
toba_dir() . "/proyectos/" $path;
                }
            }
            return 
toba_dir() . "/proyectos/" $proyecto;
        }
    }
    
    function 
get_url_proyecto($proyecto)
    {
        if (isset(
$this->datos_ini[$proyecto]['url'])) {
            return 
$this->datos_ini[$proyecto]['url'];
        }        
    }
    
    function 
set_url_proyecto($id_proyecto$url)
    {
        
$ini $this->get_ini();
        if (
$ini->existe_entrada($id_proyecto)) {
            
$conf_proy $ini->get_datos_entrada($id_proyecto);
        } else {
            
$conf_proy = array();
        }
        
$conf_proy['url'] = $url;
        
$ini->agregar_entrada($id_proyecto$conf_proy);
        
$ini->guardar();
        
toba_logger::instancia()->debug("Cambiando la url del proyecto '$id_proyecto' a '$url'");
        
// Recargo la inicializacion de la instancia
        
$this->cargar_info_ini();
    }

    function 
get_url_proyecto_pers($proyecto)
    {
        if (isset(
$this->datos_ini[$proyecto]['url_pers'])) {
            return 
$this->datos_ini[$proyecto]['url_pers'];
        }
    }

    function 
set_url_proyecto_pers($id_proyecto$url)
    {
        
$ini $this->get_ini();
        if (
$ini->existe_entrada($id_proyecto)) {
            
$conf_proy $ini->get_datos_entrada($id_proyecto);
        } else {
            
$conf_proy = array();
        }
        
$conf_proy['url_pers'] = $url;
        
$ini->agregar_entrada($id_proyecto$conf_proy);
        
$ini->guardar();
        
toba_logger::instancia()->debug("Cambiando la url de personalización del proyecto '$id_proyecto' a '$url'");
        
// Recargo la inicializacion de la instancia
        
$this->cargar_info_ini();
    }

    function 
get_lista_proyectos_vinculados()
    {
        return 
$this->ini_proyectos_vinculados;
    }
    
    function 
existe_proyecto_vinculado$proyecto )
    {
        return 
in_array$proyecto$this->ini_proyectos_vinculados );
    }
    
    function 
existe_modelo()
    {
        return 
$this->instalacion->existe_base_datos($this->ini_base)
                && 
$this->get_db()->existe_tabla($this->get_schema_db(), 'apex_usuario');
    }
    
    function 
existen_metadatos_proyecto$proyecto )
    {
        
$proyecto $this->get_db()->quote($proyecto);
        
$sql "SELECT 1 FROM apex_proyecto WHERE proyecto = $proyecto;";
        
$datos $this->get_db()->consultar$sql );
        if ( 
count$datos ) > ) {
            return 
true;
        } else {
            return 
false;
        }
    }
    
    function 
get_fecha_exportacion_local()
    {
        
$archivo $this->dir.'/global/usuarios.sql';
        if (! 
file_exists($archivo)) {
            return 
null;
        } else {
            return 
filemtime($archivo);
        }
    }    
        
    
//-----------------------------------------------------------
    //    Manipulacion de la DEFINICION
    //-----------------------------------------------------------

    
function vincular_proyecto($proyecto$path=null$url=null)
    {
        if (isset(
$path) || toba_modelo_proyecto::existe($proyectofalse)) {
            
$datos_ini = array();
            
$ini $this->get_ini();
            
$datos explode(',',$ini->get_datos_entrada'proyectos'));
            
$proyectos_instancia array_map('trim',$datos);

            
$existe_proyecto  = (in_array($proyecto$proyectos_instancia));
            if (! 
$existe_proyecto) {                                //Si el proyecto no existe en la instancia lo agrego
                
$proyectos_instancia[] = $proyecto;
                
$ini->set_datos_entrada('proyectos'implode(', '$proyectos_instancia));                            
            } elseif (
$ini->existe_entrada($proyecto)) {                //Si ya estaba, levanto sus datos anteriores
                
$datos_ini $ini->get_datos_entrada($proyecto);
            }
            
            
//Actualizo los datos del proyecto si se cambiaron 
            
if (isset($path)) {
                 
$datos_ini['path'] = $path;
            } elseif (
is_null($path)) {
                
$datos_ini['path'] = $this->get_path_proyecto($proyecto);
                
toba_logger::instancia()->debug("El path elegido para el proyecto '$proyecto' es {$datos_ini['path']}");
            }
            if (isset(
$url)) {
                
$datos_ini['url'] = $url;
            } elseif (
is_null($url)) {
                
$datos_ini['url'] = $this->get_url_proyecto($proyecto);
                
toba_logger::instancia()->debug("La url elegida para el proyecto '$proyecto' es {$datos_ini['url']}");
            }            
            
$usar_perfiles_propios $this->get_proyecto_usar_perfiles_propios($proyecto);
            if (
$usar_perfiles_propios) {
                
$datos_ini['usar_perfiles_propios'] = $usar_perfiles_propios;
                
toba_logger::instancia()->debug("El proyecto '$proyecto' usa perfiles propios");
            }
                        
            if (! 
$ini->existe_entrada($proyecto)) {            //Si no hay entrada previa para los datos del proyecto
                
$ini->agregar_entrada($proyecto$datos_ini); 
            } else {
                
$ini->set_datos_entrada($proyecto$datos_ini); 
            }
            
            
$ini->guardar();            
            
toba_logger::instancia()->debug("Vinculado el proyecto '$proyecto' a la instancia");
            
// Recargo la inicializacion de la instancia
            
$this->cargar_info_ini();
            
            
//Genera .ini templates de rest
            
$this->generar_ini_rest($proyecto);
            
        } else {
            throw new 
toba_error("El proyecto '$proyecto' no existe.");
        }
    }

    
/**
     * Brinda una nueva lista de proyectos vinculados a la instancia
     * @param array $id_proyectos
     */
    
function set_proyectos_vinculados($id_proyectos)
    {
        
$ini $this->get_ini();
        
$ini->set_datos_entrada('proyectos'implode(', '$id_proyectos));        
        
$ini->guardar();        
        
// Recargo la inicializacion de la instancia
        
$this->cargar_info_ini();
    }
    
    function 
set_proyecto_usar_perfiles_propios($proyecto$usar_perfiles_propios)
    {
        
$ini $this->get_ini();
        if (
$ini->existe_entrada($proyecto)) {
            
$datos $ini->get_datos_entrada($proyecto);
        } else {
            
$datos = array();
        }
        
$datos['usar_perfiles_propios'] = $usar_perfiles_propios;
        
$ini->agregar_entrada($proyecto$datos);
        
$ini->guardar();            
        
toba_logger::instancia()->debug("Cambiando la forma de manejar los perfiles del proyecto '$proyecto'");
        
// Recargo la inicializacion de la instancia
        
$this->cargar_info_ini();        
    }

    function 
get_proyecto_usar_perfiles_propios($proyecto)
    {
        if (isset(
$this->datos_ini[$proyecto]['usar_perfiles_propios'])) {
            return 
$this->datos_ini[$proyecto]['usar_perfiles_propios'];
        } else {
            return 
false;
        }
    }    
    
    function 
desvincular_proyecto$proyecto )
    {
        
$ini $this->get_ini();
        
$datos =  explode(',',$ini->get_datos_entrada'proyectos'));
        
$datos array_map('trim',$datos);
        if ( 
in_array$proyecto$datos ) ) {
            
$datos array_diff$datos, array( $proyecto ) );
            
$ini->set_datos_entrada'proyectos'implode(', '$datos) );
            
// Elimino la carpeta de METADATOS de la instancia especificos del PROYECTO
            
$dir_proyecto $this->get_dir_instalacion_proyecto($proyecto);
            if ( 
is_dir$dir_proyecto ) ) {
                
toba_manejador_archivos::eliminar_directorio$dir_proyecto );            
            }
            
toba_logger::instancia()->debug("Desvinculado el proyecto '$proyecto' de la instancia");
        }
        if (
$ini->existe_entrada($proyecto)) {
            
$ini->eliminar_entrada($proyecto);;
        }
        
$ini->guardar();        
        
// Recargo la inicializacion de la instancia
        
$this->cargar_info_ini();
    }

    
/**
     * Elimina toda relacion del proyecto con la instancia (lo desvicula, quita la config, metadatos, alias)
     * @param string $proy_id
     * @param boolean $desinstalar Ejecuta el proyecto de desintalacion propio del proyecto (ej. eliminar base de negocios)
     */
    
function eliminar_proyecto$proy_id$desinstalar=false)
    {
        
$proyecto $this->get_proyecto($proy_id);
        
$proyecto->despublicar();
        if (
$desinstalar) {
            
//--- Opcionalmente borra los datos propios
            
$proyecto->desinstalar();
        }
        
$proyecto->eliminar_autonomo();
        
$this->desvincular_proyecto($proy_id);                
    }
    
    
/**
     * @return toba_ini
     */
    
function get_ini()
    {
        
$ini = new toba_ini$this->dir '/' self::toba_instancia );
        
$ini->agregar_tituloself::toba_instancia_titulo );
        return 
$ini;
    }

    
//-----------------------------------------------------------
    //    EXPORTAR datos de la DB
    //-----------------------------------------------------------

    /**
    * Exportacion de TODO lo que hay en una instancia
    */
    
function exportar($excluir=array())
    {
        foreach( 
$this->get_lista_proyectos_vinculados() as $id_proyecto ) {
            if (
$id_proyecto != 'toba') {
                if (! 
in_array($id_proyecto$excluir)) {
                    
$proyecto $this->get_proyecto($id_proyecto);
                    
$proyecto->exportar();
                }
            }
        }    
        
$this->exportar_local();
    }    

    
/**
    * Exportacion de la informacion correspondiente a la instancia (no proyectos)
    */
    
function exportar_local()
    {
        
$this->manejador_interface->titulo"Exportación local de la instancia '{$this->get_id()}'" );
        
$this->exportar_global();
        
$this->exportar_proyectos();
        
$this->sincronizar_archivos();
    }
    
    private function 
sincronizar_archivos()
    {
        
//$this->manejador_interface->titulo( "SINCRONIZAR ARCHIVOS" );
        
$obs $this->get_sincronizador()->sincronizar();
        
toba_logger::instancia()->debug("Observaciones de sincronizacion: ".implode(', '$obs));
        
$this->manejador_interface->lista$obs'Observaciones' );
    }    
    
    
/*
    *    Exportar informacion GLOBAL de la instancia
    */
    
private function exportar_global()
    {
        
$this->manejador_interface->mensaje("Exportando datos globales"false);        
        
$dir_global $this->get_dir() . '/' self::dir_datos_globales;
        
toba_manejador_archivos::crear_arbol_directorios$dir_global );
        
$this->exportar_tablas_global'get_lista_global'$dir_global .'/' self::archivo_datos'GLOBAL' );    
        
$this->exportar_tablas_global'get_lista_global_usuario'$dir_global .'/' self::archivo_usuarios'USUARIOS' );
        
$this->manejador_interface->progreso_fin();
    }

    private function 
exportar_tablas_global$metodo_lista_tablas$path$texto )
    {
        
$contenido "";
        foreach ( 
toba_db_tablas_instancia::$metodo_lista_tablas() as $tabla ) {
            
$definicion toba_db_tablas_instancia::$tabla();
            
//Genero el SQL
            
$sql 'SELECT ' implode(', '$definicion['columnas']) .
                    
" FROM $tabla " .
                    
" ORDER BY {$definicion['dump_order_by']} ;\n";
            
//$this->manejador_interface->mensaje( $sql );
            
$datos $this->get_db()->consultar($sql);
            
toba_logger::instancia()->debug("Tabla $texto  --  $tabla (".count($datos).' reg.)');
            if ( 
count$datos ) > ) { //SI los registros de la tabla son mas de 1, ordeno.
                
$columnas_orden array_map('trim'explode(',',$definicion['dump_order_by']) );
                
$datos rs_ordenar_por_columnas$datos$columnas_orden );
            }            
            for ( 
$a 0$a count$datos ) ; $a++ ) {
                if (
$tabla != 'apex_checksum_proyectos') {
                    
$contenido .= sql_array_a_insert$tabla$datos[$a] , $this->get_db()). "\n";
                } else {
                    
$contenido .= sql_array_a_insert_condicional($tabla$datos[$a], $this->get_db()). "\n";
                }
            }
            
$this->manejador_interface->progreso_avanzar();
        }
        if ( 
trim$contenido ) != '' ) {
            
$this->guardar_archivo$path  $contenido );            
        }
    }

    
/*
    *    Exportar informacion de PROYECTOS de la instancia
    */
    
function exportar_proyectos()
    {
        foreach( 
$this->get_lista_proyectos_vinculados() as $proyecto ) {
            
$this->exportar_local_proyecto($proyecto);
        }
    }
    
    function 
exportar_local_proyecto($proyecto)
    {
        
$this->manejador_interface->mensaje("Exportando informacion local $proyecto"false);
        
toba_logger::instancia()->debug("Exportando local PROYECTO $proyecto");                        
        
$dir_proyecto $this->get_dir_instalacion_proyecto($proyecto);
        
toba_manejador_archivos::crear_arbol_directorios$dir_proyecto );
        
$this->exportar_tablas_proyecto'get_lista_proyecto'$dir_proyecto .'/' self::archivo_datos$proyecto'GLOBAL' );    
        
$this->exportar_tablas_proyecto'get_lista_proyecto_usuario'$dir_proyecto .'/' self::archivo_usuarios$proyecto'USUARIO' );    
        
        
///-- Si estamos en produccion y se editaron los perfiles del proyecto, exportarlos localmente
        
if ($this->instalacion->es_produccion() && $this->get_proyecto_usar_perfiles_propios($proyecto)) {
            
$this->get_proyecto($proyecto)->exportar_perfiles_produccion();
        }    
        
$this->manejador_interface->progreso_fin();        
    }


    private function 
exportar_tablas_proyecto$metodo_lista_tablas$nombre_archivo$proyecto$texto )
    {
        
$append false;
        foreach ( 
toba_db_tablas_instancia::$metodo_lista_tablas() as $tabla ) {
            
$definicion toba_db_tablas_instancia::$tabla();
            
//Genero el SQL
            
if( isset($definicion['dump_where']) && ( trim($definicion['dump_where']) != '') ) {
                
$w stripslashes($definicion['dump_where']);
                
$where str_replace("%%"$proyecto$w);
            }else{
                
$where " ( proyecto = '$proyecto')";
            }
            
$from "$tabla dd";
            if( isset(
$definicion['dump_from']) && ( trim($definicion['dump_from']) != '') ) {
                
$from .= ", ".stripslashes($definicion['dump_from']);
                 }
            
$columnas = array();
            foreach (
$definicion['columnas'] as $columna ) {
                
$columnas[] = "dd.$columna";
            }
            
$sql 'SELECT ' implode(', ',$columnas) .
                    
" FROM $from " .
                    
" WHERE $where " .
                    
" ORDER BY {$definicion['dump_order_by']} ;\n";
            
$sentencia $this->get_db()->get_pdo()->query($sql);
            
            while (
$fila $sentencia->fetch(PDO::FETCH_ASSOC)) {
                
$contenido sql_array_a_insert($tabla$fila$this->get_db())."\n";
                
$this->guardar_archivo($nombre_archivo$contenido$append);
                
$append true;
            }
            
$this->manejador_interface->progreso_avanzar();                              
        }
    }    

    private function 
guardar_archivo($archivo$contenido$append false)
    {
        
$flags null;
        if (
$append) {
            
$flags FILE_APPEND;
        }
        
file_put_contents($archivo$contenido$flags);
        
$this->get_sincronizador()->agregar_archivo$archivo );
    }
    

    function 
eliminar_archivos_log()
    {
        
//Elimino los logs de la instancia        
        
$log_instancia $this->get_dir() . '/' self::dir_datos_globales .'/'$this->nombre_log;
        if (
file_exists($log_instancia)) {
            
unlink($log_instancia);
        }
        
        
//Elimino los logs para cada proyecto
        
foreach($this->get_lista_proyectos_vinculados() as $proyecto) {
            
$dir_proyecto $this->get_dir_instalacion_proyecto($proyecto).'/logs';
            if (
file_exists$dir_proyecto )) {
                
toba_manejador_archivos::eliminar_directorio($dir_proyecto);
            }
            
$this->manejador_interface->progreso_avanzar();
        }
    }
    
    function 
generar_ini_rest($proyecto)
    {
        
$path_rest $this->get_dir_instalacion_proyecto($proyecto).'/rest';
        try {
            
toba_manejador_archivos::crear_arbol_directorios($path_rest);
        } catch (
Exception $e) {
            
$this->manejador_interface->mensaje("No se pudo crear la carpeta {$path_rest}");
            return;
        }
        
        
//--1- Servidor
        
if (! file_exists($path_rest.'/servidor.ini')) {
            
copy(toba_dir(). '/php/modelo/var/rest_servidor.ini'$path_rest.'/servidor.ini');
        }
        if (! 
file_exists($path_rest.'/servidor_usuarios.ini')) {        
            
copy(toba_dir(). '/php/modelo/var/rest_servidor_usuarios.ini'$path_rest.'/servidor_usuarios.ini');
        }

        
//--2- Clientes
        
$sql "
            SELECT servicio_web FROM apex_servicio_web WHERE tipo = 'rest' AND proyecto = "
.$this->get_db()->quote($proyecto);
        
$rs $this->get_db()->consultar($sql);
    
        foreach (
$rs as $fila) {
            
$path_rest_cliente $path_rest."/{$fila['servicio_web']}";
            try {
                
toba_manejador_archivos::crear_arbol_directorios($path_rest_cliente);
                if (! 
file_exists($path_rest_cliente.'/cliente.ini')) {
                    
copy(toba_dir(). '/php/modelo/var/rest_cliente.ini'$path_rest_cliente.'/cliente.ini');
                }
            } catch (
Exception $e) {
                
$this->manejador_interface->mensaje("No se pudo crear la carpeta {$path_rest_cliente}");
            }            
        }
    }
    
    
//-----------------------------------------------------------
    //    CARGAR modelo en la DB
    //-----------------------------------------------------------

    /**
    * Importacion completa de una instancia
    */
    
function cargar$forzar_carga false )
    {
        
$this->manejador_interface->titulo('Creación de la instancia');
        
// Existe la base?
        
if ( ! $this->instalacion->existe_base_datos$this->ini_base ) ) {
            
$this->manejador_interface->mensaje("Creando base '{$this->ini_base}'..."false);
            
$this->instalacion->crear_base_datos$this->ini_base );
            
$this->manejador_interface->progreso_fin();
        }
        
        
//Inicio el proceso de carga
        
try    {
            
$this->get_db()->abrir_transaccion();
            
$this->get_db()->crear_lenguaje_procedural();
                
            
// Esta el modelo cargado
            
if ($this->existe_modelo()) {
                if (
$forzar_carga) {
                    
//Si existe un backup previo lo borra
                    
$schema_backup $this->get_schema_db().'_backup';
                    if (
$this->get_db()->existe_schema($schema_backup)) {
                        
$this->get_db()->borrar_schema($schema_backup);
                    }
                    
$this->get_db()->renombrar_schema($this->get_schema_db(), $schema_backup);                                
                } else {
                    throw new 
toba_error_modelo_preexiste("INSTANCIA: Ya existe un modelo cargado en la base de datos.");
                }
            }
            
$this->crear_schema();            
            
$this->get_db()->retrazar_constraints();
            
$this->cargar_autonomo();
            
$this->get_db()->cerrar_transaccion();
        } catch ( 
toba_error_db $e ) {
            
$this->get_db()->abortar_transaccion();
            throw 
$e;
        }
    }
    
    function 
cargar_autonomo()
    {
        
$errores = array();
        
$this->crear_modelo_datos_toba();
        
$errores $this->cargar_proyectos();
        
$this->manejador_interface->enter();
        
$this->cargar_informacion_instancia();
        
$this->generar_info_carga();
        
$this->actualizar_secuencias();
        
$this->set_version(toba_modelo_instalacion::get_version_actual());
        
$this->crear_modelo_logs_toba();
        return 
$errores;
    }
    
    
    function 
cargar_tablas_minimas($forzar_carga false)
    {
        
$this->manejador_interface->titulo('Creación de una instancia MINIMA');        
        
// Existe la base?
        
if ( ! $this->instalacion->existe_base_datos$this->ini_base ) ) {
            
$this->manejador_interface->mensaje("Creando base '{$this->ini_base}'..."false);
            
$this->instalacion->crear_base_datos$this->ini_base );
            
$this->manejador_interface->progreso_fin();
        }
        
// Esta el modelo cargado
        
if ( $this->existe_modelo() ) {
            if ( 
$forzar_carga ) {
                
$this->eliminar_tablas_minimas();
            } else {
                throw new 
toba_error_modelo_preexiste("INSTANCIA: Ya existe un modelo cargado en la base de datos.");
            }
        }
        try {
            
$this->get_db()->abrir_transaccion();
            
$this->get_db()->retrazar_constraints();
            
// Creo las tablas basicas
            
$this->crear_tablas_minimas();
            
// Cargo informacion del proyecto
            
$this->cargar_proyectos(true);
            
// Cargo la informacion de la instancia
            
$this->cargar_informacion_instancia();
            
$this->crear_modelo_logs_toba();
            
$this->get_db()->cerrar_transaccion();
        } catch ( 
toba_error_db $e ) {
            
$this->get_db()->abortar_transaccion();
            throw 
$e;
        }        
    }

    
/**
    * Inicializacion de instancias
    */
    
function crear_modelo_datos_toba()
    {    
        
$this->crear_tablas();
        
$this->cargar_datos_nucleo();
        
toba_logger::instancia()->debug("Modelo creado");        
    }
    
    
/**
     * Crea el esquema de logs basico de Toba 
     */
    
function crear_modelo_logs_toba()
    {
        
$schema_logs $this->get_schema_db() . '_logs';        
        if (! 
$this->get_db()->existe_schema($schema_logs)) {
            
$actual $this->get_db()->get_schema();        
            if (! isset(
$actual)) {
                
$actual 'public';
            }                    
            
$this->crear_tablas_log();
            
$this->cargar_informacion_instancia_logs();
            
$this->actualizar_secuencias_tablas_log();
            
$this->get_db()->set_schema($actual);
        }
    }
    
    private function 
crear_tablas()
    {
        
$this->manejador_interface->mensaje('Creando las tablas del framework'false);
        
$directorio toba_modelo_nucleo::get_dir_ddl();
        
$archivos toba_manejador_archivos::get_archivos_directorio$directorio'|.*\.sql|' );
        
sort($archivos);
        foreach( 
$archivos as $archivo ) {
            if (
self::ddl_archivo_tablas_log != basename($archivo'.sql')) {        //Excluyo el archivo de logs para que se genere aparte                    
                
$cant $this->get_db()->ejecutar_archivo$archivo );
                
toba_logger::instancia()->debug($archivo ". ($cant)");            
                
$this->manejador_interface->progreso_avanzar();
            }
        }
        
$this->manejador_interface->progreso_fin();
    }
    
    private function 
crear_tablas_log()
    {
        
$this->manejador_interface->mensaje('Creando las tablas de log'false);
        
$schema_logs $this->get_schema_db() . '_logs';
        
        
        
$sql "CREATE SCHEMA $schema_logs;";        //Creo el schema ya que no existe
        
$this->get_db()->ejecutar($sql);
        
$this->get_db()->set_schema($schema_logs);
        
        
$directorio toba_modelo_nucleo::get_dir_ddl();
        
$nombre $directorio '/' self::ddl_archivo_tablas_log'.sql';
        if (
file_exists($nombre)) {
            
//Aca tengo que hacer un cambio veneno
            
$template =  file_get_contents($nombre);
            
$editor = new toba_editor_texto();
            
$editor->agregar_sustitucion'|__toba_logs__|'$schema_logs);
            
$sql $editor->procesar($template);
            
$cant $this->get_db()->ejecutar($sql);
            
toba_logger::instancia()->debug($nombre ". ($cant)");            
            
$this->manejador_interface->progreso_avanzar();
        }
    }
    
    function 
get_sql_crear_tablas()
    {
        
$directorio toba_modelo_nucleo::get_dir_ddl();
        
$archivos toba_manejador_archivos::get_archivos_directorio$directorio'|.*\.sql|' );
        
sort($archivos);
        
$salida "--------------------------------\n";
        
$salida .= "-- CREACION DE TABLAS\n";
        
$salida .= "--------------------------------\n\n";
        foreach( 
$archivos as $archivo ) {
            
$salida .= file_get_contents($archivo)."\n\n";
        }        
        return 
$salida;
    }
    
    private function 
crear_tablas_minimas()
    {
        
$this->manejador_interface->mensaje('Creando las tablas del framework (version reducida)'false);
        
$directorio toba_modelo_nucleo::get_dir_ddl();
        
$archivo $directorio "/pgsql_a00_tablas_instancia.sql";
        
$cant $this->get_db()->ejecutar_archivo$archivo );
        
toba_logger::instancia()->debug($archivo ". ($cant)");            
        
$this->manejador_interface->progreso_avanzar();
        
$archivo $directorio "/pgsql_a02_tablas_usuario.sql";
        
$cant $this->get_db()->ejecutar_archivo$archivo );
        
toba_logger::instancia()->debug($archivo ". ($cant)");            
        
$this->manejador_interface->progreso_avanzar();
        
$this->manejador_interface->progreso_fin();        
    }

    function 
eliminar_tablas_minimas()
    {
        
$sql[] = 'DROP TABLE apex_permiso_grupo_acc';
        
$sql[] = 'DROP TABLE apex_usuario_grupo_acc_item';
        
$sql[] = 'DROP TABLE apex_usuario_grupo_acc_miembros';
        
$sql[] = 'DROP TABLE apex_usuario_proyecto';
        
$sql[] = 'DROP TABLE apex_usuario_grupo_acc';
        
$sql[] = 'DROP TABLE apex_usuario_perfil_datos';
        
$sql[] = 'DROP TABLE apex_usuario';
        
$sql[] = 'DROP TABLE apex_usuario_tipodoc';
        
$sql[] = 'DROP TABLE apex_revision';
        
$sql[] = 'DROP TABLE apex_instancia';
        
$sql[] = 'DROP TABLE apex_proyecto';
        
$this->get_db()->ejecutar($sql);
    }
        
    private function 
cargar_datos_nucleo()
    {
        
$this->manejador_interface->mensaje('Cargando datos del nucleo'false);
        
$directorio toba_modelo_nucleo::get_dir_metadatos();
        
$archivos toba_manejador_archivos::get_archivos_directorio$directorio'|.*\.sql|' );
        foreach( 
$archivos as $archivo ) {
                
$cant $this->get_db()->ejecutar_archivo$archivo );
                
toba_logger::instancia()->debug($archivo ". ($cant)");
                
$this->manejador_interface->progreso_avanzar();    
        }
        
$this->manejador_interface->progreso_fin();        
    }
    
    function 
get_sql_carga_datos_nucleo()
    {
        
$directorio toba_modelo_nucleo::get_dir_metadatos();
        
$archivos toba_manejador_archivos::get_archivos_directorio$directorio'|.*\.sql|' );
        
$salida "--------------------------------------------------\n";
        
$salida .= "-- CARGA DATOS DEL NUCLEO\n";
        
$salida .= "--------------------------------------------------\n\n";
        foreach( 
$archivos as $archivo ) {
            
$salida .= file_get_contents($archivo)."\n\n";
        }        
        return 
$salida;        
    }

    
/*
    *    Importa los proyectos asociados
    */
    
private function cargar_proyectos($informacion_reducida=false)
    {
        
$errores = array();
        foreach( 
$this->get_lista_proyectos_vinculados() as $id_proyecto ) {
            if (
$id_proyecto != 'toba') {
                
$this->manejador_interface->enter();
                
$this->manejador_interface->subtitulo("$id_proyecto:");
                
$proyecto $this->get_proyecto($id_proyecto);
                if(!
$informacion_reducida) {
                    
$error $proyecto->cargar();
                    
$errores array_merge($errores$error);                                        
                }else{
                    
$proyecto->cargar_informacion_reducida();                                        
                }
                if (isset(
$this->datos_ini[$id_proyecto])) {
                    
$path = (isset($this->datos_ini[$id_proyecto]['path'])) ? $this->datos_ini[$id_proyecto]['path'] : null;
                }
                
$this->vincular_proyecto($id_proyecto$path);
            }
        }    
        return 
$errores;
    }
    
    function 
get_sql_carga_proyectos($proyectos)
    {
        
$salida "--------------------------------------------------\n";
        
$salida .= "-- CARGA DATOS DE PROYECTOS \n";
        
$salida .= "--------------------------------------------------\n\n";
        foreach( 
$this->get_lista_proyectos_vinculados() as $id_proyecto ) {
            if (
$id_proyecto != 'toba' && in_array($id_proyecto$proyectos)) {
                
$proyecto $this->get_proyecto($id_proyecto);
                
$salida .= $proyecto->get_sql_cargar_tablas();
                
$salida .= $proyecto->get_sql_cargar_componentes();
            }
        }            
        return 
$salida;
    }
    
    
    
/*
    *     Importa la informacion perteneciente a la instancia
    */
    
private function cargar_informacion_instancia()
    {
        
$this->manejador_interface->mensaje('Cargando datos de la instancia'false);
        
$subdirs toba_manejador_archivos::get_subdirectorios$this->get_dir() );
        
$proyectos $this->get_lista_proyectos_vinculados();
        
$nombres_carp = array('global');
        foreach (
$proyectos as $proy) {
            
$nombres_carp[] = self::prefijo_dir_proyecto.$proy;
        }
        foreach ( 
$nombres_carp as $carp ) {
            
$dir $this->get_dir()."/".$carp;
            if (
file_exists($dir)) {
                
$archivos toba_manejador_archivos::get_archivos_directorio$dir '|.*\.sql|' );
                foreach( 
$archivos as $archivo ) {
                    if (
stripos($archivo'logs_') === FALSE) {
                        
$cant $this->get_db()->ejecutar_archivo$archivo );
                        
toba_logger::instancia()->debug($archivo ". ($cant)");
                        
$this->manejador_interface->progreso_avanzar();
                    }
                }
            }
        }
        
$this->manejador_interface->progreso_avanzar();        
        
$this->manejador_interface->progreso_fin();        
    }

    function 
cargar_informacion_instancia_proyecto$proyecto )
    {
        
$this->manejador_interface->mensaje("Cargando datos locales de la instancia"false);
        
toba_logger::instancia()->debug("Cargando datos de la instancia del proyecto '{$proyecto}'");
        
$directorio $this->get_dir_instalacion_proyecto($proyecto);
        if (
file_exists($directorio)) {
            
$archivos toba_manejador_archivos::get_archivos_directorio$directorio '|.*\.sql|' );
            foreach ( 
$archivos as $archivo ) {
                
$cant $this->get_db()->ejecutar_archivo$archivo );
                
toba_logger::instancia()->debug($archivo ". ($cant)");
                
$this->manejador_interface->progreso_avanzar();
            }
            
$this->manejador_interface->progreso_fin();
        }
    }
    
    function 
cargar_informacion_instancia_logs()
    {
        
$this->manejador_interface->mensaje('Cargando logs de la instancia'false);
        
$subdirs toba_manejador_archivos::get_subdirectorios($this->get_dir());
        
$proyectos $this->get_lista_proyectos_vinculados();
        
$nombres_carp = array('global');
        foreach (
$proyectos as $proy) {
            
$nombres_carp[] = self::prefijo_dir_proyecto.$proy;
        }
        foreach ( 
$nombres_carp as $carp ) {
            
$dir $this->get_dir()."/".$carp;
            if (
file_exists($dir)) {
                
$archivos toba_manejador_archivos::get_archivos_directorio$dir '|(logs_).*\.sql$|' );
                foreach( 
$archivos as $archivo ) {
                    
$cant $this->get_db()->ejecutar_archivo$archivo );
                    
toba_logger::instancia()->debug($archivo ". ($cant)");
                    
$this->manejador_interface->progreso_avanzar();
                }
            }
        }
        
$this->manejador_interface->progreso_avanzar();        
        
$this->manejador_interface->progreso_fin();                
    }
    
    
/**
     * Importa la información perteneciente a la instancia desde otra instalacion/instancia
     *
     */
    
function importar_informacion_instancia($instancia_origen$path_origen$reemplazar_actuales)
    {
        if (! isset(
$path_origen)) {
            
$path_origen toba_dir();
        }        
        
$nombres_carp = array();
        try {
            
$path $path_origen.'/instalacion/'.self::dir_prefijo.$instancia_origen;
            if (! 
file_exists($path)) {
                throw new 
toba_error("No existe la carpeta $path");
            }
            
$subdirs toba_manejador_archivos::get_subdirectorios($path);
            
$proyectos $this->get_lista_proyectos_vinculados();
            foreach (
$proyectos as $proy) {
                
$nombres_carp[] = self::prefijo_dir_proyecto.$proy;
            }            
            
$this->get_db()->abrir_transaccion();
            
$this->get_db()->retrazar_constraints();
            if (
$reemplazar_actuales) {
                
$this->eliminar_informacion_instancia();
            }
            
            
//De la carpeta global unicamente obtengo los usuarios, no el resto de los archivos que pueden traer inconvenientes con las tablas apex_revision y apex_instancia.
            
$archivo $path.'/global/usuarios.sql';
            if (
file_exists($archivo)) {
                
$cant $this->get_db()->ejecutar_archivo$archivo );
                
toba_logger::instancia()->debug($archivo ". ($cant)");
                
$this->manejador_interface->progreso_avanzar();
            }
            
            
//Sigo con los directorios de los proyectos
            
foreach ( $nombres_carp as $carp ) {
                
$dir $path."/".$carp;
                if (
file_exists($dir)) {
                    
$archivos toba_manejador_archivos::get_archivos_directorio$dir '|.*\.sql|' );
                    foreach( 
$archivos as $archivo ) {
                        if (
stripos($archivo'logs_') === FALSE) {                            //Evito los archivos de logs, van en un schema aparte.
                            
$cant $this->get_db()->ejecutar_archivo$archivo );
                            
toba_logger::instancia()->debug($archivo ". ($cant)");
                            
$this->manejador_interface->progreso_avanzar();
                        }
                    }
                }
            }
            
$this->manejador_interface->progreso_avanzar();
            
$this->get_db()->cerrar_transaccion();
            
$this->manejador_interface->progreso_fin();        
        } catch (
toba_error_db $error) {
            
$this->get_db()->abortar_transaccion();
            throw 
$error;
        }
    }

    
/**
     * Elimina todos los datos locales de la instancia actual
     */
    
private function eliminar_informacion_instancia()
    {
        
$sql = array();
        
$metodos get_class_methods('toba_db_tablas_instancia');
        foreach (
$metodos as $metodo) {
            if ((
substr($metodo010) === 'get_lista_') && substr($metodo, -4) !== '_log') {
                foreach ( 
toba_db_tablas_instancia::$metodo() as $tabla ) {
                    
$sql[] = 'DELETE FROM '.$tabla;
                }
            }
        }
        if (! empty(
$sql)) {
            
$this->get_db()->ejecutar($sql);
        }
    }
    
    
/*
    *    Genera informacion descriptiva sobre la instancia creada
    */
    
private function generar_info_carga()
    {
        
$revision revision_svntoba_dir() );
        
$sql "INSERT INTO apex_revision ( revision , proyecto) VALUES ('$revision', 'toba')";
        
$this->get_db()->ejecutar$sql );
        
toba_logger::instancia()->debug("Actualizada la revision svn de la instancia a $revision");
        if (
$this->get_instalacion()->chequea_sincro_svn()) {
            foreach( 
$this->get_lista_proyectos_vinculados() as $id_proyecto ) {
                
$proyecto $this->get_proyecto($id_proyecto);
                
$proyecto->generar_estado_codigo();
            }
        }
    }
    
    
/*
    *    Reestablece las secuencias del sistema
    */
    
function actualizar_secuencias()
    {
        
toba_logger::instancia()->debug('Actualizando SECUENCIAS');
        
$this->manejador_interface->mensaje("Actualizando secuencias"false);
        
$sec $this->get_lista_secuencias_basicas();
        foreach(
$sec as $seq => $datos) {
            
$this->ejecutar_sql_actualizacion_secuencias(null$datos$seq);            
        }
        
        
//Ahora actualiza las secuencias alcanzadas por el id de desarrollador
        
$id_grupo_de_desarrollo $this->instalacion->get_id_grupo_desarrollo();
        foreach ( 
toba_db_secuencias::get_lista() as $seq => $datos ) {
                
$this->ejecutar_sql_actualizacion_secuencias($id_grupo_de_desarrollo$datos$seq);
        }
        
$this->manejador_interface->progreso_fin();
    }
    
    function 
actualizar_secuencias_tablas_log()
    {
        
toba_logger::instancia()->debug('Actualizando SECUENCIAS tablas log');
        
$id_grupo_de_desarrollo $this->instalacion->get_id_grupo_desarrollo();
        foreach ( 
toba_db_secuencias::get_lista_secuencias_tablas_log() as $seq => $datos ) {
            
$this->ejecutar_sql_actualizacion_secuencias($id_grupo_de_desarrollo$datos$seq);
        }
        
$this->manejador_interface->progreso_fin();
    }
    
    
/**
     * Devuelve un arreglo con las secuencias en la bd que no estan alcanzadas por el id de desarrollador.
     * @return type
     * @ignore
     */
    
protected function get_lista_secuencias_basicas()
    {
        
$secbd = array();
        
$sec_archivo toba_db_secuencias::get_lista();            //Leo las secuencias alcanzadas por el id de desarrollo
        
$tmpsec $this->get_db()->get_lista_secuencias();        //Recupero todas las secuencias de  la fuente
        
foreach($tmpsec as $fila) {
            
$indx str_replace('"'''$fila['nombre']);
            
$secbd[$indx] = $fila;
        }        
         
$resultado array_diff_key($secbd$sec_archivo);        //Quito las que estan en el archivo
         
return $resultado;        
    }
    
    function 
ejecutar_sql_actualizacion_secuencias($id_grupo_de_desarrollo$datos$seq)
    {
        
$max "MAX(CASE {$datos['campo']}::varchar ~ '^[0-9]+$' WHEN true THEN {$datos['campo']}::bigint ELSE 0 END)";
            if ( 
is_null$id_grupo_de_desarrollo ) ) {
                
//Si no hay definido un grupo la secuencia se toma en forma normal
                
$sql "SELECT setval('$seq', $max) as nuevo FROM {$datos['tabla']}"
                
$res $this->get_db()->consultar($sqlnulltrue);
                
$nuevo $res[0]['nuevo'];
            } else {
                
//Sino se toma utilizando los límites según el ID del grupo
                
$lim_inf self::cantidad_seq_grupo $id_grupo_de_desarrollo;
                
$lim_sup self::cantidad_seq_grupo * ( $id_grupo_de_desarrollo );
                
$sql_nuevo "SELECT $max as nuevo
                              FROM 
{$datos['tabla']}
                              WHERE
                                CASE regexp_replace(
{$datos['campo']}::text,'[^0-9]','','g') 
                                    WHEN '' THEN 0 
                                ELSE 
{$datos['campo']}::int8
                                  END BETWEEN 
$lim_inf AND $lim_sup";
                
$res $this->get_db()->consultar($sql_nuevonulltrue);
                
$nuevo $res[0]['nuevo'];
                
//Si no hay un maximo, es el primero del grupo
                
if ($nuevo == NULL) {
                    
$nuevo $lim_inf;
                }
                
//Caso particular para el grupo 0, no puede ser una secuencia 0
                
if ($nuevo == 0) {    
                    
$nuevo 1;
                }
                
$sql "SELECT setval('$seq', $nuevo)";
                
$this->get_db()->consultar$sql );    
            }
            
toba_logger::instancia()->debug("SECUENCIA $seq$nuevo");
            
$this->manejador_interface->progreso_avanzar();            
    }
    
    function 
get_sql_actualizar_secuencias()
    {
        
$salida "--------------------------------------------------\n";
        
$salida .= "-- ACTUALIZACION DE SECUENCIAS \n";
        
$salida .= "--------------------------------------------------\n\n";        
        foreach ( 
toba_db_secuencias::get_lista() as $seq => $datos ) {
            
$salida .= "SELECT setval('$seq', max({$datos['campo']})) as nuevo FROM {$datos['tabla']};\n"
        }
        return 
$salida;
    }
    
    
/**
     * Dado el valor de un campo generado por una secuencia determina el grupo de desarrollo que lo genero
     */
    
function get_grupo_desarrollo_de_valor($valor)
    {
        if (! 
is_numeric($valor)) {
            return 
null;
        }
        return 
floor($valor self::cantidad_seq_grupo);
    }
    
    
/**
     * Retorna el campo que es una secuencia en una tabla de la instancia
     */
    
function get_campo_secuencia_de_tabla($tabla)
    {
        if (! isset(
$this->lista_secuencias)) {
            
$this->lista_secuencias toba_db_secuencias::get_lista();
        }
        foreach (
$this->lista_secuencias as $datos) {
            if (
$datos['tabla'] == $tabla) {
                return 
$datos['campo'];                
            }
        }
    }
    
    
//-----------------------------------------------------------
    //    ELIMINAR una DB
    //-----------------------------------------------------------

    /*
    *    Elimina la instancia de la forma predefinida
    */
    
function eliminar()
    {
        
$this->eliminar_schema();
    }
    
    function 
eliminar_schema()
    {
        
$this->get_db()->borrar_schema($this->get_schema_db());
    }
    
    
/**
     * Si no esta creado el schema de toba, lo crea y lo pone por defecto en la conexión
     */
    
function crear_schema()
    {
        if (! 
$this->get_db()->existe_schema($this->get_schema_db())) {
            
$this->get_db()->crear_schema($this->get_schema_db());
            
$this->get_db()->set_schema($this->get_schema_db());
        }
    }
    

    
/**
    * Eliminacion de la BASE de la instancia
    */
    
function eliminar_base()
    {
        try {
            
$this->desconectar_db();
            
$this->manejador_interface->mensaje("Eliminando base '{$this->ini_base}'..."false);
            
$this->instalacion->borrar_base_datos$this->ini_base );
            
$this->manejador_interface->progreso_fin();
        } catch ( 
toba_error_db $e ) {
            
$this->manejador_interface->error"Ha ocurrido un error durante la eliminacion de la BASE:\n" $e->get_mensaje_motor());    
            
//- Fallo de conexion, no deberia continuar, o si?
            
if (($e->get_sqlstate() == 'db_08006') || ($e->get_sqlstate() == 'db_96669')) {
                exit(-
1);    
            }
        }
    }

    
/**
    * Eliminacion de las TABLAS de la instancia
    */
    
function eliminar_modelo()
    {
        try {
            
$this->manejador_interface->mensaje("Eliminando el modelo...",false);            
            
$this->get_db()->abrir_transaccion();
            
// Tablas
            
$sql sql_array_tablas_dropcatalogo_general::get_tablas() );
            
$this->get_db()->ejecutar$sql );
            
// Secuencias
            
$secuencias array_keys$this->get_lista_secuencias_basicas() );
            
$sql sql_array_secuencias_drop$secuencias );
            
$this->get_db()->ejecutar$sql );
            
$this->get_db()->cerrar_transaccion();
            
$this->manejador_interface->progreso_fin();
            
toba_logger::instancia()->debug("Modelo de la instancia {$this->identificador} eliminado");
        } catch ( 
toba_error_db $e ) {
            
$this->get_db()->abortar_transaccion();
            throw 
$e;
        }
    }

    
/**
     * Elimina los archivos de configuracion y datos propios de la instancia
     */
    
function eliminar_archivos()
    {
        
toba_manejador_archivos::eliminar_directorio($this->dir);        
    }
    
    function 
eliminar_logs()
    {
        
$schema '';
        
$schema_log $this->get_schema_db(). '_logs';
        if (
$this->get_db()->existe_schema($schema_log)) {
            
$schema "$schema_log.";
        }
        
//--- Borra logs en las tablas
        
$tablas toba_db_tablas_instancia::get_lista_proyecto_log();
        
$tablas array_merge($tablastoba_db_tablas_instancia::get_lista_global_log());
        foreach(
$tablas as $tabla) {
            
$sql 'DELETE FROM '$schema$tabla;
            
$this->get_db()->ejecutar($sql);
            
$this->manejador_interface->progreso_avanzar();
        }
        
        
$this->eliminar_archivos_log();        
    }
    
    
//-----------------------------------------------------------
    //    Informacion sobre METADATOS
    //-----------------------------------------------------------

    
function get_lista_usuarios($proyecto=null)
    {
        if(isset(
$proyecto)) {
            
$proyecto $this->get_db()->quote($proyecto);
            
$sql "SELECT u.usuario as usuario, u.nombre as nombre
                    FROM apex_usuario u, apex_usuario_proyecto up
                    WHERE u.usuario = up.usuario
                    AND up.proyecto = 
$proyecto;";
        } else {
            
$sql 'SELECT usuario, nombre FROM apex_usuario';
        }
        return 
$this->get_db()->consultar$sql );
    }
    
    function 
get_usuarios_administradores($proyecto$grupo 'admin')
    {
        
$proyecto =$this->get_db()->quote($proyecto);
        
$grupo $this->get_db()->quote($grupo);
        
$sql "
            SELECT    usuario
            FROM    apex_usuario_proyecto
            WHERE    
                    proyecto= 
$proyecto
                AND    usuario_grupo_acc = 
$grupo";
        return 
$this->get_db()->consultar$sql );
    }    

    function 
get_registros_tablas()
    {
        
$registros = array();
        
$tablas catalogo_general::get_tablas();
        foreach ( 
$tablas as $tabla ) {
            
$sql "SELECT COUNT(*) as registros FROM $tabla;";
            
$temp $this->get_db()->consultar$sql );
            
$registros$tabla ] = $temp[0]['registros'];
        }
        return 
$registros;
    }
    
    
//-----------------------------------------------------------
    //    Manipulacion de METADATOS
    //-----------------------------------------------------------

    
function agregar_usuario($usuario$nombre$clave$email=null$atributos=array())
    {
        
$algoritmo apex_pa_algoritmo_hash;
        
$clave encriptar_con_sal($clave$algoritmo);
        
toba_logger::instancia()->debug("Agregando el usuario '$usuario' a la instancia {$this->identificador}");
        
        
//-- Compatibilidad apis 
        
if (isset($atributos['email'])) {
            
$email $atributos['email'];
            unset(
$atributos['email']);
        }
        
$into "INSERT INTO apex_usuario ( usuario, nombre, autentificacion, clave, email"
        
$values ") VALUES (:usuario, :nombre, '$algoritmo', :clave, :email";
        foreach (
$atributos as $klave => $valor) {
             
$into .=  ", $klave";
             
$values .=  ", :$klave";
        }
        
$sql $into $values ');';
        
        
$atributos['usuario'] = $usuario;
        
$atributos['nombre'] = $nombre;
        
$atributos['email'] = $email;
        
$atributos['clave'] = $clave;
        
        
$id $this->get_db()->sentencia_preparar($sql);                
        
$this->get_db()->sentencia_ejecutar($id$atributos);
    }
    
    function 
eliminar_usuario$usuario )
    {
        
toba_logger::instancia()->debug("Borrando el usuario '$usuario' de la instancia {$this->identificador}");        
        
$sql "DELETE FROM apex_usuario WHERE usuario = '$usuario'";    
        return 
$this->get_db()->ejecutar$sql );
    }
    
    function 
desbloquear_ips()
    {
        
$schema_log $this->get_schema_db(). '_logs';
        
$sql "DELETE FROM $schema_log.apex_log_ip_rechazada";
        
$cant $this->get_db()->ejecutar($sql);
        
$this->manejador_interface->mensaje("Ips liberadas: $cant");
    }
    
    
/**
     * Cambia los grupos de acceso de un usuario en los distintos proyectos de la instancia
     *
     * @param string $usuario
     * @param array $accesos Arreglo asociativo proyecto=>array(grupos)
     */
    
function cambiar_acceso_usuario($usuario$accesos)
    {
        
$this->db->abrir_transaccion();
        foreach( 
$this->get_lista_proyectos_vinculados() as $id_proyecto ) {
            if (isset(
$accesos[$id_proyecto])) {
                
$proyecto $this->get_proyecto($id_proyecto);
                
$proyecto->desvincular_usuario($usuario);
                
$proyecto->vincular_usuario($usuario$accesos[$id_proyecto], nullfalse);
            }
        }
        
$this->db->cerrar_transaccion();
    }

    
//-------------------------------------------------------------
    //-- CREACION de INSTANCIAS
    //-------------------------------------------------------------

    /**
    * Agrega una instancia
    */
    
static function crear_instancia$nombre$base$lista_proyectos$tipo='normal' )
    {
        
//Creo la carpeta
        
if( ! self::existe_carpeta_instancia$nombre ) ) {
            
$dir self::dir_instancia$nombre );
            
mkdir$dir );
            
toba_logger::instancia()->debug("Creado directorio $dir");
        }
        
//Creo la clase que proporciona informacion sobre la instancia
        
$ini = new toba_ini();
        
$ini->agregar_tituloself::toba_instancia_titulo );
        
$ini->agregar_entrada'base'$base );
        
$ini->agregar_entrada'proyectos'implode(', 'array_keys($lista_proyectos)) );
        
$ini->agregar_entrada'tipo'$tipo );
        
        
//--- Se revisa la lista de proyectos para ver si algun id_proyecto != dir_proyecto
        
foreach ($lista_proyectos as $id_pro => $path_pro) {
            
//$datos_ini = array('url' => '/'.$id_pro);
            
$datos_ini = array();
            if (
$path_pro != $id_pro) {
                
//--- Se agrega una seccion para el proyecto
                
$datos_ini['path'] = toba_dir().'/proyectos/'.$path_pro;
            }
            
$ini->agregar_entrada($id_pro$datos_ini);            
        }
        
        
$archivo self::dir_instancia$nombre ) . '/' toba_modelo_instancia::toba_instancia ;
        
$ini->guardar$archivo );
        
toba_logger::instancia()->debug("Creado archivo $archivo");
    }

    static function 
dir_instancia$nombre )
    {
        return 
toba_modelo_instalacion::dir_base() . '/' self::dir_prefijo $nombre;
    }

    static function 
existe_carpeta_instancia$nombre )
    {
        return 
is_dirself::dir_instancia$nombre) );
    }
    
    
/**
    * Devuelve la lista de las INSTANCIAS
    */
    
static function get_lista($instalacion=null)
    {
        if (! isset(
$instalacion)) {
            
$instalacion toba_modelo_instalacion::dir_base();
        }
        
$dirs = array();
        try {
            
$temp toba_manejador_archivos::get_subdirectorios$instalacion'|^'.self::dir_prefijo.'|' );
            foreach ( 
$temp as $dir ) {
                
$temp_dir explodeself::dir_prefijo$dir );
                if (
count($temp_dir) > 1) {
                    
$dirs[] = $temp_dir[1];
                }
            }
        } catch ( 
toba_error $e ) {
            
// No existe la instalacion
        
}
        return 
$dirs;
    }


    function 
crear_alias_proyectos()
    {
        foreach( 
$this->get_lista_proyectos_vinculados() as $id_proyecto ) {
            if (
$id_proyecto != 'toba') {
                
$proyecto $this->get_proyecto($id_proyecto);                                        
                
$proyecto->publicar();    
            }
        }            
    }
    
    
//------------------------------------------------------------------------
    //--------------------------  Manejo de Versiones ------------------------
    //------------------------------------------------------------------------
    
function migrar_version($version$recursivo$con_transaccion=true)
    {
        if (
$version->es_mayor($this->get_version_actual()) || $this->get_version_actual()->es_igual(new toba_version("trunk"))) {
            
$this->get_db()->retrazar_constraints();
            
$this->manejador_interface->enter();        
            
$this->manejador_interface->subtitulo("Migrando instancia '{$this->identificador}'");
            
toba_logger::instancia()->debug("Migrando instancia {$this->identificador} a la versión ".$version->__toString());
            if (
$con_transaccion$this->get_db()->abrir_transaccion();
            
$version->ejecutar_migracion('instancia'$thisnull$this->manejador_interface);
            
            
//-- Se migran los proyectos incluidos
            
if ($recursivo) {
                foreach( 
$this->get_lista_proyectos_vinculados() as $id_proyecto ) {
                    if (
$id_proyecto != 'toba') {
                        
$proyecto $this->get_proyecto($id_proyecto);                        
                        
                        
//-- Se evitan los proyectos propios, ya que ya estan migrados pero recien se va a notar cuando se regenere
                        
if (! in_array($proyecto->get_id(), $this->proyectos_ya_migrados)) {
                            
$proyecto->migrar_version($version);
                        }
                    }
                }
            }
            
$this->set_version($version);            
            if (
$con_transaccion$this->get_db()->cerrar_transaccion();
        } else {
            
toba_logger::instancia()->debug("La instancia {$this->identificador} no necesita migrar a la versión ".$version->__toString());
        }
    }

    function 
ejecutar_migracion_particular(toba_version $version$metodo)
    {
        
$this->get_db()->abrir_transaccion();        
        
$version->ejecutar_migracion('instancia'$this$metodo$this->manejador_interface);
        
$this->get_db()->cerrar_transaccion();
    }    
    
    function 
ejecutar_ventana_migracion_version($con_transaccion=true)
    {
        
toba_logger::instancia()->debug('Ejecutando ventana de migracion de instancia');
        
$path_migracion_instancia toba_dir(). '/php/modelo/migraciones_instancia';    //Armo la ubicacion en donde se hallan los pasos de migracion de la instancia
        
        
$version_actual = new toba_version($this->get_version_actual());        //Recupero la version de la instancia existente
        
$actual_codigo  = new toba_version(toba_modelo_instalacion::get_version_actual());            //Recupero la version actual del codigo instalado
    
        
$version_actual->set_path_migraciones($path_migracion_instancia);                //Cambio el path a las migraciones por defecto
        
$versiones $version_actual->get_secuencia_migraciones($actual_codigo$path_migracion_instancia);
        
//Calculo cuales son los pasos a dar
        
if (empty($versiones)) {
            return;
        }
        foreach(
array_keys($versiones) as $version) {
            
$versiones[$version]->set_path_migraciones($path_migracion_instancia);                //Hago la migracion para cada version intermedia
            
$this->migrar_version($versiones[$version], false$con_transaccion);
        }
    }
    
    function 
set_version($version)
    {
        
$nueva $version->__toString();        
        if (
$this->get_version_actual()->es_igual(toba_version::inicial())) {
            
$sql "INSERT INTO apex_instancia (instancia, version) VALUES ('".
                    
$this->get_id(). "', '$nueva')";            
        } else {
            
$sql "UPDATE apex_instancia SET version='$nueva' WHERE instancia='{$this->identificador}'";
        }
        
toba_logger::instancia()->debug("Actualizando la instancia {$this->identificador} a versión $nueva");        
        
$this->get_db()->ejecutar($sql);
    }
    
    function 
get_version_actual()
    {
        
$sql 'SELECT version FROM apex_instancia';
        
$rs $this->get_db()->consultar($sql);
        if (empty(
$rs)) {
            return 
toba_version::inicial(); //Es la version anterior al cambio de la migracion
        
} else {
            return new 
toba_version($rs[0]['version']);    
        }
    }

    
//----------------------------------------------------------------------------
    //--------------------- Manejo de Revisiones de Proyectos ----
    //----------------------------------------------------------------------------
    
function set_revision_proyecto($proyecto$revision)
    {
        
$proy_qtd $this->get_db()->quote($proyecto);
        
$rev_qtd $this->get_db()->quote($revision);
        
$sql "INSERT INTO apex_revision (proyecto, revision) VALUES ($proy_qtd$rev_qtd);";
        
$this->get_db()->ejecutar$sql );
        
toba_logger::instancia()->debug("Actualizada la revision svn del proyecto $proyecto a $revision");
    }
    
    function 
get_revision_proyecto($proyecto)
    {
        
$proy_qtd $this->get_db()->quote($proyecto);
        
$sql "SELECT revision::integer as rev 
                        FROM apex_revision
                        WHERE proyecto = 
$proy_qtd
                        AND creacion = (SELECT max(creacion) FROM apex_revision WHERE proyecto = 
$proy_qtd);";
        
$rs $this->get_db()->consultar_fila$sql );
        
toba_logger::instancia()->var_dump($rs);    
        
$rev = (! empty($rs)) ? $rs['rev']  : 0;
        if (! isset(
$rev)) {
            
$rev 0;
        }
        return 
$rev;
    }

    function 
get_checksum_proyecto($proyecto)
    {
        
$proy_qtd $this->get_db()->quote($proyecto);
        
$sql "SELECT checksum FROM apex_checksum_proyectos WHERE proyecto = $proy_qtd;";
        
$rs $this->get_db()->consultar_fila$sql );
        
toba_logger::instancia()->var_dump($rs);
        
$chcks = (! empty($rs)) ? $rs['checksum']  : null;
        return 
$chcks;
    }

    function 
set_checksum_proyecto($proyecto$checksum)
    {
        
$proy_qtd $this->get_db()->quote($proyecto);
        
$cks_qtd $this->get_db()->quote($checksum);
        
$sql "UPDATE apex_checksum_proyectos SET checksum = $cks_qtd WHERE proyecto = $proy_qtd;";
        
$modificados $this->get_db()->sentencia($sql);

        if (
$modificados == '0') {
            
$sql "INSERT INTO apex_checksum_proyectos (proyecto, checksum) VALUES ($proy_qtd$cks_qtd);";
            
$modificados $this->get_db()->sentencia($sql);
        }
        
toba_logger::instancia()->debug("Actualizado el checksum del proyecto $proyecto");
    }

}
?>

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ Read-Only ]

:: Make Dir ::
 
[ Read-Only ]
:: Make File ::
 
[ Read-Only ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 2.1 [PHP 8 Update] [02.02.2022] maintained byC99Shell Github | Generation time: 0.7102 ]--