Wapeando con Postgres y el respetado lenguaje C

visitas.

Al momento de iniciar la escritura de este post, me encontraba en un debate personal acerca de que compartir en esta ocasión. Teniendo un par de temas respecto a funcionalidades de los motores de base de datos como opciones para el mismo. Termino por aplazar aquel que se relaciona con la posibilidad de consumir WRAPPERS que permitan obtener datos de fuentes de datos remotas a un servidor de bases de datos POSTGRES y encapsularlos en relaciones foráneas. Tales relaciones foráneas pueden ser desde tablas que se encuentren en un motor de bases de datos distinto o incluso fuentes no relacionales como un servicio web, interfaces IMAP para correos, APIs web como la de twitter, archivos planos, etc.

En esta ocasión les comparto una funcionalidad en ocasiones oculta o desconocida para muchos de los usuarios de POSTGRES, que nos permite codificar y compilar nuestras propias funciones definidas en lenguajes como C o C++ y utilizarlas directamente desde el motor con todas las ventajas de performance que esto sugiere.

Para ilustrar esta funcionalidad generaré una librería en C con una función que permita calcular el factorial de un número y posteriormente la utilizaré desde el motor de base de datos Postgres.

Para la elaboración de la librería se hace necesario la inclusión de los archivos de cabecera "postgres.h" y "fmgr.h" que se encuentran el código fuente del motor que permitirán el uso de los tipos y estructuras de datos definidas en el motor, así como el correcto mapeo a tipos de lenguaje C. También es importante la invocación de la macro PG_MODULE_MAGIC para afinar detalles de compatibilidad en las versiones recientes del motor.


El código fuente para la función se ilustra a continuación:



Para la compilación se hace necesario el código fuente del motor, en mi caso trantándose de la versión 9.1 basta con instalar el paquete postgresql-server-dev-9.1 desde la amada y famosa terminal como sigue:



Compilamos el fuente para generar la librería compartida factorial.so haciendo uso del compilador gcc e indicando el directorio donde se encuentran los headers necesarios del código fuente de POSTGRES como se ilustra a continuación:



Lo anterior nos generará la librería factorial.so.

Finalmente definimos la función en POSTGRES conectados con un usuario con privilegios como se ilustra a continuación:



Para utilizarla ejecutamos haciendo uso de una sentencia SELECT convencional y obtenemos el resultado ilustrado:











Comentarios

  1. Te escribo, porque veo que nadie lo ha hecho, pero este post es realmente excelente.

    Dennis Ritchie estaria muy orgullosos de este post...!!!!

    ResponderBorrar
  2. Buena tarde, quisiera saber si el código fuente de c lo guarda en un archivo plano o en un archivo de texto para luego compilarlo?

    ResponderBorrar

Publicar un comentario

Entradas más populares de este blog

Un par de cuadrados para todos

Dominós para todos. Parte I.

Crocancia de cuadrados en abundancia