Prólogo

MySQL MySQL es una marca registrada por MySQL AB. Parte del material que se expone aquí, concretamente las referencias de funciones del API de MySQL y de la sintaxis de SQL, son traducciones del manual original de MySQL que se puede encontrar en inglés en www.mysql.com.

Este sitio está desarrollado exclusivamente por los componentes de Con Clase, cualquier error en la presente documentación es sólo culpa nuestra.

Por otra parte, MySQL AB fue adquirida por Sun Microsystems en 2008, y ésta a su vez fue comprada por Oracle Corporation en 2010, sigue siendo de código abierto, y tiene licencia dual, pero posee derechos de copia para la mayor parte de su código.

Existe otro motor de base de datos, MariaDB, derivado de MySQL con licencia GPL. Toda la documentación que aparece en Con Clase es válida para ambos motores, y puedes usar cualquiera de ellos indistintamente.

Introducción

El presente manual trata sobre la integración de bases de datos MySQL dentro de aplicaciones C y C++. Para ello nos limitaremos a explicar algunas de las funciones y estructuras del API de MySQL y al modo en que estas se combinan para crear programas que trabajen con bases de datos.

Se supone que el lector de este documento ya tiene conocimientos sobre diseño de bases de datos y sobre el lenguaje de consulta SQL. De todos modos, en Con Clase también se incluye un curso sobre estos temas, al que se puede acceder desde MySQL con Clase.

También supondremos que trabajamos en un sistema que tiene instalado el servidor MySQL. Se puede consultar la documentación en la página de MySQL para obtener detalles sobre el modo de instalar este servidor en distintos sistemas operativos.

Instalación de bibliotecas para Dev-C++

Lo que sí necesitamos es, por supuesto, un compilador de C/C++. Los ejemplos que aparecen en este curso están escritos en C++, pero usaremos el API C, de modo que las estructuras de los programas deben ser fácilmente adaptables a código C.

Nota:

Aunque existe un API C++, que encapsula el API C de MySQL, de momento no se incluye documentación sobre él en este curso.

Siguiendo lo que ya es una tradición en Con Clase usaremos el compilador Mingw y el entorno de desarrollo Dev-C++ para crear nuestros programas de ejemplo. En este entorno se puede descargar un paquete para usar el API de MySQL. Veamos cómo hacerlo paso a paso:

  1. Usar la opción Ayuda->Sobre..., se mostrará este cuadro de diálogo:
  2. Diálogo sobre
    Diálogo sobre

  3. Pulsar el botón "Buscar actualizaciones", se mostrará el cuadro de diálogo de actualizaciones:
  4. Diálogo de actualización
    Diálogo de actualización

  5. Pulsar el botón "Check for updates". Se leerá una lista de los paquetes disponibles.
  6. Seleccionar el paquete MySQL y pulsar el botón "Download selected":
  7. Opción de MySQL
    Activar opción MySQL

  8. Se descargará el paquete desde Internet, y aparecerá este mensaje: "The updates you selected have been downloaded. Now they will be installed.", es decir, que se han descargado las actualizaciones y se procederá a instalarlas. Pulsamos "Ok".
  9. Se abrirá otra ventana, con el "Installation Wizard", pulsamos "Install>":
  10. Installation Wizard
    Installation Wizard

  11. Cuando termine la instalación pulsamos "Finish", y se cerrará el "Installation Wizard".

Ahora tendremos un subdirectorio MySQL bajo el directorio include de Dev-C++, que contendrá los ficheros de cabecera ".h". En el directorio lib de Dev-C++ se habrán copiado los ficheros "libmySQL.a" y "libmySQL.def". Y en el directorio de examples de Dev-C++ habrá una carpeta con un proyecto de ejemplo MySQLClientTest, (que no funcionará :-), aunque esto no debe preocuparnos, ya que tampoco lo vamos a necesitar).

Usar ficheros incluidos con MySQL

Pero en realidad, aunque esto funcione, lo cierto es que junto con la instalación del servidor MySQL ya existen los ficheros de cabecera y las bibliotecas necesarias para usar MySQL en nuestros programas C/C++.

El método que vamos a explicar tiene la ventaja de que usaremos las bibliotecas adecuadas para la versión de MySQL que tenemos instalada. Si usamos el método del paquete de Dev-C++ probablemente estaremos usando bibliotecas de una versión anterior. Además, funciona con cualquier IDE que use como compilador MinGW, como por ejemplo, Code::Blocks.

Los ficheros de cabecera están en el directorio include dentro del directorio de instalación de MySQL, que dependerá de dónde lo hayas instalado. Esos ficheros pueden ser copiados al directorio a un directorio mysql dentro del directorio include de Dev-C++, o en su caso, en la carpeta include de MinGW.

Además, en el directorio lib\opt de MySQL existen varios ficheros de biblioteca, y una biblioteca de enlace dinámico libmysql.dll. Copiaremos esta biblioteca a un directorio donde sea accesible, por ejemplo al directorio system32 de Windows.

De los ficheros de bibliotecas estáticas sólo nos interesa uno: libmysql.lib.

Pero Mingw no puede usar esa biblioteca directamente. Este compilador usa otro formato de bibliotecas estáticas, que además de tener la extensión ".a", tienen un formato interno diferente. Deberemos, por lo tanto, convertir la biblioteca al formato adecuado.

Para poder hacerlo necesitamos los siguientes ficheros:

  • El fichero de biblioteca dinámica "dll": libmysql.dll.
  • El fichero de biblioteca estática "lib": libmysql.lib.
  • El fichero de definición de biblioteca "def": libmysql.def.

Y estas tres utilidades:

  • Utilidad reimp.exe.
  • Utilidad dlltool.exe.
  • Utilidad as.exe.

Los dos primeros ficheros ya los tenemos, los encontraremos en el directorio lib\opt de modo que para trabajar más fácilmente, los copiaremos a un directorio temporal de trabajo, por ejemplo, C:\mysqltmp\.

Para obtener el tercero necesitamos una utilidad de Mingw llamada reimp. Esta utilidad sirve para extraer ficheros de definición de bibliotecas "lib".

Para conseguir la herramienta reimp hay que descargar el fichero Utilidades mingw, que contiene algunas utilidades, pero del que sólo nos interesa el fichero reimp.exe.

Nota:

Por lo que he podido comprobar, las últimas versiones de MinGW incluyen el programa reimp.exe en la carpeta "bin". Por otra parte, las últimas versiones de MySQL, también contienen el fichero "libmysql.def" en la carpeta "include", pero no se puede utilizar porque el formato interno no es adecuado para nuestros propósitos.

Copiaremos el fichero reimp.exe al directorio de trabajo temporal, y ejecutamos esta sentencia desde la línea de comandos:

C:\mysqltmp> reimp -d libmysql.lib

Esto genera el fichero libmysql.def. El siguiente paso es crear el fichero de biblioteca estática libmysql.a. Para ello necesitamos las otras dos utilidades, dlltool.exe y as.exe que están incluidan con el compilador Mingw, y que podemos encontrar en el subdirectorio mingw32\bin del directorio donde esté instalado Dev-C++ o Code::Blocks. Para comodidad, copiaremos estas utilidades al directorio temporal de trabajo, y ejecutaremos la siguiente sentencia desde la línea de comandos:

C:\mysqltmp>dlltool -d libmysql.def -D libmysql.dll -k -l libmysql.a -S ./as.exe

La utilidad as.exe se invoca automáticamente desde dlltool. Ahora ya tenemos nuestro fichero de biblioteca estática libmysql.a, y lo copiaremos al directorio lib de Dev-C++.

Por último, podemos borrar el directorio de trabajo temporal. Y ya podemos usar bases de datos desde programas C/C++.

Este proceso es válido para convertir cualquier biblioteca en formato "lib" a su equivalente en formato "a".

Usar bibliotecas desde otros compiladores

No lo he verificado, pero es de suponer que otros compiladores usarán, o bien las bibliotecas estáticas con extensión "a" si se basan en Mingw, o las que tienen extensión "lib", como los compiladores de Borland o Microsoft.

En cualquier caso, si quieres compartir tus experiencias en estos compiladores con nosotros, podremos ampliar este apartado.