martes, 1 de enero de 2008

Almacenar direcciones IP como numero entero largo en Postgresql

La mejor forma de almacenar direcciones IP es como numero entero no solo en PostgreSQL sino en cualquier base de datos, ya que un numero entero siempre ocupara menos bytes que una cadena de caracteres.

Para nuestro ejemplo usaremos la direccion IP 189.142.115.28.

IP:189.142.115.28
Primer Octeto: 189
Segundo Octeto: 142
Tercer Octeto: 115
Cuarto Octeto: 28

El algoritmo es muy simple de implementar para nuestra fortuna y quedaria asi:

(Primer Octeto * 256³) + (Segundo Octeto * 256²) + (Tercer Octeto * 256) + (Cuarto Octeto) = Direccion IP representada con entero.

Por lo tanto sustituyendo quedaria:

(189 * 16777216) + (142 * 65536) + (115 * 256) + 28 = 3180229404

En donde 3180229404 es equivalente a 189.142.115.28.

Ahora bien la implementacion de una funcion en PostgreSQL usando SQL como lenguaje de programacion quedaria de la siguiente forma:


CREATE OR REPLACE FUNCTION inet_aton(text) RETURNS bigint AS '
SELECT
split_part($1,''.'',1)::int8*(256*256*256)+
split_part($1,''.'',2)::int8*(256*256)+
split_part($1,''.'',3)::int8*256+
split_part($1,''.'',4)::int8;
' LANGUAGE 'SQL';


Si creamos esta funcion en nuestro postgresql, una tipica salida quedaria asi:


geodb=> select inet_aton('189.142.115.28');
inet_aton
------------
3180229404
(1 row)




Implementando la funcion inet_ntoa, capaz de convertir una direccion IP en entero a su correspondiente direccion en cadena de texto.



Para lograrlo es muy simple, solo basta con desplazar los bits adecuados como se nota a simple vista en la siguiente funcion postgresql implementada en el lenguaje SQL.


CREATE OR REPLACE FUNCTION inet_ntoa(bigint) RETURNS text AS '
SELECT (($1>>24) & 255::int8) || ''.'' ||
(($1>>16) & 255::int8) || ''.'' ||
(($1>>8) & 255::int8) || ''.'' ||
($1 & 255::int8) as result
'
LANGUAGE 'SQL';


Y pues listo, eso es todo, nos vemos luego.

miércoles, 31 de octubre de 2007

Frases celebres

I wrote when I didn't know the life. Now that I understand what it means. The life can't be written, just can lived.

Oscar Wilde

El que no posee el don de maravillarse ni de entusiasmarse, más le valdría estar muerto, porque sus ojos están cerrados".

Albert Einsten


Si de nada sirve vivir, busca algo porque morir.

Fito Paez


Un pesimista es un optimista bien informado.

Jean Paul Sartre


Nunca hay viento favorable para el que no sabe hacia dónde va.

Séneca


En nuestros locos intentos renunciamos a lo que somos por lo que esperamos ser.

Shakespeare


Miremos más que somos padres de nuestro porvenir que no hijos de nuestro pasado.-

Miguel de Unamuno


El hombre esta hecho del mismo material con el que se fabrican los sueños.

Shakespeare


No hay venganza como el olvido.

Baltasar Gracián


Vengarse de una ofensa es ponerse al nivel del enemigo: perdonarlo es colocarse sobre él.

Rochefoucauld


Un acto de justicia permite cerrar un capítulo; un acto de venganza escribe un capítulo nuevo.

Marilyn Savant


El principio y el fin son una misma cosa. Los vivos y los muertos forman una sola unidad porque la vida esta permanentemente renovada por la muerte.

M. West

Bahia desde el balcon...

Bahia desde el balcon...
Ixtapa Zihuatanejo