Hola, el dia de hoy me tope con la necesidad de migrar mi servidor postgresql 8.2 instalado mediante apt-get a la version 8.3, si bien es cierto la instalacion mediante apt-get es muy simple el problema se origino cuando quise instalar el postgres 8.3.
Pues como decia primero desinstale el antiguo postgres de la siguiente manera:
apt-get remove postgresql-8.2 postgresql-common y otros.
Pues ya hecho esto instale el nuevo postgres 8.3 igual con apt-get. Los paquetes que elegi fueron:
* postgresql
* postgresql-8.3
* postgresql.client-8.3
* postgresql-client-common
* postgresql-common
* postgresql-contrib-8.3
* postgresql-doc
* postgresql-plperl-8.3
* postgresql-pltcl-8.3
* postgresql-server-dev-8.3
Y con apt-get se descargaron y al momento de instalar marco un error 2 y quedaba inconclusa la configuracion de dichos paquetes. Despues de analizar un poco el problema me di cuenta que aun existian los directorios y archivos de la anterior version 8.2, asi que procedi a borrarlos primero. Los directorios que borre fueron:
Dentro de /etc
- ./postgresql
- ./postgresql-common
y Dentro de /var/lib
- ./postgresql
Todos estos directorios pertenecian a la version 8.2 y como la 8.3 se instala en los mismos me generaba este error en la instalacion. El apt-get remove desinstalo los paquetes pero no borro los directorios que habia creado el anterior postgres ocasionando todos estos problemas.
Ya por ultimo procedi a reinstalar el postgresql 8.3 el cual se instalo sin problemas.
Tal vez el otro archivo que hay que borrar tambien es el script de inicio dentro de /etc/init.d que se llama postgresql-8.2.
Saludos y buenas noches.
El objetivo de este blog es el de hacer publicos muchos de los trucos, hacks, codigos y experiencias que he acumulado al rededor del tiempo, y claro porque no, divertirme y pasar un buen rato en compañia de ustedes.
domingo, 24 de febrero de 2008
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:
Si creamos esta funcion en nuestro postgresql, una tipica salida quedaria asi:
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.
Y pues listo, eso es todo, nos vemos luego.
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.
Suscribirse a:
Entradas (Atom)
Mis sitios web que mas visito.
Bahia desde el balcon...
Ixtapa Zihuatanejo