260 likes | 500 Views
Envolviendo la API de Firebird/Interbase. Mg. Guillermo Cherencio. CoNaIISI 2013 UTN FRC. ¿Qué es Firebird?. http://www.firebirdsql.org Base de Datos Relacional Open Source Deriva de Interbase (Borland/Inprise) PL/SQL (funciones, stored procedures, triggers, etc) Windows / Linux
E N D
Envolviendo la API de Firebird/Interbase Mg. Guillermo Cherencio CoNaIISI 2013 UTN FRC
¿Qué es Firebird? • http://www.firebirdsql.org • Base de Datos Relacional • Open Source • Deriva de Interbase (Borland/Inprise) • PL/SQL (funciones, stored procedures, triggers, etc) • Windows / Linux • Herramientas
Instalación Firebird • Artículo en http://www.grch.com.ar http://www.grch.com.ar/docs/bd/tutorial/firebird/instalacion.firebird.2.5.pdf • En Debian: $ aptitude install firebird2.5-super $ dpkg-reconfigure firebird2.5-super • Activar Servidor • Usuario administrador: sysdba/masterkey • Rol administrador: sysdb
¿Cómo uso Firebird? • C++ librería IBPP • Java driver JDBC/JCA Jaybird • PHP php_interbase.dll / php_interbase.so • Python driver FDB • . . . • C solo API C Firebird disponible !!
¿Por qué no usar API C? • Complejidad: Dificultad, Curva de Aprendizaje, Manual 442 pag., tipos de datos, estructuras poco abstractas, etc. • Clasificación de queries en 4 categorías • Portabilidad • Aislación SGBD • . . .
Solución: Envolver API • Proyecto sourceforge: libfb http://sourceforge.net/projects/libfb/ • Incluye libcgi • +Abstracción • +Aislación • +Facilidad de uso • +Tipos de datos simples • LGPL
¿Cómo utilizar libfb? • Descargar (libfb.zip): http://sourceforge.net/projects/libfb/ • Descomprimir libfb.zip: $ unzip libfb.zip • Compilar: $ make
¿Cómo utilizar libfb? (II) • Archivo de libreria estática: libfb.a • Archivo de libreria dinámica: libfb.so • Archivo de cabecera: libfb.h
¿Cómo utilizar libfb? (III) • Ejemplos de código: /libfb/examples/*.c • Base de Datos Firebird 2.5 de ejemplo: /libfb/examples/isft.fdb • Documentación html: /libfb/doc/html/index.html • Documentación latex: /libfb/doc/latex
¿Cómo utilizar libfb? (IV) • Compilar ejemplo de libfb/examples: $ gcc -Wall -o fbquery1 -I <di> -L <dl> -lfb fbquery1.c • <di> directorio en donde se encuentra libfb.h • <dl> directorio en donde se encuentra libfb.a
Instalar BD Ejemplo • Usando cuenta root • En carpeta de descarga libfb.zip: $ cp libfb/examples/isft.fdb /var/lib/firebird/2.5/data $ chown firebird:firebird /var/lib/firebird/2.5/data/isft.fdb • Arrancar Servidor Firebird sql (start/stop): $ /etc/init.d/firebird2.5-super start
Instalar BD Ejemplo • Usando cuenta root • En carpeta de descarga libfb.zip: $ cp libfb/examples/isft.fdb /var/lib/firebird/2.5/data $ chown firebird:firebird /var/lib/firebird/2.5/data/isft.fdb • Arrancar Servidor Firebird sql (start/stop): $ /etc/init.d/firebird2.5-super start
Ejecutar Ejemplos • Con usuario no root • Utilizan BD isft.fdb • Habiendo compilado en carpeta libfb/examples: $ ./fbquery1 • Salida por consola
Conexión/Desconexión • fb_db_info dbinfo; • fb_pre_connect(&dbinfo, "localhost:/.../x.fdb", “sysdba”, "masterkey", "sysdb"); • if (fb_do_connect(&dbinfo)) { • // se conecto ok! • // ****SU CONSULTA AQUI**** • fb_do_disconnect(&dbinfo); • }
Consultas en libfb • SQL • No SQL (nombre tabla/view/select procedure) • Función callback y eventos para mayor control • Resultados como lista doblemente enlazada • Nodo = tupla • Nodo con arreglo de punteros a los valores de cada campo • El usuario no requiere usar punteros
Ejemplo Consulta No SQL (I) • query *myquery; • char *squery = "Mitabla"; • if ( (myquery=fb_do_single_query(&dbinfo, squery)) != NULL ) { • printf("Recupero %d filas\n",myquery->rows); • rquery *q = myquery->top; • // ***AQUI RECUPERO TUPLAS*** • fb_free(myquery); • }
Ejemplo Recupero de tuplas (I) • ... • rquery *q; • for(q = myquery->top;q;q=q->next) • printf("[%s][%s]\n", • fb_get_col(myquery,q,0), • fb_get_col(myquery,q,1)); • ...
Ejemplo Recupero de tuplas (II) • ... • rquery *q; • for(q = myquery->top;q;q=q->next) • printf("[%s][%s]\n", • fb_get_col_byname(myquery,q,”codigo”), • fb_get_col_byname(myquery,q,”descr”)); • ...
Ejemplo Consulta SQL (I) • query myquery; • fb_init(&myquery); • if ( fb_do_query(&dbinfo,1,"SELECT ...", • OnDoGenericQuery,&myquery) ) { • // ***AQUI RECUPERO TUPLAS*** • fb_free(&myquery); • }
Ejemplo Consulta SQL (II) • query *myquery; • char *squery = "SELECT ..."; • if ( (myquery = fb_do_single_query(&dbinfo, squery)) != NULL ) { • // ***AQUI RECUPERO TUPLAS*** • fb_free(myquery); • }
Ejemplo Ejecuto Procedure (I) • char *squery = "EXECUTE PROCEDURE ...”; • query myquery; • fb_init(&myquery); • if ( fb_do_query(&dbinfo, 1, squery, onDoGenericQuery, &myquery) ) { • // ***PROC EJECUTADO OK!!*** • fb_free(&myquery); • } else { • // ***ERROR EN EJECUCION PROC !!*** • }
Ejemplo Ejecuto Procedure (II) • char *squery = "DELETE FROM ...”; • query myquery; • fb_init(&myquery); • if ( fb_do_cmd(&dbinfo, squery) ) { • // ***PROC EJECUTADO OK!!*** • fb_free(&myquery); • } else { • // ***ERROR EN EJECUCION PROC !!*** • }
Conexión, Consulta, etc (I) • char *sql = "TBL_PLANE"; • query *myquery; • if ((myquery = fb_do_connect_squery("localhost:/var/...", • "sysdba", "masterkey", "sysdb", sql)) != NULL) { • // ***AQUI RECUPERO TUPLAS*** • fb_free(myquery); • } else { • // ***ERROR !!*** • }
Otras “Features” (I) • Consultas parametrizadas ( select .. legajo = ?) • Soporte para arreglos, blob, etc. • Uso de función de callback provista por librería (onDoGenericQuery) • Uso de función de callback provista por el usuario • Manejo Errores SQL
Otras “Features” (II) • Exportación de queries a archivo • Uso de funciones para recupero de tuplas sin utilizar punteros • Info de Base de Datos / Servidor • Soporte para eventos Firebird • Log de errores • Activación/Desactivación de mensajes de error
PREGUNTAS ¿? • MUCHAS GRACIAS POR SU ATENCION!! • Mg. Guillermo Cherencio • http://www.grch.com.ar • UTN FRD – UNLu – ISFT 189