Prólogo

SQLite SQLite es una biblioteca que implementa en sí misma, sin servidor, y sin necesidad de configuración, un motor de base de datos SQL transicional. El código de SQLite es de dominio público y por lo tanto libre para usarlo para cualquier propósito, comercial o privado.

Introducción

El presente manual trata sobre la integración de bases de datos SQLite dentro de aplicaciones C y C++. Para ello nos limitaremos a explicar algunas de las funciones y estructuras del API de SQLite 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.

Instalación de bibliotecas para entornos de programación basados en GCC

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.

Siguiendo lo que ya es una tradición en Con Clase usaremos el compilador Mingw y el entorno de desarrollo Dev-C++, Code::Blocks o ZinjaI para crear nuestros programas de ejemplo.

Paquetes a instalar

En la sección de descargas de SQLite existen varios paquetes, aunque no todos serán necesarios para poder trabajar con este motor de bases de datos, necesitaremos descargar algunos de ellos:

  • sqlite-amalgamation-x_y_z.zip: donde las letras 'x', 'y' y 'z' indican la versión de la librería. (Mientras escribo esto, la versión es 3.7.3). De este zip necesitaremos los siguientes ficheros:
    • sqlite3.h: fichero de cabecera para incluir en nuestros programas.
    • sqlite3.def: fichero de definición, contiene una lista de las funciones incluidas en la biblioteca.
  • sqlite-amalgamation-x.y.z.tar.gz: se trata de los mismos contenidos, pero orientados a sistemas UNIX y LINUX.
  • sqlite-x_y_z.zip: programa de línea de comandos para Windows, que nos permite acceder y modificar bases de datos.
  • sqlite3-x.y.z.bin.gz: el mismo programa, para entornos Linux.
  • sqlitedll-x_y_z.zip: contiene una DLL con las funciones necesarias para ejecutar SQLite, además del fichero sqlite3.def.
  • sqlite-x.y.z.so.gz: contiene la librería compartida precompilada para ejecutar SQLite, necesaria en Linux.

Ni que decir tiene que sólo necesitaremos los paquetes que conciernan al sistema operativo que estemos usando.

La DLL podremos mantenerla en la misma carpeta que los ficheros ejecutables que vayamos creando, y deberemos redistribuirla junto con ellos. También se puede copiar a una carpeta a la que se tenga acceso desde el sistema (que esté incluida en el PATH), por ejemplo, "system32".

El fichero sqlite3.h deberá estar en la carpeta include del compilador. En nuestros ejemplos supondremos que está en la carpeta include/sqlite3.

El programa en línea de comandos puede estar en cualquier sitio, y lo usaremos para acceder a las bases de datos desde fuera de los programas, de modo que podemos crear tablas, modificarlas, o trabajar con los datos que contienen. Funciona como un intérprete SQL para bases de datos SQLite.

Usar ficheros incluidos con SQLite

Volveremos a explicar el método que usaremos para obtener el fichero que nos falta para poder acceder a la DLL de SQLite desde nuestro programas C/C++.

SQLite no proporciona ficheros de librería estáticas para acceder al DLL, pero podemos obtenerlos a partir del propio fichero DLL y del fichero DEF. Para hacerlo crearemos una carpeta temporal en la que copiaremos los siguientes ficheros:

  • El fichero de biblioteca dinámica "dll": sqlite3.dll.
  • El fichero de definición de biblioteca "def": sqlite3.def.

Y estas tres utilidades:

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

Los dos primeros ficheros ya los tenemos, y los extraeremos de los paquetes correspondientes.

El siguiente paso es crear el fichero de biblioteca estática libsqlite.a. Para ello necesitamos las 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 el compilador. 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 sqlite3.def -D sqlite3.dll -k -l libsqlite.a -S ./as.exe

La utilidad as.exe (un ensamblador) se invoca automáticamente desde dlltool. Ahora ya tenemos nuestro fichero de biblioteca estática libsqlite.a, y lo copiaremos al directorio lib del compilador.

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 conseguir ficheros de librería estática en formato ".a" a partir de ficheros DLL y DEF.

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.