martes, 31 de agosto de 2010

PostgreSQL: funcion para reemplazar substring

Referencia

La funcion overlay(string placing string from int [for int]) retorna un dato tipo TEXT y reeplaza parte de una cadena...

ejemplo de la funcion:
select overlay('Txxxxas' placing 'hom' from 2 for 4)

En la funcion overlay indicas el inicio de la cadena a reemplazar y la cantidad de caracteres q eliminaras de la cadena original, no importa si la subcadena nueva contenga la misma cantidad de caracteres. en el ejemplo se elimina desde el caracter 2, 4 caracteres 'xxxx' y se reeplaza con 'hom' 3 caracteres.. y el resultado es: Thomas

Tambien existe la funcion replace(string text, from text, to text) que reemplaza las ocurrencias de una cadena en otra por otra cadena

ejemplo de la funcion:

select replace('abcdefabcdef', 'cd', 'XYZ')
y el resultado es 'abXYZefabXYZef'

lunes, 30 de agosto de 2010

SVN: eliminar los archivos .svn el proyecto

Este comando lo paso un amigo hace un tiempo... el comando busca los archivos .svn y los elimina.. muy util para subir proyectos al SVN que antes estaban en otro SVN, claro, suponiendo q ya no eliminaste los archivos .svn desde el IDE (ej. eclipse)

Debes entrar en la carpeta y luego ejecutar el comando y listo!

$ cd /var/www/proy
$ find . -name .svn -print0 | xargs -0 rm -rf

Comando Linux: Diff - para comparar archivos -

Es invocado desde la línea de comando con los nombres de dos archivos: diff original new. El resultado del comando representa los cambios requeridos para hacer que el archivo original se convierta en el nuevo archivo.
Si original y nuevo son directorios, entonces diff se ejecutará sobre cada archivo que exista en ambos directorios. Una opción, -r, hará que cualesquiera subdirectorios emparejados comparen archivos entre directorios.


$ diff original.txt nuevo.txt 
 y tambien puedes utilizar

$ diff -e original.txt nuevo.txt

domingo, 29 de agosto de 2010

PostgreSQL: Funcion que convierte un numero a texto

La siguiente funcion esta escrita en plpgsql y retorna un cadena de texto correspondiente a un numero que se pasa por parametro, la funcion devuelve hasta un maximo de 999999999,99
Esta funcion la saque de un foro hace un tiempo ya, la tenia en alguna BD de prueba y para no perderla... pues la coloco aqui..

-- DROP FUNCTION f_convnl(numeric);

CREATE OR REPLACE FUNCTION f_convnl(num numeric)
  RETURNS character varying AS
$BODY$
-- Función que devuelve la cadena de texto en castellano que corresponde a un número.
-- Parámetros: número con 2 decimales, máximo 999999999,99.

 
DECLARE 
 d VARCHAR[];
 f VARCHAR[];

 g VARCHAR[];
 numt VARCHAR;
 txt VARCHAR;

 a INTEGER;
 a1 INTEGER;
 a2 INTEGER;
 n INTEGER;

 p INTEGER;
 negativo BOOLEAN;
BEGIN
 -- Máximo 999.999.999,99

 IF num > 999999999.99 THEN
  RETURN '---';

 END IF;
 txt = '';
 d = ARRAY[' un',' dos',' tres',' cuatro',' cinco',' seis',' siete',' ocho',' nueve',' diez',' once',' doce',' trece',' catorce',' quince',

  ' dieciseis',' diecisiete',' dieciocho',' diecinueve',' veinte',' veintiun',' veintidos', ' veintitres', ' veinticuatro', ' veinticinco',

  ' veintiseis',' veintisiete',' veintiocho',' veintinueve'];

 f = ARRAY ['','',' treinta',' cuarenta',' cincuenta',' sesenta',' setenta',' ochenta', ' noventa'];

 g= ARRAY [' ciento',' doscientos',' trescientos',' cuatrocientos',' quinientos',' seiscientos',' setecientos',' ochocientos',' novecientos'];

 numt = LPAD((num::numeric(12,2))::text,12,'0');

 IF strpos(numt,'-') > 0 THEN

    negativo = TRUE;
 ELSE
    negativo = FALSE;

 END IF;
 numt = TRANSLATE(numt,'-','0');

 numt = TRANSLATE(numt,'.,','');

 -- Trato 4 grupos: millones, miles, unidades y decimales
 p = 1;
 FOR i IN 1..4 LOOP

  IF i < 4 THEN
   n = substring(numt::text FROM p FOR 3);

  ELSE
   n = substring(numt::text FROM p FOR 2);

  END IF;
  p = p + 3;
  IF i = 4 THEN

   IF txt = '' THEN
    txt = ' cero';

   END IF;
   IF n > 0 THEN
   -- Empieza con los decimales

    txt = txt || ' con';
   END IF;

  END IF;
  -- Centenas 
  IF n > 99 THEN

   a = substring(n::text FROM 1 FOR 1);

   a1 = substring(n::text FROM 2 FOR 2);

   IF a = 1 THEN
    IF a1 = 0 THEN

     txt = txt || ' cien';
    ELSE
     txt = txt || ' ciento';

    END IF;
   ELSE
    txt = txt || g[a];

   END IF;
  ELSE
   a1 = n;
  END IF;

  -- Decenas
  a = a1;
  IF a > 0 THEN

   IF a < 30 THEN
    IF a = 21 AND (i = 3 OR i = 4) THEN

     txt = txt || ' veintiuno';
    ELSIF n = 1 AND i = 2 THEN

     txt = txt; 
    ELSIF a = 1 AND (i = 3 OR i = 4)THEN

     txt = txt || ' uno';
    ELSE
     txt = txt || d[a];

    END IF;
   ELSE
    a1 = substring(a::text FROM 1 FOR 1);

    a2 = substring(a::text FROM 2 FOR 1);

    IF a2 = 1 AND (i = 3 OR i = 4) THEN

      txt = txt || f[a1] || ' y' || ' uno';

    ELSE
     IF a2 <> 0 THEN
      txt = txt || f[a1] || ' y' || d[a2];

     ELSE
      txt = txt || f[a1];
     END IF;

    END IF;
   END IF;
  END IF;

  IF n > 0 THEN
   IF i = 1 THEN

    IF n = 1 THEN
     txt = txt || ' millón';

    ELSE
     txt = txt || ' millones';
    END IF;

   ELSIF i = 2 THEN
    txt = txt || ' mil';

   END IF;  
  END IF;
 END LOOP;

 txt = LTRIM(txt);
 IF negativo = TRUE THEN

    txt= '-' || txt;
 END IF;
    RETURN txt;

END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION f_convnl(numeric) OWNER TO u_test;

viernes, 27 de agosto de 2010

PostgreSQL: Lenguajes procedimentales

Los lenguajes procedimentales son utilizados para realizar funciones complejas e base de datos, Postgres al igual q SQLServer, Oracle y otros posee lenguajes procedimentales, a mi parecer mucho mejor q SQLServer por q no solo tienes que diseñar tus funciones con el lenguaje por defecto, si no q tambien los creas con diferentes lenguajes:
plruby , pljava , plproxy , plperl, C y creo q otros....

El nativo de postgres plpgsql.

Para instalar leguajes procedimentales en postgres:

plpgsql es el lenguaje procedimental de postgres por defecto, para instalarlo se ejecuta el siguiente comando como el usuario postgres:
# su - postgres
$ psql data_db
data_db=# CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql;

para otro tipo de lenguajes como C o Perl debes buscar el paquete e instalarlo como el usuario root:
# aptitude search plperl
# aptitude install postgresql-plperl-8.3

cambias al usuario postgres y creas el lenguaje
# su - postgres
$ psql data_db
data_db=# CREATE TRUSTED PROCEDURAL LANGUAGE plperl;

Listo!

lunes, 23 de agosto de 2010

PostgreSQL: DBlink, conexion entre bases de datos postgres

DBlink consta de un conjunto de funciones diseñadas para realizar conexiones entre bases de datos Postgres, en el mismo server o en otros.. lo que se necesita es instalar DBlink en el servidor que hace la peticion..
Para implementar esto debes instalar el paquete contrib de la version que usas de postres
# aptitude install postgresql-contrib-8.3
el contrib de postgres provee una serie de funciones muy utiles para desarrolladores y administradores.
Para instalar la funcion en tu BD debes ser el usuario postgres y por lineas de comando:
$ cd /usr/share/postgresql/8.3/contrib
$ psql test_db u_test -h localhost < dblink.sql
Te conectas a la BD que tiene instalado el DBlink y realizas la consulta
$ psql test_db u_test -h localhost
La idea es trear datos de la BD my_db que esta en el servidor 191.168.50.90 y mostrarlos en la conexion establecida en test_db en localhost
test_db=# select * from
dblink ('dbname=my_db hostaddr=191.168.50.90 user=u_test password=123456 port=5432',
'select id,descripcion from tabla')  as t1(id int4,descripcion text); 

Listo!

miércoles, 4 de agosto de 2010

PostgreSQL: Postgresql-autodoc

postgresql_autodoc:
varios tipos de archivo a partir de una bd postgresql para la documentacion de de la base de datos..
archivos que genera:
    .dia .htm .xml .dot (a partir de este archivo se genera un .png del diagrama) y otros....

Instalacion
# aptitude install postgresql-autodoc
# aptitude install dia
# aptitude install GraphViz

Opciones de uso:
$ postgresql_autodoc--help

Para generar los documentos:
$ postgresql_autodoc -d Nomb_BD -f /ruta_destino/Nombre_BD -h localhost -u usuario_db --password=pass_db

    -d = base de datos
    -f = archivo destino y el prefijo de los archivos generados
              se generan archivos como:
                           /ruta_destino/Nombre_BD.dia
                           /ruta_destino/Nombre_BD.html
                           .....
               ...
    -h = host de la bd
    -u = usuario
    --password= =password de bd

Luego para generar una imagen .png apartir del documento .dot generado con postgresql_autodoc ejecutamos el siguiente comando
$ dot -Tpng -o /ruta_destino/output.png /ruta_destino/Nombre_BD.dot

PHP: Problemas de apache2 al interpretar PHP5

En algunas oportunidades me he visto en la necesidad de configurar ambientes de desarrollo en diferentes maquinas.. algunas veces todo va muy bien otras no tanto.. en particular al instalar apache2 y php5 en algunas ocaciones (no se en realidad el por que de esto) apache no interpreta en php y el navegador lanza una ventanita diciendo algo asi como descargar archivo.php.. para solucionar esto edita el archivo apache2.conf:

# vim /etc/apache2/apache2.conf
Al final del archivo colocas los siguiente:
LoadModule php5_module modules/libphp5.so

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

Luego solo reiniciamos el servicio

# /etc/init.d/apache2 restart