ODBC para Servidor de Bases de Datos PostGreSQL ( II )
Autor:
Juan Antonio Martinez Castaño
E-mail:
jantonio@drake.dit.upm.es
- Presentación
- Introducción
- Un primer paseo por el API ODBC
- El API ODBC en Linux
- Un Ejemplo práctico: PHP-3.0.1
- Conclusiones
- Referencias
Presentación
Continuando con la serie sobre ODBC para Linux, describimos en este
artículo la instalación de los diversos drivers del API ODBC
en nuestro sistema operativo favorito, Presentando como ejemplo de
aplicación el complemento ideal de todo gestor de bases de datos:
PHP-3.0.1
Introducción
Antes de emprender la instalación de ODBC es preciso aclarar algunos
conceptos de funcionamiento del API de ODBC.
Como explicamos en el número anterior de Linux Actual, ODBC es
un API de interfaz entre clientes de bases de datos y servidores de bases
de datos. La figura 1 ilustra este esquema:
|
figura 1: Estructura en capas del API ODBC
|
La primera capa constituye la librería del API que utilizan las
diversas aplicaciones que "hablan" ODBC. Microsoft proporciona para sus
sistemas el fichero ODBC32.DLL, que contienen el API y el interfaz
con el sistema operativo, permitiendo a los desarrolladores de controladores
ODBC incluír dicha librería en sus distribuciones ( de la
misma manera que para la DLL de controles Visual Basic VBRUN.DLL ). Para
sistemas UNIX, el proyecto FreeODBC, ha desarrollado su propia librería
GPL libodbc.so.x.x que es totalmente compatible con las especificaciones
descritas por Microsoft
El administrador de orígenes de datos es el responsable del "rutado" de
peticiones de ODBC desde la librería hasta los controladores. Para ello
se discriminan tres tipos de orígenes de datos: de usuario, de archivo
y de sistema. Esta nomenclatura es motivo frecuente de confusión: cuando
desde Windows se abre desde el panel de control el menú de
"controladores ODBC" se encuentra con esta clasificación, y cuando
abre cada una de las ventanas se encuentra con los mismos contenidos...
Vamos a explicarlo un poco:
- Los orígenes de datos de usuario, realmente se refieren a las
operaciones que realiza el usuario con su base de datos desde la
aplicación nativa para la que han sido desarrollados, y sin
realizar ningún tipo de compartición con otros usuarios. En
cristiano: cuando se trabaja con MS-Access, y no compartes la base de
datos ( en UNIX y en Win-NT esta disgresión tiene sentido;
en Win95 es cuando menos discutible )
- Cuando se comparte la base de datos mediante un servidor de ficheros
compartiendo físicamente los datos almacenados en un fichero
determinado hablamos de orígenes de datos de archivo. Este
método permite, por ejemplo a un usuario de dBase manejar una
database de MS-Access, o bien que varios usuarios puedan compartir
una misma database
- Cuando no se comparte un fichero, sino que se trabaja con la database a
través de un sistema cliente-servidor, hablamos de un origen de
datos de sistema.
- Las aplicaciones ofimáticas mas comunes, ofrecen drivers para
orígenes de datos de usuario y de archivo, para permitir a los
usuarios el poder trabajar, importar y exportar datos entre diversas
aplicaciones de gestión. Las aplicaciones de servidores de bases
de datos, por contra, proporcionan drivers para orígenes de datos
de sistema
PostODBC y los drivers de PostGreSQL para iODBC pertenecen a
esta última categoría
Por último, cada origen de datos tiene asociado un controlador,
que actúa de "pasarela" entre el API y el acceso físico a
los datos
En el CD-Rom que acompaña a este número de la revista se incluyen
bajo el directorio iODBC-1.0 los ficheros correspondientes a la libreria
ODBC para Linux, y los drivers ODBC para PostGreSQL y MySQL
bajo Linux. Descomprimamos el paquete, y echemos un vistazo a los ficheros
odbc_types.h y odbc_funcs.h. Estos ficheros constiuyen el el
interfaz del API ODBC tal como ha sido definido por Microsoft y definen la
lista de funciones y definiciones que todo driver ODBC debe cumplir ( bien
totalmente o en parte, en función del nivel de conformidad del driver )
Del mismo modo, descomprimiendo los ficheros de la librería iODBC, se
obtienen los ficheros isql.h e isqlext.h que contienen las
definiciones de tipos de datos y los codigos de las diversas llamadas a la
librería del API ODBC.
Podemos observar que el API ODBC no es sino una llamada a una función
de entrada, en la que, dependiendo de los parámetros especificados
se realizan unas u otras funciones. Se observa una correspondencia casi
lineal entre los códigos de entrada del API ODBC y las funciones
definidas para el driver PostGreSQL. Esta correspondencia, que en Linux/UNIX
es lineal, en sistemas MS-Windows "atraviesa" el sistema operativo (?) donde el
administrador de orígenes de datos redirecciona las peticiones a los
diferentes drivers instalados.
En cambio, en Linux/UNIX, la misión del administrador de
orígenes de datos es realizada por la propia librería. Existe
para ello un fichero iodbc.ini donde se le especifican los drivers
y los modos de acceso. ¿ Cómo se realiza la conexión entre
el API y el driver?. Mediante un sistema de "dynamic loading" de los diversos
drivers de cada gestor de base de datos, en función de las
especificaciones del fichero iodbc.ini
Llegados a este punto preguntamos: ¿Cómo funciona de cara al programador
la librería ODBC?. La respuesta es ridículamente sencilla:
el API ODBC consiste en un interfaz que implementa un método de
pasar peticiones en lenguaje SQL a través de una serie de funciones.
Con ODBC podemos:
- Obtener un puntero de descripción del entorno de programacion
( algo parecido al XOpenDisplay() de X-Windows )
- Crear punteros de conexión, especificando origen de datos y
controlador
- Efectuar conexiones con la database (en nuestro lenguaje: abrir un socket)
- Crear punteros de peticiones SQL ( básicamente, obtener
estructuras de datos que nos permitan insertar nuestras peticiones )
- Ejecutar peticiones sobre la base de datos
- Recoger resultados de nuestras peticiones
- Liberar y cerrar todos los recursos previamente asignados
En la práctica, ni todas las aplicaciones, ni todos los controladores de
orígenes de datos son capaces de gestionar todas las funcionalidades
previstas por el API. Por ello se establecen los denominados "niveles de
conformidad SQL" en la aplicación así como "niveles de
conformidad del controlador", que permiten al administrador de orígenes
de datos saber qué puede hacer tanto con el driver como con la
aplicación.
Remitimos al lector a la literatura indicada en las referencias para
buscar las especificaciones y descripciones de cada nivel de compatibilidad
El proyecto FreeODBC ha desarrollado una librería, denominada
iODBC, que cumple con las especificaciones del API ODBC 2.0 de Microsoft,
y que integra las funciones de API y de administrador de orígenes
de datos.
|
---|
| | |
¿Cómo se aplica ésto en sistemas UNIX? El proyecto
FreeODBC ha desarrollado una librería, denominada iODBC, que
cumple con las especificaciones del API ODBC 2.0 de Microsoft, y que integra
las funciones de API y de administrador de orígenes de datos. Cada
servidor de bases de datos provee un driver que hace las funciones de
controlador de orígenes de datos y de origen de datos de sistema
específico de cada servidor de bases de datos.
Existe un fichero ${HOME}/.iodbc.ini, que indica a la librería
libodbc.so.x.x, los controladores de que dispone cada sistema, y
cómo se accede a ellos. Todo el interfaz esta implementado mediante
librerías dinámicas. El resultado de todo esto, es que el
programador se encuentra con un API virtualmente idéntico al que se
encontraría si estuviera trabajando en una maquina M$-Windows
En el CD-Rom que se acompaña a esta revista, bajo el directorio
odbc/ encontramos el fichero iODBC-1.0.tgz, que contiene:
- iodbc-2.12 Código fuente de la librería
del API de ODBC para UNIX proveniente del Proyecto FreeODBC
- pgodbc-0.06 Código fuente del driver UNIX para
conectar el API iODBC con el servidor PostGreSQL
- myodbc-2.50.17 Código fuente del driver UNIX para
conectar el API iODBC con MySQL
Su instalación es realmente sencilla, pues basta seguir las
instrucciones para tener las librerías libpgodbc.so, libmyodbc.so y
libiodbc.so compiladas. Unicamente se deberá tener presente el
instalar los ficheros include y las librerías de manera que
sean accesibles por el resto de las aplicaciones, ( por ejemplo en
/usr/local/lib y /usr/local/include ), y modificar el fichero
/etc/ld.so.conf para que el comando ldconfig localice dichas
librerías y las incluya en el caché
Navegando por el Web, podremos encontrar drivers de iODBC para casi
todas las bases de datos disponibles en Linux.
|
| | |
Buceando por las paginas web, podremos encontrar drivers de iODBC para casi
todas las bases de datos disponibles en Linux. De hecho, Los desarrolladores
de iODBC han decidido incluír en sus nuevas releases todos los drivers
de aquellas bases de datos que libremente los provean, incluyendo además
de serie la pasarela JDBC-ODBC.
Para que nuestro servidor de bases de datos esté completo nos falta un
componente imprescindible en todo servidor de información: el poder
hacer consultas a la base de datos desde el Web. Para ello Linux dispone de
la herramienta ideal: PHP
PHP es un lenguaje de scripting con sintaxis tipo C, orientado a la
generación de páginas Web. Al igual que Perl, puede ser invocado
como un CGI script desde el servidor, o bien, insertado en documentos HTML
mediante cláusulas <?php..... ?>. Estas tags son detectadas por el
servidor web, que las "intercepta" y transfiere al programa PHP que las
interpreta, dando por su salida estandard el código HTML que el
programador desea
Asímismo, PHP es capaz de tomar y procesar los parámetros
procedentes de un FORM, convirtiéndolos directamente a variables del
lenguaje, que pueden ser utilizadas a voluntad.
La característica de PHP que nos interesa, es que tiene soporte
directo de funciones de acceso a las diversas bases de datos existentes para
Linux, incluyendo -cómo no- a PostGreSQL, y a ODBC.
PHP es un lenguaje de scripting con sintaxis tipo C, orientado a la
generación de páginas Web.
|
---|
| | |
A la hora de instalarlo en nuestro sistema deberemos decidir:
- Si lo vamos a instalar como programa independiente ( al estilo Perl )
o como módulo cargable desde el servidor Apache. Esta última
opción es la más recomendable, pero tiene el inconveniente de
requerir la recompilación del servidor Apache.
- Las funcionalidades y lista de servidores de bases de datos soportados.
En relación con nuestra serie de artículos podemos seleccionar:
- Soporte para PostGreSQL
- Soporte para acceso al driver ODBC
- Soporte para acceso a través de la librería iODBC
- Deberemos también especificar los diversos parámetros de
funcionamiento: safe-mode, ejecución paralela, utilidades de
compresión/descompresión, utilidades gráficas,
modos de funcionamiento, etc.
En el Listado 1 se indican las funciones ODBC que soporta PHP, así
como sus parámetros. Del mismo modo, en el CD-Rom bajo el directorio
listados se incluyen una serie de ejemplos de paginas web con
extensiones php ( ficheros .pthml ) que ilustran el manejo de php con
accesos a la base de datos que se creó de ejemplo en el artículo
anterior
Unified ODBC Functions
- (int) odbc_autocommit($connection_id, $OnOff)
- (void) odbc_close($connection_id)
- (void) odbc_close_all(void)
- (int) odbc_commit($connection_id)
- (int) odbc_connect($dsn, $user, $password)
- (int) odbc_pconnect($dsn, $user, $password)
- (string) odbc_cursor($result_id)
- (int) odbc_do($connection_id, $query_string)
- (int) odbc_exec($connection_id, $query_string)
- (int) odbc_prepare($connection_id, $query_string)
- (int) odbc_execute($result_id, $array)
- (int) odbc_fetch_row($result_id, $row_number)
- (int) odbc_fetch_into($result_id, $row_number, $array_ptr)
- (int) odbc_field_len($result_id, $field_number)
- (string) odbc_field_name($result_id, $field_number)
- (string) odbc_field_type($result_id, $field)
- (int) odbc_free_result($result_id)
- (int) odbc_num_fields($result_id)
- (int) odbc_num_rows($result_id)
- (string) odbc_result($result_id, $field)
- (int) odbc_result_all($result_id, $format)
- (int) odbc_rollback($connection_id)
|
Listado 1: Funciones ODBC soportadas por PHP |
Remitimos al lector al manual para proceder a la instalación.
Es algo complicado, y normalmente implica una recompilación del servidor
Apache, pero los resultados compensan con creces el esfuerzo dedicado.
Prestemos atención a como PHP implementa las diversas funciones de
llamada al API ODBC o al driver ODBC que tengamos instalado. Para ello echemos
un vistazo al fichero functions/unified_odbc.c . En el se enumeran
todas y cada una de las funciones del API ODBC, y se efectúa una
translación entre las funciones PHP y las funciones equivalentes del
API. En función de los parámetros de configuración
indicados en el momento de la compilación, PHP utilizará
bien el API iODBC, o bien accederá directamente al driver ODBC del
servidor de bases de datos que tengamos instalado. Esta última
configuración tiene un inconveniente: impide que podamos tener
varios servidores que hablen ODBC accesibles desde el servidor Web. En
un primer momento, esto puede parecer que no tiene sentido, pero
piénsese que iODBC permite el uso de varios servidores de bases
de datos simultaneamente, por lo que podríamos utilizar la
librería como un "túnel" de acceso a un servidor de databases
remoto que careciera de servidor web...
En este segundo artículo dedicado a la conectividad ODBC, se han
introducido los conceptos básicos de dicho sistema. Asimismo hemos
aprendido a instalar y configurar los drivers ODBC para PostGreSQL y
las librerías ODBC para Linux/UNIX, poniendo como ejemplo de
aplicación el interfaz web de acceso a base de datos PHP
En el próximo número de Linux Actual,
finalizaremos la serie sobre ODBC, explicando la forma en que debemos instalar
los drivers ODBC para PostGreSQL en sistemas Microsoft Windows-3.XX
y Windows-95, con ejemplos de utilización desde MS-Access-97.
- PostGreSQL:
http://www.postgresql.org
http://postgres95.vnet.net
- Apache:
http://www.apache.org
- PHP:
http://www.php3.org
- Referencias sobre SQL:
- "The Practical SQL handbook" Bowman, Emerson y Damovsky
ISBN 0-201-44787-8 Addison-Wesley 1997
- "A guide to the SQL Standard" Date y Darwen
ISBN 0-201-96426-0 Addison-Wesley 1997
- PostGreSQL ODBC:
http://www.magenet.com/postodbc
http://postgres95.vnet.net/postodbc
- iODBC:
"The FreeODBC Pages" http://users.ids.net/~bjepson/freeODBC/
- ODBC y JDBC:
"Gestion de Bases de Datos en Internet" Framiñan y León
ISBN 84-415-0208-0 Anaya Multimedia