!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/lib/db/   drwxr-xr-x
Free 14.74 GB of 61.93 GB (23.8%)
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     toba_db_postgres7.php (26.32 KB)      -rw-r--r--
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
/**
 * Driver de conexión con postgres
 * @package Fuentes
 * @subpackage Drivers
 */
class toba_db_postgres7 extends toba_db
{
    protected 
$cache_metadatos = array(); //Guarda un cache de los metadatos de cada tabla
    
protected $schema;
    protected 
$transaccion_abierta false;
    
    
    function 
__construct($profile$usuario$clave$base$puerto)
    {
        
$this->motor "postgres7";
        
parent::__construct($profile$usuario$clave$base$puerto);
        
//$this->setear_datestyle_iso();
    
}

    function 
get_dsn()
    {
        
$puerto = ($this->puerto != '') ? "port={$this->puerto}"'';
        return 
"pgsql:host=$this->profile;dbname=$this->base;$puerto";    
    }
    
    function 
get_parametros()
    {
        
$parametros parent::get_parametros();
        
$parametros['schema'] = $this->schema;
        return 
$parametros;
    }
    
/**
     * Determina que schema se utilizará por defecto para la ejecución de consultas, comandos y consulta de metadatos
     * @param string $schema
     * @param boolean $ejecutar
     */
    
function set_schema($schema$ejecutar true$fallback_en_public=false)
    {
        
$this->schema $schema;
        
$sql "SET search_path TO $schema";
        if (
$fallback_en_public) {
            
$sql .= ', public';
        }
        if (! 
$ejecutar) { return $sql; }
        
$this->ejecutar($sql);
    }
    
    function 
get_schema()
    {
        if (isset(
$this->schema)) {
            return 
$this->schema;
        }
    }

    function 
set_encoding($encoding$ejecutar true)
    {
        
$sql "SET CLIENT_ENCODING TO '$encoding';";
        if (! 
$ejecutar) { return $sql; }
        
$this->ejecutar($sql);        
    }

    function 
set_datestyle_iso()
    {    
        
$sql "SET datestyle TO 'iso';";
        
$this->ejecutar($sql);    
    }
         
    
/**
     *  Crea el lenguaje plpgsql unicamente si el mismo aun no existe para la base de datos.
     */
    
function crear_lenguaje_procedural()
    {
        if (! 
$this->existe_lenguaje('plpgsql')) {
            
$this->crear_lenguaje('plpgsql');
        }
        
/*$sql = "SELECT lanname FROM pg_language WHERE lanname='plpgsql'";
        $rs = $this->consultar($sql);
        if (empty($rs)) {
            $sql = 'CREATE LANGUAGE plpgsql';
            $this->ejecutar($sql);
        }*/
    
}
    
    
/**
    *    Recupera el valor actual de una secuencia
    *    @param string $secuencia Nombre de la secuencia
    *    @return string Siguiente numero de la secuencia
    */    
    
function recuperar_secuencia($secuencia$ejecutar=true)
    {
        
$sql "SELECT currval('$secuencia') as seq;";
        if (! 
$ejecutar) { return $sql; }
        
$datos $this->consultar($sql);
        return 
$datos[0]['seq'];
    }

    function 
recuperar_nuevo_valor_secuencia($secuencia$ejecutar true)
    {
        
$sql "SELECT nextval('$secuencia') as seq;";
        if (! 
$ejecutar) { return $sql; }
        
$datos $this->consultar($sql);
        return 
$datos[0]['seq'];
    }
        
    function 
retrazar_constraints($retrazar true)
    {
        
$tipo $retrazar 'DEFERRED' 'IMMEDIATE';
        
$this->ejecutar("SET CONSTRAINTS ALL $tipo;");
        
toba_logger::instancia()->debug("************ Se cambia el chequeo de constraints ($tipo) ****************"'toba');        
    }
    

    function 
abrir_transaccion()
    {
        
$sql 'BEGIN TRANSACTION;';
        
$this->ejecutar($sql);
        
$this->transaccion_abierta true;
        
toba_logger::instancia()->debug("************ ABRIR transaccion ($this->base@$this->profile) ****************"'toba');
    }
    
    function 
abortar_transaccion()
    {
        
$sql 'ROLLBACK TRANSACTION;';
        
$this->ejecutar($sql);
        
$this->transaccion_abierta false;
        
toba_logger::instancia()->debug("************ ABORTAR transaccion ($this->base@$this->profile) ****************"'toba'); 
    }
    
    function 
cerrar_transaccion()
    {
        
$sql "COMMIT TRANSACTION;";
        
$this->ejecutar($sql);
        
$this->transaccion_abierta false;
        
toba_logger::instancia()->debug("************ CERRAR transaccion ($this->base@$this->profile) ****************"'toba'); 
    }

    
/**
     * @return boolean Devuelve true si hay una transacción abierta y false en caso contrario
     */
    
function transaccion_abierta()
    {
        return 
$this->transaccion_abierta;
    }

    function 
agregar_savepoint($nombre)
    {
        
$sql "SAVEPOINT $nombre;";
        
$this->ejecutar($sql);
        
toba_logger::instancia()->debug("************ agregar savepoint $nombre ($this->base@$this->profile) ****************"'toba');
    }

    function 
abortar_savepoint($nombre)
    {
        
$sql "ROLLBACK TO SAVEPOINT $nombre;";
        
$this->ejecutar($sql);
        
toba_logger::instancia()->debug("************ abortar savepoint $nombre ($this->base@$this->profile) ****************"'toba');
    }

    function 
liberar_savepoint($nombre)
    {
        
$sql "RELEASE SAVEPOINT $nombre;";
        
$this->ejecutar($sql);
        
toba_logger::instancia()->debug("************ liberar savepoint $nombre ($this->base@$this->profile) ****************"'toba');
    }

    
/**
    *    Insert de datos desde un arreglo hacia una tabla. Requiere la extension original pgsql.
    *    @param string $tabla Nombre de la tabla en la que se insertarán los datos
    *    @param array $datos Los datos a insertar: cada elemento del arreglo será un registro en la tabla.
    *    @param string $delimitador Separador de datos de cada fila.
    *    @param string $valor_nulo Cadena que se utlilizará como valor nulo.
    *    @return boolean Retorn TRUE en caso de éxito o FALSE en caso de error.
    */
    
function insert_masivo($tabla,$datos,$delimitador="\t",$valor_nulo="\\N") {
        
$puerto = ($this->puerto != '') ? "port={$this->puerto}"'';
        
$host "host={$this->profile}";
        
$base "dbname={$this->base}";
        
$usuario "user={$this->usuario}";
        
$clave "password={$this->clave}";
        
$conn_string "$host $puerto $base $usuario $clave";
        
$dbconn pg_connect($conn_string);
        if (isset(
$this->schema)) {
            
$sql "SET search_path TO {$this->schema};";
            
pg_query($dbconn$sql);
        }
        
$salida pg_copy_from($dbconn,$tabla,$datos,$delimitador,$valor_nulo);
        if (!
$salida) {
            
$mensaje pg_last_error($dbconn);
            
pg_close($dbconn);
            
toba::logger()->error($mensaje);
            throw new 
toba_error($mensaje);
        }
        
pg_close($dbconn);
        return 
$salida;
    }

    
//------------------------------------------------------------------------
    //-- SCHEMAS Postgres
    //------------------------------------------------------------------------    
    
    
function existe_schema($esquema
    {
        
$esquema $this->quote($esquema);
        
$sql "SELECT
                    count(*) as cant
                FROM
                    information_schema.schemata
                WHERE 
                    schema_name = 
$esquema;";
        
$rs $this->consultar_fila($sql);
        return 
$rs['cant'] > 0;
    }
    
    function 
borrar_schema($schema$ejecutar true)
    {
        
$sql "DROP SCHEMA $schema CASCADE;";
        if (! 
$ejecutar) { return $sql; }
        return 
$this->ejecutar($sql);
    }        

    function 
borrar_schema_si_existe($schema)
    {
        if (
$this->existe_schema($schema)) {
            
$this->borrar_schema($schema);
        }
    }

    function 
crear_schema($schema$ejecutar true
    {
        
$sql "CREATE SCHEMA $schema;";
        if (! 
$ejecutar) { return $sql; }
        return 
$this->ejecutar($sql);
    }    
    
    function 
renombrar_schema($actual$nuevo$ejecutar true
    {
        
$sql "ALTER SCHEMA $actual RENAME TO $nuevo;";
        if (! 
$ejecutar) { return $sql; }
        return 
$this->ejecutar($sql);
    }        

    function 
get_lista_schemas_disponibles()
    {
        
$sql 'SELECT n.nspname AS esquema
                FROM pg_catalog.pg_namespace n
                WHERE   (n.nspname !~ \'^pg_\') 
                    AND  (n.nspname <> \'information_schema\')
                    AND  (n.nspname !~ \'_backup$\')
                    AND  (n.nspname !~ \'_logs$\')    
                ORDER BY 1;'
;
        return 
$this->consultar($sql);
    }
    
    function 
existe_lenguaje($lang)
    {
        
$lang $this->quote($lang);
        
$sql "SELECT COUNT(*) FROM pg_language WHERE lanname=$lang;";
        
$res $this->consultar($sql);
        return 
$res[0]['count'] > 0;
    }

    function 
crear_lenguaje($lang)
    {
        
$sql "CREATE LANGUAGE $lang;";
        return 
$this->ejecutar($sql);
    }

    
/**
     * Clona el schema actual en $nuevo_schema. FUNCIONA EN POSTGRES >= 8.3
     * @param string $actual el nombre del schema a clonar
     * @param string $nuevo el nombre del nuevo schema
     */
    
public function clonar_schema($actual$nuevo)
    {
        if (!
$this->existe_lenguaje('plpgsql')) {
            
$this->crear_lenguaje('plpgsql');
        }
        
        
$sql "
            CREATE OR REPLACE FUNCTION clone_schema(source_schema text, dest_schema text) RETURNS void AS
            \$BODY$
            DECLARE
              objeto text;
              buffer text;
            BEGIN
                EXECUTE 'CREATE SCHEMA ' || dest_schema ;

                FOR objeto IN
                    SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = source_schema
                LOOP
                    buffer := dest_schema || '.' || objeto;
                    EXECUTE 'CREATE SEQUENCE ' || buffer;
                    BEGIN
                        --EXECUTE 'SELECT setval(' || quote_literal(buffer) ||', (SELECT nextval(' || quote_literal(source_schema ||'.'|| objeto) || '))' || ')';
                        EXECUTE 'SELECT setval(' || quote_literal(buffer) ||', (SELECT last_value FROM ' || source_schema ||'.'|| objeto || ')' || ')';
                    EXCEPTION WHEN OTHERS THEN
                    END;
                END LOOP;

                FOR objeto IN
                    SELECT table_name::text FROM information_schema.tables WHERE table_schema = source_schema
                LOOP
                    buffer := dest_schema || '.' || objeto;
                    EXECUTE 'CREATE TABLE ' || buffer || ' (LIKE ' || source_schema || '.' || objeto || ' INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING DEFAULTS)';
                    EXECUTE 'INSERT INTO ' || buffer || '(SELECT * FROM ' || source_schema || '.' || objeto || ')';
                END LOOP;

            END;
            \$BODY$
            LANGUAGE plpgsql;
        "
;
        
        
$this->ejecutar($sql);
        
        
$actual $this->quote($actual);
        
$nuevo $this->quote($nuevo);
        
$sql "SELECT clone_schema($actual$nuevo);";
        
$this->ejecutar($sql);
    }

    
//---------------------------------------------------------------------
    //-- PERMISOS
    //---------------------------------------------------------------------
    
    
function get_usuario_actual()
    {
        
$sql 'SELECT CURRENT_USER AS usuario;';
        
$datos toba::db()->consultar_fila($sql);
        return 
$datos['usuario'];
    }
    
    function 
get_rol_actual()
    {
        
$sql 'SHOW ROLE;';
        
$datos $this->consultar_fila($sql);
        return 
$datos['role'];
    }    
    
    function 
set_rol($rol$ejecutar true)
    {
        
$sql "SET ROLE $rol;";
        if (! 
$ejecutar) { return $sql; }
        return 
$this->ejecutar($sql);
    }
    
    function 
existe_rol($rol
    {
        
$datos $this->listar_roles($rol);
        return !empty(
$datos);
    }
    
    function 
listar_roles($rol null)
    {
        
$sql 'SELECT rolname FROM pg_roles ';
        if (! 
is_null($rol)) {
            
$rol $this->quote($rol);
            
$sql .= " WHERE rolname = $rol;";
        }
        return 
$this->consultar($sql);
    }    
    
    function 
crear_rol($rol$ejecutar=true)
    {
        
$sql "CREATE ROLE $rol NOINHERIT;";
        if (! 
$ejecutar) { return $sql; }        
        return 
$this->ejecutar($sql);        
    }
    
    function 
crear_usuario($rol$password$ejecutar true)
    {
        
$password $this->quote($password);
        
$sql "CREATE ROLE $rol NOINHERIT LOGIN PASSWORD $password;";
        if (! 
$ejecutar) { return $sql; }
        return 
$this->ejecutar($sql);
    }    
    
    function 
borrar_rol($rol$ejecutar true)
    {
        
$sql "DROP ROLE IF EXISTS $rol;";
        if (! 
$ejecutar) { return $sql; }
        return 
$this->ejecutar($sql);
    }
    
    function 
grant_rol($usuario$rol$ejecutar true)
    {
        
$sql "GRANT $rol TO $usuario;";
        if (! 
$ejecutar) { return $sql; }
        return 
$this->ejecutar($sql);
    }    

    function 
grant_schema($usuario$schema$permisos 'USAGE'$ejecutar true)
    {
        
$sql "GRANT $permisos ON SCHEMA \"$schema\" TO $usuario;";
        if (! 
$ejecutar) { return $sql; }
        return 
$this->ejecutar($sql);
    }    
    
    function 
revoke_schema($usuario$schema$permisos 'ALL PRIVILEGES'$ejecutar true)
    {
        
$sql = array();
        
//--Revoka las tablas dentro
        
$sql_rs "SELECT
                    relname
                FROM pg_class c
                    JOIN pg_namespace ns ON (c.relnamespace = ns.oid)
                WHERE
                        relkind in ('r','v','S')
                    AND nspname = '
$schema' ;";
        
$rs $this->consultar($sql_rs);
        foreach (
$rs as $tabla) {
            
$sql[] = "REVOKE $permisos ON $schema.{$tabla['relname']} FROM $usuario CASCADE;";
        }
        
        
$sql[] = "REVOKE $permisos ON SCHEMA \"$schema\" FROM $usuario;";
        if (! 
$ejecutar) { return $sql; }
        
$this->ejecutar($sql);        
    }
    
    function 
revoke_tablas($usuario$schema$tablas$permisos 'ALL PRIVILEGES'$ejecutar=true)
    {
        
$sql = array();
        foreach (
$tablas as $tabla) {
            
$sql[] = "REVOKE $permisos ON $schema.{$tabla} FROM $usuario CASCADE;";
        }
        if (! 
$ejecutar) {
            return 
$sql;
        }
        
$this->ejecutar($sql);    
    }
    
    function 
revoke_rol($usuario$rol$ejecutar true)
    {
        
$sql "REVOKE $rol FROM $usuario;";
        if (! 
$ejecutar) { return $sql; }
        return 
$this->ejecutar($sql);
    }

    
/**
     *    Da permisos especificos a todas las tablas de un esquema dado
     **/
    
function grant_tablas_schema($usuario$schema$privilegios ='ALL PRIVILEGES')
    {
        
$sql "SELECT
                    relname
                FROM pg_class c
                    JOIN pg_namespace ns ON (c.relnamespace = ns.oid)
                WHERE
                        relkind in ('r','v','S')
                    AND nspname = "
.$this->quote($schema);
        
$tablas $this->consultar($sql);
        
$this->grant_tablas($usuario$schemaaplanar_matriz($tablas'relname'), $privilegios);
    }    
    
    
/**
     *    Da permisos especificos a todas las tablas de un esquema dado
     **/
    
function grant_tablas($usuario$schema$tablas$privilegios ='ALL PRIVILEGES'$ejecutar true)
    {
        
$sql = array();
        foreach (
$tablas as $tabla) {
            
$sql[] = "GRANT $privilegios ON $schema.$tabla TO $usuario;";
        }
        if (! 
$ejecutar) { return $sql; }
        
$this->ejecutar($sql);
    }    

    function 
grant_sp_schema($usuario$schema,  $privilegios 'ALL PRIVILEGES'$ejecutar true)
    {
        
$stored_procedures $this->get_sp_schema($schema);                //Busco todos los stored procedures del schema
        
$sql "GRANT $privilegios ON FUNCTION ";
        foreach (
$stored_procedures as $sp) {                                                //Los agrego separados por coma para usar 1 sola SQL
            
$sql .= $schema.$sp(), ";
        }
        
$sql substr($sql0, -2) . " TO $usuario;";                                            //Agrego el rol/usuario beneficiario
        
if (! $ejecutar) { return $sql; }
        
$this->ejecutar($sql);
    }

    function 
revoke_sp_schema($usuario$schema,  $privilegios 'ALL PRIVILEGES'$ejecutar true)
    {
        
$stored_procedures $this->get_sp_schema($schema);                //Busco todos los stored procedures del schema
        
$sql "REVOKE $privilegios ON FUNCTION ";
        foreach (
$stored_procedures as $sp) {
            
$sql .= "$schema.$sp(), ";                                                                    //Los agrego separados por coma para usar 1 sola SQL
        
}
        
$sql substr($sql, -2) .  " FROM $usuario;";
        if (! 
$ejecutar) { return $sql; }
        
$this->ejecutar($sql);
    }

    function 
get_sp_schema($schema)
    {
        
$sql "SELECT
                                            proname
                         FROM pg_proc p
                            JOIN pg_namespace ns ON (p.pronamespace = ns.oid)
                        WHERE
                            nspname =  "
.$this->quote($schema);
        
$stored_proc $this->consultar($sql);
        return 
aplanar_matriz($stored_proc'proname');                                //Devuelvo la matriz sin el subindice de nombre de columna
    
}
    
    
//------------------------------------------------------------------------
    //-- INSPECCION del MODELO de DATOS
    //------------------------------------------------------------------------    
        
    
function get_lista_tablas_y_vistas()
    {
        
$esquema null;
        if (isset(
$this->schema)) {
            
$esquema $this->schema;
        }        
        return 
$this->get_lista_tablas_bd(true$esquema);    
    }
    
    
    function 
get_lista_tablas($incluir_vistas=false$esquema=null)
    {
        if (
is_null($esquema) && isset($this->schema)) {
            
$esquema $this->schema;
        }
        return 
$this->get_lista_tablas_bd($incluir_vistas$esquema);
    }
        
    function 
get_lista_tablas_bd($incluir_vistas=false$esquema=null)
    {
        
$sql_esquema '';
        if (! 
is_null($esquema)) {
            
$esquema $this->quote($esquema);
            if (
is_array($esquema)) {
                
$sql_esquema .= " AND schemaname IN (" .implode(',' $esquema) .")" ;
            } else {
                
$sql_esquema .= " AND schemaname= $esquema " ;
            }
        }
        
$sql "SELECT tablename as nombre,
                      schemaname as esquema
                FROM 
                    pg_tables
                WHERE 
                        tablename NOT LIKE 'pg_%'
                    AND tablename NOT LIKE 'sql_%' 
                    AND schemaname NOT LIKE 'pg_temp_%'
                    AND schemaname != 'information_schema'
                    
$sql_esquema
        "
;
        if (
$incluir_vistas) {
            
$sql .= "
                UNION
                SELECT viewname as nombre,
                        schemaname as esquema
                FROM 
                    pg_views
                WHERE 
                        viewname NOT LIKE 'pg_%'
                    AND viewname NOT LIKE 'sql_%' 
                    AND schemaname NOT LIKE 'pg_temp_%'
                    AND schemaname != 'information_schema'
                    
$sql_esquema
            "
;            
        }
        
$sql .= 'ORDER BY nombre;';
        return 
$this->consultar($sql);
    }
        
    function 
existe_tabla($schema$tabla)
    {
        
$tabla $this->quote($tabla);
        
$schema $this->quote($schema);
        
        
$sql "SELECT
                    table_name
                FROM
                    information_schema.tables
                WHERE 
                    table_name = 
$tabla AND
                    table_schema= 
$schema;";

        
$rs $this->consultar_fila($sql);
        return !empty(
$rs);
    }    
    
    
    function 
existe_columna($columna$tabla)
    {
        
$tabla $this->quote($tabla);
        
$sql "
                SELECT     a.attname as nombre
                FROM     pg_class c,
                        pg_type t,
                        pg_attribute a     
                WHERE c.relkind in ('r','v') 
                AND c.relname= 
$tabla
                AND a.attname not like '....%%'
                AND a.attnum > 0 
                AND a.atttypid = t.oid 
                AND a.attrelid = c.oid 
                ORDER BY a.attnum;        
        "
;
        foreach (
$this->consultar($sql) as $campo) {
            if (
$campo['nombre'] == $columna) {
                return 
true;
            }
        }
        return 
false;
    }
    
    function 
get_lista_secuencias($esquema=null)
    {
        
$where '';
        if (! 
is_null($esquema)) {
            
$esquema $this->quote($esquema);
            
$where .= " AND n.nspname = $esquema;            
        } elseif (isset(
$this->schema)) {
            
$esquema $this->quote($this->schema);
            
$where .= " AND n.nspname = $esquema;            
        }
        
$sql "
            SELECT 
                c.relname as tabla,
                a.attname as campo,
                replace( substring(adef.adsrc,'''[^'']*'''), '''', '' ) as nombre
            FROM
                pg_catalog.pg_attribute a 
                    LEFT JOIN pg_catalog.pg_attrdef adef ON a.attrelid=adef.adrelid AND a.attnum=adef.adnum
                    LEFT JOIN pg_catalog.pg_type t ON a.atttypid=t.oid
                    LEFT JOIN pg_catalog.pg_class c ON a.attrelid=c.oid
                    LEFT JOIN pg_catalog.pg_namespace as n ON c.relnamespace = n.oid
            WHERE
                 adsrc like '%nextval%'
                 AND a.attnum > 0 AND NOT a.attisdropped
                 
$where
            ORDER BY a.attname;
        "
;
        return 
$this->consultar($sql);
    }
    
    
/**
    *    Busca la definicion de un TABLA. Cachea los resultados por un pedido de pagina
    */
    
function get_definicion_columnas($tabla$esquema=null)
    {
        
$where '';
        if (isset(
$esquema)) {
            
$esquema $this->quote($esquema);
            
$where .= " AND n.nspname = $esquema;
        }
        if (isset(
$this->cache_metadatos[$tabla])) {
            return 
$this->cache_metadatos[$tabla];
        }
        
$tabla_sana $this->quote($tabla);
        
//1) Busco definicion
        
$sql "SELECT  a.attname as             nombre,
                        t.typname as             tipo,
                        a.attlen as             tipo_longitud,
                        a.atttypmod as             longitud,
                        format_type(a.atttypid, a.atttypmod) as tipo_sql,
                        a.attnotnull as         not_null,
                        a.atthasdef as             tiene_predeterminado,
                        d.adsrc as                 valor_predeterminado,
                        '' as                    secuencia,
                        fc.relname                as fk_tabla,
                        fa.attname                as fk_campo,                        
                        a.attnum as             orden,
                        c.relname as            tabla,
                        EXISTS (SELECT 
                                    indisprimary 
                                FROM 
                                    pg_index i INNER JOIN pg_class ic ON ic.oid = i.indexrelid AND indisprimary = TRUE 
                                WHERE 
                                    (    a.attrelid = i.indrelid 
                                     AND (i.indkey[0] = a.attnum 
                                        OR i.indkey[1] = a.attnum 
                                        OR i.indkey[2] = a.attnum 
                                        OR i.indkey[3] = a.attnum 
                                        OR i.indkey[4] = a.attnum 
                                        OR i.indkey[5] = a.attnum 
                                        OR i.indkey[6] = a.attnum 
                                        OR i.indkey[7] = a.attnum)
                                    )
                                ) as pk,
                        EXISTS (SELECT 
                                    indisunique 
                                FROM 
                                    pg_index i INNER JOIN pg_class ic ON ic.oid = i.indexrelid AND indisunique = TRUE 
                                WHERE 
                                    (     a.attrelid = i.indrelid 
                                     AND (i.indkey[0] = a.attnum 
                                        OR i.indkey[1] = a.attnum 
                                        OR i.indkey[2] = a.attnum 
                                        OR i.indkey[3] = a.attnum 
                                        OR i.indkey[4] = a.attnum 
                                        OR i.indkey[5] = a.attnum 
                                        OR i.indkey[6] = a.attnum 
                                        OR i.indkey[7] = a.attnum)
                                    )
                                ) as uk
                FROM     pg_class c,
                        pg_type t,
                        pg_namespace as n,                        
                        pg_attribute a     
                            LEFT OUTER JOIN pg_attrdef d
                                ON ( d.adrelid = a.attrelid AND d.adnum = a.attnum)
                            --- Foreign Keys
                            LEFT OUTER JOIN (pg_constraint const 
                                                INNER JOIN pg_class fc ON fc.oid = const.confrelid
                                                INNER JOIN pg_attribute fa ON (fa.attrelid = const.confrelid AND fa.attnum = const.confkey[1]
                                                                                AND const.confkey[2] IS NULL) 
                                            )
                                ON (const.conrelid = a.attrelid
                                        AND const.contype='f'
                                        AND const.conkey[1] = a.attnum
                                )
                WHERE 
                        c.relkind in ('r','v') 
                    AND c.relname=
$tabla_sana
                    AND a.attname not like '....%%'
                    AND a.attnum > 0 
                    AND a.atttypid = t.oid 
                    AND a.attrelid = c.oid 
                    AND c.relnamespace = n.oid
                        
$where
                ORDER BY a.attnum;"
;

        
$columnas $this->consultar($sql);
        if(!
$columnas){
            throw new 
toba_error("La tabla '$tabla' no existe");    
        }
        
//2) Normalizo VALORES
        
$columnas_booleanas = array('uk','pk','not_null','tiene_predeterminado');
        
        foreach(
array_keys($columnas) as $id
        {
            
//Estas columnas manejan string en vez de booleanos
            
foreach($columnas_booleanas as $x) {
                if(
$columnas[$id][$x]=='t'){
                    
$columnas[$id][$x] = true;
                }else{
                    
$columnas[$id][$x] = false;
                }
            }
            
//Tipo de datos generico
            
$columnas[$id]['tipo'] = $this->get_tipo_datos_generico($columnas[$id]['tipo']);
            
//longitudes
            //-- Si el tipo es -1 es que es 'varlena' http://www.postgresql.org/docs/7.4/static/catalog-pg-type.html
            //-- Para el caso de varchar hay que restarle 4
            
if($columnas[$id]['tipo_longitud'] <= 0){
                
$columnas[$id]['longitud'] = $columnas[$id]['longitud'] - 4;
            }
            
//-- Si es numerico(a,b) la longitud es 327680*b+a, pero para facilitar el proceso general se usa -1
            
if ($columnas[$id]['tipo'] == 'numeric') {
                
$columnas[$id]['longitud'] = -1;
            }
            
//Secuencias
            
if($columnas[$id]['tiene_predeterminado']){
                
$match = array();
                if(
preg_match("&nextval.*?(\'|\")(.*?[.]|)(.*)(\'|\")&",$columnas[$id]['valor_predeterminado'],$match)){
                    
$columnas[$id]['secuencia'] = $match[3];
                }            
            }
        }
        
$this->cache_metadatos[$tabla] = array_values($columnas);
        return 
$this->cache_metadatos[$tabla];
    }

    function 
get_semantica_valor_defecto()
    {
        return 
'DEFAULT';
    }

    
/**
     * Devuelve el nombre de la columna que es una secuencia en la tabla $tabla del schema $schema.
     * Si no se especifica el schema se utiliza el que tiene por defecto la base
     * @return string nombre de la columna si la tabla tiene secuencia. Sino devuelve null
     */
    
function get_secuencia_tabla($tabla$schema null)
    {
        
        
$result $this->get_secuencia_tablas(array($tabla), $schema);
        if (! empty(
$result)) {
            return 
$result[$tabla];
        } else {
            return 
null;
        }
    }

    function 
get_secuencia_tablas($tablas$schema null)
    {
        
$secuencias = array();
        
$tablas_usadas implode ("','" $tablas);            
        if (
is_null($schema)) {
            
$schema $this->get_schema();
        }    

        
$sql "
            SELECT column_name, table_name
            FROM information_schema.columns
            WHERE
                table_name   IN ('
$tablas_usadas')
                AND    table_schema = '
$schema'
                AND ((column_default LIKE '%seq\"''::text)::regclass)') OR (column_default LIKE '%seq''::text)::regclass)')); "
;

        
$result $this->consultar($sql);
        if (! empty(
$result)) {
            foreach(
$result as $valores) {
                
$secuencias[$valores['table_name']] = $valores['column_name'];
            }
        }
        return 
$secuencias;
    }
    
    
/**
     *  Devuelve una lista de los triggers en el esquema, segun estado, nombre y tablas.
     * @param string $schema    Nombre del schema
     * @param string $nombre    Comienzo del nombre de/los triggers
     * @param char $estado        Estado de disparo actual del trigger (O=Origen, D=Disable, A=Always, R=Replica)
     * @param array $tablas        Tablas involucradas con los triggers
     * @return array
     */
    
function get_triggers_schema($schema$nombre ''$estado 'O'$tablas = array())
    {
        
$where = array();
        
$esquema $this->quote($schema);
        
$estado $this->quote($estado);
        
$sql "  SELECT t.*, 
                         c.relname as tabla, 
                              n.nspname as schema
                FROM pg_trigger as t,
                            pg_class as c, 
                       pg_namespace as n 
                WHERE  
                      t.tgrelid = c.oid 
                      AND c.relnamespace = n.oid 
                      AND n.nspname = 
$esquema
                      AND t.tgenabled = 
$estado ";
        
        if (
trim($nombre) != '') {
            
$sql .= ' AND t.tgname ILIKE '$this->quote($nombre.'%');
        }        
        if (! empty(
$tablas)) {
            
$tablas $this->quote($tablas);
            
$sql  .= ' AND C.relname IN ('implode(','$tablas) . ')';
        }
        return 
$this->consultar($sql);
    }
    
    
//-----------------------------------------------------------------------------------
    //-- UTILIDADES PG_DUMP
    //-----------------------------------------------------------------------------------

    /**
     * Devuelve una tabla del sistema como un arreglo de INSERTS obtenida a partir
     * del pg_dump de postgres
     * @param string $bd    El nombre de la base
     * @param string $schema    El schema al que pertenece la tabla
     * @param string $tabla        La tabla a exportar
     * @param string $host        
     * @param string $usuario
     * @param string $pass
     * @return array
     */
    
function pgdump_get_tabla($bd$schema$tabla$host$usuario$pass null)
    {
        
$exito 0;
        
$comando "pg_dump  -a -i -d -t $schema.$tabla -h $host -U $usuario $bd";
        
$tabla = array();

        if (!
is_null($pass)) {
            
putenv("PGPASSWORD=$pass");
        }
        
        
exec($comando$tabla$exito);
        if (
$exito 0) {
            throw new 
toba_error("Error ejecutando pg_dump. Comando ejecutado: $comando");
        }

        
$this->pgdump_limpiar($tabla);
        return 
$tabla;
    }

    protected function 
pgdump_limpiar(&$array)
    {
        
$borrando true;

        foreach (
$array as $key => $elem) {
            if (
comienza_con($elem'INSERT')) {
                continue;
            }
            unset(
$array[$key]);
        }
    }

    
//-----------------------------------------------------------------------------------
    //-- AUDITORIA (se le pide una instancia de manejador a la base que ya sabe el motor)
    //-----------------------------------------------------------------------------------

    /**
     * Devuelve una instancia del manejador de auditoria para este motor de base de datos
     * ventana de extension en los hijos
     * @param string $schema_modelo
     * @param string $schema_auditoria
     * @param string $schema_toba
     * @return object
     */
    
function get_manejador_auditoria($schema_modelo ='public'$schema_auditoria 'public_auditoria'$schema_toba null)
    {
        return new 
toba_auditoria_tablas_postgres($this$schema_modelo$schema_auditoria$schema_toba);
    }
}
?>

:: 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.6085 ]--